From 186c4dd11804ffd4d3311b456d2b5fd608f07a95 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 26 Jul 2021 20:24:39 +1000 Subject: [PATCH] New experimental serialiser-based drawing generation code. See #1153. See #1564. --- .../blenderbim/bim/module/drawing/operator.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index 2a55ce3c05..07f7060477 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -7,6 +7,8 @@ import bmesh import shutil import subprocess import webbrowser +import ifcopenshell +import ifcopenshell.geom import ifcopenshell.util.selector import ifcopenshell.util.representation import blenderbim.bim.module.drawing.svgwriter as svgwriter @@ -231,6 +233,37 @@ class CreateDrawing(bpy.types.Operator): svg_path = os.path.join(context.scene.BIMProperties.data_dir, "cache", self.drawing_name + "-linework.svg") if os.path.isfile(svg_path) and self.props.should_use_linework_cache: return svg_path + # This is a work in progress. See #1153 and #1564. + # Switch from old to new if you are testing v0.7.0 + self.generate_linework_old(svg_path) + #self.generate_linework_new(svg_path) + return svg_path + + def generate_linework_new(self, svg_path): + settings = ifcopenshell.geom.settings( + APPLY_DEFAULT_MATERIALS=True, + DISABLE_TRIANGULATION=True, + INCLUDE_CURVES=True, + EXCLUDE_SOLIDS_AND_SURFACES=False, + ) + buffer = ifcopenshell.geom.serializers.buffer() + serialiser = ifcopenshell.geom.serializers.svg(buffer, settings) + serialiser.setFile(self.file) + serialiser.setElevationRef("DRAWING") + serialiser.setUseNamespace(True) + serialiser.setAlwaysProject(True) + serialiser.setUseHlrPoly(True) + serialiser.setWithoutStoreys(True) + excluded_elements = [] + for ifc_class in ["IfcSpace", "IfcOpeningElement", "IfcDoor", "IfcWindow"]: + excluded_elements += self.file.by_type(ifc_class) + for element in ifcopenshell.geom.iterate(settings, self.file, exclude=excluded_elements): + serialiser.write(element) + serialiser.finalize() + with open(svg_path, "w") as svg: + svg.write(buffer.get_value()) + + def generate_linework_old(self, svg_path): ifcconvert_path = os.path.join(cwd, "..", "..", "..", "libs", "IfcConvert") subprocess.run( [