Esempio n. 1
0
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))
Esempio n. 2
0
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)
Esempio n. 3
0
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
Esempio n. 4
0
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))
Esempio n. 5
0
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)
Esempio n. 6
0
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
Esempio n. 7
0
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)
Esempio n. 8
0
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)
Esempio n. 9
0
    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)
Esempio n. 10
0
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))
Esempio n. 11
0
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
Esempio n. 12
0
    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)
Esempio n. 13
0
 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)
Esempio n. 14
0
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)
Esempio n. 15
0
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)