OverviewFilesCommitsIssuesDocsReleasesPeers

hardops / operators / editmode / star_connect.py

58 lines · python ref:
import bpy
import bmesh


class HOPS_OT_StarConnect(bpy.types.Operator):
    bl_idname = "hops.star_connect"
    bl_label = "Hops Star Connect"
    bl_options = {'REGISTER', 'UNDO'}
    bl_description = "Allows an edge to be created between more than 2 points"

    @classmethod
    def poll(cls, context):
        if context.active_object != None:
            object = context.active_object
            return(object.type == 'MESH' and context.mode == 'EDIT_MESH')
        return False

    def execute(self, context):

        # bmesh version of MACHIN3's star connect

        obj = bpy.context.object
        me = obj.data
        bm = bmesh.from_edit_mesh(me)

        # check if at least 2 verts are selected
        selected = [v.index for v in bm.verts if v.select]
        if len(selected) < 2:
            return {'FINISHED'}

        bpy.ops.mesh.select_mode(type="VERT")

        # uses active vert from history (should be faster) or last selected if it doesn't exist
        try:
            av = bm.select_history.active
            av.select_set(0)
        except:
            lastvert = selected[-1]
            av = bm.verts[lastvert]
            av.select_set(0)

        verts = []

        # conects all selected verts to active one
        for v in bm.verts:
            if v.select:
                verts.append(v)
                verts.append(av)
                bm.select_history.add(av)
                bmesh.ops.connect_verts(bm, verts=verts)
                verts[:] = []

        av.select_set(1)

        bmesh.update_edit_mesh(me)

        return {'FINISHED'}