Exemple #1
0
 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
Exemple #2
0
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
Exemple #4
0
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