Context Sensitive Modeling Script - Bmesh subdivide_edges issue

Hi people!
I’m super new to Blender, fresh off the boat from 3ds Max and to make my transition a little easier I decided to rewrite a little script that I used in max all the time.

Its basically a “Connect everything” script which does a lot of different things, depending on the selection and the selection mode.

here is the code WIP as it currently stands:


import bpy
import bmesh
class ConnectEverything(bpy.types.Operator):
    """Connect Everything"""      # Use this as a tool-tip for menu items and buttons.
    bl_idname = "mesh.connect_everything"        # Unique identifier for buttons and menu items to reference.
    bl_label = "Connect Everything"         # Display name in the interface.
    bl_options = {'REGISTER', 'UNDO'}  # Enable undo for the operator.
    
    def finish( self, bm, me ):
        bpy.ops.object.mode_set(mode='OBJECT')  
        
        bm.to_mesh(me)
        bm.free()


        bpy.ops.object.mode_set(mode='EDIT') 
      
    def deselectAll( self, bm):
        for edge in bm.edges:
            edge.select_set(False)  
        for vert in bm.verts:
            vert.select_set(False)      
            
    def selectEdges( self, bm, edgelist):
        
        bm.edges.ensure_lookup_table()
        bm.verts.ensure_lookup_table() 
        
        self.deselectAll( bm )
        self.report({'INFO'}, 'edgelist ' + str(edgelist) )
 
        edgesToSelect = [e for e in edgelist if type(e) == bmesh.types.BMEdge]
        for e in edgesToSelect:
            bm.edges[e.index].select = True


        vertsToSelect = [v for v in edgelist if type(v) == bmesh.types.BMVert]
        for v in vertsToSelect:
            bm.verts[v.index].select = True
            
    def selectCommonVert( self, bm, selection):
        self.deselectAll( bm )
        bm.verts.ensure_lookup_table() 
        
        vertlist = []
        edgesToSelect = [e for e in selection if type(e) == bmesh.types.BMEdge]
        for e in edgesToSelect:
            vertlist.append( e.verts[0])
            vertlist.append( e.verts[1])
        
        vertsToSelect = [v for v in selection if type(v) == bmesh.types.BMVert]
        for v in vertsToSelect:
            if ( vertlist.count(v) > 1 ):
                bm.verts[v.index].select = True
        
    def execute(self, context):


        scene = context.scene
        self.report({'INFO'}, 'ConnectEveryting run')
        toolSettings = scene.tool_settings;
        
        bpy.ops.object.mode_set(mode='OBJECT')
        me = bpy.context.object.data
        bm  = bmesh.new()
        bm.from_mesh(me)
         
        if (toolSettings.mesh_select_mode[0]): # vertex
            selectedVerts = [v for v in bm.verts if v.select]
            vertCount = len( selectedVerts )
            if ( vertCount == 1 ):
                #self.report({'INFO'}, '1 verts' )
                self.finish(bm, me)
                
            elif ( vertCount > 1 ):
                edges = bmesh.ops.connect_verts(bm, verts=selectedVerts, faces_exclude=[], check_degenerate=False)
                #self.report({'INFO'}, 'more verts' )
                
                self.finish(bm, me)
                context.scene.tool_settings.mesh_select_mode = (False, True, False)
                
        elif (toolSettings.mesh_select_mode[1]): # edge
            selectedEdges = [e for e in bm.edges if e.select]
            edgeCount = len( selectedEdges )
            
            if ( edgeCount == 0):
                #self.report({'INFO'}, 'no edge' )
                self.finish(bm, me)
            elif ( edgeCount == 1):
                #self.report({'INFO'}, '1 edge' )
                result = bmesh.ops.bisect_edges(bm, edges = selectedEdges, cuts = 1)
                
                self.selectCommonVert( bm, result['geom_split'])
                
                self.finish(bm, me)
                context.scene.tool_settings.mesh_select_mode = (True, False, False)

#################   This is here is issue is: ##################                
            else:
                #self.report({'INFO'}, 'more edge' )
                result = bmesh.ops.subdivide_edges(bm, edges = selectedEdges, cuts = 1)
                
                self.selectEdges(bm, result['geom_inner'])
                
                self.finish(bm, me)
                context.scene.tool_settings.mesh_select_mode = (False, True, False)
#########################################################            
            
        elif (toolSettings.mesh_select_mode[2]): # face
            self.report({'INFO'}, 'face')
            self.finish(bm, me)
          
        return {'FINISHED'}            # Lets Blender know the operator finished successfully.

def register():
    bpy.utils.register_class(ConnectEverything)

def unregister():
    bpy.utils.unregister_class(ConnectEverything)

if __name__ == '__main__':
    register()

The issue I have right now is that “bmesh.ops.subdivide_edges(bm, edges = selectedEdges, cuts = 1)” does funny things under some circumstances



In this branch I want to connect two edges: Insert a vertex in the middle of each and connect those verts. Simple enough. But sometimes, in corners it connects it weirdly.
I just hope that its something simple… A bool param that I need to set or something. Did anyone come across this? Any ideas.

Cheers
Simon

look into tini cad
which has some feature like that

happy bl



#################   This is here is issue is: ##################                
            else:


                bpy.ops.object.mode_set(mode="EDIT")
                bpy.ops.mesh.subdivide()


                context.scene.tool_settings.mesh_select_mode = (False, True, False)
#########################################################            

Hope it helps

in edit mode you also have to select the right edge
then use the subdivide command
see Bmesh operators !

happy bl