mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-08-14 17:15:57 +08:00
* more easy to recognize a circle * do not considerate ngons as circle if n<9
This commit is contained in:
parent
9d3602fb6f
commit
0e8e8b9b99
@ -171,44 +171,50 @@ namespace Slic3r {
|
|||||||
// the id is center-diameter-extruderid
|
// the id is center-diameter-extruderid
|
||||||
std::vector<std::vector<std::pair<std::tuple<Point, float, int>, Polygon*>>> layerid2center;
|
std::vector<std::vector<std::pair<std::tuple<Point, float, int>, Polygon*>>> layerid2center;
|
||||||
for (size_t i = 0; i < this->m_layers.size(); i++) layerid2center.emplace_back();
|
for (size_t i = 0; i < this->m_layers.size(); i++) layerid2center.emplace_back();
|
||||||
//tbb::parallel_for(
|
tbb::parallel_for(
|
||||||
//tbb::blocked_range<size_t>(0, m_layers.size()),
|
tbb::blocked_range<size_t>(0, m_layers.size()),
|
||||||
//[this, layerid2center](const tbb::blocked_range<size_t>& range) {
|
[this, &layerid2center](const tbb::blocked_range<size_t>& range) {
|
||||||
//for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++layer_idx) {
|
for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++layer_idx) {
|
||||||
for (size_t layer_idx = 0; layer_idx < this->m_layers.size(); ++layer_idx) {
|
m_print->throw_if_canceled();
|
||||||
m_print->throw_if_canceled();
|
Layer* layer = m_layers[layer_idx];
|
||||||
Layer* layer = m_layers[layer_idx];
|
for (size_t region_idx = 0; region_idx < layer->m_regions.size(); ++region_idx)
|
||||||
for (size_t region_idx = 0; region_idx < layer->m_regions.size(); ++region_idx)
|
{
|
||||||
{
|
if (layer->m_regions[region_idx]->region()->config().hole_to_polyhole) {
|
||||||
if (layer->m_regions[region_idx]->region()->config().hole_to_polyhole) {
|
for (Surface& surf : layer->m_regions[region_idx]->m_slices.surfaces) {
|
||||||
for (Surface& surf : layer->m_regions[region_idx]->m_slices.surfaces) {
|
for (Polygon& hole : surf.expolygon.holes) {
|
||||||
for (Polygon& hole : surf.expolygon.holes) {
|
//test if convex (as it's clockwise bc it's a hole, we have to do the opposite)
|
||||||
//test if convex (as it's clockwise bc it's a hole, we have to do the opposite)
|
if (hole.convex_points().empty() && hole.points.size() > 8) {
|
||||||
if (hole.convex_points().empty() && hole.points.size() > 4) {
|
// Computing circle center
|
||||||
double center_x = 0, center_y = 0;
|
double center_x = 0, center_y = 0;
|
||||||
for (int i = 0; i < hole.points.size(); ++i) {
|
double lines_length = 0;
|
||||||
center_x += hole.points[i].x();
|
for (Line l : hole.lines()) {
|
||||||
center_y += hole.points[i].y();
|
center_x += l.a.x() * l.length();
|
||||||
}
|
center_x += l.b.x() * l.length();
|
||||||
Point center{ center_x / hole.points.size(), center_y / hole.points.size() };
|
center_y += l.a.y() * l.length();
|
||||||
double diameter_min = std::numeric_limits<float>::max(), diameter_max = 0;
|
center_y += l.b.y() * l.length();
|
||||||
for (int i = 0; i < hole.points.size(); ++i) {
|
lines_length += l.length() + l.length();
|
||||||
double dist = hole.points[i].distance_to(center);
|
}
|
||||||
diameter_min = std::min(diameter_min, dist);
|
Point center{ center_x / lines_length, center_y / lines_length };
|
||||||
diameter_max = std::max(diameter_max, dist);
|
// check for roundeness
|
||||||
}
|
double diameter_min = std::numeric_limits<float>::max(), diameter_max = 0;
|
||||||
if (diameter_max - diameter_min < SCALED_EPSILON) {
|
for (int i = 0; i < hole.points.size(); ++i) {
|
||||||
layerid2center[layer_idx].emplace_back(
|
double dist = hole.points[i].distance_to(center);
|
||||||
std::tuple<Point, float, int>{center, diameter_max, layer->m_regions[region_idx]->region()->config().perimeter_extruder.value}, & hole);
|
diameter_min = std::min(diameter_min, dist);
|
||||||
|
diameter_max = std::max(diameter_max, dist);
|
||||||
|
}
|
||||||
|
// SCALED_EPSILON was a bit too harsh.
|
||||||
|
if (diameter_max - diameter_min < 1000) {
|
||||||
|
layerid2center[layer_idx].emplace_back(
|
||||||
|
std::tuple<Point, float, int>{center, diameter_max, layer->m_regions[region_idx]->region()->config().perimeter_extruder.value}, & hole);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// for layer->slices, it will be also replaced later.
|
||||||
}
|
}
|
||||||
// for layer->slices, it will be also replaced later.
|
});
|
||||||
}
|
|
||||||
//});
|
|
||||||
//sort holes per center-diameter
|
//sort holes per center-diameter
|
||||||
std::map<std::tuple<Point, float, int>, std::vector<std::pair<Polygon*, int>>> id2layerz2hole;
|
std::map<std::tuple<Point, float, int>, std::vector<std::pair<Polygon*, int>>> id2layerz2hole;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user