Пример #1
0
    def draw_rays(self, ray_file):
        r = 1.0
        g = 0.0
        b = 0.0
        if self.ray_data.load(ray_file) == True:
            self.gl_objects_remove_regex("ray_trace_results")
            for t in self.ray_data.data:
                z = gl_scale.project_m2screen_z(t.xyz0.z)
                dz = gl_scale.project_m2screen_z(
                    t.xyz1.z) - gl_scale.project_m2screen_z(t.xyz0.z)

                x = gl_scale.project_m2screen_x(t.xyz0.x)
                dx = gl_scale.project_m2screen_x(
                    t.xyz1.x) - gl_scale.project_m2screen_x(t.xyz0.x)

                y = gl_scale.project_m2screen_y(t.xyz0.y)
                dy = gl_scale.project_m2screen_y(
                    t.xyz1.y) - project_m2screen_y(t.xyz0.y)

                a = gl_base_object()
                a.id = ["ray_trace_results"]
                a.type = "ray"
                a.x = x
                a.y = y
                a.z = z
                a.dx = dx
                a.dy = dy
                a.dz = dz
                a.r = self.ray_data.r
                a.g = self.ray_data.g
                a.b = self.ray_data.b
                self.gl_objects_add(a)
Пример #2
0
    def draw_mode(self):
        if self.false_color == True:
            return

        glLineWidth(5)
        glColor3f(1.0, 1.0, 1.0)

        t = []
        s = []

        data = dat_file()

        path = os.path.join(get_sim_path(), "optical_output",
                            "light_1d_photons_tot_norm.dat")

        if data.load(path) == True:
            glBegin(GL_LINES)
            array_len = data.y_len
            s = data.data[0][0]
            #print(path)
            #print(data.data)
            for i in range(1, array_len):
                x = gl_scale.project_m2screen_x(0)
                y = gl_scale.project_m2screen_y(data.y_scale[i - 1])
                z = gl_scale.project_m2screen_z(0) - s[i - 1] * 0.5
                glVertex3f(x, y, z)

                y = gl_scale.project_m2screen_y(data.y_scale[i])
                z = gl_scale.project_m2screen_z(0) - s[i] * 0.5
                glVertex3f(x, y, z)

            glEnd()
Пример #3
0
 def draw_circuit(self):
     for c in self.graph_data.data:
         a = gl_base_object()
         a.id = ["electrical_mesh"]
         if c.name == "R":
             a.type = "resistor"
         elif c.name == "D":
             a.type = "diode"
         #print(c.z0,c.x0,c.y0,c.z1,c.x1,c.y1)
         a.x = gl_scale.project_m2screen_x(c.x0)
         a.y = gl_scale.project_m2screen_y(c.y0)
         a.z = gl_scale.project_m2screen_z(c.z0)
         a.dx = gl_scale.project_m2screen_x(c.x1) - a.x
         a.dy = gl_scale.project_m2screen_y(c.y1) - a.y
         a.dz = gl_scale.project_m2screen_z(c.z1) - a.z
         a.r = 1.0
         a.g = 0.0
         a.b = 0.0
         a.alpha = 1.0
         self.gl_objects_add(a)
