bbim bcf - fix issues setting visibility exceptions

1) bpy.ops.object.hide_view_set doesn't actually work with context provided selected objects - it's checking whether they're actually selected
2) bpy.ops.object.hide_view_clear wasn't using select=False, selecting revealed objects which might get in the way later.
3) used new api for getting visibility settings
This commit is contained in:
Andrej730
2024-08-12 14:07:33 +05:00
parent 73e5985777
commit 65cc5bf4c1
@@ -998,43 +998,46 @@ class ActivateBcfViewpoint(bpy.types.Operator):
self.set_colours(viewpoint)
def set_exceptions(self, viewpoint: bcf.v2.visinfo.VisualizationInfoHandler, context: bpy.types.Context) -> None:
if not hasattr(viewpoint.visualization_info.components, "visibility") or not hasattr(
viewpoint.visualization_info.components.visibility.exceptions, "component"
):
visibility_settings = viewpoint.get_elements_visibility()
if visibility_settings is None:
return
exception_global_ids = {
v.ifc_guid for v in viewpoint.visualization_info.components.visibility.exceptions.component or []
}
default_visibility, exception_global_ids = visibility_settings
if viewpoint.visualization_info.components.visibility.default_visibility:
objs: list[bpy.types.Object] = []
for global_id in exception_global_ids:
obj = IfcStore.get_element(global_id)
if obj and context.view_layer.objects.get(obj.name):
assert isinstance(obj, bpy.types.Object)
objs.append(obj)
context_override = tool.Blender.get_viewport_context()
if default_visibility:
# default_visibility is True: show all objs, hide the exceptions
old = context.area.type
context.area.type = "VIEW_3D"
bpy.ops.object.hide_view_clear()
context.area.type = old
for global_id in exception_global_ids:
obj = IfcStore.get_element(global_id)
if obj and bpy.context.view_layer.objects.get(obj.name):
with context.temp_override(**context_override):
bpy.ops.object.hide_view_clear(select=False)
for obj in objs:
obj.hide_set(True)
else:
# default_visibility is False: hide all objs, show the exceptions
objs = []
for global_id in exception_global_ids:
obj = IfcStore.get_element(global_id)
if obj:
objs.append(obj)
if objs:
old = context.area.type
context.area.type = "VIEW_3D"
bpy.ops.object.hide_view_clear()
context_override = {}
context_override["object"] = context_override["active_object"] = objs[0]
context_override["selected_objects"] = context_override["selected_editable_objects"] = objs
with context.temp_override(**context_override):
bpy.ops.object.hide_view_set(unselected=True)
bpy.data.objects["Viewpoint"].hide_set(False)
context.area.type = old
with context.temp_override(**context_override):
bpy.ops.object.hide_view_clear(select=False)
bpy.ops.object.select_all(action="DESELECT")
# We need to store unselectable objects and toggle unselectibility for them.
# As hide_view_set requires them to be selected to work.
unselectable = []
for obj in objs:
if obj.hide_select:
unselectable.append(obj)
obj.hide_select = False
obj.select_set(True)
# hide_view_set is checking actually selected objects, not context.selected objects.
bpy.ops.object.hide_view_set(unselected=True)
bpy.data.objects["Viewpoint"].hide_set(False)
for obj in unselectable:
obj.hide_select = True
def set_view_setup_hints(
self, viewpoint: bcf.v2.visinfo.VisualizationInfoHandler, context: bpy.types.Context
@@ -1062,9 +1065,9 @@ class ActivateBcfViewpoint(bpy.types.Operator):
pass # We no longer have an openings collection
def set_selection(self, viewpoint: bcf.v2.visinfo.VisualizationInfoHandler) -> None:
if not viewpoint.visualization_info.components or not viewpoint.visualization_info.components.selection:
selected_global_ids = viewpoint.get_selected_guids()
if selected_global_ids is None:
return
selected_global_ids = [s.ifc_guid for s in viewpoint.visualization_info.components.selection.component or []]
bpy.ops.object.select_all(action="DESELECT")
for global_id in selected_global_ids:
obj = IfcStore.get_element(global_id)