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)
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()
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_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)
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)
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)
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)
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()
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()
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)
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)
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)
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()
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)