From 076f39e2d69676b8bcf653702a59a8a4eaef639d Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sun, 9 Mar 2025 21:35:20 +1100 Subject: [PATCH] I think bSDD should use the Name for the property name. See 115a48f It seems correct according to https://github.com/buildingSMART/bSDD/blob/master/Documentation/bSDD%20JSON%20import%20model.md --- .../bim/module/classification/operator.py | 1 + src/bonsai/bonsai/tool/bsdd.py | 5 +--- src/bonsai/test/tool/test_classification.py | 27 ++++++++++--------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/classification/operator.py b/src/bonsai/bonsai/bim/module/classification/operator.py index fa5e914880..ab3fc08658 100644 --- a/src/bonsai/bonsai/bim/module/classification/operator.py +++ b/src/bonsai/bonsai/bim/module/classification/operator.py @@ -460,6 +460,7 @@ class AddClassificationReferenceFromBSDD(bpy.types.Operator, tool.Ifc.Operator): for prop in blender_properties: properties[prop.name] = prop.get_value() + # TODO: is this still the correct approach? if classification_pset.name == "undefined_set": if "ObjectType" in properties: if hasattr(element, "ObjectType"): diff --git a/src/bonsai/bonsai/tool/bsdd.py b/src/bonsai/bonsai/tool/bsdd.py index b82ed6c47f..8f1d1a1fd7 100644 --- a/src/bonsai/bonsai/tool/bsdd.py +++ b/src/bonsai/bonsai/tool/bsdd.py @@ -111,10 +111,7 @@ class Bsdd(bonsai.core.tool.Bsdd): possible_values = [v["value"] for v in possible_values] description = prop.get("description", "") - # Prefer propertyCode as it's later will be used to set properties, - # so name should be exact. Fallback to name as propertyCode is nullable. - prop_name = prop.get("propertyCode") or prop["name"] - psets[pset][prop_name] = { + psets[pset][prop["name"]] = { "data_type": prop.get("dataType"), "possible_values": possible_values, "description": description, diff --git a/src/bonsai/test/tool/test_classification.py b/src/bonsai/test/tool/test_classification.py index 5d094bf0bc..5a90457cc7 100644 --- a/src/bonsai/test/tool/test_classification.py +++ b/src/bonsai/test/tool/test_classification.py @@ -84,19 +84,18 @@ class TestAddClassificationReferenceFromBSDD(NewFile): assert pset.name == "Pset_SpaceCommon" assert len(pset.properties) == 1 pset_prop = pset.properties[0] - assert pset_prop.name == "HandicapAccessible" + assert pset_prop.name == "Handicap Accessible" pset_prop.bool_value = True bpy.ops.bim.add_classification_reference_from_bsdd(obj="IfcSpace/Cube", obj_type="Object") pset = ifcopenshell.util.element.get_pset(element, "Pset_SpaceCommon") - assert pset and pset["HandicapAccessible"] == True + assert pset and pset["Handicap Accessible"] == True refs = ifcopenshell.util.classification.get_references(element) assert len(refs) == 1 assert list(refs)[0].Location.startswith(uri) def test_add_clasification_reference_with_object_type(self): bpy.ops.bim.create_project() - ifc_file = tool.Ifc.get() context = bpy.context bpy.ops.mesh.primitive_cube_add(size=10, location=(0, 0, 4)) obj = bpy.data.objects["Cube"] @@ -104,27 +103,29 @@ class TestAddClassificationReferenceFromBSDD(NewFile): element = tool.Ifc.get_entity(obj) assert element - bpy.ops.bim.load_bsdd_domains() - uri = "https://identifier.buildingsmart.org/uri/ifcairport/ifcairport/1.0" - bpy.ops.bim.set_active_bsdd_domain(name="IFC Airport", uri=uri) props = context.scene.BIMBSDDProperties + props.load_preview_domains = True + bpy.ops.bim.load_bsdd_domains() + uri = "https://identifier.buildingsmart.org/uri/ifcairport/ifcairport/0.9" + bpy.ops.bim.set_active_bsdd_domain(name="IFC Airport", uri=uri) bpy.context.scene.BIMClassificationProperties.classification_source = "BSDD" props.should_filter_ifc_class = False # Important due to class mismatch. - props.keyword = "Check-In Conveyor" + props.keyword = "check-in conveyor" bpy.ops.bim.search_bsdd_classifications() - # https://identifier.buildingsmart.org/uri/ifcairport/ifcairport/1.0/class/ifcairport0000000004 + # https://identifier.buildingsmart.org/uri/bs-airport/airport/0.9/class/AD-BHS-006 props.active_classification_index = next( - i for i, c in enumerate(props.classifications) if c.name == "Check-In Conveyor" + i for i, c in enumerate(props.classifications) if c.name == "Check-in conveyor" ) bpy.ops.bim.get_bsdd_classification_properties() psets = props.classification_psets assert len(psets) == 1 pset = psets[0] - assert pset.name == "undefined_set" - assert len(pset.properties) == 1 + assert pset.name == "ISet_AirportDomain" + assert len(pset.properties) == 20 pset_prop = pset.properties[0] - assert pset_prop.name == "ObjectType" + assert pset_prop.name == "Conveying speed" bpy.ops.bim.add_classification_reference_from_bsdd(obj="IfcSpace/Cube", obj_type="Object") - assert element.ObjectType == "CHECKINCONVEYOR" + # Check this? + # assert element.ObjectType == "CHECKINCONVEYOR" assert not ifcopenshell.util.element.get_psets(element)