Fix #2521. Fill areas have limited dissolve applied before rendering.

This commit is contained in:
Dion Moult
2023-02-12 18:58:49 +11:00
parent 303de61417
commit 60fa05a913
2 changed files with 16 additions and 9 deletions
@@ -39,16 +39,16 @@ text { /* 2.5mm */ fill: black; stroke: none; font-family: 'OpenGost Type B TT';
.PredefinedType-BOUNDARY { fill: none; stroke: red; stroke-width: 1; stroke-dasharray: 12, 4, 3, 4, 3, 4; } .PredefinedType-BOUNDARY { fill: none; stroke: red; stroke-width: 1; stroke-dasharray: 12, 4, 3, 4, 3, 4; }
.PredefinedType-BATTING { marker-start: url(#batting); stroke: none; } .PredefinedType-BATTING { marker-start: url(#batting); stroke: none; }
.PredefinedType-SEALANT { fill: url(#crosshatch1); stroke-width: 0.25; } .PredefinedType-SEALANT { fill: url(#crosshatch1); stroke-width: 0.25; }
.PredefinedType-FILLAREA { fill: white; stroke: none; } .PredefinedType-FILLAREA { fill: white; stroke: black; }
.PredefinedType-BREAKLINE { fill: none; stroke: black; stroke-width: 0.25; marker-mid: url(#breakline-marker); } .PredefinedType-BREAKLINE { fill: none; stroke: black; stroke-width: 0.25; marker-mid: url(#breakline-marker); }
.PredefinedType-TEXT { fill: black; stroke: none; } .PredefinedType-TEXT { fill: black; stroke: none; }
path.PredefinedType-TEXTLEADER { marker-end: url(#leader-marker); } path.PredefinedType-TEXTLEADER { marker-end: url(#leader-marker); }
text.PredefinedType-TEXTLEADER { fill: black; stroke: none; } text.PredefinedType-TEXTLEADER { fill: black; stroke: none; }
text.title { /* 7mm */ fill: black; stroke: none; font-family: 'OpenGost Type B TT'; font-size: 11.55px; } text.title { /* 7mm */ font-size: 11.55px; }
text.header { /* 5mm */ fill: black; stroke: none; font-family: 'OpenGost Type B TT'; font-size: 8.25px; } text.header { /* 5mm */ font-size: 8.25px; }
text.large { /* 3.5mm */ fill: black; stroke: none; font-family: 'OpenGost Type B TT'; font-size: 5.78px; } text.large { /* 3.5mm */ font-size: 5.78px; }
text.regular { /* 2.5mm */ fill: black; stroke: none; font-family: 'OpenGost Type B TT'; font-size: 4.13px; } text.regular { /* 2.5mm */ font-size: 4.13px; }
text.small { /* 1.8mm */ fill: black; stroke: none; font-family: 'OpenGost Type B TT'; font-size: 2.97px; } text.small { /* 1.8mm */ font-size: 2.97px; }
.material-blank { fill: white; } .material-blank { fill: white; }
.material-diagonal1 { fill: url(#diagonal1); } .material-diagonal1 { fill: url(#diagonal1); }
.material-diagonal2 { fill: url(#diagonal2); } .material-diagonal2 { fill: url(#diagonal2); }
@@ -31,6 +31,7 @@ import ifcopenshell.util.representation
import blenderbim.tool as tool import blenderbim.tool as tool
import blenderbim.bim.module.drawing.helper as helper import blenderbim.bim.module.drawing.helper as helper
import blenderbim.bim.module.drawing.annotation as annotation import blenderbim.bim.module.drawing.annotation as annotation
from math import pi
from mathutils import Vector from mathutils import Vector
from mathutils import geometry from mathutils import geometry
from blenderbim.bim.ifc import IfcStore from blenderbim.bim.ifc import IfcStore
@@ -290,16 +291,22 @@ class SvgWriter:
# from Blender. In the future, it should probably come from IFC. # from Blender. In the future, it should probably come from IFC.
if not isinstance(obj.data, bpy.types.Mesh): if not isinstance(obj.data, bpy.types.Mesh):
return return
classes = self.get_attribute_classes(obj) classes = self.get_attribute_classes(obj)
if len(obj.data.polygons) == 0: if len(obj.data.polygons) == 0:
self.draw_edge_annotation(obj, classes) self.draw_edge_annotation(obj, classes)
return return
bm = bmesh.new()
bm.from_mesh(obj.data)
bmesh.ops.dissolve_limit(bm, angle_limit=pi / 180 * 1, verts=bm.verts, edges=bm.edges)
bm.faces.ensure_lookup_table()
x_offset = self.raw_width / 2 x_offset = self.raw_width / 2
y_offset = self.raw_height / 2 y_offset = self.raw_height / 2
matrix_world = obj.matrix_world matrix_world = obj.matrix_world
for polygon in obj.data.polygons: for face in bm.faces:
points = [obj.data.vertices[v] for v in polygon.vertices] projected_points = [self.project_point_onto_camera(matrix_world @ p.co.xyz) for p in face.verts]
projected_points = [self.project_point_onto_camera(matrix_world @ p.co.xyz) for p in points]
projected_points.append(projected_points[0]) projected_points.append(projected_points[0])
d = " ".join( d = " ".join(
[ [