[Bf-extensions-cvs] [47820f66] master: Collection Manager: Add ops for selected objects. Task: T69577
Ryan Inch
noreply at git.blender.org
Wed Jan 13 04:33:02 CET 2021
Commit: 47820f66c255ce816c29fc50431b39a5148d8353
Author: Ryan Inch
Date: Tue Jan 12 22:30:16 2021 -0500
Branches: master
https://developer.blender.org/rBA47820f66c255ce816c29fc50431b39a5148d8353
Collection Manager: Add ops for selected objects. Task: T69577
Add operators to isolate/disable the collections of selected objects.
===================================================================
M object_collection_manager/__init__.py
M object_collection_manager/internals.py
M object_collection_manager/operator_utils.py
M object_collection_manager/operators.py
M object_collection_manager/qcd_init.py
M object_collection_manager/qcd_operators.py
M object_collection_manager/ui.py
===================================================================
diff --git a/object_collection_manager/__init__.py b/object_collection_manager/__init__.py
index 4c8901ce..6a93ecd1 100644
--- a/object_collection_manager/__init__.py
+++ b/object_collection_manager/__init__.py
@@ -22,7 +22,7 @@ bl_info = {
"name": "Collection Manager",
"description": "Manage collections and their objects",
"author": "Ryan Inch",
- "version": (2, 18, 5),
+ "version": (2, 19, 0),
"blender": (2, 80, 0),
"location": "View3D - Object Mode (Shortcut - M)",
"warning": '', # used for warning icon and text in addons panel
diff --git a/object_collection_manager/internals.py b/object_collection_manager/internals.py
index c95328c8..77e801f6 100644
--- a/object_collection_manager/internals.py
+++ b/object_collection_manager/internals.py
@@ -638,14 +638,14 @@ def get_move_selection(*, names_only=False):
return {obj for obj in bpy.data.objects if obj.name in move_selection}
-def get_move_active():
+def get_move_active(*, always=False):
global move_active
global move_selection
if not move_active:
move_active = getattr(bpy.context.view_layer.objects.active, "name", None)
- if move_active not in get_move_selection(names_only=True):
+ if not always and move_active not in get_move_selection(names_only=True):
move_active = None
return bpy.data.objects[move_active] if move_active else None
diff --git a/object_collection_manager/operator_utils.py b/object_collection_manager/operator_utils.py
index 8b637a57..820ab1bb 100644
--- a/object_collection_manager/operator_utils.py
+++ b/object_collection_manager/operator_utils.py
@@ -26,6 +26,7 @@ from . import internals
from .internals import (
update_property_group,
get_move_selection,
+ get_move_active,
)
mode_converter = {
@@ -244,6 +245,122 @@ def isolate_rto(cls, self, view_layer, rto, *, children=False):
cls.isolated = True
+def isolate_sel_objs_collections(view_layer, rto, caller, *, use_active=False):
+ selected_objects = get_move_selection()
+
+ if use_active:
+ selected_objects.add(get_move_active(always=True))
+
+ if not selected_objects:
+ return "No selected objects"
+
+ off = set_off_on[rto]["off"]
+ on = set_off_on[rto]["on"]
+
+ if caller == "CM":
+ history = internals.rto_history[rto+"_all"][view_layer]
+
+ elif caller == "QCD":
+ history = internals.qcd_history[view_layer]
+
+
+ # if not isolated, isolate collections of selected objects
+ if len(history) == 0:
+ keep_history = False
+
+ # save history and isolate RTOs
+ for item in internals.layer_collections.values():
+ history.append(get_rto(item["ptr"], rto))
+ rto_state = off
+
+ # check if any of the selected objects are in the collection
+ if not set(selected_objects).isdisjoint(item["ptr"].collection.objects):
+ rto_state = on
+
+ if history[-1] != rto_state:
+ keep_history = True
+
+ if rto == "exclude":
+ set_exclude_state(item["ptr"], rto_state)
+
+ else:
+ set_rto(item["ptr"], rto, rto_state)
+
+ # activate all parents if needed
+ if rto_state == on and rto not in ["holdout", "indirect"]:
+ laycol = item["parent"]
+ while laycol["id"] != 0:
+ set_rto(laycol["ptr"], rto, on)
+ laycol = laycol["parent"]
+
+
+ if not keep_history:
+ history.clear()
+
+ return "Collection already isolated"
+
+
+ else:
+ for x, item in enumerate(internals.layer_collections.values()):
+ set_rto(item["ptr"], rto, history[x])
+
+ # clear history
+ if caller == "CM":
+ del internals.rto_history[rto+"_all"][view_layer]
+
+ elif caller == "QCD":
+ del internals.qcd_history[view_layer]
+
+
+def disable_sel_objs_collections(view_layer, rto, caller):
+ off = set_off_on[rto]["off"]
+ on = set_off_on[rto]["on"]
+ selected_objects = get_move_selection()
+
+ if caller == "CM":
+ history = internals.rto_history[rto+"_all"][view_layer]
+
+ elif caller == "QCD":
+ history = internals.qcd_history[view_layer]
+
+
+ if not selected_objects and not history:
+ # clear history
+ if caller == "CM":
+ del internals.rto_history[rto+"_all"][view_layer]
+
+ elif caller == "QCD":
+ del internals.qcd_history[view_layer]
+
+ return "No selected objects"
+
+ # if not disabled, disable collections of selected objects
+ if len(history) == 0:
+ # save history and disable RTOs
+ for item in internals.layer_collections.values():
+ history.append(get_rto(item["ptr"], rto))
+
+ # check if any of the selected objects are in the collection
+ if not set(selected_objects).isdisjoint(item["ptr"].collection.objects):
+ if rto == "exclude":
+ set_exclude_state(item["ptr"], off)
+
+ else:
+ set_rto(item["ptr"], rto, off)
+
+
+ else:
+ for x, item in enumerate(internals.layer_collections.values()):
+ set_rto(item["ptr"], rto, history[x])
+
+ # clear history
+ if caller == "CM":
+ del internals.rto_history[rto+"_all"][view_layer]
+
+ elif caller == "QCD":
+ del internals.qcd_history[view_layer]
+
+
def toggle_children(self, view_layer, rto):
laycol_ptr = internals.layer_collections[self.name]["ptr"]
# clear rto history
diff --git a/object_collection_manager/operators.py b/object_collection_manager/operators.py
index 94b7518d..45dc4df5 100644
--- a/object_collection_manager/operators.py
+++ b/object_collection_manager/operators.py
@@ -59,6 +59,8 @@ from .operator_utils import (
remove_collection,
select_collection_objects,
set_exclude_state,
+ isolate_sel_objs_collections,
+ disable_sel_objs_collections,
)
from . import ui
@@ -441,6 +443,8 @@ class CMUnExcludeAllOperator(Operator):
bl_description = (
" * LMB - Enable all/Restore.\n"
" * Shift+LMB - Invert.\n"
+ " * Shift+Ctrl+LMB - Isolate collections w/ selected objects.\n"
+ " * Shift+Alt+LMB - Disable collections w/ selected objects.\n"
" * Ctrl+LMB - Copy/Paste RTOs.\n"
" * Ctrl+Alt+LMB - Swap RTOs.\n"
" * Alt+LMB - Discard history"
@@ -472,6 +476,20 @@ class CMUnExcludeAllOperator(Operator):
elif modifiers == {"shift"}:
invert_rtos(view_layer, "exclude")
+ elif modifiers == {"shift", "ctrl"}:
+ error = isolate_sel_objs_collections(view_layer, "exclude", "CM")
+
+ if error:
+ self.report({"WARNING"}, error)
+ return {'CANCELLED'}
+
+ elif modifiers == {"shift", "alt"}:
+ error = disable_sel_objs_collections(view_layer, "exclude", "CM")
+
+ if error:
+ self.report({"WARNING"}, error)
+ return {'CANCELLED'}
+
else:
activate_all_rtos(view_layer, "exclude")
@@ -550,6 +568,8 @@ class CMUnRestrictSelectAllOperator(Operator):
bl_description = (
" * LMB - Enable all/Restore.\n"
" * Shift+LMB - Invert.\n"
+ " * Shift+Ctrl+LMB - Isolate collections w/ selected objects.\n"
+ " * Shift+Alt+LMB - Disable collections w/ selected objects.\n"
" * Ctrl+LMB - Copy/Paste RTOs.\n"
" * Ctrl+Alt+LMB - Swap RTOs.\n"
" * Alt+LMB - Discard history"
@@ -579,6 +599,20 @@ class CMUnRestrictSelectAllOperator(Operator):
elif modifiers == {"shift"}:
invert_rtos(view_layer, "select")
+ elif modifiers == {"shift", "ctrl"}:
+ error = isolate_sel_objs_collections(view_layer, "select", "CM")
+
+ if error:
+ self.report({"WARNING"}, error)
+ return {'CANCELLED'}
+
+ elif modifiers == {"shift", "alt"}:
+ error = disable_sel_objs_collections(view_layer, "select", "CM")
+
+ if error:
+ self.report({"WARNING"}, error)
+ return {'CANCELLED'}
+
else:
activate_all_rtos(view_layer, "select")
@@ -649,6 +683,8 @@ class CMUnHideAllOperator(Operator):
bl_description = (
" * LMB - Enable all/Restore.\n"
" * Shift+LMB - Invert.\n"
+ " * Shift+Ctrl+LMB - Isolate collections w/ selected objects.\n"
+ " * Shift+Alt+LMB - Disable collections w/ selected objects.\n"
" * Ctrl+LMB - Copy/Paste RTOs.\n"
" * Ctrl+Alt+LMB - Swap RTOs.\n"
" * Alt+LMB - Discard history"
@@ -678,6 +714,20 @@ class CMUnHideAllOperator(Operator):
elif modifiers == {"shift"}:
invert_rtos(view_layer, "hide")
+ elif modifiers == {"shift", "ctrl"}:
+ error = isolate_sel_objs_collections(view_layer, "hide", "CM")
+
+ if error:
+ self.report({"WARNING"}, error)
+ return {'CANCELLED'}
+
+ elif modifiers == {"shift", "alt"}:
+ error = disable_sel_objs_collections(view_layer, "hide", "CM")
+
+ if error:
+ self.report({"WARNING"}, error)
+ return {'CANCELLED'}
+
else:
activate_all_rtos(view_layer, "hide")
@@ -748,6 +798,8 @@ class CMUnDisableViewportAllOperator(Operator):
bl_description = (
" * LMB - Enable all/Restore.\n"
" * Shift+LMB - Invert.\n"
+ " * Shift+Ctrl+LMB - Isolate collections w/ selected objects.\n"
+ " * Shift+Alt+LMB - Disable collections w/ selected objects.\n"
" * Ctrl+LMB - Copy/Paste RTOs.\n"
" * Ctrl+Alt+LMB - Swap RTOs.\n"
" * Alt+LMB - Discard history"
@@ -777,6 +829,20 @@ class CMUnDisableViewportAllOperator(Operator):
elif modifiers == {"shift"}:
invert_rtos(view_layer, "disable")
+ elif modifiers == {"shift", "ctrl"}:
+ error = isolate_sel_objs_collections(vi
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list