From c099a6cb75543de361a230edd5ee4ed2cb512489 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 13 Apr 2022 12:21:18 +1000 Subject: [PATCH] #1153 Drawing titles now display IFC scale and identification data --- .../bim/data/templates/view-title.svg | 6 ++-- .../blenderbim/bim/module/drawing/prop.py | 10 ++++-- .../blenderbim/bim/module/drawing/sheeter.py | 24 ++++++++------ src/blenderbim/blenderbim/core/drawing.py | 2 +- src/blenderbim/blenderbim/tool/drawing.py | 31 +++++++++++++------ 5 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/data/templates/view-title.svg b/src/blenderbim/blenderbim/bim/data/templates/view-title.svg index 302826ec61..9bfad5dc85 100644 --- a/src/blenderbim/blenderbim/bim/data/templates/view-title.svg +++ b/src/blenderbim/blenderbim/bim/data/templates/view-title.svg @@ -70,7 +70,7 @@ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.96055365px;font-family:'OpenGost Type B TT';-inkscape-font-specification:'OpenGost Type B TT';text-align:center;text-anchor:middle;stroke-width:0.26458332px" y="103.10933" x="32.822662" - id="tspan857">{{no}} + id="tspan857">{{Identification}} {{name}} + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.54325247px;font-family:'OpenGost Type B TT';-inkscape-font-specification:'OpenGost Type B TT';text-align:start;text-anchor:start;stroke-width:0.26458329px">{{Name}} {{scale}} + id="tspan865">{{Scale}} diff --git a/src/blenderbim/blenderbim/bim/module/drawing/prop.py b/src/blenderbim/blenderbim/bim/module/drawing/prop.py index 07e5b9b626..a0935d6ac7 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/prop.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/prop.py @@ -72,8 +72,10 @@ def update_diagram_scale(self, context): scale = self.diagram_scale if scale == "CUSTOM": scale = self.custom_diagram_scale - scale = scale.split("|")[1] - element = tool.Ifc.get_entity(context.scene.camera) + if "|" not in scale: + return + human_scale, scale = scale.split("|") + element = tool.Ifc.get_entity(context.scene.active_object) if not element: return pset = ifcopenshell.util.element.get_psets(element).get("EPset_Drawing") @@ -81,7 +83,9 @@ def update_diagram_scale(self, context): pset = tool.Ifc.get().by_id(pset["id"]) else: pset = ifcopenshell.api.run("pset.add_pset", tool.Ifc.get(), product=element, name="EPset_Drawing") - ifcopenshell.api.run("pset.edit_pset", tool.Ifc.get(), pset=pset, properties={"Scale": scale}) + ifcopenshell.api.run( + "pset.edit_pset", tool.Ifc.get(), pset=pset, properties={"Scale": scale, "HumanScale": human_scale} + ) def get_diagram_scales(self, context): diff --git a/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py b/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py index 3c5779d3a0..95dc0b8da7 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py @@ -180,7 +180,7 @@ class SheetBuilder: root = tree.getroot() self.build_titleblock(root, sheet) - self.build_drawings(root, sheet_name) + self.build_drawings(root, sheet) self.build_schedules(root.findall('{http://www.w3.org/2000/svg}g[@data-type="schedule"]')) with open(os.path.join(self.data_dir, "build", sheet_name, f"{sheet_name}.svg"), "wb") as output: @@ -192,8 +192,15 @@ class SheetBuilder: titleblock.append(self.parse_embedded_svg(image, sheet.get_info())) titleblock.remove(image) - def build_drawings(self, root, sheet_name): + def build_drawings(self, root, sheet): + sheet_name = tool.Drawing.get_sheet_filename(sheet) + references = tool.Drawing.get_document_references(sheet) + drawing_references = {tool.Drawing.get_reference_element(r): r for r in references} + for view in root.findall('{http://www.w3.org/2000/svg}g[@data-type="drawing"]'): + drawing = [d for d in drawing_references.keys() if d and d.GlobalId == view.attrib["data-guid"]][0] + reference = drawing_references[drawing] + images = view.findall("{http://www.w3.org/2000/svg}image") background = None @@ -208,8 +215,6 @@ class SheetBuilder: elif image.attrib["data-type"] == "view-title": view_title = image - self.scale = "NTS" - if foreground is not None: view.append(self.parse_embedded_svg(foreground, {})) @@ -219,12 +224,11 @@ class SheetBuilder: if view_title is not None: foreground_path = self.get_href(foreground) - view.append( - self.parse_embedded_svg( - view_title, - {"no": 1, "name": ntpath.basename(foreground_path)[0:-4], "scale": self.scale}, - ) - ) + data = reference.get_info() + if not data["Name"]: + data["Name"] = ntpath.basename(foreground_path)[0:-4] + data["Scale"] = tool.Drawing.get_drawing_human_scale(drawing) + view.append(self.parse_embedded_svg(view_title, data)) for image in images: view.remove(image) diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index ac43fd3323..845d35ed89 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -115,7 +115,7 @@ def add_drawing(ifc, collector, drawing, target_view=None, location_hint=None): ifc.run("group.assign_group", group=group, product=element) collector.assign(camera) pset = ifc.run("pset.add_pset", product=element, name="EPset_Drawing") - ifc.run("pset.edit_pset", pset=pset, properties={"TargetView": target_view, "Scale": "1/100"}) + ifc.run("pset.edit_pset", pset=pset, properties={"TargetView": target_view, "Scale": "1/100", "HumanScale": "1:100"}) drawing.import_drawings() diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index 5dd7d8022a..e01bd58bea 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -291,24 +291,17 @@ class Drawing(blenderbim.core.tool.Drawing): if not new.is_expanded: continue - if tool.Ifc.get_schema() == "IFC2X3": - references = sheet.DocumentReferences or [] - else: - references = sheet.HasDocumentReferences or [] - - for reference in references: + for reference in cls.get_document_references(sheet): new = props.sheets.add() new.ifc_definition_id = reference.id() new.is_sheet = False if tool.Ifc.get_schema() == "IFC2X3": new.identification = reference.ItemReference or "X" - element = [ - r for r in tool.Ifc.by_type("IfcRelAssociatesDocument") if r.RelatingDocument == reference - ][0].RelatedObjects[0] else: new.identification = reference.Identification or "X" - element = reference.DocumentRefForObjects[0].RelatedObjects[0] + + element = cls.get_reference_element(reference) new.name = element.Name new.reference_type = "DRAWING" @@ -720,3 +713,21 @@ class Drawing(blenderbim.core.tool.Drawing): if grid_obj.matrix_world != obj.matrix_world: bpy.ops.bim.update_representation(obj=obj.name) tool.Geometry.record_object_position(obj) + + @classmethod + def get_document_references(cls, document): + if tool.Ifc.get_schema() == "IFC2X3": + return document.DocumentReferences or [] + return document.HasDocumentReferences or [] + + @classmethod + def get_reference_element(cls, reference): + if tool.Ifc.get_schema() == "IFC2X3": + return [ + r for r in tool.Ifc.by_type("IfcRelAssociatesDocument") if r.RelatingDocument == reference + ][0].RelatedObjects[0] + return reference.DocumentRefForObjects[0].RelatedObjects[0] + + @classmethod + def get_drawing_human_scale(cls, drawing): + return ifcopenshell.util.element.get_psets(drawing)["EPset_Drawing"]["HumanScale"]