From 8686462eed566af6c4f8fe91345026e60395ca67 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 29 Mar 2022 20:44:20 +1100 Subject: [PATCH] #1153. Section markers are now supported in SVG. --- .../blenderbim/bim/data/templates/symbols.svg | 7 +++++ .../blenderbim/bim/module/drawing/operator.py | 2 ++ .../bim/module/drawing/svgwriter.py | 26 +++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/src/blenderbim/blenderbim/bim/data/templates/symbols.svg b/src/blenderbim/blenderbim/bim/data/templates/symbols.svg index 1dc3c36950..ea0e4b3630 100644 --- a/src/blenderbim/blenderbim/bim/data/templates/symbols.svg +++ b/src/blenderbim/blenderbim/bim/data/templates/symbols.svg @@ -14,4 +14,11 @@ + + + + + + + diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index a519ccd9a2..c7d083fa13 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -459,6 +459,8 @@ class CreateDrawing(bpy.types.Operator): svg_writer.annotations.setdefault("dimension_objs", []).append(obj) elif element.ObjectType == "ELEVATION": svg_writer.annotations.setdefault("elevation_objs", []).append(obj) + elif element.ObjectType == "SECTION": + svg_writer.annotations.setdefault("section_objs", []).append(obj) elif element.ObjectType == "BREAKLINE": svg_writer.annotations["break_obj"] = obj elif element.ObjectType == "HIDDEN_LINE": diff --git a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py index 4e81798518..b13656735c 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py @@ -290,6 +290,9 @@ class SvgWriter: for obj in self.annotations.get("elevation_objs", []): self.draw_elevation_annotation(obj) + for obj in self.annotations.get("section_objs", []): + self.draw_section_annotation(obj) + for text_obj in self.annotations.get("text_objs", []): self.draw_text_annotation(text_obj, text_obj.location) @@ -430,6 +433,29 @@ class SvgWriter: position = Vector((0, 0, 0)) self.draw_text_annotation(obj, position) + def draw_section_annotation(self, obj): + x_offset = self.raw_width / 2 + y_offset = self.raw_height / 2 + + self.draw_line_annotation((obj, obj.data), ["solid"]) + + v1 = self.project_point_onto_camera(obj.matrix_world @ Vector((0, 0, 0))) + v2 = self.project_point_onto_camera(obj.matrix_world @ Vector((0, 0, -1))) + angle = -math.degrees((v2 - v1).xy.angle_signed(Vector((0, 1)))) + + for vert in obj.data.vertices: + point = obj.matrix_world @ vert.co + symbol_position = self.project_point_onto_camera(point) + symbol_position = Vector(((x_offset + symbol_position.x), (y_offset - symbol_position.y))) + transform = "rotate({}, {}, {})".format( + angle, + (symbol_position * self.scale)[0], + (symbol_position * self.scale)[1], + ) + + self.svg.add(self.svg.use("#section-arrow", insert=tuple(symbol_position * self.scale), transform=transform)) + self.svg.add(self.svg.use("#section-tag", insert=tuple(symbol_position * self.scale))) + def draw_elevation_annotation(self, obj): x_offset = self.raw_width / 2 y_offset = self.raw_height / 2