Пример #4
0
    def shape_to_screen(self, a, pos, s):
        if s.shape_enabled == True:
            a.type = "solid_and_mesh"
            if self.draw_device_cut_through == True:  # and l!=len(epi.layers)-1
                a.type = "box_cut_through"
        else:
            a.type = "marker"

        a.id = [s.id]
        a.xyz.x = gl_scale.project_m2screen_x(pos.x)
        #a.xyz.y=gl_scale.project_m2screen_y(pos.y)
        if s.shape_flip_y == False:
            a.xyz.y = gl_scale.project_m2screen_y(pos.y)
        else:
            a.xyz.y = gl_scale.project_m2screen_y(pos.y + s.dy)

        a.xyz.z = gl_scale.project_m2screen_z(pos.z)
        #print(">>>>>>",project_m2screen_z(0))

        a.dxyz.x = s.dx * scale_get_xmul()
        a.dxyz.y = s.dy * scale_get_ymul()
        a.dxyz.z = s.dz * scale_get_zmul()
        if s.shape_flip_y == False:
            a.dxyz.y = a.dxyz.y * -1.0

        a.r = s.r
        a.g = s.g
        a.b = s.b

        a.alpha = 1.0
        if len(s.shapes) > 0:
            a.alpha = 0.5

        a.allow_cut_view = True
        a.selectable = True
        v = vec()
        v.x = s.dx
        v.y = s.dy
        v.z = s.dz
        #resize the shape to the mesh
        if s.triangles != None:
            a.triangles = triangles_mul_vec(s.triangles.data, v)

            if s.shape_flip_y == True:
                a.triangles = triangles_flip(a.triangles)

            a.triangles = scale_trianges_m2screen(a.triangles)

        self.gl_objects_add(a)
    def draw_light_profile(self):

        self.gl_objects_remove_regex("light_profile")
        name = inp_get_token_value(os.path.join(get_sim_path(), "light.inp"),
                                   "#light_profile")
        if name != "box":
            epi = get_epi()

            s = shape()
            s.type = name
            s.load_triangles()
            s.triangles.data = triangles_remove_below(s.triangles.data, 0.1)

            a = gl_base_object()
            a.id = ["light_profile"]
            a.type = "open_triangles"

            a.x = gl_scale.project_m2screen_x(0)
            a.y = gl_scale.project_m2screen_y(0)
            a.z = gl_scale.project_m2screen_z(0)

            a.dx = 1.0
            a.dy = scale_get_ymul() * 1.0
            a.dz = 1.0

            a.r = 0.0
            a.g = 1.0
            a.b = 0.0
            a.alpha = 1.0

            my_vec = vec()
            my_vec.x = get_mesh().get_xlen()
            my_vec.y = epi.ylen() * 1.0
            my_vec.z = get_mesh().get_zlen()

            t = triangles_mul_vec(s.triangles.data, my_vec)

            my_vec = vec()
            my_vec.x = 0.0
            my_vec.y = -epi.ylen() * 3.0
            my_vec.z = 0.0

            t = triangles_add_vec(t, my_vec)

            a.triangles = scale_trianges_m2screen(t)
            #triangles_mul_vec(triangles_flip_in_box(s.triangles.data),my_vec)
            #print("bing!",gl_scale.project_m2screen_x(0))
            self.gl_objects_add(a)
Пример #6
0
    def curciut_mesh_add_links(self, z):
        epi = get_epi()
        mesh = get_mesh()
        for zi in range(0, len(z)):

            for x_sub_mesh_index in range(0, len(mesh.x.layers)):

                xl = mesh.x.layers[x_sub_mesh_index]
                if xl.points == 0:  #if there is a gap in the mesh
                    if x_sub_mesh_index != 0 and x_sub_mesh_index != len(
                            mesh.x.layers
                    ) - 1:  #get left and right points to the gap
                        xl_l = mesh.x.layers[x_sub_mesh_index - 1]
                        xl_r = mesh.x.layers[x_sub_mesh_index + 1]

                        x0 = xl_l.mesh[-1]
                        x1 = xl_r.mesh[
                            0]  #look for a shape which fills the gap

                        shapes = epi.get_shapes_between_x(x0, x1)
                        for s in shapes:
                            if s.shape_electrical != "none":
                                f = inp()
                                f.load(s.shape_electrical + ".inp")
                                component = f.get_token(
                                    "#electrical_component")
                                nl = epi.find_layer_by_id(s.id)
                                y0 = epi.layers[nl].start
                                if component == "link":
                                    a = gl_base_object()
                                    a.id = ["electrical_mesh"]
                                    a.type = "line"
                                    a.xyz.x = gl_scale.project_m2screen_x(x0)
                                    a.xyz.y = gl_scale.project_m2screen_y(y0 +
                                                                          s.dy)
                                    a.xyz.z = z[zi]
                                    a.dxyz.x = (x1 - x0) * scale_get_xmul()
                                    a.dxyz.y = s.dy * scale_get_ymul() * 0.9
                                    a.dxyz.z = 0.0
                                    a.r = 1.0
                                    a.g = 0.0
                                    a.b = 0.0
                                    a.alpha = 1.0
                                    self.gl_objects_add(a)
