Esempio n. 1
0
 def process(self):
     outputs = self.outputs
     if not outputs['Vertices'].is_linked:
         return
     IVerts, IFaces, IMask, Imatr = self.inputs
     vertices_s = IVerts.sv_get()
     faces_s = IFaces.sv_get()
     linked_extruded_polygons = outputs['ExtrudedPolys'].is_linked
     linked_other_polygons = outputs['OtherPolys'].is_linked
     result_vertices = []
     result_edges = []
     result_faces = []
     result_extruded_faces = []
     result_other_faces = []
     bmlist = [bmesh_from_pydata(verts, [], faces) for verts, faces in zip(vertices_s, faces_s)]
     trans = Imatr.sv_get()
     if IMask.is_linked:
         flist = [np.extract(mask, bm.faces[:]) for bm, mask in zip(bmlist, IMask.sv_get())]
     else:
         flist = [bm.faces for bm in bmlist]
     for bm, selfaces in zip(bmlist, flist):
         extrfaces = extrude_discrete_faces(bm, faces=selfaces)['faces']
         fullList(trans, len(extrfaces))
         new_extruded_faces = []
         for face, ma in zip(extrfaces, trans):
             normal = face.normal
             if normal[0] == 0 and normal[1] == 0:
                 m_r = Matrix() if normal[2] >= 0 else Matrix.Rotation(pi, 4, 'X')
             else:
                 z_axis = normal
                 x_axis = Vector((z_axis[1] * -1, z_axis[0], 0)).normalized()
                 y_axis = z_axis.cross(x_axis).normalized()
                 m_r = Matrix(list([*zip(x_axis[:], y_axis[:], z_axis[:])])).to_4x4()
             m = (Matrix.Translation(face.calc_center_median()) @ m_r).inverted()
             transform(bm, matrix=ma, space=m, verts=face.verts)
             if linked_extruded_polygons or linked_other_polygons:
                 new_extruded_faces.append([v.index for v in face.verts])
         new_vertices, new_edges, new_faces = pydata_from_bmesh(bm)
         bm.free()
         new_other_faces = [f for f in new_faces if f not in new_extruded_faces] if linked_other_polygons else []
         result_vertices.append(new_vertices)
         result_edges.append(new_edges)
         result_faces.append(new_faces)
         result_extruded_faces.append(new_extruded_faces)
         result_other_faces.append(new_other_faces)
     outputs['Vertices'].sv_set(result_vertices)
     outputs['Edges'].sv_set(result_edges)
     outputs['Polygons'].sv_set(result_faces)
     outputs['ExtrudedPolys'].sv_set(result_extruded_faces)
     outputs['OtherPolys'].sv_set(result_other_faces)
Esempio n. 2
0
 def process(self):
     outputs = self.outputs
     if not outputs['Vertices'].is_linked:
         return
     IVerts, IFaces, IMask, Imatr = self.inputs
     vertices_s = IVerts.sv_get()
     faces_s = IFaces.sv_get()
     linked_extruded_polygons = outputs['ExtrudedPolys'].is_linked
     linked_other_polygons = outputs['OtherPolys'].is_linked
     result_vertices = []
     result_edges = []
     result_faces = []
     result_extruded_faces = []
     result_other_faces = []
     bmlist = [bmesh_from_pydata(verts, [], faces) for verts, faces in zip(vertices_s, faces_s)]
     trans = Imatr.sv_get()
     if IMask.is_linked:
         flist = [np.extract(mask, bm.faces[:]) for bm, mask in zip(bmlist, IMask.sv_get())]
     else:
         flist = [bm.faces for bm in bmlist]
     for bm, selfaces in zip(bmlist, flist):
         extrfaces = extrude_discrete_faces(bm, faces=selfaces)['faces']
         fullList(trans, len(extrfaces))
         new_extruded_faces = []
         for face, ma in zip(extrfaces, trans):
             normal = face.normal
             if normal[0] == 0 and normal[1] == 0:
                 m_r = Matrix() if normal[2] >= 0 else Matrix.Rotation(pi, 4, 'X')
             else:
                 z_axis = normal
                 x_axis = Vector((z_axis[1] * -1, z_axis[0], 0)).normalized()
                 y_axis = z_axis.cross(x_axis).normalized()
                 m_r = Matrix(list([*zip(x_axis[:], y_axis[:], z_axis[:])])).to_4x4()
             m = (Matrix.Translation(face.calc_center_median()) * m_r).inverted()
             transform(bm, matrix=ma, space=m, verts=face.verts)
             if linked_extruded_polygons or linked_other_polygons:
                 new_extruded_faces.append([v.index for v in face.verts])
         new_vertices, new_edges, new_faces = pydata_from_bmesh(bm)
         bm.free()
         new_other_faces = [f for f in new_faces if f not in new_extruded_faces] if linked_other_polygons else []
         result_vertices.append(new_vertices)
         result_edges.append(new_edges)
         result_faces.append(new_faces)
         result_extruded_faces.append(new_extruded_faces)
         result_other_faces.append(new_other_faces)
     outputs['Vertices'].sv_set(result_vertices)
     outputs['Edges'].sv_set(result_edges)
     outputs['Polygons'].sv_set(result_faces)
     outputs['ExtrudedPolys'].sv_set(result_extruded_faces)
     outputs['OtherPolys'].sv_set(result_other_faces)