def process(self): if not any(socket.is_linked for socket in self.outputs): return vertices_s = self.inputs['Vertices'].sv_get() edges_s = self.inputs['Edges'].sv_get(default=[[]]) faces_s = self.inputs['Faces'].sv_get(default=[[]]) masks_s = self.inputs['FaceMask'].sv_get(default=[[1]]) max_angle_s = self.inputs['MaxAngle'].sv_get() face_data_s = self.inputs['FaceData'].sv_get(default=[[]]) verts_out = [] edges_out = [] faces_out = [] face_data_out = [] meshes = match_long_repeat( [vertices_s, edges_s, faces_s, masks_s, max_angle_s, face_data_s]) for vertices, edges, faces, masks, max_angle, face_data in zip( *meshes): if self.split_mode == 'NONPLANAR': if isinstance(max_angle, (list, tuple)): max_angle = max_angle[0] fullList(masks, len(faces)) if face_data: fullList(face_data, len(faces)) bm = bmesh_from_pydata(vertices, edges, faces, normal_update=True, markup_face_data=True) bm_faces = [face for mask, face in zip(masks, bm.faces[:]) if mask] if self.split_mode == 'NONPLANAR': new_geom = bmesh.ops.connect_verts_nonplanar( bm, angle_limit=radians(max_angle), faces=bm_faces) else: new_geom = bmesh.ops.connect_verts_concave(bm, faces=bm_faces) new_verts, new_edges, new_faces = pydata_from_bmesh(bm) #new_edges, new_faces = get_bm_geom(new_geom) if not face_data: new_face_data = [] else: new_face_data = face_data_from_bmesh_faces(bm, face_data) verts_out.append(new_verts) edges_out.append(new_edges) faces_out.append(new_faces) face_data_out.append(new_face_data) self.outputs['Vertices'].sv_set(verts_out) self.outputs['Edges'].sv_set(edges_out) self.outputs['Faces'].sv_set(faces_out) self.outputs['FaceData'].sv_set(face_data_out)
def remove_doubles(vertices, faces, distance, face_data=None, find_doubles=False, mask=[], output_mask=False): if faces: edge_mode = (len(faces[0]) == 2) else: edge_mode = False if face_data: mark_face_data = True else: mark_face_data = False bm = bmesh_from_pydata(vertices, faces if edge_mode else [], [] if edge_mode else faces, markup_face_data=mark_face_data, markup_vert_data=output_mask) bm_verts = bm.verts if mask: mask_full = chain(mask, repeat(mask[-1])) bm_verts = [v for v, m in zip(bm_verts, mask_full) if m] if find_doubles: res = bmesh.ops.find_doubles(bm, verts=bm_verts, dist=distance) doubles = [vert.co[:] for vert in res['targetmap'].keys()] else: doubles = [] bmesh.ops.remove_doubles(bm, verts=bm_verts, dist=distance) edges = [] faces = [] face_data_out = [] bm.verts.index_update() verts = [vert.co[:] for vert in bm.verts[:]] bm.edges.index_update() bm.faces.index_update() for edge in bm.edges[:]: edges.append([v.index for v in edge.verts[:]]) for face in bm.faces: faces.append([v.index for v in face.verts[:]]) if face_data: face_data_out = face_data_from_bmesh_faces(bm, face_data) if mask and output_mask: mask_out = vert_data_from_bmesh_verts(bm, mask) else: mask_out = [] bm.clear() bm.free() return (verts, edges, faces, face_data_out, doubles, mask_out)
def process(self): if not any(socket.is_linked for socket in self.outputs): return vertices_s = self.inputs['Vertices'].sv_get() edges_s = self.inputs['Edges'].sv_get(default=[[]]) faces_s = self.inputs['Faces'].sv_get(default=[[]]) masks_s = self.inputs['FaceMask'].sv_get(default=[[1]]) face_data_s = self.inputs['FaceData'].sv_get(default=[[]]) offset_s = self.inputs['Offset'].sv_get() verts_out = [] edges_out = [] faces_out = [] face_data_out = [] meshes = zip_long_repeat(vertices_s, edges_s, faces_s, offset_s, masks_s, face_data_s) for vertices, edges, faces, offset, masks, face_data in meshes: if isinstance(offset, (list, tuple)): offset = offset[0] masks = repeat_last_for_length(masks, len(faces)) if face_data: face_data = repeat_last_for_length(face_data, len(faces)) bm = bmesh_from_pydata(vertices, edges, faces, normal_update=True, markup_face_data=True) bm_faces = [face for mask, face in zip(masks, bm.faces[:]) if mask] bmesh.ops.poke(bm, faces=bm_faces, offset=offset, center_mode=self.mode, use_relative_offset=self.offset_relative) new_verts, new_edges, new_faces = pydata_from_bmesh(bm) if not face_data: new_face_data = [] else: new_face_data = face_data_from_bmesh_faces(bm, face_data) bm.free() verts_out.append(new_verts) edges_out.append(new_edges) faces_out.append(new_faces) face_data_out.append(new_face_data) self.outputs['Vertices'].sv_set(verts_out) self.outputs['Edges'].sv_set(edges_out) self.outputs['Faces'].sv_set(faces_out) self.outputs['FaceData'].sv_set(face_data_out)