Пример #7
0
    def shape_layer(self, epi_layer, shape_list, y_padding=0.0, name="name"):
        self.gl_objects_remove_regex(name)
        for s in shape_list:
            n = 0
            for pos in s.expand_xyz0(epi_layer):

                a = gl_base_object()
                if n == 0:
                    a.origonal_object = True
                n = n + 1

                a.id = [s.id]
                a.type = "solid_and_mesh"

                a.xyz.x = gl_scale.project_m2screen_x(pos.x)
                a.xyz.y = gl_scale.project_m2screen_y(pos.y)
                a.xyz.z = gl_scale.project_m2screen_z(pos.z)
                #print(">>>>>>",project_m2screen_z(0))

                a.dxyz.x = s.dx * scale_get_xmul()
                a.dxyz.y = s.dy * scale_get_ymul()
                a.dxyz.z = s.dz * scale_get_zmul()
                if s.shape_flip_y == False:
                    a.dxyz.y = a.dxyz.y * -1.0

                a.r = s.r
                a.g = s.g
                a.b = s.b
                a.allow_cut_view = True
                a.selectable = True
                v = vec()
                v.x = s.dx
                v.y = s.dy
                v.z = s.dz
                #resize the shape to the mesh
                if s.triangles != None:
                    a.triangles = triangles_mul_vec(s.triangles.data, v)

                    if s.shape_flip_y == True:
                        a.triangles = triangles_flip(a.triangles)

                    a.triangles = scale_trianges_m2screen(a.triangles)

                self.gl_objects_add(a)
Пример #8
0
	def draw_mesh(self):
		x=[]
		y=[]
		z=[]
		epi=get_epi()
		device_start=epi.get_device_start()
		mesh=get_mesh()

		y,temp=mesh.y.calculate_points()
		x,temp=mesh.x.calculate_points()
		z,temp=mesh.z.calculate_points()

		x=gl_scale.project_m2screen_x(x)
		y=gl_scale.project_m2screen_y(y)
		z=gl_scale.project_m2screen_z(z)

		glLineWidth(3)
		if mesh.y.circuit_model==False:
			self.drift_diffusion_mesh()
Пример #9
0
    def project_object_through_electrical_mesh(self, o):
        mesh = get_mesh()
        mesh_with_gaps = False
        for l in mesh.x.layers:
            if l.points == 0:
                mesh_with_gaps = True
                break

        if mesh_with_gaps == False:
            self.gl_objects_add(o)
        else:
            for l in mesh.x.layers:
                if l.points != 0:
                    new_obj = gl_base_object()
                    new_obj.copy(o)
                    #print(layer,l.start,l.end-l.start)
                    new_obj.xyz.x = gl_scale.project_m2screen_x(l.start)
                    new_obj.dxyz.x = (l.end - l.start) * scale_get_xmul()
                    #print(layer,o.xyz.x,o.dxyz.x)
                    self.gl_objects_add(new_obj)
Пример #10
0
    def draw_mesh(self):
        x = []
        y = []
        z = []
        epi = get_epi()
        device_start = epi.get_device_start()
        mesh = get_mesh()

        y, temp = mesh.y.calculate_points()
        x, temp = mesh.x.calculate_points()
        z, temp = mesh.z.calculate_points()

        old_layer = -1
        components = []
        component = ""

        for i in range(0, len(y)):
            y[i] = y[i] + device_start
            layer = epi.get_layer_by_cordinate(y[i])
            if old_layer != layer:
                old_layer = layer
                f = inp()
                f.load(epi.layers[layer].electrical_file + ".inp")
                component = f.get_token("#electrical_component")
                if component == "resistance":
                    component = "resistor"
            components.append(component)

        x = gl_scale.project_m2screen_x(x)
        y = gl_scale.project_m2screen_y(y)
        z = gl_scale.project_m2screen_z(z)

        glLineWidth(3)
        if mesh.y.circuit_model == False:
            self.drift_diffusion_mesh()
        else:
            self.circuit_mesh()
