diff --git a/src/serializers/SvgSerializer.cpp b/src/serializers/SvgSerializer.cpp index 18a2aa72ca..9f99d39235 100644 --- a/src/serializers/SvgSerializer.cpp +++ b/src/serializers/SvgSerializer.cpp @@ -773,7 +773,14 @@ void SvgSerializer::write(const geometry_data& data) { // SVG has a coordinate system with the origin in the *upper*-left corner // therefore we mirror the shape along the XZ-plane. gp_Trsf trsf_mirror; - trsf_mirror.SetMirror(gp_Ax2(gp::Origin(), gp::DY())); + if (!mirror_y_) { + trsf_mirror.SetMirror(gp_Ax2(gp::Origin(), gp::DY())); + } + if (mirror_x_) { + gp_Trsf mirror_x; + mirror_x.SetMirror(gp_Ax2(gp::Origin(), gp::DX())); + trsf_mirror.PreMultiply(mirror_x); + } BRepBuilderAPI_Transform make_transform_mirror(compound_unmirrored, trsf_mirror, true); make_transform_mirror.Build(); // (When determinant < 0, copy is implied and the input is not mutated.) @@ -1679,6 +1686,13 @@ std::array, 3> SvgSerializer::resize() { cy = ymin * sc; } + if (mirror_y_) { + cy = - size_->second - cy; + } + if (mirror_x_) { + cx = - size_->first - cx; + } + m = {{ {{sc,0,-cx}},{{0,sc,-cy}},{{0,0,1}} }}; float_item_list::const_iterator it; @@ -1716,7 +1730,14 @@ void SvgSerializer::draw_hlr(const gp_Pln& pln, const drawing_key& drawing_name) TopoDS_Shape hlr_compound; if (drawing_name.first == nullptr) { gp_Trsf trsf_mirror; - trsf_mirror.SetMirror(gp_Ax2(gp::Origin(), gp::DY())); + if (!mirror_y_) { + trsf_mirror.SetMirror(gp_Ax2(gp::Origin(), gp::DY())); + } + if (mirror_x_) { + gp_Trsf mirror_x; + mirror_x.SetMirror(gp_Ax2(gp::Origin(), gp::DX())); + trsf_mirror.PreMultiply(mirror_x); + } BRepBuilderAPI_Transform make_transform_mirror(hlr_compound_unmirrored, trsf_mirror, true); make_transform_mirror.Build(); hlr_compound = make_transform_mirror.Shape(); diff --git a/src/serializers/SvgSerializer.h b/src/serializers/SvgSerializer.h index e39cb67877..c5373aa78d 100644 --- a/src/serializers/SvgSerializer.h +++ b/src/serializers/SvgSerializer.h @@ -524,6 +524,8 @@ protected: bool emit_building_storeys_; bool no_css_; bool unify_inputs_; + bool mirror_y_; + bool mirror_x_; int profile_threshold_; @@ -575,6 +577,8 @@ public: , polygonal_(false) , emit_building_storeys_(true) , no_css_(false) + , mirror_y_(false) + , mirror_x_(false) , unify_inputs_(false) , profile_threshold_(-1) , file(0) @@ -716,6 +720,22 @@ public: return profile_threshold_; } + void setMirrorY(bool b) { + mirror_y_ = b; + } + + bool getMirrorY() const { + return mirror_y_; + } + + void setMirrorX(bool b) { + mirror_x_ = b; + } + + bool getMirrorX() const { + return mirror_x_; + } + protected: std::string writeMetadata(const drawing_meta& m); };