diff --git a/src/blenderbim/blenderbim/bim/module/drawing/data.py b/src/blenderbim/blenderbim/bim/module/drawing/data.py index eb5ad290bc..a763b9a847 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/data.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/data.py @@ -16,10 +16,12 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +import os import bpy import ifcopenshell.util.element import ifcopenshell.util.representation import blenderbim.tool as tool +from pathlib import Path def refresh(): @@ -56,13 +58,29 @@ class SheetsData: @classmethod def load(cls): - cls.data = {"total_sheets": cls.total_sheets()} + cls.data = {"total_sheets": cls.total_sheets(), "titleblocks": cls.titleblocks()} cls.is_loaded = True @classmethod def total_sheets(cls): return len([d for d in tool.Ifc.get().by_type("IfcDocumentInformation") if d.Scope == "SHEET"]) + @classmethod + def titleblocks(cls): + files = Path(os.path.join(bpy.context.scene.BIMProperties.data_dir, "templates", "titleblocks")).glob("*.svg") + files = [str(f.stem) for f in files] + + if tool.Ifc.get(): + project = tool.Ifc.get().by_type("IfcProject")[0] + titleblocks_dir = ifcopenshell.util.element.get_pset(project, "BBIM_Documentation", "TitleblocksDir") + if not titleblocks_dir: + titleblocks_dir = bpy.context.scene.DocProperties.titleblocks_dir + titleblocks_dir = tool.Ifc.resolve_uri(titleblocks_dir) + if os.path.exists(titleblocks_dir): + files.extend([str(f.stem) for f in Path(titleblocks_dir).glob("*.svg")]) + + return [(f, f, "") for f in sorted(list(set(files)))] + class DrawingsData: data = {} diff --git a/src/blenderbim/blenderbim/bim/module/drawing/prop.py b/src/blenderbim/blenderbim/bim/module/drawing/prop.py index 84ffb3cb22..633ebbefaf 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/prop.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/prop.py @@ -25,7 +25,7 @@ import blenderbim.tool as tool import blenderbim.core.drawing as core import blenderbim.bim.module.drawing.annotation as annotation import blenderbim.bim.module.drawing.decoration as decoration -from blenderbim.bim.module.drawing.data import DrawingsData, DecoratorData +from blenderbim.bim.module.drawing.data import DrawingsData, DecoratorData, SheetsData from blenderbim.bim.module.drawing.data import refresh as refresh_drawing_data from pathlib import Path from blenderbim.bim.prop import Attribute, StrProperty @@ -44,18 +44,15 @@ from bpy.props import ( diagram_scales_enum = [] -titleblocks_enum = [] sheets_enum = [] vector_styles_enum = [] def purge(): global diagram_scales_enum - global titleblocks_enum global sheets_enum global vector_styles_enum diagram_scales_enum = [] - titleblocks_enum = [] sheets_enum = [] vector_styles_enum = [] @@ -191,20 +188,14 @@ def update_layer(self, context, name, value): ifcopenshell.api.run("pset.edit_pset", tool.Ifc.get(), pset=pset, properties={name: value}) -def getTitleblocks(self, context): - global titleblocks_enum - if len(titleblocks_enum) < 1: - titleblocks_enum.clear() - files = Path(os.path.join(context.scene.BIMProperties.data_dir, "templates", "titleblocks")).glob("*.svg") - files = sorted([str(f.stem) for f in files]) - titleblocks_enum.extend([(f, f, "") for f in files]) - return titleblocks_enum +def get_titleblocks(self, context): + if not SheetsData.is_loaded: + SheetsData.load() + return SheetsData.data["titleblocks"] -def refreshTitleblocks(self, context): - global titleblocks_enum - titleblocks_enum.clear() - getTitleblocks(self, context) +def update_titleblocks(self, context): + SheetsData.data["titleblocks"] = SheetsData.titleblocks() def toggleDecorations(self, context): @@ -327,7 +318,7 @@ class DocProperties(PropertyGroup): current_drawing_index: IntProperty(name="Current Drawing Index") schedules: CollectionProperty(name="Schedules", type=Schedule) active_schedule_index: IntProperty(name="Active Schedule Index") - titleblock: EnumProperty(items=getTitleblocks, name="Titleblock", update=refreshTitleblocks) + titleblock: EnumProperty(items=get_titleblocks, name="Titleblock", update=update_titleblocks) is_editing_sheets: BoolProperty(name="Is Editing Sheets", default=False) sheets: CollectionProperty(name="Sheets", type=Sheet) active_sheet_index: IntProperty(name="Active Sheet Index") diff --git a/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py b/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py index 852764662d..c2ae5ca8ad 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/sheeter.py @@ -35,18 +35,22 @@ class SheetBuilder: self.scale = "NTS" def create(self, layout_path, titleblock_name): - sheet_dir = os.path.dirname(layout_path) - root = ET.Element("svg") root.attrib["xmlns"] = "http://www.w3.org/2000/svg" root.attrib["xmlns:xlink"] = "http://www.w3.org/1999/xlink" root.attrib["id"] = "root" root.attrib["version"] = "1.1" + sheet_dir = os.path.dirname(layout_path) ootb_titleblock_path = os.path.join(self.data_dir, "templates", "titleblocks", titleblock_name + ".svg") titleblock_path = tool.Ifc.resolve_uri(tool.Drawing.get_default_titleblock_path(titleblock_name)) - view_root = ET.parse(ootb_titleblock_path).getroot() + os.makedirs(sheet_dir, exist_ok=True) + os.makedirs(os.path.dirname(titleblock_path), exist_ok=True) + if not os.path.exists(titleblock_path): + shutil.copy(ootb_titleblock_path, titleblock_path) + + view_root = ET.parse(titleblock_path).getroot() view_width = self.convert_to_mm(view_root.attrib.get("width")) view_height = self.convert_to_mm(view_root.attrib.get("height")) view = ET.SubElement(root, "g") @@ -62,11 +66,6 @@ class SheetBuilder: root.attrib["height"] = "{}mm".format(view_height) root.attrib["viewBox"] = "0 0 {} {}".format(view_width, view_height) - os.makedirs(sheet_dir, exist_ok=True) - os.makedirs(os.path.dirname(titleblock_path), exist_ok=True) - if not os.path.exists(titleblock_path): - shutil.copy(ootb_titleblock_path, titleblock_path) - with open(layout_path, "w") as f: f.write(minidom.parseString(ET.tostring(root)).toprettyxml(indent=" "))