Пример #11
0
    def drift_diffusion_mesh(self):
        x = []
        y = []
        z = []
        epi = get_epi()
        device_start = epi.get_device_start()
        mesh = get_mesh()

        y, temp = mesh.y.calculate_points()
        x, temp = mesh.x.calculate_points()
        z, temp = mesh.z.calculate_points()

        for i in range(0, len(y)):
            y[i] = y[i] + device_start

        x = gl_scale.project_m2screen_x(x)
        y = gl_scale.project_m2screen_y(y)
        z = gl_scale.project_m2screen_z(z)

        glLineWidth(3)

        for zi in range(0, len(z)):
            for xi in range(0, len(x)):
                for yi in range(0, len(y)):
                    name = "mesh:" + str(xi) + ":" + str(yi) + ":" + str(zi)
                    if yi == self.dump_energy_slice_ypos and xi == self.dump_energy_slice_xpos and zi == self.dump_energy_slice_zpos:
                        a = gl_base_object()
                        a.id = [name]
                        a.type = "ball"
                        a.x = x[xi]
                        a.y = y[yi]
                        a.z = z[zi]
                        a.dx = 0.08
                        a.r = 0.0
                        a.g = 1.0
                        a.b = 0.0
                        self.gl_objects_add(a)
                    elif xi == self.dump_1d_slice_xpos and zi == self.dump_1d_slice_zpos:
                        a = gl_base_object()
                        a.id = [name]
                        a.type = "ball"
                        a.x = x[xi]
                        a.y = y[yi]
                        a.z = z[zi]
                        a.dx = 0.05
                        a.r = 0.0
                        a.g = 0.0
                        a.b = 1.0
                        self.gl_objects_add(a)
                    else:
                        a = gl_base_object()
                        a.id = [name]
                        a.type = "ball"
                        a.x = x[xi]
                        a.y = y[yi]
                        a.z = z[zi]
                        a.dx = 0.05
                        if self.dump_verbose_electrical_solver_results == False:
                            a.alpha = 0.5
                        else:
                            a.alpha = 0.9
                        a.r = 1.0
                        a.g = 0.0
                        a.b = 0.0
                        self.gl_objects_add(a)

                    if yi != len(y) - 1:
                        a = gl_base_object()
                        a.id = ["electrical_mesh"]
                        a.type = "line"
                        a.x = x[xi]
                        a.y = y[yi]
                        a.z = z[zi]
                        a.dx = 0.0
                        a.dy = y[yi + 1] - y[yi]
                        a.dz = 0.0
                        a.r = 1.0
                        a.g = 0.0
                        a.b = 0.0
                        self.gl_objects_add(a)

                    if xi != len(x) - 1:
                        a = gl_base_object()
                        a.id = ["electrical_mesh"]
                        a.type = "line"
                        a.x = x[xi]
                        a.y = y[yi]
                        a.z = z[zi]
                        a.dx = x[xi + 1] - x[xi]
                        a.dy = 0.0
                        a.dz = 0.0
                        a.r = 1.0
                        a.g = 0.0
                        a.b = 0.0
                        self.gl_objects_add(a)

                    if zi != len(z) - 1:
                        a = gl_base_object()
                        a.id = ["electrical_mesh"]
                        a.type = "line"
                        a.x = x[xi]
                        a.y = y[yi]
                        a.z = z[zi]
                        a.dx = 0.0
                        a.dy = 0.0
                        a.dz = z[zi + 1] - z[zi]
                        a.r = 1.0
                        a.g = 0.0
                        a.b = 0.0
                        self.gl_objects_add(a)
