diff --git a/src/ifcconvert/IfcConvert.cpp b/src/ifcconvert/IfcConvert.cpp index 0a15bc0a20..8ac40cff6f 100644 --- a/src/ifcconvert/IfcConvert.cpp +++ b/src/ifcconvert/IfcConvert.cpp @@ -392,6 +392,8 @@ int main(int argc, char** argv) { "Stores name and guid in a separate namespace as opposed to data-name, data-guid") ("svg-poly", "Uses the polygonal algorithm for hidden line rendering") + ("svg-write-poly", + "Approximate every curve as polygonal in SVG output") ("svg-project", "Always enable hidden line rendering instead of only on elevations") ("door-arcs", "Draw door openings arcs for IfcDoor elements") @@ -1008,6 +1010,7 @@ int main(int argc, char** argv) { } static_cast(serializer.get())->setUseNamespace(vmap.count("svg-xmlns") > 0); static_cast(serializer.get())->setUseHlrPoly(vmap.count("svg-poly") > 0); + static_cast(serializer.get())->setPolygonal(vmap.count("svg-write-poly") > 0); static_cast(serializer.get())->setAlwaysProject(vmap.count("svg-project") > 0); if (relative_center_x && relative_center_y) { static_cast(serializer.get())->setDrawingCenter(*relative_center_x, *relative_center_y); diff --git a/src/serializers/SvgSerializer.cpp b/src/serializers/SvgSerializer.cpp index 3b3d8ae8fd..b24af6b7a5 100644 --- a/src/serializers/SvgSerializer.cpp +++ b/src/serializers/SvgSerializer.cpp @@ -135,7 +135,7 @@ void SvgSerializer::write(path_object& p, const TopoDS_Wire& wire, boost::option // TODO: ALMOST_THE_SAME utilities in separate header bool closed = fabs((u1 + PI2) - u2) < 1.e-9; - if (conical && closed) { + if (!polygonal_ && (conical && closed)) { if (first) { if (ty == STANDARD_TYPE(Geom_Circle)) { Handle(Geom_Circle) circle = Handle(Geom_Circle)::DownCast(curve); @@ -222,7 +222,7 @@ void SvgSerializer::write(path_object& p, const TopoDS_Wire& wire, boost::option growBoundingBox(p2.X(), p2.Y()); - if (ty == STANDARD_TYPE(Geom_Circle) || ty == STANDARD_TYPE(Geom_Ellipse)) { + if (!polygonal_ && (ty == STANDARD_TYPE(Geom_Circle) || ty == STANDARD_TYPE(Geom_Ellipse))) { Handle(Geom_Conic) conic = Handle(Geom_Conic)::DownCast(curve); const bool mirrored = conic->Position().Axis().Direction().Z() < 0; diff --git a/src/serializers/SvgSerializer.h b/src/serializers/SvgSerializer.h index ede299dea3..51eac2ed0a 100644 --- a/src/serializers/SvgSerializer.h +++ b/src/serializers/SvgSerializer.h @@ -145,7 +145,7 @@ protected: storey_height_display_types storey_height_display_; bool draw_door_arcs_, is_floor_plan_; bool auto_section_, auto_elevation_; - bool use_namespace_, use_hlr_poly_, always_project_; + bool use_namespace_, use_hlr_poly_, always_project_, polygonal_; IfcParse::IfcFile* file; IfcUtil::IfcBaseEntity* storey_; @@ -188,6 +188,7 @@ public: , use_namespace_(false) , use_hlr_poly_(false) , always_project_(false) + , polygonal_(false) , file(0) , storey_(0) , xcoords_begin(0) @@ -249,6 +250,10 @@ public: use_hlr_poly_ = b; } + void setPolygonal(bool b) { + polygonal_ = b; + } + void setAlwaysProject(bool b) { always_project_ = b; }