mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-28 19:27:10 +00:00
Preserve visibility status for non-ifc objects when drawing is activated
Mentioned in #3402
This commit is contained in:
@@ -1779,6 +1779,7 @@ class Drawing(bonsai.core.tool.Drawing):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def activate_drawing(cls, camera: bpy.types.Object) -> None:
|
def activate_drawing(cls, camera: bpy.types.Object) -> None:
|
||||||
selected_objects_before = bpy.context.selected_objects
|
selected_objects_before = bpy.context.selected_objects
|
||||||
|
non_ifc_objects_hide = {o: o.hide_get() for o in bpy.context.view_layer.objects if not tool.Ifc.get_entity(o)}
|
||||||
|
|
||||||
# Sync viewport objects visibility with selectors from EPset_Drawing/Include and /Exclude
|
# Sync viewport objects visibility with selectors from EPset_Drawing/Include and /Exclude
|
||||||
drawing = tool.Ifc.get_entity(camera)
|
drawing = tool.Ifc.get_entity(camera)
|
||||||
@@ -1859,11 +1860,12 @@ class Drawing(bonsai.core.tool.Drawing):
|
|||||||
element_obj_names.add(obj.name)
|
element_obj_names.add(obj.name)
|
||||||
|
|
||||||
# Note that render visibility is only set on drawing generation time for speed.
|
# Note that render visibility is only set on drawing generation time for speed.
|
||||||
[
|
for obj in bpy.context.view_layer.objects:
|
||||||
obj.hide_set(False) # Show the object
|
if obj.name in element_obj_names:
|
||||||
for obj in bpy.context.view_layer.objects
|
obj.hide_set(False) # Show the object
|
||||||
if obj.name in element_obj_names or not tool.Ifc.get_entity(obj)
|
continue
|
||||||
]
|
if (hide := non_ifc_objects_hide.get(obj)) is not None:
|
||||||
|
obj.hide_set(hide)
|
||||||
|
|
||||||
cls.import_camera_props(drawing, camera.data)
|
cls.import_camera_props(drawing, camera.data)
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,29 @@ Scenario: Create drawing after deleting a duplicated object
|
|||||||
When I press "bim.create_drawing"
|
When I press "bim.create_drawing"
|
||||||
Then nothing happens
|
Then nothing happens
|
||||||
|
|
||||||
|
Scenario: Activate drawing preserves visibility for non-ifc objects
|
||||||
|
Given an empty IFC project
|
||||||
|
And I add a cube
|
||||||
|
And I add a cube
|
||||||
|
And the object "Cube" is visible
|
||||||
|
And the object "Cube.001" is not visible
|
||||||
|
And I press "bim.add_drawing"
|
||||||
|
And the variable "drawing" is "IfcStore.get_file().by_type('IfcAnnotation')[0].id()"
|
||||||
|
And I set "scene.DocProperties.active_drawing_index" to "0"
|
||||||
|
When I press "bim.activate_drawing(drawing={drawing})"
|
||||||
|
Then the object "Cube" is visible
|
||||||
|
And the object "Cube.001" is not visible
|
||||||
|
|
||||||
|
Scenario: Activate drawing preserves selection
|
||||||
|
Given an empty IFC project
|
||||||
|
And I add a cube
|
||||||
|
And the object "Cube" is selected
|
||||||
|
And I press "bim.add_drawing"
|
||||||
|
And the variable "drawing" is "IfcStore.get_file().by_type('IfcAnnotation')[0].id()"
|
||||||
|
And I set "scene.DocProperties.active_drawing_index" to "0"
|
||||||
|
When I press "bim.activate_drawing(drawing={drawing})"
|
||||||
|
Then the object "Cube" is selected
|
||||||
|
|
||||||
Scenario: Remove drawing
|
Scenario: Remove drawing
|
||||||
Given an empty IFC project
|
Given an empty IFC project
|
||||||
And I add a cube
|
And I add a cube
|
||||||
|
|||||||
@@ -840,6 +840,30 @@ def the_object_name_is_not_a_void(name):
|
|||||||
assert False, "A void was found"
|
assert False, "A void was found"
|
||||||
|
|
||||||
|
|
||||||
|
@given(parsers.parse('the object "{name}" is visible'))
|
||||||
|
def given_the_object_name_is_visible(name):
|
||||||
|
obj = the_object_name_exists(name)
|
||||||
|
obj.hide_set(False)
|
||||||
|
|
||||||
|
|
||||||
|
@given(parsers.parse('the object "{name}" is not visible'))
|
||||||
|
def given_the_object_name_is_not_visible(name):
|
||||||
|
obj = the_object_name_exists(name)
|
||||||
|
obj.hide_set(True)
|
||||||
|
|
||||||
|
|
||||||
|
@then(parsers.parse('the object "{name}" is visible'))
|
||||||
|
def the_object_name_is_visible(name):
|
||||||
|
obj = the_object_name_exists(name)
|
||||||
|
assert obj.hide_get() == False
|
||||||
|
|
||||||
|
|
||||||
|
@then(parsers.parse('the object "{name}" is not visible'))
|
||||||
|
def the_object_name_is_not_visible(name):
|
||||||
|
obj = the_object_name_exists(name)
|
||||||
|
assert obj.hide_get() == True
|
||||||
|
|
||||||
|
|
||||||
@then(parsers.parse('the object "{name}" is an "{ifc_class}"'))
|
@then(parsers.parse('the object "{name}" is an "{ifc_class}"'))
|
||||||
def the_object_name_is_an_ifc_class(name, ifc_class):
|
def the_object_name_is_an_ifc_class(name, ifc_class):
|
||||||
ifc = an_ifc_file_exists()
|
ifc = an_ifc_file_exists()
|
||||||
|
|||||||
Reference in New Issue
Block a user