Пример #12
0
    def circuit_mesh(self):
        x = []
        y = []
        z = []
        epi = get_epi()
        mesh = get_mesh()

        y, temp = mesh.y.calculate_points()
        x, temp = mesh.x.calculate_points()
        z, temp = mesh.z.calculate_points()

        old_layer = -1
        components = []
        component = ""

        for l in epi.layers:
            f = inp()
            f.load(l.electrical_file + ".inp")
            component = f.get_token("#electrical_component")
            if component == "resistance":
                component = "resistor"
            if component == "resistor":
                components.append("resistor")
                components.append("resistor")

            if component == "diode":
                components.append("resistor")
                components.append("diode")

        x = gl_scale.project_m2screen_x(x)
        y = gl_scale.project_m2screen_y(y)
        z = gl_scale.project_m2screen_z(z)

        glLineWidth(3)

        mask = mesh.build_device_shadow()

        for zi in range(0, len(z)):
            xi = 0
            for x_sub_mesh_index in range(0, len(mesh.x.layers)):
                #print(len(xl.mesh))
                xl = mesh.x.layers[x_sub_mesh_index]

                for x_point in range(0, len(xl.mesh)):
                    mid_point = 0

                    for yi in range(0, len(y)):
                        name = "mesh:" + str(xi) + ":" + str(yi) + ":" + str(
                            zi)

                        block_y = False
                        block_x = False
                        block_z = False

                        #layer=epi.get_layer_by_cordinate(y[yi])
                        #l=epi.layers[layer]

                        if x_point == len(
                                xl.mesh
                        ) - 1:  #if we are at the end of the submesh
                            if x_sub_mesh_index != len(mesh.x.layers) - 1:
                                if mesh.x.layers[x_sub_mesh_index +
                                                 1].points == 0:
                                    block_x = True

                        if mask[zi][xi][yi] == False:
                            block_y = True

                        if xi != len(x) - 1:
                            if mask[zi][xi + 1][yi] == False:
                                block_x = True

                        if yi != len(y) - 1:
                            if mask[zi][xi][yi + 1] == False:
                                block_y = True

                        if mask[zi][xi][yi] == False:
                            block_x = True
                            block_z = True

                        if mid_point == 0:
                            block_x = True

                        if yi != len(y) - 1 and block_y == False:
                            a = gl_base_object()
                            a.id = ["electrical_mesh"]
                            a.type = components[yi]
                            a.xyz.x = x[xi]
                            a.xyz.y = y[yi]
                            a.xyz.z = z[zi]
                            a.dxyz.x = 0.0
                            a.dxyz.y = y[yi + 1] - y[yi]
                            a.dxyz.z = 0.0
                            a.r = 1.0
                            a.g = 0.0
                            a.b = 0.0
                            a.alpha = 1.0
                            self.gl_objects_add(a)

                        if xi != len(x) - 1 and block_x == False:
                            #print(yi,y[yi],mid_point,block_x)

                            a = gl_base_object()
                            a.id = ["electrical_mesh"]
                            a.type = "resistor"
                            a.xyz.x = x[xi]
                            a.xyz.y = y[yi]
                            a.xyz.z = z[zi]
                            a.dxyz.x = x[xi + 1] - x[xi]
                            a.dxyz.y = 0.0
                            a.dxyz.z = 0.0
                            a.r = 1.0
                            a.g = 0.0
                            a.b = 0.0
                            a.alpha = 1.0
                            self.gl_objects_add(a)

                        if zi != len(z) - 1 and block_z == False:
                            a = gl_base_object()
                            a.id = ["electrical_mesh"]
                            a.type = "resistor"
                            a.xyz.x = x[xi]
                            a.xyz.y = y[yi]
                            a.xyz.z = z[zi]
                            a.dxyz.x = 0.0
                            a.dxyz.y = 0.0
                            a.dxyz.z = z[zi + 1] - z[zi]
                            a.r = 1.0
                            a.g = 0.0
                            a.b = 0.0
                            a.alpha = 1.0
                            self.gl_objects_add(a)

                        mid_point = mid_point + 1
                        if mid_point == 2:
                            mid_point = 0

                    xi = xi + 1

        self.curciut_mesh_add_links(z)
Пример #13
0
        def rebuild_scene(self):
            self.gl_objects_clear()
            self.menu_update()
            self.text_clear_lib()

            x = gl_scale.project_m2screen_x(0)
            z = gl_scale.project_m2screen_z(0)

            if self.enable_draw_rays == True:
                self.draw_rays(self.ray_file)

            if self.enable_draw_light_source == True:

                lines = inp_load_file(os.path.join(get_sim_path(), "ray.inp"))

                if lines != False:
                    point_x = float(inp_search_token_value(lines, "#ray_xsrc"))
                    point_y = float(inp_search_token_value(lines, "#ray_ysrc"))
                    if point_x == -1.0:
                        point_x = 0.0
                        point_y = 0.0
                    else:
                        point_x = gl_scale.project_m2screen_x(point_x)
                        point_y = gl_scale.project_m2screen_y(point_y)

                    a = gl_base_object()
                    a.id = ["ray_src"]
                    a.type = "box"
                    a.xyz.x = point_x
                    a.xyz.y = point_y
                    a.xyz.z = 0.0
                    a.dxyz.dx = 0.2
                    a.dxyz.dy = 0.2
                    a.dxyz.dz = 0.2
                    a.r = 0.0
                    a.g = 0.0
                    a.b = 1.0

                    a.moveable = True
                    a.selectable = True
                    self.gl_objects_add(a)

            if self.draw_electrical_mesh == True:
                self.draw_mesh()

            elif self.view.draw_device == True:
                self.draw_device2(x, z)
                self.draw_contacts()

            if self.plot_circuit == True:
                self.draw_circuit()

            if self.enable_light_profile == True:
                self.draw_light_profile()

            if self.view.render_grid == True:
                o = gl_base_object()
                o.id = ["grid"]
                o.r = 0.5
                o.g = 0.5
                o.b = 0.5
                o.type = "grid"
                self.gl_objects_add(o)

            if self.pre_built_scene != None:
                self.gl_objects_load(self.pre_built_scene)
