Hi guys.
I’m trying to make a small creak that would blender himself understood that it is necessary to put far (without the context menu).
I encountered a problem that when you delete an object in the object mode occurs only if at least one active object, how to do that he would have worked even if there is no active among the selected object
video bug - https://monosnap.com/file/fj3BbUSYOk5iGFKaTCifQ8DUemjD5x
code
import bpy
bl_info = {
"name": "Smart Delete :)",
"location": "View3D > Add > Mesh > Smart Delete,",
"description": "Auto detect a delete elements",
"author": "Vladislav Kindushov",
"version": (0,1),
"blender": (2, 7, 7),
"category": "Mesh",
}
def find_connected_verts(me, found_index):
edges = me.edges
connecting_edges = [i for i in edges if found_index in i.vertices[:]]
print('connecting_edges',len(connecting_edges))
return len(connecting_edges)
class MeshDissolveContextual(bpy.types.Operator):
""" Dissolves mesh elements based on context instead
of forcing the user to select from a menu what
it should dissolve.
"""
bl_idname = "mesh.dissolve_contextual"
bl_label = "Mesh Dissolve Contextual"
bl_options = {'UNDO'}
use_verts = bpy.props.BoolProperty(name="Use Verts", default=False)
@classmethod
def poll(cls, context):
return (context.active_object is not None)# and (context.mode == "EDIT_MESH")
def execute(self, context):
if bpy.context.mode == 'OBJECT':
bpy.ops.object.delete()
print ('hello')
elif bpy.context.mode == 'EDIT_MESH':
select_mode = context.tool_settings.mesh_select_mode
me = context.object.data
if select_mode[0]:
bpy.ops.mesh.dissolve_verts()
elif select_mode[1] and not select_mode[2]:
bpy.ops.mesh.dissolve_edges(use_verts=self.use_verts)
bpy.ops.mesh.select_mode(type='VERT')
bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.object.mode_set(mode='EDIT')
vs = [v.index for v in me.vertices if v.select]
bpy.ops.mesh.select_all(action='DESELECT')
bpy.ops.object.mode_set(mode='OBJECT')
for v in vs:
vv = find_connected_verts(me, v)
if vv==2:
me.vertices[v].select = True
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.dissolve_verts()
bpy.ops.mesh.select_all(action='DESELECT')
for v in vs:
me.vertices[v].select = True
elif select_mode[2] and not select_mode[1]:
bpy.ops.mesh.delete(type='FACE')
else:
bpy.ops.mesh.dissolve_verts()
return {'FINISHED'}
bpy.utils.register_class(MeshDissolveContextual)
def register():
#bpy.utils.register_class(SmartDelete)
kc = bpy.context.window_manager.keyconfigs.addon
if kc:
km = kc.keymaps.new(name="3D View", space_type="VIEW_3D")
kmi = km.keymap_items.new('mesh.dissolve_contextual', 'X', 'PRESS',)
def unregister():
bpy.utils.unregister_class(MeshDissolveContextual)
kc = bpy.context.window_manager.keyconfigs.addon
if kc:
km = kc.keymaps["3D View"]
for kmi in km.keymap_items:
if kmi.idname == 'mesh.dissolve_contextual':
km.keymap_items.remove(kmi)
break
if __name__ == "__main__":
register()