From 3ef823db239843bdd1104055f2229336d824cc9a Mon Sep 17 00:00:00 2001 From: Bruno Postle Date: Sat, 20 Apr 2024 11:56:22 +0100 Subject: [PATCH] Regenerate missing sheets #4462 BlenderBIM will regenerate missing SVG drawings from the IFC on demand, now it attempts to regenerate missing SVG sheets too. ie. you can open a bare IFC file with configured drawings and sheets and continue working. Only drawings are recognised, spreadsheet and other SVG refs are not regenerated, all drawings are placed at the 30,30 pixel location. --- .../blenderbim/bim/module/drawing/operator.py | 1 + .../blenderbim/bim/module/drawing/svgwriter.py | 2 +- src/blenderbim/blenderbim/core/drawing.py | 8 ++++++++ src/blenderbim/blenderbim/tool/drawing.py | 15 +++++++++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index 1d5e751062f..f11837dba4e 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -2373,6 +2373,7 @@ def _execute(self, context): if not filepath.is_file(): sheet_name = f"{sheet_prop.identification} - {sheet_prop.name}" sheets_not_found.append(f'"{sheet_name}" - {document_uri}') + core.regenerate_sheet(tool.Drawing, sheet) if sheets_not_found: self.report({"ERROR"}, "Some sheets svg files are missing:\n" + "\n".join(sheets_not_found)) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py index 736d8efbe5b..21220f39711 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py @@ -93,7 +93,7 @@ def draw_underlay(self, image): def setup_drawing_resource_paths(self, element): pset = ifcopenshell.util.element.get_pset(element, "EPset_Drawing") - for resource in ("Stylesheet", "Markers", "Symbols", "Patterns"): + for resource in ("Stylesheet", "Markers", "Symbols", "Patterns", "ShadingStyles"): resource_path = pset.get(resource) if not resource_path: self.resource_paths[resource] = None diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index cccdc16ad10..36cec23daa6 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -16,6 +16,8 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +from pathlib import Path + def enable_editing_text(drawing, obj=None): drawing.enable_editing_text(obj) @@ -89,6 +91,12 @@ def add_sheet(ifc, drawing, titleblock=None): drawing.import_sheets() +def regenerate_sheet(drawing, sheet=None): + titleblock_uri = drawing.get_document_uri(sheet, "TITLEBLOCK") + drawing.create_svg_sheet(sheet, drawing.sanitise_filename(Path(titleblock_uri).stem)) + drawing.add_drawings(sheet) + + def open_sheet(drawing, sheet=None): drawing.open_layout_svg(drawing.get_document_uri(sheet, "LAYOUT")) diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index d1d7e9649a2..a5d67e5aedb 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -247,6 +247,21 @@ def create_svg_sheet(cls, document, titleblock): sheet_builder.create(uri, titleblock) return uri + @classmethod + def add_drawings(cls, sheet): + sheet_builder = sheeter.SheetBuilder() + sheet_builder.data_dir = bpy.context.scene.BIMProperties.data_dir + sheet_reference = None + drawing_names = [] + for reference in cls.get_document_references(sheet): + if reference.Description == "LAYOUT": + sheet_reference = reference + elif reference.Description == "DRAWING": + drawing_names.append(Path(reference.Location).stem) + for annotation in [e for e in tool.Ifc.get().by_type("IfcAnnotation") if e.ObjectType == "DRAWING"]: + if annotation.Name in drawing_names: + sheet_builder.add_drawing(sheet_reference, annotation, sheet) + @classmethod def delete_collection(cls, collection): bpy.data.collections.remove(collection, do_unlink=True)