Пример #14
0
        def render(self):
            self.update_real_to_gl_mul()

            x = gl_scale.project_m2screen_x(0)
            y = 0.0  #project_m2screen_y(0)
            z = gl_scale.project_m2screen_z(0)
            #print(">>>>>>22",project_m2screen_z(0))
            self.clear_color()
            glClearColor(self.view.bg_color[0], self.view.bg_color[1],
                         self.view.bg_color[2], 0.5)

            self.dos_start = -1
            self.dos_stop = -1

            self.emission = False
            self.ray_model = False

            lines = inp_load_file(os.path.join(get_sim_path(), "ray.inp"))

            if lines != False:
                self.ray_model = val = str2bool(
                    inp_search_token_value(lines, "#ray_auto_run"))

            lines = []
            epi = get_epi()
            for i in range(0, len(epi.layers)):
                if epi.layers[i].dos_file != "none":
                    lines = inp_load_file(
                        os.path.join(get_sim_path(),
                                     epi.layers[i].dos_file + ".inp"))
                    if lines != False and len(lines) != 0:
                        if str2bool(lines[3]) == True:
                            self.emission = True

            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
            glLoadIdentity()
            glScalef(1.0, 1.0, -1.0)

            glTranslatef(self.view.x_pos, self.view.y_pos,
                         self.view.zoom)  # Move Into The Screen

            glRotatef(self.view.xRot, 1.0, 0.0, 0.0)
            glRotatef(self.view.yRot, 0.0, 1.0, 0.0)
            glRotatef(self.view.zRot, 0.0, 0.0, 1.0)

            glColor3f(1.0, 1.5, 0.0)
            glPolygonMode(GL_FRONT, GL_FILL)

            #glClearColor(0.92, 0.92, 0.92, 0.5) # Clear to black.

            lines = []

            self.pos = 0.0
            if self.enable_cordinates == True:
                self.draw_cords()

            if self.enable_draw_ray_mesh == True:
                self.draw_ray_mesh()

            if self.view.optical_mode == True:
                self.draw_mode()

            if self.scene_built == False:
                self.build_scene()

            if self.plot_graph == True:
                self.draw_graph()

            #for l in self.lights:
            #	box(l.xyz[0],l.xyz[1],l.xyz[2],0.5,0.5,0.5,1.0,0,0,0.5)

            if self.view.render_photons == True:
                self.draw_photons(x, z)

            self.gl_objects_render()

            if self.view.zoom > self.view.stars_distance:
                self.draw_stars()
