From d9726efee0fb89039e807bf20cc65e4a558465a4 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 14 Apr 2023 20:24:02 +1000 Subject: [PATCH] Fix #2986. Reimplement Metadata property of EPset_Drawing to include arbitrary metadata as CSS classes. --- .../blenderbim/bim/module/drawing/operator.py | 16 +++++++++++----- .../blenderbim/bim/module/drawing/svgwriter.py | 9 ++++----- src/blenderbim/blenderbim/tool/drawing.py | 4 ++++ 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index 65d04f6330..ec833ea1d3 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -187,6 +187,7 @@ class CreateDrawing(bpy.types.Operator): with profile("Initialize drawing generation process"): self.cprops = self.camera.data.BIMCameraProperties self.drawing_name = self.file.by_id(drawing_id).Name + self.metadata = tool.Drawing.get_drawing_metadata(self.camera_element) self.get_scale() if self.cprops.update_representation(self.camera): bpy.ops.bim.update_representation(obj=self.camera.name, ifc_representation_class="") @@ -543,8 +544,16 @@ class CreateDrawing(bpy.types.Operator): material_name = material.LayerSetName or "null" else: material_name = getattr(material, "Name", "null") or "null" - material_name = self.canonicalise_class_name(material_name) + material_name = tool.Drawing.canonicalise_class_name(material_name) classes.append(f"material-{material_name}") + + for key in self.metadata: + value = ifcopenshell.util.selector.get_element_value(element, key) + if value: + classes.append( + tool.Drawing.canonicalise_class_name(key) + "-" + tool.Drawing.canonicalise_class_name(str(value)) + ) + el.set("class", (el.get("class", "") + " " + " ".join(classes)).strip()) # Drawing convention states that objects with the same material are merged when cut. @@ -594,9 +603,6 @@ class CreateDrawing(bpy.types.Operator): if group is not None: group[:] = reversed(group) - def canonicalise_class_name(self, name): - return re.sub("[^0-9a-zA-Z]+", "", name) - def generate_annotation(self, context): if not self.cprops.has_annotation: return @@ -613,7 +619,7 @@ class CreateDrawing(bpy.types.Operator): precision = ifcopenshell.util.element.get_pset(self.camera_element, "EPset_Drawing", "MetricPrecision") if not precision: precision = ifcopenshell.util.element.get_pset(self.camera_element, "EPset_Drawing", "ImperialPrecision") - self.svg_writer.metadata = tool.Drawing.get_drawing_metadata(self.camera_element) + self.svg_writer.metadata = self.metadata self.svg_writer.create_blank_svg(svg_path).draw_annotations(annotations, precision).save() return svg_path diff --git a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py index b0e017fd7d..d053569e72 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py @@ -354,7 +354,7 @@ class SvgWriter: def get_attribute_classes(self, obj): element = tool.Ifc.get_entity(obj) global_id = "GlobalId-{}".format(element.GlobalId) - predefined_type = "PredefinedType-" + self.canonicalise_class_name( + predefined_type = "PredefinedType-" + tool.Drawing.canonicalise_class_name( str(ifcopenshell.util.element.get_predefined_type(element)) ) classes = [global_id, element.is_a(), predefined_type] @@ -364,12 +364,11 @@ class SvgWriter: for key in self.metadata: value = ifcopenshell.util.selector.get_element_value(element, key) if value: - classes.append(self.canonicalise_class_name(key) + "-" + self.canonicalise_class_name(str(value))) + classes.append( + tool.Drawing.canonicalise_class_name(key) + "-" + tool.Drawing.canonicalise_class_name(str(value)) + ) return classes - def canonicalise_class_name(self, name): - return re.sub("[^0-9a-zA-Z]+", "", name) - def draw_line_annotation(self, obj): # TODO: properly scope these offsets x_offset = self.raw_width / 2 diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index f42c445aa6..4ed2dec9a4 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -44,6 +44,10 @@ import collections class Drawing(blenderbim.core.tool.Drawing): + @classmethod + def canonicalise_class_name(self, name): + return re.sub("[^0-9a-zA-Z]+", "", name) + @classmethod def copy_representation(cls, source, dest): if source.Representation: