diff --git a/src/bonsai/bonsai/bim/data/pset/Psets_BBIM_Annotation.ifc b/src/bonsai/bonsai/bim/data/pset/Psets_BBIM_Annotation.ifc index 451c890536..e526cfdd1e 100644 --- a/src/bonsai/bonsai/bim/data/pset/Psets_BBIM_Annotation.ifc +++ b/src/bonsai/bonsai/bim/data/pset/Psets_BBIM_Annotation.ifc @@ -28,7 +28,7 @@ DATA; #21=IFCSIMPLEPROPERTYTEMPLATE('1UDakJ5_f7kBhggNSW4$h5',$,'SymbolsPath','Default symbols SVG',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #22=IFCSIMPLEPROPERTYTEMPLATE('0d53LEtgLDQxnv__NfgH7i',$,'PatternsPath','Default patterns SVG',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #23=IFCSIMPLEPROPERTYTEMPLATE('26qFNMv7nCHgU6Jd7Anga5',$,'ShadingStylesPath','Default shading styles',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); -#24=IFCPROPERTYSETTEMPLATE('0I9merLinF5Ap$aZwaclgm',$,'BBIM_Dimension','',.PSET_TYPEDRIVENOVERRIDE.,'IfcAnnotation/DIMENSION,IfcAnnotation/RADIUS,IfcAnnotation/DIAMETER,IfcTypeProduct',(#25,#26,#27,#28,#30)); +#24=IFCPROPERTYSETTEMPLATE('0I9merLinF5Ap$aZwaclgm',$,'BBIM_Dimension','',.PSET_TYPEDRIVENOVERRIDE.,'IfcAnnotation/DIMENSION,IfcAnnotation/RADIUS,IfcAnnotation/DIAMETER,IfcTypeProduct',(#25,#26,#27,#28,#30,#34)); #25=IFCSIMPLEPROPERTYTEMPLATE('1rL2AbQsXD8RbpoWH5pYOV',$,'ShowDescriptionOnly','Hide the measurement values and show only annotation description',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #26=IFCSIMPLEPROPERTYTEMPLATE('0SVyOfB0rC2xNfdRYf3XvY',$,'SuppressZeroInches','Suppress 0 inch values in dimension annotation text (for example: 12'' - 0" -> 12'')',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); #27=IFCSIMPLEPROPERTYTEMPLATE('2bUmj458PBqPAtUoI3MXsb',$,'TextPrefix','Text to add before annotation measurement value',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); @@ -37,6 +37,7 @@ DATA; #30=IFCSIMPLEPROPERTYTEMPLATE('2TJn72t_v2cvBUG916Dpev',$,'CustomUnit','Dimension''s custom unit',.P_ENUMERATEDVALUE.,'IfcText',$,#31,$,$,$,.READWRITE.); #31=IFCPROPERTYENUMERATION('CustomUnit',(IFCTEXT('Feet and Inches - Fractional'),IFCTEXT('Feet - Decimal'),IFCTEXT('Inches - Fractional'),IFCTEXT('Inches - Decimal'),IFCTEXT('Meters'),IFCTEXT('Decimeters'),IFCTEXT('Centimeters'),IFCTEXT('Millimeters')),$); #32=IFCSIMPLEPROPERTYTEMPLATE('0gjJzDYBX8P85qn1xcAOOo',$,'Reverse_List','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.); +#34=IFCSIMPLEPROPERTYTEMPLATE('1Kx4Pm9nR8vBwZqTs2uYeL',$,'Separator','Characters placed between multiple dimension values when CustomUnit has more than one unit selected (default: '' / '')',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.); #33=IFCSIMPLEPROPERTYTEMPLATE('22TrcxF8jFNB4buSmzjGEF',$,'List_Separator','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.); ENDSEC; END-ISO-10303-21; diff --git a/src/bonsai/bonsai/bim/module/drawing/data.py b/src/bonsai/bonsai/bim/module/drawing/data.py index 23ee7c1987..4341fa3883 100644 --- a/src/bonsai/bonsai/bim/module/drawing/data.py +++ b/src/bonsai/bonsai/bim/module/drawing/data.py @@ -801,8 +801,8 @@ class DecoratorData: suppress_zero_inches = pset_data.get("SuppressZeroInches", False) text_prefix = pset_data.get("TextPrefix", None) or "" text_suffix = pset_data.get("TextSuffix", None) or "" - custom_unit_list = pset_data.get("CustomUnit", None) or "" - custom_unit = custom_unit_list[0] if custom_unit_list else "" + custom_units = list(pset_data.get("CustomUnit", None) or []) + separator = pset_data.get("Separator", None) or " / " return { "dimension_style": dimension_style, @@ -811,7 +811,8 @@ class DecoratorData: "text_prefix": text_prefix, "text_suffix": text_suffix, "fill_bg": fill_bg, - "custom_unit": custom_unit, + "custom_units": custom_units, + "separator": separator, } @classmethod diff --git a/src/bonsai/bonsai/bim/module/drawing/decoration.py b/src/bonsai/bonsai/bim/module/drawing/decoration.py index eedc79e995..dc55a91f53 100644 --- a/src/bonsai/bonsai/bim/module/drawing/decoration.py +++ b/src/bonsai/bonsai/bim/module/drawing/decoration.py @@ -749,12 +749,17 @@ class DimensionDecorator(BaseDecorator): if not show_description_only: length = (v1 - v0).length - text = self.format_value( - context, - length, - suppress_zero_inches=dimension_data["suppress_zero_inches"], - custom_unit=dimension_data["custom_unit"], - ) + units_to_format = dimension_data["custom_units"] if dimension_data["custom_units"] else [None] + parts = [ + self.format_value( + context, + length, + suppress_zero_inches=dimension_data["suppress_zero_inches"], + custom_unit=unit, + ) + for unit in units_to_format + ] + text = dimension_data["separator"].join(str(p) for p in parts) if isinstance(self, DiameterDecorator): text = "D" + text text = text_prefix + text + text_suffix @@ -969,7 +974,9 @@ class RadiusDecorator(BaseDecorator): def get_text(): length = (spline_points[-1] - spline_points[-2]).length - return "R" + self.format_value(context, length, custom_unit=dimension_data["custom_unit"]) + units_to_format = dimension_data["custom_units"] if dimension_data["custom_units"] else [None] + parts = [self.format_value(context, length, custom_unit=unit) for unit in units_to_format] + return "R" + dimension_data["separator"].join(str(p) for p in parts) self.draw_dimension_text( context, get_text, description, dimension_data, pos=pos, text_dir=Vector((1, 0)), box_alignment="center" diff --git a/src/bonsai/bonsai/bim/module/drawing/svgwriter.py b/src/bonsai/bonsai/bim/module/drawing/svgwriter.py index e6cb797738..7b778fa139 100644 --- a/src/bonsai/bonsai/bim/module/drawing/svgwriter.py +++ b/src/bonsai/bonsai/bim/module/drawing/svgwriter.py @@ -1367,14 +1367,17 @@ class SvgWriter: def get_text(): radius = (points[-1].co - points[-2].co).length - radius = helper.format_distance( - radius, - precision=self.precision, - decimal_places=self.decimal_places, - custom_unit=dimension_data["custom_unit"], - ) - text = f"R{radius}" - return text + units_to_format = dimension_data["custom_units"] if dimension_data["custom_units"] else [None] + parts = [ + helper.format_distance( + radius, + precision=self.precision, + decimal_places=self.decimal_places, + custom_unit=unit, + ) + for unit in units_to_format + ] + return "R" + dimension_data["separator"].join(str(p) for p in parts) self.draw_dimension_text( get_text, tag, dimension_data, text_position=text_position, class_str="RADIUS", box_alignment="center" @@ -1504,7 +1507,8 @@ class SvgWriter: text_prefix=dimension_data["text_prefix"], text_suffix=dimension_data["text_suffix"], fill_bg=dimension_data["fill_bg"], - custom_unit=dimension_data["custom_unit"], + custom_units=dimension_data["custom_units"], + separator=dimension_data["separator"], ) def draw_dimension_annotations(self, obj: bpy.types.Object) -> None: @@ -1530,7 +1534,8 @@ class SvgWriter: text_prefix=dimension_data["text_prefix"], text_suffix=dimension_data["text_suffix"], fill_bg=dimension_data["fill_bg"], - custom_unit=dimension_data["custom_unit"], + custom_units=dimension_data["custom_units"], + separator=dimension_data["separator"], ) def draw_measureit_arch_dimension_annotations(self) -> None: @@ -1557,7 +1562,8 @@ class SvgWriter: text_prefix="", text_suffix="", fill_bg=False, - custom_unit=None, + custom_units=None, + separator=" / ", ) -> None: offset = Vector([self.raw_width, self.raw_height]) / 2 v0 = self.project_point_onto_camera(v0_global) @@ -1586,14 +1592,18 @@ class SvgWriter: if not show_description_only: dimension = (v1_global - v0_global).length - dimension = helper.format_distance( - dimension, - precision=self.precision, - decimal_places=self.decimal_places, - suppress_zero_inches=suppress_zero_inches, - custom_unit=custom_unit, - ) - text = text_prefix + str(dimension) + text_suffix + units_to_format = custom_units if custom_units else [None] + parts = [ + helper.format_distance( + dimension, + precision=self.precision, + decimal_places=self.decimal_places, + suppress_zero_inches=suppress_zero_inches, + custom_unit=unit, + ) + for unit in units_to_format + ] + text = text_prefix + separator.join(str(p) for p in parts) + text_suffix else: if not dimension_text: return