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