From 43d7ed7cc9e582e9a02089c17d1eebb2e91e989e Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Fri, 8 Nov 2019 22:27:54 -0500 Subject: [PATCH] Add operator for copying modifiers to many objects. --- korman/operators/op_modifier.py | 103 +++++++++++++++++++------------- korman/ui/ui_modifiers.py | 2 + 2 files changed, 65 insertions(+), 40 deletions(-) diff --git a/korman/operators/op_modifier.py b/korman/operators/op_modifier.py index a587d78..6f55aa2 100644 --- a/korman/operators/op_modifier.py +++ b/korman/operators/op_modifier.py @@ -72,46 +72,7 @@ class ModifierAddOperator(ModifierOperator, bpy.types.Operator): return {"FINISHED"} -class ModifierCopyOperator(ModifierOperator, bpy.types.Operator): - bl_idname = "object.plasma_modifier_copy" - bl_label = "Copy Modifiers" - bl_description = "Copy Modifiers from an Object" - - active_modifier = IntProperty(name="Modifier Display Order", - default=-1, - options={"HIDDEN"}) - - def execute(self, context): - pl_scene = context.scene.plasma_scene - pl_scene.modifier_copy_object = context.object - pl_mod = self._get_modifier(context) - if pl_mod is None: - pl_scene.property_unset("modifier_copy_id") - else: - pl_scene.modifier_copy_id = pl_mod.pl_id - return {"FINISHED"} - - -class ModifierPasteOperator(ModifierOperator, bpy.types.Operator): - bl_idname = "object.plasma_modifier_paste" - bl_label = "Paste Modifier" - bl_description = "Paste Modifier(s) to another Object" - - def execute(self, context): - pl_scene = context.scene.plasma_scene - if not pl_scene.is_property_set("modifier_copy_object"): - raise RuntimeError() - - dst_object, src_object = context.object, pl_scene.modifier_copy_object - pl_mod_id = pl_scene.modifier_copy_id - - if pl_mod_id: - self._paste_modifier(src_object, dst_object, pl_mod_id) - else: - for mod_cls in modifiers.PlasmaModifierProperties.__subclasses__(): - self._paste_modifier(src_object, dst_object, mod_cls.pl_id) - return {"FINISHED"} - +class ModifierClipboard: def _paste_modifier(self, src_object, dst_object, pl_mod_id): src_mod = getattr(src_object.plasma_modifiers, pl_mod_id) dst_mod = getattr(dst_object.plasma_modifiers, pl_mod_id) @@ -155,6 +116,68 @@ class ModifierPasteOperator(ModifierOperator, bpy.types.Operator): except AttributeError: pass + +class ModifierCopyOperator(ModifierOperator, bpy.types.Operator): + bl_idname = "object.plasma_modifier_copy" + bl_label = "Copy Modifiers" + bl_description = "Copy Modifiers from an Object" + + active_modifier = IntProperty(name="Modifier Display Order", + default=-1, + options={"HIDDEN"}) + + def execute(self, context): + pl_scene = context.scene.plasma_scene + pl_scene.modifier_copy_object = context.object + pl_mod = self._get_modifier(context) + if pl_mod is None: + pl_scene.property_unset("modifier_copy_id") + else: + pl_scene.modifier_copy_id = pl_mod.pl_id + return {"FINISHED"} + + +class ModifierCopyToOperator(ModifierClipboard, ModifierOperator, bpy.types.Operator): + bl_idname = "object.plasma_modifier_copy_to_selection" + bl_label = "Copy Modifiers to Selection" + bl_description = "Copy Modifiers from the active Object to all selected Objects" + + def _iter_objects(self, context): + for i in context.selected_objects: + if i != context.active_object: + yield i + + def execute(self, context): + if not any(self._iter_objects(context)): + self.report({"WARNING"}, "No objects are selected to copy to.") + return {"CANCELLED"} + for i in self._iter_objects(context): + for mod_cls in modifiers.PlasmaModifierProperties.__subclasses__(): + self._paste_modifier(context.active_object, i, mod_cls.pl_id) + self.report({"INFO"}, "Copied Plasma Modifers to selection.") + return {"FINISHED"} + + +class ModifierPasteOperator(ModifierClipboard, ModifierOperator, bpy.types.Operator): + bl_idname = "object.plasma_modifier_paste" + bl_label = "Paste Modifier" + bl_description = "Paste Modifier(s) to another Object" + + def execute(self, context): + pl_scene = context.scene.plasma_scene + if not pl_scene.is_property_set("modifier_copy_object"): + raise RuntimeError() + + dst_object, src_object = context.object, pl_scene.modifier_copy_object + pl_mod_id = pl_scene.modifier_copy_id + + if pl_mod_id: + self._paste_modifier(src_object, dst_object, pl_mod_id) + else: + for mod_cls in modifiers.PlasmaModifierProperties.__subclasses__(): + self._paste_modifier(src_object, dst_object, mod_cls.pl_id) + return {"FINISHED"} + @classmethod def poll(cls, context): pl_scene = context.scene.plasma_scene diff --git a/korman/ui/ui_modifiers.py b/korman/ui/ui_modifiers.py index 49a7a77..b29d7a3 100644 --- a/korman/ui/ui_modifiers.py +++ b/korman/ui/ui_modifiers.py @@ -95,5 +95,7 @@ class PlasmaModifiersSpecialMenu(ModifierButtonsPanel, bpy.types.Menu): def draw(self, context): layout = self.layout + layout.operator("object.plasma_modifier_copy_to_selection", icon="PASTEDOWN") + layout.separator() layout.operator("object.plasma_modifier_copy", icon="COPYDOWN", text="Copy Modifiers").active_modifier = -1 layout.operator("object.plasma_modifier_paste", icon="PASTEDOWN", text="Paste Modifier(s)")