Created
September 21, 2020 03:34
-
-
Save falldeaf/16de001091e8bf8cf93599ec62b7723b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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