From fab76bbcdee101d3e171cc5bb32770ab2c672b94 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 27 Mar 2023 23:08:40 +1100 Subject: [PATCH] Fixed bug where enumeration values in psets could be empty lists. --- .../ifcopenshell/api/pset/edit_pset.py | 13 +++++++------ .../test/api/pset/test_edit_pset.py | 12 ++++++------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py index 34b563c1d0..37b269d433 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py @@ -171,7 +171,7 @@ class Usecase: self.pset_template = self.settings["pset_template"] else: # TODO: add IFC2X3 PsetQto template support - self.psetqto = ifcopenshell.util.pset.get_template("IFC4") + self.psetqto = ifcopenshell.util.pset.get_template(self.file.schema) self.pset_template = self.psetqto.get_by_name(self.settings["pset"].Name) # TODO - Add support for changing property types? @@ -198,16 +198,15 @@ class Usecase: ].is_a() # Only need the first enum type since all enums are of the same type ifc_val = self.file.create_entity(primary_measure_type, val) sel_vals.append(ifc_val) - prop.EnumerationValues = tuple(sel_vals) - + prop.EnumerationValues = tuple(sel_vals) or None else: if value.EnumerationReference.EnumerationValues == (): if self.settings["should_purge"]: del self.settings["properties"][prop.Name] self.file.remove(prop) return - prop.EnumerationReference.EnumerationValues = () - prop.EnumerationValues = () + prop.EnumerationReference.EnumerationValues = None + prop.EnumerationValues = None elif isinstance(value, ifcopenshell.entity_instance): prop.EnumerationReference.EnumerationValues = value.EnumerationReference.EnumerationValues prop.EnumerationValues = value.EnumerationValues @@ -257,7 +256,9 @@ class Usecase: ) # TODO-The following "elif" is temporary code, will need to refactor at some point - vulevukusej elif isinstance(value, list): - for pset_template in self.settings["pset_template"].HasPropertyTemplates: + if not value: + continue + for pset_template in self.pset_template.HasPropertyTemplates: if pset_template.Name == name: prop_enum = self.file.create_entity( "IFCPROPERTYENUMERATION", diff --git a/src/ifcopenshell-python/test/api/pset/test_edit_pset.py b/src/ifcopenshell-python/test/api/pset/test_edit_pset.py index 88d28b5fae..52d7404693 100644 --- a/src/ifcopenshell-python/test/api/pset/test_edit_pset.py +++ b/src/ifcopenshell-python/test/api/pset/test_edit_pset.py @@ -28,7 +28,7 @@ class TestEditPset(test.bootstrap.IFC4): "pset.edit_pset", self.file, pset=pset, - properties={"Reference": "reference", "Status": "NEW", "Combustible": True, "ThermalTransmittance": 42}, + properties={"Reference": "reference", "Status": ["NEW"], "Combustible": True, "ThermalTransmittance": 42}, ) pset = element.IsDefinedBy[0].RelatingPropertyDefinition @@ -37,8 +37,8 @@ class TestEditPset(test.bootstrap.IFC4): assert pset.HasProperties[0].NominalValue.wrappedValue == "reference" assert pset.HasProperties[1].Name == "Status" - assert pset.HasProperties[1].NominalValue.is_a("IfcLabel") - assert pset.HasProperties[1].NominalValue.wrappedValue == "NEW" + assert pset.HasProperties[1].EnumerationValues[0].is_a("IfcLabel") + assert pset.HasProperties[1].EnumerationValues[0].wrappedValue == "NEW" assert pset.HasProperties[2].Name == "Combustible" assert pset.HasProperties[2].NominalValue.is_a("IfcBoolean") @@ -55,9 +55,9 @@ class TestEditPset(test.bootstrap.IFC4): "pset.edit_pset", self.file, pset=pset, - properties={"Reference": "foo", "Status": "NEW", "Combustible": True, "ThermalTransmittance": 42}, + properties={"Reference": "foo", "Status": ["NEW"], "Combustible": True, "ThermalTransmittance": 42}, ) - ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Reference": "bar", "Status": None}) + ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"Reference": "bar", "Status": []}) pset = element.IsDefinedBy[0].RelatingPropertyDefinition assert pset.HasProperties[0].Name == "Reference" @@ -65,7 +65,7 @@ class TestEditPset(test.bootstrap.IFC4): assert pset.HasProperties[0].NominalValue.wrappedValue == "bar" assert pset.HasProperties[1].Name == "Status" - assert pset.HasProperties[1].NominalValue is None + assert pset.HasProperties[1].EnumerationValues is None def test_editing_a_templated_pset_with_automatic_casting_of_primitive_data_types(self): element = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")