diff options
author | Ryan Inch <mythologylover75@gmail.com> | 2021-01-13 06:30:16 +0300 |
---|---|---|
committer | Ryan Inch <mythologylover75@gmail.com> | 2021-01-13 06:30:16 +0300 |
commit | 47820f66c255ce816c29fc50431b39a5148d8353 (patch) | |
tree | e62c44155b67a8ff88cffe4a2d2e983ad3d17f40 /object_collection_manager/operator_utils.py | |
parent | 589d13408a60cbec34a8bc3cc798c586043743ae (diff) |
Collection Manager: Add ops for selected objects. Task: T69577
Add operators to isolate/disable the collections of selected objects.
Diffstat (limited to 'object_collection_manager/operator_utils.py')
-rw-r--r-- | object_collection_manager/operator_utils.py | 117 |
1 files changed, 117 insertions, 0 deletions
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 |