Пример #15
0
    def draw_graph(self):
        z = 0
        #for z in range(0,len(self.graph_data.z_scale)):
        my_max, my_min = dat_file_max_min(self.graph_data)

        if len(self.graph_data.z_scale) == 1:
            zi_list = [0]
        else:
            zi_list = [0, len(self.graph_data.z_scale) - 1]

        glBegin(GL_QUADS)

        if len(self.graph_data.z_scale) > 1:
            dz = self.graph_data.z_scale[1] - self.graph_data.z_scale[0]
        else:
            dz = 0.0

        dx = self.graph_data.x_scale[1] - self.graph_data.x_scale[0]
        dy = self.graph_data.y_scale[1] - self.graph_data.y_scale[0]

        #front,back
        for zi in zi_list:
            for xi in range(0, len(self.graph_data.x_scale)):
                for yi in range(0, len(self.graph_data.y_scale)):
                    x0 = gl_scale.project_m2screen_x(
                        self.graph_data.x_scale[xi])
                    y0 = gl_scale.project_m2screen_y(
                        self.graph_data.y_scale[yi])
                    z0 = gl_scale.project_m2screen_z(
                        self.graph_data.z_scale[zi])
                    x1 = gl_scale.project_m2screen_x(
                        self.graph_data.x_scale[xi] + dx)
                    y1 = gl_scale.project_m2screen_y(
                        self.graph_data.y_scale[yi] + dy)
                    z1 = gl_scale.project_m2screen_z(
                        self.graph_data.z_scale[zi])
                    if self.graph_data.data[zi][xi][yi] != 0.0:
                        r, g, b = val_to_rgb(self.graph_data.data[zi][xi][yi] /
                                             (my_max - my_min))

                        #glColor4f(r,g,b, 1.0)
                        col = [r, g, b, 1.0]
                        glMaterialfv(GL_FRONT, GL_DIFFUSE, col)

                        glVertex3f(x0, y0, z0)
                        glVertex3f(x1, y0, z0)
                        glVertex3f(x1, y1, z0)
                        glVertex3f(x0, y1, z0)

        if len(self.graph_data.z_scale) == 1:
            glEnd()
            return

        #left,right
        for xi in [0, len(self.graph_data.x_scale) - 1]:
            for zi in range(0, len(self.graph_data.z_scale)):
                for yi in range(0, len(self.graph_data.y_scale)):
                    x0 = gl_scale.project_m2screen_x(
                        self.graph_data.x_scale[xi])
                    y0 = gl_scale.project_m2screen_y(
                        self.graph_data.y_scale[yi])
                    z0 = gl_scale.project_m2screen_z(
                        self.graph_data.z_scale[zi])
                    x1 = gl_scale.project_m2screen_x(
                        self.graph_data.x_scale[xi])
                    y1 = gl_scale.project_m2screen_y(
                        self.graph_data.y_scale[yi] + dy)
                    z1 = gl_scale.project_m2screen_z(
                        self.graph_data.z_scale[zi] + dz)
                    r, g, b = val_to_rgb(self.graph_data.data[zi][xi][yi] /
                                         (my_max - my_min))

                    #glColor4f(r,g,b, 1.0)
                    col = [r, g, b, 1.0]
                    glMaterialfv(GL_FRONT, GL_DIFFUSE, col)

                    glVertex3f(x0, y0, z0)
                    glVertex3f(x0, y1, z0)
                    glVertex3f(x0, y1, z1)
                    glVertex3f(x0, y0, z1)

        #top,bottom
        for yi in [0, len(self.graph_data.y_scale) - 1]:
            for zi in range(0, len(self.graph_data.z_scale)):
                for xi in range(0, len(self.graph_data.x_scale)):
                    x0 = gl_scale.project_m2screen_x(
                        self.graph_data.x_scale[xi])
                    y0 = gl_scale.project_m2screen_y(
                        self.graph_data.y_scale[yi])
                    z0 = gl_scale.project_m2screen_z(
                        self.graph_data.z_scale[zi])
                    x1 = gl_scale.project_m2screen_x(
                        self.graph_data.x_scale[xi] + dx)
                    y1 = gl_scale.project_m2screen_y(
                        self.graph_data.y_scale[yi])
                    z1 = gl_scale.project_m2screen_z(
                        self.graph_data.z_scale[zi] + dz)

                    r, g, b = val_to_rgb(
                        (self.graph_data.data[zi][xi][yi] - my_min) /
                        (my_max - my_min))

                    #glColor4f(r,g,b, 1.0)
                    col = [r, g, b, 1.0]
                    glMaterialfv(GL_FRONT, GL_DIFFUSE, col)

                    glVertex3f(x0, y0, z0)
                    glVertex3f(x1, y0, z0)
                    glVertex3f(x1, y0, z1)
                    glVertex3f(x0, y0, z1)

        glEnd()
