def make_bmesh_geometry(context, name, verts, edges, faces, matrix): # no verts. no processing. if not verts: return scene = context.scene meshes = bpy.data.meshes objects = bpy.data.objects if name in objects: sv_object = objects[name] else: temp_mesh = default_mesh(name) sv_object = objects.new(name, temp_mesh) scene.objects.link(sv_object) scene.update() # definitely verts, definitely do something. bm = bmesh_from_pydata(verts, edges, faces) # Finish up, write the bmesh back to the mesh bm.to_mesh(sv_object.data) bm.free() # free and prevent further access sv_object.hide_select = False # apply matrices if necessary if matrix: sv_object.matrix_local = list(zip(*matrix))
def soldify(vertices, faces, t, verlen): if not faces or not vertices: return False if len(faces[0]) == 2: return False bm = bmesh_from_pydata(vertices, [], faces) geom_in = bm.verts[:]+bm.edges[:]+bm.faces[:] bmesh.ops.recalc_face_normals(bm, faces=bm.faces[:]) res = bmesh.ops.solidify(bm, geom=geom_in, thickness=t[0]) edges = [] faces = [] newpols = [] bm.verts.index_update() bm.edges.index_update() bm.faces.index_update() for edge in bm.edges[:]: edges.append([v.index for v in edge.verts[:]]) verts = [vert.co[:] for vert in bm.verts[:]] for face in bm.faces: indexes = [v.index for v in face.verts[:]] faces.append(indexes) if not verlen.intersection(indexes): newpols.append(indexes) bm.clear() bm.free() return (verts, edges, faces, newpols)
def fillet(verts, edges, adj, num_seg): bm = bmesh_from_pydata(verts[0], edges[0], []) this_fillet = fillet_op0(bm, adj, num_seg) verts_out = [v.co[:] for v in bm.verts] edges_out = [[i.index for i in p.verts] for p in bm.edges[:]] return verts_out, edges_out
def soldify(vertices, faces, t, verlen): if not faces or not vertices: return False if len(faces[0]) == 2: return False bm = bmesh_from_pydata(vertices, [], faces) geom_in = bm.verts[:] + bm.edges[:] + bm.faces[:] bmesh.ops.recalc_face_normals(bm, faces=bm.faces[:]) res = bmesh.ops.solidify(bm, geom=geom_in, thickness=t[0]) edges = [] faces = [] newpols = [] bm.verts.index_update() bm.edges.index_update() bm.faces.index_update() for edge in bm.edges[:]: edges.append([v.index for v in edge.verts[:]]) verts = [vert.co[:] for vert in bm.verts[:]] for face in bm.faces: indexes = [v.index for v in face.verts[:]] faces.append(indexes) if not verlen.intersection(indexes): newpols.append(indexes) bm.clear() bm.free() return (verts, edges, faces, newpols)
def get_lathed_geometry(node, verts, edges, cent, axis, dvec, angle, steps): bm = bmesh_from_pydata(verts, edges, []) geom = bm.verts[:] + bm.edges[:] spin(bm, geom=geom, cent=cent, axis=axis, dvec=dvec, angle=angle, steps=steps, use_duplicate=0) if node.remove_doubles: bmesh.ops.remove_doubles(bm, verts=bm.verts[:], dist=node.dist) v = [v.co[:] for v in bm.verts] p = [[i.index for i in p.verts] for p in bm.faces[:]] bm.free() return v, p
def join_tris(verts, faces, limit): if not verts: return False bm = bmesh_from_pydata(verts, [], faces) bmesh.ops.join_triangles(bm, faces=bm.faces, limit=limit) bm.verts.index_update() bm.faces.index_update() faces_out = [] verts_out = [vert.co[:] for vert in bm.verts] [faces_out.append([v.index for v in face.verts]) for face in bm.faces] bm.clear() bm.free() return (verts_out, faces_out)
def update(self): if self.outputs['Volume'].links and self.inputs['Vers'].links: vertices = Vector_generate( dataCorrect(SvGetSocketAnyType(self, self.inputs['Vers']))) faces = dataCorrect(SvGetSocketAnyType(self, self.inputs['Pols'])) out = [] for verts_obj, faces_obj in zip(vertices, faces): # this is for one object bme = bmesh_from_pydata(verts_obj, [], faces_obj) geom_in = bme.verts[:] + bme.edges[:] + bme.faces[:] bmesh.ops.recalc_face_normals(bme, faces=bme.faces[:]) # calculation itself out.append(bme.calc_volume()) bme.clear() bme.free() if self.outputs['Volume'].links: SvSetSocketAnyType(self, 'Volume', out)
def make_bmesh_geometry(node, context, name, verts, *topology): scene = context.scene meshes = bpy.data.meshes objects = bpy.data.objects edges, faces, matrix = topology if name in objects: sv_object = objects[name] else: temp_mesh = default_mesh(name) sv_object = objects.new(name, temp_mesh) scene.objects.link(sv_object) ''' There is overalapping code here for testing! ''' mesh = sv_object.data current_count = len(mesh.vertices) propose_count = len(verts) difference = (propose_count - current_count) ''' With this mode you make a massive assumption about the constant state of geometry. Assumes the count of verts edges/faces stays the same, and only updates the locations node.fixed_verts is not suitable for initial object creation but if over time you find that the only change is going to be vertices, this mode can be switched to to increase efficiency ''' if node.fixed_verts and difference == 0: f_v = list(itertools.chain.from_iterable(verts)) mesh.vertices.foreach_set('co', f_v) else: ''' get bmesh, write bmesh to obj, free bmesh''' bm = bmesh_from_pydata(verts, edges, faces) bm.to_mesh(sv_object.data) bm.free() sv_object.hide_select = False if matrix: sv_object.matrix_local = list(zip(*matrix))
def update(self): if self.outputs['Vers'].links and self.inputs['Vers'].links: vertices = Vector_generate( SvGetSocketAnyType(self, self.inputs['Vers'])) faces = SvGetSocketAnyType(self, self.inputs['Pols']) offset = self.inputs['Offset'].sv_get()[0] nsides = self.inputs['N sides'].sv_get()[0][0] radius = self.inputs['Radius'].sv_get()[0] #print(radius,nsides,offset) outv = [] oute = [] outo = [] outn = [] for verts_obj, faces_obj in zip(vertices, faces): # this is for one object fullList(offset, len(faces_obj)) fullList(radius, len(faces_obj)) verlen = set(range(len(verts_obj))) bme = bmesh_from_pydata(verts_obj, [], faces_obj) geom_in = bme.verts[:] + bme.edges[:] + bme.faces[:] bmesh.ops.recalc_face_normals(bme, faces=bme.faces[:]) list_0 = [f.index for f in bme.faces] # calculation itself result = \ self.Offset_pols(bme, list_0, offset, radius, nsides, verlen) outv.append(result[0]) oute.append(result[1]) outo.append(result[2]) outn.append(result[3]) if self.outputs['Vers'].links: SvSetSocketAnyType(self, 'Vers', outv) if self.outputs['Edgs'].links: SvSetSocketAnyType(self, 'Edgs', oute) if self.outputs['OutPols'].links: SvSetSocketAnyType(self, 'OutPols', outo) if self.outputs['InPols'].links: SvSetSocketAnyType(self, 'InPols', outn)
def update(self): if self.outputs['Vers'].links and self.inputs['Vers'].links: vertices = Vector_generate(SvGetSocketAnyType(self, self.inputs['Vers'])) faces = SvGetSocketAnyType(self, self.inputs['Pols']) offset = self.inputs['Offset'].sv_get()[0] nsides = self.inputs['N sides'].sv_get()[0][0] radius = self.inputs['Radius'].sv_get()[0] #print(radius,nsides,offset) outv = [] oute = [] outo = [] outn = [] for verts_obj, faces_obj in zip(vertices, faces): # this is for one object fullList(offset, len(faces_obj)) fullList(radius, len(faces_obj)) verlen = set(range(len(verts_obj))) bme = bmesh_from_pydata(verts_obj, [], faces_obj) geom_in = bme.verts[:]+bme.edges[:]+bme.faces[:] bmesh.ops.recalc_face_normals(bme, faces=bme.faces[:]) list_0 = [ f.index for f in bme.faces ] # calculation itself result = \ self.Offset_pols(bme, list_0, offset, radius, nsides, verlen) outv.append(result[0]) oute.append(result[1]) outo.append(result[2]) outn.append(result[3]) if self.outputs['Vers'].links: SvSetSocketAnyType(self, 'Vers', outv) if self.outputs['Edgs'].links: SvSetSocketAnyType(self, 'Edgs', oute) if self.outputs['OutPols'].links: SvSetSocketAnyType(self, 'OutPols', outo) if self.outputs['InPols'].links: SvSetSocketAnyType(self, 'InPols', outn)
def fill_holes(vertices, edges, s): if not edges and not vertices: return False if len(edges[0]) != 2: return False bm = bmesh_from_pydata(vertices, edges, []) res = bmesh.ops.holes_fill(bm, edges=bm.edges[:], sides=s) bmesh.ops.recalc_face_normals(bm, faces=bm.faces[:]) edges = [] faces = [] bm.verts.index_update() bm.edges.index_update() bm.faces.index_update() for edge in bm.edges[:]: edges.append([v.index for v in edge.verts[:]]) verts = [vert.co[:] for vert in bm.verts[:]] for face in bm.faces: faces.append([v.index for v in face.verts[:]]) bm.clear() bm.free() return (verts, edges, faces)