Editing psets can now accept user specified data types and auto-detect non-string data types

This commit is contained in:
Dion Moult
2021-09-20 15:37:01 +10:00
parent 92e519de9e
commit 8cde074fd8
3 changed files with 195 additions and 10 deletions
@@ -39,7 +39,7 @@ class Usecase:
if value is None:
prop.NominalValue = None
else:
primary_measure_type = self.get_primary_measure_type(prop.Name, previous_value=prop.NominalValue)
primary_measure_type = self.get_primary_measure_type(prop.Name, old_value=prop.NominalValue, new_value=value)
prop.NominalValue = self.file.create_entity(primary_measure_type, value)
del self.settings["properties"][prop.Name]
@@ -48,7 +48,9 @@ class Usecase:
for name, value in self.settings["properties"].items():
if value is None:
continue
primary_measure_type = self.get_primary_measure_type(name)
primary_measure_type = self.get_primary_measure_type(name, new_value=value)
if hasattr(value, "is_a"):
value = value.wrappedValue
properties.append(
self.file.create_entity(
"IfcPropertySingleValue",
@@ -71,11 +73,22 @@ class Usecase:
elif hasattr(self.settings["pset"], "Properties"): # For IfcMaterialProperties
return self.settings["pset"].Properties or []
def get_primary_measure_type(self, name, previous_value=None):
if not self.pset_template:
return previous_value.is_a() if previous_value else "IfcLabel"
for prop_template in self.pset_template.HasPropertyTemplates:
if prop_template.Name != name:
continue
return prop_template.PrimaryMeasureType or "IfcLabel"
return previous_value.is_a() if previous_value else "IfcLabel"
def get_primary_measure_type(self, name, old_value=None, new_value=None):
if self.pset_template:
for prop_template in self.pset_template.HasPropertyTemplates:
if prop_template.Name != name:
continue
return prop_template.PrimaryMeasureType or "IfcLabel"
if old_value:
return old_value.is_a()
elif new_value and hasattr(new_value, "is_a"):
return new_value.is_a()
elif new_value is not None:
if isinstance(new_value, str):
return "IfcLabel"
elif isinstance(new_value, float):
return "IfcReal"
elif isinstance(new_value, bool):
return "IfcBoolean"
elif isinstance(new_value, int):
return "IfcInteger"