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