Пример #16
0
    def draw_contacts(self):
        #print("draw contacts")
        epi = get_epi()
        box = vec()
        pos = vec()
        y_mesh = get_mesh().y
        x_mesh = get_mesh().x
        z_mesh = get_mesh().z

        self.gl_objects_remove_regex("contact")
        top_contact_layer = epi.get_top_contact_layer()
        btm_contact_layer = epi.get_btm_contact_layer()

        for c in epi.contacts.contacts:
            if c.shape_enabled == True:
                a = gl_base_object()
                a.id = [c.id]

                if c.position == "left":
                    if len(x_mesh.points) > 1:
                        sticking_out_bit = 0.2
                        a.type = "solid_and_mesh"
                        a.xyz.x = gl_scale.project_m2screen_x(
                            0) - sticking_out_bit
                        a.xyz.y = gl_scale.project_m2screen_y(c.y0)
                        a.xyz.z = gl_scale.project_m2screen_z(0)
                        a.dxyz.x = 1.0
                        a.dxyz.y = scale_get_ymul() * c.dy
                        a.dxyz.z = scale_get_device_z()

                        a.r = c.r
                        a.g = c.g
                        a.b = c.b
                        a.alpha = 1.0
                        my_vec = vec()
                        my_vec.x = sticking_out_bit / scale_get_xmul(
                        )  #+c.ingress
                        my_vec.y = c.dy
                        my_vec.z = get_mesh().get_zlen()

                        if c.triangles != None:
                            a.triangles = triangles_flip_in_box(
                                c.triangles.data)
                            a.triangles = triangles_mul_vec(a.triangles, box)
                            a.triangles = triangles_add_vec(a.triangles, pos)
                            a.triangles = scale_trianges_m2screen(a.triangles)
                            self.gl_objects_add(a)

                elif c.position == "top":
                    if top_contact_layer != -1:
                        #if epi.layers[0].name!="air":
                        box = vec()
                        if len(x_mesh.points) == 1 and len(z_mesh.points) == 1:
                            xstart = 0
                            box.x = get_mesh().get_xlen()
                        else:
                            xstart = c.x0
                            box.x = c.dx

                        box.y = epi.layers[0].dy  #+c.ingress
                        box.z = get_mesh().get_zlen()

                        if self.draw_device_cut_through == False:
                            a.type = "solid_and_mesh"
                        else:
                            a.type = "solid_and_mesh_cut_through"

                        a.xyz.x = gl_scale.project_m2screen_x(xstart)
                        if c.shape_flip_y == False:
                            a.xyz.y = gl_scale.project_m2screen_y(
                                epi.get_layer_start(0))
                        else:
                            a.xyz.y = gl_scale.project_m2screen_y(
                                epi.get_layer_end(0))
                        a.xyz.z = gl_scale.project_m2screen_z(0.0)

                        a.dxyz.x = box.x * scale_get_xmul()
                        a.dxyz.y = box.y * scale_get_ymul()
                        a.dxyz.z = scale_get_device_z()
                        if c.shape_flip_y == False:
                            a.dxyz.y = a.dxyz.y * -1.0

                        a.r = c.r
                        a.g = c.g
                        a.b = c.b
                        a.alpha = 1.0

                        if c.triangles != None:
                            a.triangles = triangles_mul_vec(
                                c.triangles.data, box)
                            if c.shape_flip_y == True:
                                a.triangles = triangles_flip(a.triangles)

                            a.triangles = scale_trianges_m2screen(a.triangles)
                            self.gl_objects_add(a)

                elif c.position == "bottom":
                    if btm_contact_layer != -1:
                        if len(x_mesh.points) == 1 and len(z_mesh.points) == 1:

                            xstart = 0
                            box.x = get_mesh().get_xlen()
                        else:
                            xstart = c.x0
                            box.x = c.dx

                        box.y = epi.layers[len(epi.layers) - 1].dy  #+c.ingress
                        box.z = get_mesh().get_zlen()

                        a.type = "solid_and_mesh"

                        pos.x = xstart
                        pos.y = epi.get_layer_start(len(epi.layers) - 1)
                        pos.z = 0

                        a.xyz.x = gl_scale.project_m2screen_x(pos.x)
                        a.xyz.y = gl_scale.project_m2screen_y(pos.y)
                        a.xyz.z = gl_scale.project_m2screen_z(pos.z)

                        a.dxyz.x = box.x * scale_get_xmul()
                        a.dxyz.y = -box.y * scale_get_ymul()
                        a.dxyz.z = scale_get_device_z()

                        a.r = epi.layers[len(epi.layers) - 1].r
                        a.g = epi.layers[len(epi.layers) - 1].g
                        a.b = epi.layers[len(epi.layers) - 1].b

                        a.alpha = 1.0
                        my_vec = vec()
                        my_vec.x = c.dx
                        my_vec.y = epi.layers[len(epi.layers) - 1].dy
                        my_vec.z = get_mesh().get_zlen()

                        a.r = c.r
                        a.g = c.g
                        a.b = c.b
                        a.alpha = 1.0

                        a.triangles = triangles_flip_in_box(c.triangles.data)
                        a.triangles = triangles_mul_vec(a.triangles, box)
                        #a.triangles=triangles_add_vec(a.triangles,pos)
                        a.triangles = scale_trianges_m2screen(a.triangles)

                        self.gl_objects_add(a)