mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-16 13:46:54 +00:00
Change <logical> primitive data type from bool to enum
As it also has a third value "UNKNOWN" which has it's own meanig in IFC and therefore IfcLogical cannot be represented by simple booleans. Example in Bonsai - https://i.imgur.com/xuPMcwA.png
This commit is contained in:
@@ -185,11 +185,23 @@ def import_attribute(
|
|||||||
new.special_type = "FORCE"
|
new.special_type = "FORCE"
|
||||||
new.float_value = 0.0 if new.is_null else float(data[attribute.name()])
|
new.float_value = 0.0 if new.is_null else float(data[attribute.name()])
|
||||||
elif data_type == "enum":
|
elif data_type == "enum":
|
||||||
enum_items = ifcopenshell.util.attribute.get_enum_items(attribute)
|
attribute_type = attribute.type_of_attribute()
|
||||||
new.enum_items = json.dumps(enum_items)
|
is_logical = str(attribute_type) == "<type IfcLogical: <logical>>"
|
||||||
add_attribute_enum_items_descriptions(new, enum_items)
|
enum_value = data[new.name]
|
||||||
if data[new.name]:
|
if is_logical:
|
||||||
new.enum_value = data[new.name]
|
new.special_type = "LOGICAL"
|
||||||
|
enum_items = ("TRUE", "FALSE", "UNKNOWN")
|
||||||
|
new.enum_items = json.dumps(enum_items)
|
||||||
|
if enum_value is not None and enum_value != "UNKNOWN":
|
||||||
|
# IfcOpenShell returns bool if IfcLogical is True/False.
|
||||||
|
enum_value = "TRUE" if enum_value else "FALSE"
|
||||||
|
else:
|
||||||
|
enum_items = ifcopenshell.util.attribute.get_enum_items(attribute)
|
||||||
|
new.enum_items = json.dumps(enum_items)
|
||||||
|
add_attribute_enum_items_descriptions(new, enum_items)
|
||||||
|
|
||||||
|
if enum_value is not None:
|
||||||
|
new.enum_value = enum_value
|
||||||
add_attribute_description(new, data)
|
add_attribute_description(new, data)
|
||||||
add_attribute_min_max(attribute, new)
|
add_attribute_min_max(attribute, new)
|
||||||
|
|
||||||
|
|||||||
@@ -275,7 +275,7 @@ def get_display_name(self: "Attribute") -> str:
|
|||||||
|
|
||||||
|
|
||||||
AttributeDataType = Literal["string", "integer", "float", "boolean", "enum", "file"]
|
AttributeDataType = Literal["string", "integer", "float", "boolean", "enum", "file"]
|
||||||
AttributeSpecialType = Literal["", "DATE", "DATETIME", "LENGTH", "AREA", "VOLUME", "FORCE"]
|
AttributeSpecialType = Literal["", "DATE", "DATETIME", "LENGTH", "AREA", "VOLUME", "FORCE", "LOGICAL"]
|
||||||
|
|
||||||
|
|
||||||
class Attribute(PropertyGroup):
|
class Attribute(PropertyGroup):
|
||||||
@@ -337,7 +337,11 @@ class Attribute(PropertyGroup):
|
|||||||
return self.string_value.replace("\\n", "\n")
|
return self.string_value.replace("\\n", "\n")
|
||||||
if self.data_type == "file":
|
if self.data_type == "file":
|
||||||
return [f.name for f in self.filepath_value.file_list]
|
return [f.name for f in self.filepath_value.file_list]
|
||||||
return getattr(self, str(self.get_value_name()), None)
|
value = getattr(self, str(self.get_value_name()), None)
|
||||||
|
if self.special_type == "LOGICAL" and value != "UNKNOWN":
|
||||||
|
# IfcOpenShell expects bool if IfcLogical is True/False.
|
||||||
|
value = value == "TRUE"
|
||||||
|
return value
|
||||||
|
|
||||||
def get_value_default(self) -> Union[str, float, int, bool]:
|
def get_value_default(self) -> Union[str, float, int, bool]:
|
||||||
data_type = self.data_type
|
data_type = self.data_type
|
||||||
|
|||||||
@@ -47,9 +47,9 @@ def get_primitive_type(
|
|||||||
return "float"
|
return "float"
|
||||||
elif "<number>" in data_type or "<integer>" in data_type:
|
elif "<number>" in data_type or "<integer>" in data_type:
|
||||||
return "integer"
|
return "integer"
|
||||||
elif "<boolean>" in data_type or "<logical>" in data_type:
|
elif "<boolean>" in data_type:
|
||||||
return "boolean"
|
return "boolean"
|
||||||
elif "<enumeration" in data_type:
|
elif "<logical>" in data_type or "<enumeration" in data_type:
|
||||||
return "enum"
|
return "enum"
|
||||||
elif "<binary" in data_type:
|
elif "<binary" in data_type:
|
||||||
return "binary"
|
return "binary"
|
||||||
|
|||||||
Reference in New Issue
Block a user