Displaying project units for length values in psets and qsets

Examples:
- https://i.imgur.com/ww7MJ7w.png
- https://i.imgur.com/N1rOELc.png
This commit is contained in:
Andrej730
2023-05-31 15:49:10 +05:00
parent 36b746da7a
commit 2629172ff4
3 changed files with 33 additions and 5 deletions
@@ -133,6 +133,14 @@ class EnablePsetEditing(bpy.types.Operator):
metadata.has_calculator = bool(mapper.get(pset_template.Name, {}).get(prop_template.Name, None)) metadata.has_calculator = bool(mapper.get(pset_template.Name, {}).get(prop_template.Name, None))
metadata.data_type = self.get_data_type(prop_template) 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": if metadata.data_type == "string":
metadata.string_value = "" if metadata.is_null else str(data[prop_template.Name]) metadata.string_value = "" if metadata.is_null else str(data[prop_template.Name])
elif metadata.data_type == "integer": elif metadata.data_type == "integer":
@@ -196,7 +204,7 @@ class EnablePsetEditing(bpy.types.Operator):
enum_items = [v.wrappedValue for v in prop.EnumerationReference.EnumerationValues] enum_items = [v.wrappedValue for v in prop.EnumerationReference.EnumerationValues]
selected_enum_items = [v.wrappedValue for v in prop.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: for enum in enum_items:
new = simple_prop.enumerated_value.enumerated_values.add() new = simple_prop.enumerated_value.enumerated_values.add()
@@ -352,7 +360,9 @@ class AddPset(bpy.types.Operator, Operator):
continue continue
element = tool.Ifc.get().by_id(ifc_definition_id) 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): 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): 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) 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) 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) 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): class CalculateQuantity(bpy.types.Operator):
@@ -42,7 +42,7 @@ def draw_property(prop, layout, copy_operator=None):
def draw_single_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: if not value_name:
layout.label(text=prop["Name"]) layout.label(text=prop["Name"])
return return
+17 -1
View File
@@ -223,6 +223,16 @@ def set_numerical_value(self, value_name, new_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): class Attribute(PropertyGroup):
tooltip = "`Right Click > IFC Description` to read the attribute description and online documentation" tooltip = "`Right Click > IFC Description` to read the attribute description and online documentation"
name: StringProperty(name="Name") name: StringProperty(name="Name")
@@ -245,6 +255,9 @@ class Attribute(PropertyGroup):
get=lambda self: float(self.get("float_value", 0.0)), get=lambda self: float(self.get("float_value", 0.0)),
set=set_float_value, 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_items: StringProperty(name="Value")
enum_descriptions: CollectionProperty(type=StrProperty) enum_descriptions: CollectionProperty(type=StrProperty)
enum_value: EnumProperty(items=get_attribute_enum_values, name="Value", update=update_attribute_value) 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_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: 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") 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): def get_value(self):
if self.is_optional and self.is_null: if self.is_optional and self.is_null:
@@ -275,7 +289,7 @@ class Attribute(PropertyGroup):
elif self.data_type == "enum": elif self.data_type == "enum":
return "0" return "0"
def get_value_name(self): def get_value_name(self, display_only=False):
if self.data_type == "string": if self.data_type == "string":
return "string_value" return "string_value"
elif self.data_type == "boolean": elif self.data_type == "boolean":
@@ -283,6 +297,8 @@ class Attribute(PropertyGroup):
elif self.data_type == "integer": elif self.data_type == "integer":
return "int_value" return "int_value"
elif self.data_type == "float": elif self.data_type == "float":
if display_only and self.special_type == "LENGTH":
return "length_value"
return "float_value" return "float_value"
elif self.data_type == "enum": elif self.data_type == "enum":
return "enum_value" return "enum_value"