From 7f212963d55cb8a5e119e29d3fbaca4446b4748a Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 10 Feb 2022 11:40:38 +1100 Subject: [PATCH] The storey is now the default container when starting a project for convenience. --- src/blenderbim/blenderbim/core/project.py | 1 + src/blenderbim/blenderbim/core/tool.py | 1 + src/blenderbim/blenderbim/tool/geometry.py | 4 ++-- src/blenderbim/blenderbim/tool/project.py | 16 ++++++++++++++++ src/blenderbim/test/core/test_project.py | 3 +++ src/blenderbim/test/tool/test_project.py | 12 ++++++++++++ 6 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/core/project.py b/src/blenderbim/blenderbim/core/project.py index 614c255128..c562bffb06 100644 --- a/src/blenderbim/blenderbim/core/project.py +++ b/src/blenderbim/blenderbim/core/project.py @@ -58,6 +58,7 @@ def create_project(ifc, project, schema=None, template=None): project.run_aggregate_assign_object(relating_obj=building, related_obj=storey) project.set_context(body) + project.set_active_spatial_element(storey) if template: project.append_all_types_from_template(template) diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 4eb31bd230..0ba921fbfa 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -324,6 +324,7 @@ class Project: def run_owner_set_user(cls, user=None): pass def run_root_assign_class(cls, obj=None, ifc_class=None, predefined_type=None, should_add_representation=True, context=None, ifc_representation_class=None): pass def run_unit_assign_scene_units(cls): pass + def set_active_spatial_element(cls, obj): pass def set_context(cls, context): pass diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index b9d2ec10b8..ed146e454f 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -305,9 +305,9 @@ class Geometry(blenderbim.core.tool.Geometry): for slot in obj.material_slots: if slot.material and slot.material.use_nodes: for node in slot.material.node_tree.nodes: - if node.type == "TEX_COORD" and node.outputs['UV'].links: + if node.type == "TEX_COORD" and node.outputs["UV"].links: return True - elif node.type == "UVMAP" and node.outputs['UV'].links and node.uv_map: + elif node.type == "UVMAP" and node.outputs["UV"].links and node.uv_map: return True return False diff --git a/src/blenderbim/blenderbim/tool/project.py b/src/blenderbim/blenderbim/tool/project.py index bbf0f24d66..0670af4d6c 100644 --- a/src/blenderbim/blenderbim/tool/project.py +++ b/src/blenderbim/blenderbim/tool/project.py @@ -94,6 +94,22 @@ class Project(blenderbim.core.tool.Project): def run_unit_assign_scene_units(cls): return blenderbim.core.unit.assign_scene_units(tool.Ifc, tool.Unit) + @classmethod + def set_active_spatial_element(cls, obj): + collection = obj.users_collection[0] + queue = [bpy.context.view_layer.layer_collection] + layer_collection = None + + while queue: + layer = queue.pop() + if layer.name == collection.name: + layer_collection = layer + break + queue.extend(list(layer.children)) + + if layer_collection: + bpy.context.view_layer.active_layer_collection = layer_collection + @classmethod def set_context(cls, context): blenderbim.bim.handler.refresh_ui_data() diff --git a/src/blenderbim/test/core/test_project.py b/src/blenderbim/test/core/test_project.py index 1b10132581..1ff903b180 100644 --- a/src/blenderbim/test/core/test_project.py +++ b/src/blenderbim/test/core/test_project.py @@ -63,6 +63,7 @@ class TestCreateProject: project.run_aggregate_assign_object(relating_obj="building", related_obj="storey").should_be_called() project.set_context("body").should_be_called() + project.set_active_spatial_element("storey").should_be_called() subject.create_project(ifc, project, schema="IFC4", template=None) @@ -103,6 +104,7 @@ class TestCreateProject: project.run_aggregate_assign_object(relating_obj="building", related_obj="storey").should_be_called() project.set_context("body").should_be_called() + project.set_active_spatial_element("storey").should_be_called() project.append_all_types_from_template("template").should_be_called() @@ -152,5 +154,6 @@ class TestCreateProject: project.run_aggregate_assign_object(relating_obj="building", related_obj="storey").should_be_called() project.set_context("body").should_be_called() + project.set_active_spatial_element("storey").should_be_called() subject.create_project(ifc, project, schema="IFC2X3", template=None) diff --git a/src/blenderbim/test/tool/test_project.py b/src/blenderbim/test/tool/test_project.py index a5fe84ddc2..a6fea4ef42 100644 --- a/src/blenderbim/test/tool/test_project.py +++ b/src/blenderbim/test/tool/test_project.py @@ -82,6 +82,18 @@ class TestRunUnitAssignSceneUnits(NewFile): pass +class TestSetActiveSpatialElement(NewFile): + def test_run(self): + obj = bpy.data.objects.new("Foo", None) + collection = bpy.data.collections.new("Foo") + bpy.context.scene.collection.children.link(collection) + collection.objects.link(obj) + layer = bpy.context.view_layer.layer_collection.children["Foo"] + assert bpy.context.view_layer.active_layer_collection != layer + subject.set_active_spatial_element(obj) + assert bpy.context.view_layer.active_layer_collection == layer + + class TestSetContext(NewFile): def test_run(self): ifc = ifcopenshell.file()