Support de08d3726e for ifc2x3 #5420

This commit is contained in:
Andrej730
2024-09-19 18:00:27 +05:00
parent b7d725254d
commit f184ce5386
2 changed files with 45 additions and 4 deletions
+25 -2
View File
@@ -926,9 +926,32 @@ class Loader(bonsai.core.tool.Loader):
return mesh return mesh
@classmethod @classmethod
def setup_active_bsdd_classification(cls): def setup_active_bsdd_classification(cls) -> None:
ifc_file = tool.Ifc.get() ifc_file = tool.Ifc.get()
attr_name = "Specification" if ifc_file.schema == "IFC4X3" else "Location" schema = ifc_file.schema
# In IFC2X3 IfcClassification doesn't have an attribute for uri.
if schema == "IFC2X3":
classifications = [c for c in ifc_file.by_type("IfcClassification") if c.Name]
if not classifications:
return
pattern = r"^https://identifier\.buildingsmart\.org/uri/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([0-9]+\.[0-9]+)"
# No inverse attribute in IFC2X3...
for ref in ifc_file.by_type("IfcClassificationReference"):
if (
not (uri := ref.Location)
or not uri.startswith("https://identifier.buildingsmart.org/uri/")
or not (pattern_match := re.match(pattern, uri))
or not (classification := ref.ReferencedSource)
or classification not in classifications
or not classification.is_a("IfcClassification")
):
continue
tool.Bsdd.set_active_bsdd(classification.Name, pattern_match.group(0))
return
attr_name = "Specification" if schema == "IFC4X3" else "Location"
bsdd_classification, uri, name = None, None, None bsdd_classification, uri, name = None, None, None
for c in ifc_file.by_type("IfcClassification"): for c in ifc_file.by_type("IfcClassification"):
if ( if (
+20 -2
View File
@@ -19,6 +19,7 @@
import bpy import bpy
import bmesh import bmesh
import ifcopenshell import ifcopenshell
import ifcopenshell.util.schema
import bonsai.core.tool import bonsai.core.tool
import bonsai.tool as tool import bonsai.tool as tool
from test.bim.bootstrap import NewFile from test.bim.bootstrap import NewFile
@@ -513,15 +514,32 @@ class TestLoadingIndexedMap(NewFile):
class TestSetupActiveBsddClassification(NewFile): class TestSetupActiveBsddClassification(NewFile):
def test_run(self): def run_test(self, schema: ifcopenshell.util.schema.IFC_SCHEMA) -> None:
schema_ = "IFC4X3_ADD2" if schema == "IFC4X3" else schema
bpy.context.scene.BIMProjectProperties.export_schema = schema_
bpy.ops.bim.create_project() bpy.ops.bim.create_project()
ifc_file = tool.Ifc.get() ifc_file = tool.Ifc.get()
name = "CCI Construction" name = "CCI Construction"
uri = "https://identifier.buildingsmart.org/uri/molio/cciconstruction/1.0" uri = "https://identifier.buildingsmart.org/uri/molio/cciconstruction/1.0"
ifc_file.create_entity("IfcClassification", Name=name, Location=uri) if schema == "IFC2X3":
classification = ifc_file.create_entity("IfcClassification", Name=name)
ifc_file.create_entity("IfcClassificationReference", Location=uri, ReferencedSource=classification)
else:
attr_name = "Specification" if schema == "IFC4X3" else "Location"
classification = ifc_file.create_entity("IfcClassification", Name=name)
setattr(classification, attr_name, uri)
filepath = "test/files/temp/test.ifc" filepath = "test/files/temp/test.ifc"
ifc_file.write(filepath) ifc_file.write(filepath)
bpy.ops.bim.load_project(filepath=filepath) bpy.ops.bim.load_project(filepath=filepath)
props = bpy.context.scene.BIMBSDDProperties props = bpy.context.scene.BIMBSDDProperties
assert props.active_domain == name assert props.active_domain == name
assert props.active_uri == uri assert props.active_uri == uri
def test_set_load_and_set_active_bsdd_ifc2x3(self):
self.run_test("IFC2X3")
def test_set_load_and_set_active_bsdd_ifc4(self):
self.run_test("IFC4")
def test_set_load_and_set_active_bsdd_ifc4x3(self):
self.run_test("IFC4X3")