From de08d3726ea5a01f506f7879943e0db77218c457 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 18 Sep 2024 17:25:19 +0500 Subject: [PATCH] Bonsai - set active bsdd when loading project When loading an ifc project it will search it for bsdd ifcclassifications and will set one as active if finds it, so now it will be a bit more convenient working with bsdd classification assignment as it active bsdd previously was always getting reset when you reload ifc file. Example - https://imgur.com/a/stlJqwm --- src/bonsai/bonsai/bim/import_ifc.py | 1 + src/bonsai/bonsai/tool/loader.py | 18 ++++++++++++++++++ src/bonsai/test/tool/test_loader.py | 15 +++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/src/bonsai/bonsai/bim/import_ifc.py b/src/bonsai/bonsai/bim/import_ifc.py index 9abff58357..380a6ad2b5 100644 --- a/src/bonsai/bonsai/bim/import_ifc.py +++ b/src/bonsai/bonsai/bim/import_ifc.py @@ -282,6 +282,7 @@ class IfcImporter: tool.Spatial.run_spatial_import_spatial_decomposition() if default_container := tool.Spatial.guess_default_container(): tool.Spatial.set_default_container(default_container) + tool.Loader.setup_active_bsdd_classification() self.update_progress(100) bpy.context.window_manager.progress_end() diff --git a/src/bonsai/bonsai/tool/loader.py b/src/bonsai/bonsai/tool/loader.py index 34de704904..ceb5cfd688 100644 --- a/src/bonsai/bonsai/tool/loader.py +++ b/src/bonsai/bonsai/tool/loader.py @@ -924,3 +924,21 @@ class Loader(bonsai.core.tool.Loader): mesh["ios_materials"] = [m.instance_id() for m in geometry.materials] mesh["ios_material_ids"] = geometry.material_ids return mesh + + @classmethod + def setup_active_bsdd_classification(cls): + ifc_file = tool.Ifc.get() + attr_name = "Specification" if ifc_file.schema == "IFC4X3" else "Location" + bsdd_classification, uri, name = None, None, None + for c in ifc_file.by_type("IfcClassification"): + if ( + (uri := getattr(c, attr_name)) + and uri.startswith("https://identifier.buildingsmart.org/uri/") + and (name := c.Name) + ): + bsdd_classification = c + break + if not bsdd_classification: + return + assert name and uri + tool.Bsdd.set_active_bsdd(name, uri) diff --git a/src/bonsai/test/tool/test_loader.py b/src/bonsai/test/tool/test_loader.py index 27826cd303..ba0d9a10b8 100644 --- a/src/bonsai/test/tool/test_loader.py +++ b/src/bonsai/test/tool/test_loader.py @@ -510,3 +510,18 @@ class TestLoadingIndexedMap(NewFile): blender_color = Vector(layer.data[loop_i].color) ifc_color = Vector(colors[color_index[face_i]] + (1.0,)) assert tool.Cad.are_vectors_equal(blender_color, ifc_color) + + +class TestSetupActiveBsddClassification(NewFile): + def test_run(self): + bpy.ops.bim.create_project() + ifc_file = tool.Ifc.get() + name = "CCI Construction" + uri = "https://identifier.buildingsmart.org/uri/molio/cciconstruction/1.0" + ifc_file.create_entity("IfcClassification", Name=name, Location=uri) + filepath = "test/files/temp/test.ifc" + ifc_file.write(filepath) + bpy.ops.bim.load_project(filepath=filepath) + props = bpy.context.scene.BIMBSDDProperties + assert props.active_domain == name + assert props.active_uri == uri