Skip to content

Instantly share code, notes, and snippets.

@falldeaf
Created September 21, 2020 03:34
Show Gist options
  • Save falldeaf/16de001091e8bf8cf93599ec62b7723b to your computer and use it in GitHub Desktop.
Save falldeaf/16de001091e8bf8cf93599ec62b7723b to your computer and use it in GitHub Desktop.
bl_info = {
"name": "Collection Helpers",
"description": "Operators and hotkeys for selecting (Alt+L), duplicating (Ctrl+D), and deleting (Ctrl+X) entire collections based on one member object",
"author": "Tom Mardis (Falldeaf)",
"version": (1, 0),
"blender": (2, 82, 7),
"location": "Object Context Menu",
#"warning": "", # used for warning icon and text in addons panel
#"wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/My_Script",
"tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/",
"support": "COMMUNITY",
"category": "Object",
}
import bpy
from bpy.props import StringProperty
class CollectionHelpers(bpy.types.Operator):
bl_idname = "object.collection_helper"
bl_label = "Collection Helpers"
bl_options = {'REGISTER'}
action: StringProperty()
@staticmethod
def selectCollection():
obj = bpy.context.active_object
for cobj in obj.users_collection[0].all_objects:
cobj.select_set(True)
@staticmethod
def duplicateCollection():
obj = bpy.context.active_object
source_collection = obj.users_collection[0]
destination_collection = bpy.data.collections.new(source_collection.name)
bpy.context.scene.collection.children.link(destination_collection)
for cobj in [o for o in source_collection.objects if o.type == "MESH"]:
new_obj = cobj.copy()
new_obj.data = cobj.data.copy()
destination_collection.objects.link(new_obj)
bpy.ops.object.select_all(action='DESELECT')
for cobj2 in destination_collection.all_objects:
cobj2.select_set(True)
bpy.ops.transform.translate('INVOKE_DEFAULT')
@staticmethod
def deleteCollection():
obj = bpy.context.active_object
col_to_del = obj.users_collection[0]
for cobj in col_to_del.all_objects:
bpy.data.objects.remove(cobj)
bpy.data.collections.remove(col_to_del)
def execute(self, context):
if self.action == 'sel':
self.selectCollection()
elif self.action == 'dup':
self.duplicateCollection()
elif self.action == 'del':
self.deleteCollection()
return {'FINISHED'}
def menu_draw(self, context):
layout = self.layout
layout.operator("object.collection_helper", text="Select Collection").action = 'sel'
layout.operator("object.collection_helper", text="Duplicate Collection").action = 'dup'
layout.operator("object.collection_helper", text="Delete Collection").action = 'del'
layout.separator()
#selectCollection()
#duplicateCollection()
#deleteCollection()
# store keymaps here to access after registration
addon_keymaps = []
def register():
bpy.utils.register_class(CollectionHelpers)
bpy.types.VIEW3D_MT_object_context_menu.prepend(menu_draw)
# keymap for select
wm = bpy.context.window_manager
km = wm.keyconfigs.addon.keymaps.new(name='Object Mode', space_type='EMPTY')
kmi = km.keymap_items.new(CollectionHelpers.bl_idname, 'L', 'PRESS', alt=True)
kmi.properties.action = "sel"
addon_keymaps.append((km, kmi))
# keymap for duplicate
km2 = wm.keyconfigs.addon.keymaps.new(name='Object Mode', space_type='EMPTY')
kmi2 = km2.keymap_items.new(CollectionHelpers.bl_idname, 'D', 'PRESS', ctrl=True)
kmi2.properties.action = "dup"
addon_keymaps.append((km2, kmi2))
# keymap for delete
km3 = wm.keyconfigs.addon.keymaps.new(name='Object Mode', space_type='EMPTY')
kmi3 = km3.keymap_items.new(CollectionHelpers.bl_idname, 'X', 'PRESS', ctrl=True)
kmi3.properties.action = "del"
addon_keymaps.append((km3, kmi3))
def unregister():
bpy.types.VIEW3D_MT_object_context_menu.remove(menu_draw)
bpy.utils.unregister_class(CollectionHelpers)
# handle the keymap
for km, kmi in addon_keymaps:
km.keymap_items.remove(kmi)
addon_keymaps.clear()
if __name__ == "__main__":
register()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment