Skip to content

Commit 2629172

Browse files
committed
Displaying project units for length values in psets and qsets
Examples: - https://i.imgur.com/ww7MJ7w.png - https://i.imgur.com/N1rOELc.png
1 parent 36b746d commit 2629172

3 files changed

Lines changed: 33 additions & 5 deletions

File tree

src/blenderbim/blenderbim/bim/module/pset/operator.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,14 @@ def load_single_value(self, pset_template, prop_template, data):
133133
metadata.has_calculator = bool(mapper.get(pset_template.Name, {}).get(prop_template.Name, None))
134134
metadata.data_type = self.get_data_type(prop_template)
135135

136+
special_type = ""
137+
if prop_template.PrimaryMeasureType in (
138+
"IfcPositiveLengthMeasure",
139+
"IfcLengthMeasure",
140+
) or prop_template.TemplateType in ("Q_LENGTH",):
141+
special_type = "LENGTH"
142+
metadata.special_type = special_type
143+
136144
if metadata.data_type == "string":
137145
metadata.string_value = "" if metadata.is_null else str(data[prop_template.Name])
138146
elif metadata.data_type == "integer":
@@ -196,7 +204,7 @@ def load_from_pset_data(self, pset):
196204

197205
enum_items = [v.wrappedValue for v in prop.EnumerationReference.EnumerationValues]
198206
selected_enum_items = [v.wrappedValue for v in prop.EnumerationValues]
199-
data_type = metadata.get_value_name()
207+
data_type = metadata.get_value_name(display_only=True)
200208

201209
for enum in enum_items:
202210
new = simple_prop.enumerated_value.enumerated_values.add()
@@ -352,7 +360,9 @@ def _execute(self, context):
352360
continue
353361
element = tool.Ifc.get().by_id(ifc_definition_id)
354362
if pset_name in blenderbim.bim.schema.ifc.psetqto.get_applicable_names(element.is_a(), pset_only=True):
355-
bpy.ops.bim.enable_pset_editing(pset_id=0, pset_name=pset_name, pset_type="PSET", obj=obj, obj_type=self.obj_type)
363+
bpy.ops.bim.enable_pset_editing(
364+
pset_id=0, pset_name=pset_name, pset_type="PSET", obj=obj, obj_type=self.obj_type
365+
)
356366

357367

358368
class AddQto(bpy.types.Operator, Operator):
@@ -368,7 +378,9 @@ def _execute(self, context):
368378
props = get_pset_props(context, self.obj, self.obj_type)
369379
ifc_definition_id = blenderbim.bim.helper.get_obj_ifc_definition_id(context, self.obj, self.obj_type)
370380
element = tool.Ifc.get().by_id(ifc_definition_id)
371-
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)
381+
bpy.ops.bim.enable_pset_editing(
382+
pset_id=0, pset_name=props.qto_name, pset_type="QTO", obj=self.obj, obj_type=self.obj_type
383+
)
372384

373385

374386
class CalculateQuantity(bpy.types.Operator):

src/blenderbim/blenderbim/bim/module/pset/ui.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def draw_property(prop, layout, copy_operator=None):
4242

4343

4444
def draw_single_property(prop, layout, copy_operator=None):
45-
value_name = prop.metadata.get_value_name()
45+
value_name = prop.metadata.get_value_name(display_only=True)
4646
if not value_name:
4747
layout.label(text=prop["Name"])
4848
return

src/blenderbim/blenderbim/bim/prop.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,16 @@ def set_numerical_value(self, value_name, new_value):
223223
self[value_name] = new_value
224224

225225

226+
def get_length_value(self):
227+
si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
228+
return self.float_value * si_conversion
229+
230+
231+
def set_lenght_value(self, value):
232+
si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
233+
self.float_value = value / si_conversion
234+
235+
226236
class Attribute(PropertyGroup):
227237
tooltip = "`Right Click > IFC Description` to read the attribute description and online documentation"
228238
name: StringProperty(name="Name")
@@ -245,6 +255,9 @@ class Attribute(PropertyGroup):
245255
get=lambda self: float(self.get("float_value", 0.0)),
246256
set=set_float_value,
247257
)
258+
length_value: FloatProperty(
259+
name="Value", description=tooltip, get=get_length_value, set=set_lenght_value, unit="LENGTH"
260+
)
248261
enum_items: StringProperty(name="Value")
249262
enum_descriptions: CollectionProperty(type=StrProperty)
250263
enum_value: EnumProperty(items=get_attribute_enum_values, name="Value", update=update_attribute_value)
@@ -257,6 +270,7 @@ class Attribute(PropertyGroup):
257270
value_min_constraint: BoolProperty(default=False, description="True if the numerical value has a lower bound")
258271
value_max: FloatProperty(description="This is used to validate int_value and float_value")
259272
value_max_constraint: BoolProperty(default=False, description="True if the numerical value has an upper bound")
273+
special_type: StringProperty(name="Special Value Type", default="")
260274

261275
def get_value(self):
262276
if self.is_optional and self.is_null:
@@ -275,14 +289,16 @@ def get_value_default(self):
275289
elif self.data_type == "enum":
276290
return "0"
277291

278-
def get_value_name(self):
292+
def get_value_name(self, display_only=False):
279293
if self.data_type == "string":
280294
return "string_value"
281295
elif self.data_type == "boolean":
282296
return "bool_value"
283297
elif self.data_type == "integer":
284298
return "int_value"
285299
elif self.data_type == "float":
300+
if display_only and self.special_type == "LENGTH":
301+
return "length_value"
286302
return "float_value"
287303
elif self.data_type == "enum":
288304
return "enum_value"

0 commit comments

Comments
 (0)