From 6cd4a2d78be00b23c9dc94e41432ec912799e8fe Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 29 Mar 2022 20:30:10 +1100 Subject: [PATCH] #1153. Add support for elevation symbols in generated SVGs. --- .../blenderbim/bim/data/templates/symbols.svg | 9 +++++- .../blenderbim/bim/module/drawing/operator.py | 3 ++ .../bim/module/drawing/svgwriter.py | 30 ++++++++++++++++--- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/data/templates/symbols.svg b/src/blenderbim/blenderbim/bim/data/templates/symbols.svg index b3209968e5..1dc3c36950 100644 --- a/src/blenderbim/blenderbim/bim/data/templates/symbols.svg +++ b/src/blenderbim/blenderbim/bim/data/templates/symbols.svg @@ -5,6 +5,13 @@ - + + + + + + + + diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index b77e870b81..a519ccd9a2 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -457,6 +457,8 @@ class CreateDrawing(bpy.types.Operator): svg_writer.annotations.setdefault("equal_objs", []).append(obj) elif element.ObjectType == "DIMENSION": svg_writer.annotations.setdefault("dimension_objs", []).append(obj) + elif element.ObjectType == "ELEVATION": + svg_writer.annotations.setdefault("elevation_objs", []).append(obj) elif element.ObjectType == "BREAKLINE": svg_writer.annotations["break_obj"] = obj elif element.ObjectType == "HIDDEN_LINE": @@ -681,6 +683,7 @@ class ActivateView(bpy.types.Operator): project_collection.children["Views"].children[camera.users_collection[0].name].hide_viewport = False bpy.data.collections.get(camera.users_collection[0].name).hide_render = False + bpy.context.scene.DocProperties.active_drawing_id = self.drawing bpy.ops.bim.activate_drawing_style() core.sync_references(tool.Ifc, tool.Collector, tool.Drawing, drawing=tool.Ifc.get().by_id(self.drawing)) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py index baabc5cef0..4e81798518 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/svgwriter.py @@ -286,7 +286,12 @@ class SvgWriter: }, ) ) - self.draw_text_annotations() + + for obj in self.annotations.get("elevation_objs", []): + self.draw_elevation_annotation(obj) + + for text_obj in self.annotations.get("text_objs", []): + self.draw_text_annotation(text_obj, text_obj.location) def draw_ifc_annotation(self): x_offset = self.raw_width / 2 @@ -425,9 +430,25 @@ class SvgWriter: position = Vector((0, 0, 0)) self.draw_text_annotation(obj, position) - def draw_text_annotations(self): - for text_obj in self.annotations.get("text_objs", []): - self.draw_text_annotation(text_obj, text_obj.location) + def draw_elevation_annotation(self, obj): + x_offset = self.raw_width / 2 + y_offset = self.raw_height / 2 + symbol_position = self.project_point_onto_camera(obj.location) + symbol_position = Vector(((x_offset + symbol_position.x), (y_offset - symbol_position.y))) + + 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)))) + + transform = "rotate({}, {}, {})".format( + angle, + (symbol_position * self.scale)[0], + (symbol_position * self.scale)[1], + ) + + self.svg.add(self.svg.use("#elevation-arrow", insert=tuple(symbol_position * self.scale), transform=transform)) + self.svg.add(self.svg.use("#elevation-tag", insert=tuple(symbol_position * self.scale))) + def draw_text_annotation(self, text_obj, position): x_offset = self.raw_width / 2 @@ -646,6 +667,7 @@ class SvgWriter: ) def project_point_onto_camera(self, point): + # TODO is this needlessly complex? return self.camera.matrix_world.inverted() @ geometry.intersect_line_plane( point.xyz, point.xyz - Vector(self.camera_projection),