BIM: Hide all objects that aren't selected during Isolate
Currently if user selects an item and does `Isolate` operation on it in BIM, everything is being hidden if the item was inside another container (like Building). This is because we are prioritizing on hiding parents of current object if they are not the selected ones, which is causing the child of the parent to be hidden as well (duh). So, this patch fixes isolate method to hide all other parents and their childs. If they are not a parent of our child under selection -> hide them and proceed further. If we are processing parent of our selection, just hide anything on current level that is not our selection while leaving parent intact.
This commit is contained in:
committed by
Yorik van Havre
parent
f9d79627b5
commit
d24dabbdc2
@@ -448,17 +448,46 @@ class BIM_Views:
|
||||
FreeCAD.ActiveDocument.recompute()
|
||||
|
||||
def isolate(self):
|
||||
"turns all items off except the selected ones"
|
||||
"""
|
||||
Traverse the tree and hide all items (and their ancestors) that are not the currently
|
||||
selected item or a descendant of the currently selected item.
|
||||
|
||||
This ensures that only the selected item and its ancestors remain visible, while
|
||||
all other items are hidden.
|
||||
"""
|
||||
|
||||
vm = findWidget()
|
||||
if vm:
|
||||
onnames = [item.toolTip(0) for item in vm.tree.selectedItems()]
|
||||
for i in range(vm.tree.topLevelItemCount()):
|
||||
item = vm.tree.topLevelItem(i)
|
||||
if item.toolTip(0) not in onnames:
|
||||
obj = FreeCAD.ActiveDocument.getObject(item.toolTip(0))
|
||||
onnames = vm.tree.selectedItems()
|
||||
selectedItsTooltips = [item.toolTip(0) for item in vm.tree.selectedItems()]
|
||||
def is_ancestor_of_any(potential_parent, selected_items):
|
||||
"""Check if potential_parent is an ancestor of ANY selected item."""
|
||||
for item in selected_items:
|
||||
current = item.parent()
|
||||
while current:
|
||||
if current.toolTip(0) == potential_parent:
|
||||
return True
|
||||
current = current.parent()
|
||||
return False
|
||||
|
||||
def traverse_and_hide(item):
|
||||
"""Recursively traverse the tree and hide/show parents accordingly."""
|
||||
toolTip = item.toolTip(0)
|
||||
obj = FreeCAD.ActiveDocument.getObject(toolTip)
|
||||
if toolTip not in selectedItsTooltips and not is_ancestor_of_any(toolTip, onnames):
|
||||
if obj:
|
||||
obj.ViewObject.Visibility = False
|
||||
|
||||
# Traverse on lower levels of this tree only if we didn't hide current level
|
||||
if obj and obj.ViewObject.Visibility != False:
|
||||
for i in range(item.childCount()):
|
||||
traverse_and_hide(item.child(i))
|
||||
|
||||
# Start from top-level items
|
||||
for i in range(vm.tree.topLevelItemCount()):
|
||||
top_item = vm.tree.topLevelItem(i)
|
||||
traverse_and_hide(top_item)
|
||||
|
||||
FreeCAD.ActiveDocument.recompute()
|
||||
|
||||
def saveView(self):
|
||||
|
||||
Reference in New Issue
Block a user