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 1d5e751062..f11837dba4 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -2373,6 +2373,7 @@ class LoadSheets(bpy.types.Operator, Operator): 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 736d8efbe5..21220f3971 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py @@ -93,7 +93,7 @@ class SvgWriter: 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 cccdc16ad1..36cec23daa 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 d1d7e9649a..a5d67e5aed 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -247,6 +247,21 @@ class Drawing(blenderbim.core.tool.Drawing): 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)