diff options
-rw-r--r-- | release/scripts/startup/bl_operators/object.py | 33 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/properties_collection.py | 16 |
2 files changed, 47 insertions, 2 deletions
diff --git a/release/scripts/startup/bl_operators/object.py b/release/scripts/startup/bl_operators/object.py index f5759255e22..60f534b3ab6 100644 --- a/release/scripts/startup/bl_operators/object.py +++ b/release/scripts/startup/bl_operators/object.py @@ -855,6 +855,37 @@ class DupliOffsetFromCursor(Operator): return {'FINISHED'} +class DupliOffsetToCursor(Operator): + """Set cursor position to the offset used for collection instances""" + bl_idname = "object.instance_offset_to_cursor" + bl_label = "Set Cursor to Offset" + bl_options = {'INTERNAL', 'UNDO'} + + def execute(self, context): + scene = context.scene + collection = context.collection + scene.cursor.location = collection.instance_offset + return {'FINISHED'} + + +class DupliOffsetFromObject(Operator): + """Set offset used for collection instances based on the active object position""" + bl_idname = "object.instance_offset_from_object" + bl_label = "Set Offset from Object" + bl_options = {'INTERNAL', 'UNDO'} + + @classmethod + def poll(cls, context): + return (context.active_object is not None) + + def execute(self, context): + ob_eval = context.active_object.evaluated_get(context.view_layer.depsgraph) + world_loc = ob_eval.matrix_world.to_translation() + collection = context.collection + collection.instance_offset = world_loc + return {'FINISHED'} + + class LoadImageAsEmpty: bl_options = {'REGISTER', 'UNDO'} @@ -976,6 +1007,8 @@ class OBJECT_OT_assign_property_defaults(Operator): classes = ( ClearAllRestrictRender, DupliOffsetFromCursor, + DupliOffsetToCursor, + DupliOffsetFromObject, IsolateTypeRender, JoinUVs, LoadBackgroundImage, diff --git a/release/scripts/startup/bl_ui/properties_collection.py b/release/scripts/startup/bl_ui/properties_collection.py index 78e9c60a752..bd43ab32f37 100644 --- a/release/scripts/startup/bl_ui/properties_collection.py +++ b/release/scripts/startup/bl_ui/properties_collection.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-or-later -from bpy.types import Panel +from bpy.types import Panel, Menu class CollectionButtonsPanel: @@ -42,6 +42,16 @@ class COLLECTION_PT_collection_flags(CollectionButtonsPanel, Panel): col.prop(vlc, "indirect_only", toggle=False) +class COLLECTION_MT_context_menu_instance_offset(Menu): + bl_label = "Instance Offset" + + def draw(self, _context): + layout = self.layout + layout.operator("object.instance_offset_from_cursor") + layout.operator("object.instance_offset_from_object") + layout.operator("object.instance_offset_to_cursor") + + class COLLECTION_PT_instancing(CollectionButtonsPanel, Panel): bl_label = "Instancing" @@ -51,8 +61,9 @@ class COLLECTION_PT_instancing(CollectionButtonsPanel, Panel): layout.use_property_decorate = False collection = context.collection - row = layout.row() + row = layout.row(align=True) row.prop(collection, "instance_offset") + row.menu("COLLECTION_MT_context_menu_instance_offset", icon='DOWNARROW_HLT', text="") class COLLECTION_PT_lineart_collection(CollectionButtonsPanel, Panel): @@ -80,6 +91,7 @@ class COLLECTION_PT_lineart_collection(CollectionButtonsPanel, Panel): classes = ( + COLLECTION_MT_context_menu_instance_offset, COLLECTION_PT_collection_flags, COLLECTION_PT_instancing, COLLECTION_PT_lineart_collection, |