From 6846021768fcf1fcbbd8e538280f39eea0eb6aa3 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 12 Jan 2024 19:48:32 +1100 Subject: [PATCH] Fix #4199. Bug where external references on sheets weren't properly referenced leading to no names. --- .../blenderbim/bim/module/drawing/operator.py | 22 +++++++------- .../blenderbim/bim/module/drawing/sheeter.py | 29 ++++++++++--------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index c41b75461e..10100f832c 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -1996,11 +1996,11 @@ class AddReferenceToSheet(bpy.types.Operator, Operator): props = context.scene.DocProperties active_reference = props.references[props.active_reference_index] active_sheet = tool.Drawing.get_active_sheet(context) - reference = tool.Ifc.get().by_id(active_reference.ifc_definition_id) + extref = tool.Ifc.get().by_id(active_reference.ifc_definition_id) if tool.Ifc.get_schema() == "IFC2X3": - reference_location = tool.Drawing.get_path_with_ext(reference.DocumentReferences[0].Location, "svg") + extref_location = tool.Drawing.get_path_with_ext(extref.DocumentReferences[0].Location, "svg") else: - reference_location = tool.Drawing.get_path_with_ext(reference.HasDocumentReferences[0].Location, "svg") + extref_location = tool.Drawing.get_path_with_ext(extref.HasDocumentReferences[0].Location, "svg") sheet = tool.Ifc.get().by_id(active_sheet.ifc_definition_id) if not sheet.is_a("IfcDocumentInformation"): @@ -2008,30 +2008,30 @@ class AddReferenceToSheet(bpy.types.Operator, Operator): references = tool.Drawing.get_document_references(sheet) - has_reference = False + has_extref = False for reference in references: - if reference.Location == reference_location: - has_reference = True + if reference.Location == extref_location: + has_extref = True break - if has_reference: + if has_extref: return - if not tool.Drawing.does_file_exist(tool.Ifc.resolve_uri(reference_location)): - self.report({"ERROR"}, f"Cannot find reference svg by path {reference_location}.") + if not tool.Drawing.does_file_exist(tool.Ifc.resolve_uri(extref_location)): + self.report({"ERROR"}, f"Cannot find reference svg by path {extref_location}.") return reference = tool.Ifc.run("document.add_reference", information=sheet) id_attr = "ItemReference" if tool.Ifc.get_schema() == "IFC2X3" else "Identification" attributes = { id_attr: str(len([r for r in references if r.Description in ("DRAWING", "REFERENCE")]) + 1), - "Location": reference_location, + "Location": extref_location, "Description": "REFERENCE", } tool.Ifc.run("document.edit_reference", reference=reference, attributes=attributes) sheet_builder = sheeter.SheetBuilder() sheet_builder.data_dir = context.scene.BIMProperties.data_dir - sheet_builder.add_document(reference, reference, sheet) + sheet_builder.add_document(reference, extref, sheet) tool.Drawing.import_sheets() diff --git a/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py b/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py index f4fd9a4503..55de457f39 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py @@ -187,11 +187,11 @@ class SheetBuilder: layout_tree.write(layout_path) - def add_document(self, reference, schedule, sheet): - view_path = tool.Drawing.get_path_with_ext(tool.Drawing.get_document_uri(schedule), "svg") + def add_document(self, reference, document, sheet): + view_path = tool.Drawing.get_path_with_ext(tool.Drawing.get_document_uri(document), "svg") if not os.path.exists(view_path): - tool.Drawing.create_svg_schedule(schedule) - schedule_name = os.path.splitext(os.path.basename(view_path))[0] + tool.Drawing.create_svg_document(document) + document_name = os.path.splitext(os.path.basename(view_path))[0] layout_path = tool.Drawing.get_document_uri(sheet, "LAYOUT") layout_dir = os.path.dirname(layout_path) @@ -207,12 +207,12 @@ class SheetBuilder: view_height = self.convert_to_mm(view_root.attrib.get("height")) view = ET.SubElement(layout_root, "g") - view.attrib["data-type"] = "schedule" view.attrib["data-id"] = str(reference.id()) - view.attrib["data-schedule"] = str(schedule.id()) + view.attrib["data-type"] = document.Scope.lower() + view.attrib["data-document"] = str(document.id()) foreground = ET.SubElement(view, "image") - foreground.attrib["data-type"] = "table" + foreground.attrib["data-type"] = "content" foreground.attrib["xlink:href"] = os.path.relpath(view_path, layout_dir) foreground.attrib["x"] = str(DEFAULT_POSITION.x) foreground.attrib["y"] = str(DEFAULT_POSITION.y) @@ -263,7 +263,7 @@ class SheetBuilder: self.build_titleblock(root, sheet) self.build_drawings(root, sheet) - self.build_schedules(root, sheet) + self.build_documents(root, sheet) with open(sheet_path, "wb") as output: tree.write(output) @@ -390,11 +390,14 @@ class SheetBuilder: for image in images: view.remove(image) - def build_schedules(self, root, sheet): - for view in root.findall('{http://www.w3.org/2000/svg}g[@data-type="schedule"]'): + def build_documents(self, root, sheet): + schedules = root.findall('{http://www.w3.org/2000/svg}g[@data-type="schedule"]') + references = root.findall('{http://www.w3.org/2000/svg}g[@data-type="reference"]') + documents = schedules + references + for view in documents: try: reference = tool.Ifc.get().by_id(int(view.attrib["data-id"])) - schedule = tool.Ifc.get().by_id(int(view.attrib["data-schedule"])) + document = tool.Ifc.get().by_id(int(view.attrib["data-document"])) except: # Perhaps the SVG has outdated content or is edited externally which we cannot control. continue @@ -405,7 +408,7 @@ class SheetBuilder: view_title = None for image in images: - if image.attrib["data-type"] == "table": + if image.attrib["data-type"] == "content": table = image elif image.attrib["data-type"] == "view-title": view_title = image @@ -418,7 +421,7 @@ class SheetBuilder: data = reference.get_info() data.update({"Sheet" + k: v for k, v in sheet.get_info().items()}) if not data["Name"]: - data["Name"] = schedule.Name or "Unnamed" + data["Name"] = document.Name or "Unnamed" view.append(self.parse_embedded_svg(view_title, data)) for image in images: