def slice(self): if( len(self.mesh) == 0): self.message('Load mesh first!') return self.slices.clear() curdir = os.getcwd() if(path.isdir("images")): #remove all files in images filelist = [ f for f in os.listdir("./images") if f.endswith(".png") ] for f in filelist: os.remove(os.path.join(curdir+"/images", f)) else: os.mkdir("images") self.out_path = os.path.join(curdir, "images/slice-%d.png") self.message('Slicing mesh...') self.update_var() self.mesh_info.first_layer_thicknes = self.conf.get("first_layer_thickness") self.mesh_info.layer_thickness = self.conf.get("layer_thickness") nLayer = self.mesh_info.get_layers() z_list = self.mesh_info.get_z_list() str_layers = str(nLayer) x_pixel_size, y_pixel_size, x0, y0 = stl2pngfunc.stl2png(self.mesh_info.path, z_list, self.mesh_info.image_width, self.mesh_info.image_height, self.out_path, self.mesh_info.border_size, func = lambda i: self.message("slicing layer " + str(i+1) + "/" + str_layers, False) ) self.mesh_info.real_pixel_size, self.mesh_info.real_pixel_size, self.gcode_minx, self.gcode_miny = x_pixel_size, y_pixel_size, x0, y0 self.message('Slicing mesh into ' + self.out_path) self.message(self.mesh_info.get_info() ) im = cv2.imread(self.out_path % 0) tex1 = cv2.cvtColor(im, cv2.COLOR_BGR2RGBA) v1 = gl.GLImageItem(tex1) v1.translate(0, 0, 0) self.view_slice.addItem(v1) # activate slider self.sl.setMinimum(0) self.sl.setMaximum(self.mesh_info.get_layers() - 1) self.sl.setValue(0) self.sl.setTickPosition(QSlider.TicksBelow) self.sl.setTickInterval(1) self.sl.valueChanged.connect(self.show_slice) return
def gen_continuous_path_with_constraint(ms_info, tmp_slice_path, collision_dist_xy=30, collision_dist_z=30, offset=-4): m = ms_info N = m.get_layers() z_list = m.get_z_list() #slicing remove_files(tmp_slice_path) curdir = os.getcwd() out_path = tmp_slice_path + "/slice-%d.png" real_pixel_size, real_pixel_size, gcode_minx, gcode_miny = stl2pngfunc.stl2png( m.path, z_list, m.image_width, m.image_height, out_path, m.border_size, func=lambda i: print("slicing layer {}/{}".format(i + 1, N))) #print sequence R = [] #R = {r_ij} S = [] #sequence with [[i,j]......] pe = pathengine.pathEngine() for i in range(N): img_file = out_path % i rs = get_region_boundary_from_img(img_file, pe, True) R.append(rs) d = RDqueue(R) #d = di = dj = deque() r, i, j = d.get_end() while d.size() != 0: if (i < N - 1) and (not is_interference_xyz( ms_info, d, i, j, collision_dist_xy, collision_dist_z)): S.append([i, j]) d.remove_item(i, j) i = i + 1 rs, js = find_surpported_regions(d, r, i, -6) if js == []: r, i, j = d.get_end() continue else: j = js[0] r = rs[0] for idx in range(1, len(js)): d.move_to_end(i, idx) if i == (N - 1): # reach the top if not is_interference_xyz(ms_info, d, i, j, collision_dist_xy, collision_dist_z): S.append([i, j]) d.remove_item(i, j) r, i, j = d.get_end() else: r_next, i_next, j_next = d.get_end() if [i, j] == [ i_next, j_next ]: #the extruder goes back and the region is not be appended S.append([i, j]) d.remove_item(i, j) r_next, i_next, j_next = d.get_end() else: if i <= i_next: # The new region is not lower than current, S.append([i, j]) # so the nozzle doesn't need to go down. d.remove_item(i, j) r = r_next i = i_next j = j_next # generate spiral and connect them # todo: connect path on the nearest point d = RDqueue(R) path = [] Z = 0.0 z_list[-1] = z_list[-2] + m.layer_thickness for i in range(0, len(S)): iLayer = S[i][0] r = d.get_item(iLayer, S[i][1]) cs = spiral(pe, r, offset) * ms_info.get_pixel_size() #transformation to 3d vector Z = z_list[iLayer] z = [Z] * len(cs) z = np.array(z).reshape([len(z), 1]) if i == 0: path = np.hstack([cs, z]) else: cs = np.hstack([cs, z]) path = np.vstack([path, cs]) #if i== 0: #path = np.hstack([cs,z]) #else: #if iLayer == 1: #z += ms_info.first_layer_thickness #elif iLayer > 1: #z += ((iLayer-1) * ms_info.layer_thickness + ms_info.first_layer_thickness) #cs = np.hstack([cs,z]) #path = np.vstack([path,cs]) return path
print(m.get_info()) image_width = 640 image_height = 480 #remove all files in images remove_files("images") curdir = os.getcwd() out_path = os.path.join(curdir, "images/slice-%d.png") real_pixel_size, real_pixel_size, gcode_minx, gcode_miny = stl2pngfunc.stl2png( file_path, N, m.image_width, m.image_height, out_path, func=lambda i: print("slicing layer {}/{}".format(i + 1, N))) print('Slicing mesh into ' + out_path) # algorithm dq = deque() pe = pathengine.pathEngine() def get_region_boundary_from_img(img_path, pe, is_reverse=False): ''' @image_path is an obsolute file path @pe is a reference of patheEngine object
def gen_continous_path(ms_info, tmp_slice_path, slice_layers, collision_dist=3, offset=-4): dist_th = collision_dist N = slice_layers m = ms_info m.set_layers(N) #slicing remove_files(tmp_slice_path) curdir = os.getcwd() out_path = tmp_slice_path + "/slice-%d.png" real_pixel_size, real_pixel_size, gcode_minx, gcode_miny = stl2pngfunc.stl2png( ms_info.path, N, m.image_width, m.image_height, out_path, func=lambda i: print("slicing layer {}/{}".format(i + 1, N))) #print sequence R = [] #R = {r_ij} S = [] #sequence with [[i,j]......] pe = pathengine.pathEngine() for i in range(N): img_file = out_path % i rs = get_region_boundary_from_img(img_file, pe, True) for r in rs: for c in r: print(c.shape) R.append(rs) d = RDqueue(R) #d = di = dj = deque() r, i, j = d.get_end() while d.size() != 0: if (i < N - 1) and (not is_interference(d, i, j, dist_th)): S.append([i, j]) d.remove_item(i, j) i = i + 1 r, j = find_surpported_region_in_layer(d, r, i, -6) if j == -1: r, i, j = d.get_end() continue if i == (N - 1): # reach the top if not is_interference(d, i, j, dist_th): S.append([i, j]) d.remove_item(i, j) r, i, j = d.get_end() else: r_next, i_next, j_next = d.get_end() if [i, j] == [ i_next, j_next ]: #the nozzle goes back and the region is not be appended S.append([i, j]) d.remove_item(i, j) r_next, i_next, j_next = d.get_end() else: if i <= i_next: # The new region is not lower than current, S.append([i, j]) # so the nozzle doesn't need to go down. d.remove_item(i, j) r = r_next i = i_next j = j_next # generate spiral and connect them d = RDqueue(R) path = [] Z = 0.0 for i in range(0, len(S) - 1): iLayer = S[i][0] r = d.get_item(iLayer, S[i][1]) cs = spiral(pe, r, offset) * ms_info.get_pixel_size() #transformation to 3d vector z = [Z] * len(cs) z = np.array(z).reshape([len(z), 1]) if i == 0: path = np.hstack([cs, z]) else: if iLayer == 1: z += ms_info.first_layer_thickness elif iLayer > 1: z += ((iLayer - 1) * ms_info.layer_thickness + ms_info.first_layer_thickness) cs = np.hstack([cs, z]) path = np.vstack([path, cs]) return path