FIX: failed to import svg file(path + width) STUDIO-1807
Change-Id: I2a4e1866c0f23bfbec4ae6765a78f6f7d994cd19 (cherry picked from commit c8b59f4e3ffd0ba34a5d56ca7a0538ee854f1a91)
This commit is contained in:
parent
37ed71b764
commit
74e1ba7963
|
@ -19,6 +19,9 @@
|
||||||
#include "TopExp_Explorer.hxx"
|
#include "TopExp_Explorer.hxx"
|
||||||
#include "TopoDS.hxx"
|
#include "TopoDS.hxx"
|
||||||
#include "BRepExtrema_SelfIntersection.hxx"
|
#include "BRepExtrema_SelfIntersection.hxx"
|
||||||
|
#include "clipper/clipper.hpp"
|
||||||
|
|
||||||
|
using namespace ClipperLib;
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
const double STEP_TRANS_CHORD_ERROR = 0.005;
|
const double STEP_TRANS_CHORD_ERROR = 0.005;
|
||||||
|
@ -188,7 +191,8 @@ bool get_svg_profile(const char *path, std::vector<Element_Info> &element_infos,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// keep the start and end points of profile connected
|
// keep the start and end points of profile connected
|
||||||
profile_line_points.back().second = profile_line_points[0].first;
|
if (shape->fill.gradient != nullptr)
|
||||||
|
profile_line_points.back().second = profile_line_points[0].first;
|
||||||
|
|
||||||
if (is_profile_self_interaction(profile_line_points))
|
if (is_profile_self_interaction(profile_line_points))
|
||||||
BOOST_LOG_TRIVIAL(warning) << "the profile is self interaction.";
|
BOOST_LOG_TRIVIAL(warning) << "the profile is self interaction.";
|
||||||
|
@ -196,6 +200,56 @@ bool get_svg_profile(const char *path, std::vector<Element_Info> &element_infos,
|
||||||
path_line_points.push_back(profile_line_points);
|
path_line_points.push_back(profile_line_points);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (shape->fill.gradient == nullptr) {
|
||||||
|
double scale_size = 1e6;
|
||||||
|
std::vector<std::vector<std::pair<gp_Pnt, gp_Pnt>>> new_path_line_points;
|
||||||
|
float stroke_width = shape->strokeWidth * scale_size;
|
||||||
|
Polygons polygons;
|
||||||
|
bool close_polygon = false;
|
||||||
|
for (int i = 0; i < path_line_points.size(); ++i) {
|
||||||
|
ClipperLib::Path pt_path;
|
||||||
|
for (auto line_point : path_line_points[i]) {
|
||||||
|
pt_path.push_back(IntPoint(line_point.first.X() * scale_size, line_point.first.Y() * scale_size));
|
||||||
|
}
|
||||||
|
pt_path.push_back(IntPoint(path_line_points[i].back().second.X() * scale_size, path_line_points[i].back().second.Y() * scale_size));
|
||||||
|
|
||||||
|
ClipperLib::Paths out_paths;
|
||||||
|
ClipperLib::ClipperOffset co;
|
||||||
|
if (pt_path.front() == pt_path.back()) {
|
||||||
|
co.AddPath(pt_path, ClipperLib::jtMiter, ClipperLib::etClosedLine);
|
||||||
|
close_polygon = true;
|
||||||
|
} else {
|
||||||
|
co.AddPath(pt_path, ClipperLib::jtMiter, ClipperLib::etOpenSquare);
|
||||||
|
close_polygon = false;
|
||||||
|
}
|
||||||
|
co.Execute(out_paths, stroke_width / 2);
|
||||||
|
|
||||||
|
for (auto out_path : out_paths) {
|
||||||
|
polygons.emplace_back(Polygon(out_path));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!close_polygon)
|
||||||
|
polygons = union_(polygons);
|
||||||
|
|
||||||
|
std::vector<std::pair<gp_Pnt, gp_Pnt>> profile_line_points;
|
||||||
|
for (auto polygon : polygons) {
|
||||||
|
profile_line_points.clear();
|
||||||
|
for (int i = 0; i < polygon.size() - 1; ++i) {
|
||||||
|
gp_Pnt pt1(double(polygon[i][0] / scale_size), double(polygon[i][1] / scale_size), 0);
|
||||||
|
gp_Pnt pt2(double(polygon[i + 1][0] / scale_size), double(polygon[i + 1][1] / scale_size), 0);
|
||||||
|
profile_line_points.push_back({pt1, pt2});
|
||||||
|
}
|
||||||
|
gp_Pnt pt1(double(polygon.back()[0] / scale_size), double(polygon.back()[1] / scale_size), 0);
|
||||||
|
gp_Pnt pt2(double(polygon.front()[0] / scale_size), double(polygon.front()[1] / scale_size), 0);
|
||||||
|
profile_line_points.push_back({pt1, pt2});
|
||||||
|
|
||||||
|
new_path_line_points.push_back(profile_line_points);
|
||||||
|
}
|
||||||
|
|
||||||
|
path_line_points = new_path_line_points;
|
||||||
|
}
|
||||||
|
|
||||||
// generate all profile curves
|
// generate all profile curves
|
||||||
std::vector<TopoDS_Wire> wires;
|
std::vector<TopoDS_Wire> wires;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
|
Loading…
Reference in New Issue