From 2629172ff4abc3b5cfcb33178852903f891e83f7 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 31 May 2023 15:49:10 +0500 Subject: [PATCH] Displaying project units for length values in psets and qsets Examples: - https://i.imgur.com/ww7MJ7w.png - https://i.imgur.com/N1rOELc.png --- .../blenderbim/bim/module/pset/operator.py | 18 +++++++++++++++--- .../blenderbim/bim/module/pset/ui.py | 2 +- src/blenderbim/blenderbim/bim/prop.py | 18 +++++++++++++++++- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index 2fa01640eb..849b321af9 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -133,6 +133,14 @@ class EnablePsetEditing(bpy.types.Operator): metadata.has_calculator = bool(mapper.get(pset_template.Name, {}).get(prop_template.Name, None)) metadata.data_type = self.get_data_type(prop_template) + special_type = "" + if prop_template.PrimaryMeasureType in ( + "IfcPositiveLengthMeasure", + "IfcLengthMeasure", + ) or prop_template.TemplateType in ("Q_LENGTH",): + special_type = "LENGTH" + metadata.special_type = special_type + if metadata.data_type == "string": metadata.string_value = "" if metadata.is_null else str(data[prop_template.Name]) elif metadata.data_type == "integer": @@ -196,7 +204,7 @@ class EnablePsetEditing(bpy.types.Operator): enum_items = [v.wrappedValue for v in prop.EnumerationReference.EnumerationValues] selected_enum_items = [v.wrappedValue for v in prop.EnumerationValues] - data_type = metadata.get_value_name() + data_type = metadata.get_value_name(display_only=True) for enum in enum_items: new = simple_prop.enumerated_value.enumerated_values.add() @@ -352,7 +360,9 @@ class AddPset(bpy.types.Operator, Operator): continue element = tool.Ifc.get().by_id(ifc_definition_id) if pset_name in blenderbim.bim.schema.ifc.psetqto.get_applicable_names(element.is_a(), pset_only=True): - bpy.ops.bim.enable_pset_editing(pset_id=0, pset_name=pset_name, pset_type="PSET", obj=obj, obj_type=self.obj_type) + bpy.ops.bim.enable_pset_editing( + pset_id=0, pset_name=pset_name, pset_type="PSET", obj=obj, obj_type=self.obj_type + ) class AddQto(bpy.types.Operator, Operator): @@ -368,7 +378,9 @@ class AddQto(bpy.types.Operator, Operator): props = get_pset_props(context, self.obj, self.obj_type) ifc_definition_id = blenderbim.bim.helper.get_obj_ifc_definition_id(context, self.obj, self.obj_type) element = tool.Ifc.get().by_id(ifc_definition_id) - bpy.ops.bim.enable_pset_editing(pset_id=0, pset_name=props.qto_name, pset_type="QTO", obj=self.obj, obj_type=self.obj_type) + bpy.ops.bim.enable_pset_editing( + pset_id=0, pset_name=props.qto_name, pset_type="QTO", obj=self.obj, obj_type=self.obj_type + ) class CalculateQuantity(bpy.types.Operator): diff --git a/src/blenderbim/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py index 3dd0ed821d..f677c9158a 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/ui.py +++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py @@ -42,7 +42,7 @@ def draw_property(prop, layout, copy_operator=None): def draw_single_property(prop, layout, copy_operator=None): - value_name = prop.metadata.get_value_name() + value_name = prop.metadata.get_value_name(display_only=True) if not value_name: layout.label(text=prop["Name"]) return diff --git a/src/blenderbim/blenderbim/bim/prop.py b/src/blenderbim/blenderbim/bim/prop.py index 0d9cc02972..744ae2aea8 100644 --- a/src/blenderbim/blenderbim/bim/prop.py +++ b/src/blenderbim/blenderbim/bim/prop.py @@ -223,6 +223,16 @@ def set_numerical_value(self, value_name, new_value): self[value_name] = new_value +def get_length_value(self): + si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) + return self.float_value * si_conversion + + +def set_lenght_value(self, value): + si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get()) + self.float_value = value / si_conversion + + class Attribute(PropertyGroup): tooltip = "`Right Click > IFC Description` to read the attribute description and online documentation" name: StringProperty(name="Name") @@ -245,6 +255,9 @@ class Attribute(PropertyGroup): get=lambda self: float(self.get("float_value", 0.0)), set=set_float_value, ) + length_value: FloatProperty( + name="Value", description=tooltip, get=get_length_value, set=set_lenght_value, unit="LENGTH" + ) enum_items: StringProperty(name="Value") enum_descriptions: CollectionProperty(type=StrProperty) enum_value: EnumProperty(items=get_attribute_enum_values, name="Value", update=update_attribute_value) @@ -257,6 +270,7 @@ class Attribute(PropertyGroup): value_min_constraint: BoolProperty(default=False, description="True if the numerical value has a lower bound") value_max: FloatProperty(description="This is used to validate int_value and float_value") value_max_constraint: BoolProperty(default=False, description="True if the numerical value has an upper bound") + special_type: StringProperty(name="Special Value Type", default="") def get_value(self): if self.is_optional and self.is_null: @@ -275,7 +289,7 @@ class Attribute(PropertyGroup): elif self.data_type == "enum": return "0" - def get_value_name(self): + def get_value_name(self, display_only=False): if self.data_type == "string": return "string_value" elif self.data_type == "boolean": @@ -283,6 +297,8 @@ class Attribute(PropertyGroup): elif self.data_type == "integer": return "int_value" elif self.data_type == "float": + if display_only and self.special_type == "LENGTH": + return "length_value" return "float_value" elif self.data_type == "enum": return "enum_value"