diff --git a/src/ifcblenderexport/blenderbim/bim/cut_ifc.py b/src/ifcblenderexport/blenderbim/bim/cut_ifc.py index 13f0918915..2aa140abbd 100644 --- a/src/ifcblenderexport/blenderbim/bim/cut_ifc.py +++ b/src/ifcblenderexport/blenderbim/bim/cut_ifc.py @@ -861,6 +861,9 @@ class SvgWriter(): if self.ifc_cutter.dimension_obj: self.draw_dimension_annotations(self.ifc_cutter.dimension_obj) + if self.ifc_cutter.break_obj: + self.draw_break_annotations(self.ifc_cutter.break_obj) + for grid_obj in self.ifc_cutter.grid_objs: matrix_world = grid_obj.matrix_world for edge in grid_obj.data.edges: @@ -1056,6 +1059,30 @@ class SvgWriter(): } )) + def draw_break_annotations(self, break_obj): + x_offset = self.raw_width / 2 + y_offset = self.raw_height / 2 + + matrix_world = break_obj.matrix_world + for polygon in break_obj.data.polygons: + points = [break_obj.data.vertices[v] for v in polygon.vertices] + projected_points = [self.project_point_onto_camera(matrix_world @ p.co.xyz) for p in points] + d = ' '.join(['L {} {}'.format( + (x_offset + p.x) * self.scale, (y_offset - p.y) * self.scale) + for p in projected_points]) + d = 'M{}'.format(d[1:]) + path = self.svg.add(self.svg.path(d=d, class_=' '.join(['break']))) + + break_points = [ + projected_points[0], + ((projected_points[1]-projected_points[0])/2)+projected_points[0], + projected_points[1]] + d = ' '.join(['L {} {}'.format( + (x_offset + p.x) * self.scale, (y_offset - p.y) * self.scale) + for p in break_points]) + d = 'M{}'.format(d[1:]) + path = self.svg.add(self.svg.path(d=d, class_=' '.join(['breakline']))) + def draw_dimension_annotations(self, dimension_obj, text_override=None): x_offset = self.raw_width / 2 y_offset = self.raw_height / 2 diff --git a/src/ifcblenderexport/blenderbim/bim/data/styles/default.css b/src/ifcblenderexport/blenderbim/bim/data/styles/default.css index 42c7c15528..b1e11aa999 100644 --- a/src/ifcblenderexport/blenderbim/bim/data/styles/default.css +++ b/src/ifcblenderexport/blenderbim/bim/data/styles/default.css @@ -4,6 +4,8 @@ .hidden { stroke-dasharray: 3, 2; } .leader { marker-end: url(#leader-marker); } .stair { marker-start: url(#stair-marker-start); marker-end: url(#stair-marker-end); } +.break { fill: white; } +.breakline { fill: none; stroke: black; stroke-linecap: 'round'; stroke-width: 0.25; marker-mid: url(#breakline-marker); } .solid {} .material-diagonal1 { fill: url(#diagonal1); } .material-diagonal2 { fill: url(#diagonal2); } diff --git a/src/ifcblenderexport/blenderbim/bim/data/templates/markers.svg b/src/ifcblenderexport/blenderbim/bim/data/templates/markers.svg index 3a9cb0eee2..3ba0be893a 100644 --- a/src/ifcblenderexport/blenderbim/bim/data/templates/markers.svg +++ b/src/ifcblenderexport/blenderbim/bim/data/templates/markers.svg @@ -53,4 +53,10 @@ + + + + + + diff --git a/src/ifcblenderexport/blenderbim/bim/operator.py b/src/ifcblenderexport/blenderbim/bim/operator.py index a7ef3d67cb..9b5476958e 100644 --- a/src/ifcblenderexport/blenderbim/bim/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/operator.py @@ -1579,6 +1579,7 @@ class CutSection(bpy.types.Operator): ifc_cutter.leader_obj = None ifc_cutter.stair_obj = None ifc_cutter.dimension_obj = None + ifc_cutter.break_obj = None ifc_cutter.equal_obj = None ifc_cutter.hidden_objs = [] ifc_cutter.solid_objs = [] @@ -1595,6 +1596,8 @@ class CutSection(bpy.types.Operator): ifc_cutter.equal_obj = obj elif 'Dimension' in obj.name: ifc_cutter.dimension_obj = obj + elif 'Break' in obj.name: + ifc_cutter.break_obj = obj elif 'Hidden' in obj.name: ifc_cutter.hidden_objs.append((obj, obj.data)) elif 'Solid' in obj.name: