mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-22 12:07:59 +00:00
See #2894. Implement SVG mirroring options (typically used for RCPs or useful when converting to other things like DXF).
This commit is contained in:
@@ -773,7 +773,14 @@ void SvgSerializer::write(const geometry_data& data) {
|
|||||||
// SVG has a coordinate system with the origin in the *upper*-left corner
|
// SVG has a coordinate system with the origin in the *upper*-left corner
|
||||||
// therefore we mirror the shape along the XZ-plane.
|
// therefore we mirror the shape along the XZ-plane.
|
||||||
gp_Trsf trsf_mirror;
|
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);
|
BRepBuilderAPI_Transform make_transform_mirror(compound_unmirrored, trsf_mirror, true);
|
||||||
make_transform_mirror.Build();
|
make_transform_mirror.Build();
|
||||||
// (When determinant < 0, copy is implied and the input is not mutated.)
|
// (When determinant < 0, copy is implied and the input is not mutated.)
|
||||||
@@ -1679,6 +1686,13 @@ std::array<std::array<double, 3>, 3> SvgSerializer::resize() {
|
|||||||
cy = ymin * sc;
|
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}} }};
|
m = {{ {{sc,0,-cx}},{{0,sc,-cy}},{{0,0,1}} }};
|
||||||
|
|
||||||
float_item_list::const_iterator it;
|
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;
|
TopoDS_Shape hlr_compound;
|
||||||
if (drawing_name.first == nullptr) {
|
if (drawing_name.first == nullptr) {
|
||||||
gp_Trsf trsf_mirror;
|
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);
|
BRepBuilderAPI_Transform make_transform_mirror(hlr_compound_unmirrored, trsf_mirror, true);
|
||||||
make_transform_mirror.Build();
|
make_transform_mirror.Build();
|
||||||
hlr_compound = make_transform_mirror.Shape();
|
hlr_compound = make_transform_mirror.Shape();
|
||||||
|
|||||||
@@ -524,6 +524,8 @@ protected:
|
|||||||
bool emit_building_storeys_;
|
bool emit_building_storeys_;
|
||||||
bool no_css_;
|
bool no_css_;
|
||||||
bool unify_inputs_;
|
bool unify_inputs_;
|
||||||
|
bool mirror_y_;
|
||||||
|
bool mirror_x_;
|
||||||
|
|
||||||
int profile_threshold_;
|
int profile_threshold_;
|
||||||
|
|
||||||
@@ -575,6 +577,8 @@ public:
|
|||||||
, polygonal_(false)
|
, polygonal_(false)
|
||||||
, emit_building_storeys_(true)
|
, emit_building_storeys_(true)
|
||||||
, no_css_(false)
|
, no_css_(false)
|
||||||
|
, mirror_y_(false)
|
||||||
|
, mirror_x_(false)
|
||||||
, unify_inputs_(false)
|
, unify_inputs_(false)
|
||||||
, profile_threshold_(-1)
|
, profile_threshold_(-1)
|
||||||
, file(0)
|
, file(0)
|
||||||
@@ -716,6 +720,22 @@ public:
|
|||||||
return profile_threshold_;
|
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:
|
protected:
|
||||||
std::string writeMetadata(const drawing_meta& m);
|
std::string writeMetadata(const drawing_meta& m);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user