looping perimeters: cleaning & now extrude long "move" between outline & holes if infill is at 0%

This commit is contained in:
supermerill 2018-10-29 16:27:07 +01:00
parent af0ef31b20
commit e2d21d21d0

View File

@ -722,12 +722,10 @@ get_nearest_point(const PerimeterGeneratorLoops &children, ExtrusionLoop &myPoly
} }
int id = 0;
ExtrusionLoop ExtrusionLoop
PerimeterGenerator::_extrude_and_cut_loop(const PerimeterGeneratorLoop &loop, const Point entry_point, const Line &direction) const PerimeterGenerator::_extrude_and_cut_loop(const PerimeterGeneratorLoop &loop, const Point entry_point, const Line &direction) const
{ {
const int my_id = ++id;
bool need_to_reverse = false; bool need_to_reverse = false;
Polyline initial_polyline; Polyline initial_polyline;
const coord_t dist_cut = (coord_t)scale_(this->print_config->nozzle_diameter.get_at(this->config->perimeter_extruder - 1)); const coord_t dist_cut = (coord_t)scale_(this->print_config->nozzle_diameter.get_at(this->config->perimeter_extruder - 1));
@ -772,7 +770,6 @@ PerimeterGenerator::_extrude_and_cut_loop(const PerimeterGeneratorLoop &loop, co
//std::vector<PerimeterPolylineNode> myPolylines; //std::vector<PerimeterPolylineNode> myPolylines;
ExtrusionLoop my_loop; ExtrusionLoop my_loop;
ExtrusionLoop svg_out(elrDefault);
//overhang / notoverhang //overhang / notoverhang
{ {
bool is_external = loop.is_external(); bool is_external = loop.is_external();
@ -886,8 +883,18 @@ ExtrusionLoop
PerimeterGenerator::_traverse_and_join_loops(const PerimeterGeneratorLoop &loop, const PerimeterGeneratorLoops &children, const Point entry_point) const PerimeterGenerator::_traverse_and_join_loops(const PerimeterGeneratorLoop &loop, const PerimeterGeneratorLoops &children, const Point entry_point) const
{ {
//std::cout << " === ==== _traverse_and_join_loops ==== ===\n"; //std::cout << " === ==== _traverse_and_join_loops ==== ===\n";
// other perimeters
//this->_mm3_per_mm = this->perimeter_flow.mm3_per_mm();
//coord_t perimeter_width = this->perimeter_flow.scaled_width();
const coord_t perimeter_spacing = this->perimeter_flow.scaled_spacing();
const coord_t dist_cut = (coord_t)scale_(this->print_config->nozzle_diameter.get_at(this->config->perimeter_extruder - 1)); //// external perimeters
//this->_ext_mm3_per_mm = this->ext_perimeter_flow.mm3_per_mm();
//coord_t ext_perimeter_width = this->ext_perimeter_flow.scaled_width();
const coord_t ext_perimeter_spacing = this->ext_perimeter_flow.scaled_spacing();
//coord_t ext_perimeter_spacing2 = this->ext_perimeter_flow.scaled_spacing(this->perimeter_flow);
//const coord_t dist_cut = (coord_t)scale_(this->print_config->nozzle_diameter.get_at(this->config->perimeter_extruder - 1));
//TODO change this->external_perimeter_flow.scaled_width() if it's the first one! //TODO change this->external_perimeter_flow.scaled_width() if it's the first one!
const coord_t max_width_extrusion = this->perimeter_flow.scaled_width(); const coord_t max_width_extrusion = this->perimeter_flow.scaled_width();
ExtrusionLoop my_loop = _extrude_and_cut_loop(loop, entry_point); ExtrusionLoop my_loop = _extrude_and_cut_loop(loop, entry_point);
@ -900,20 +907,13 @@ PerimeterGenerator::_traverse_and_join_loops(const PerimeterGeneratorLoop &loop,
//Polylines myPolylines = { myPolyline }; //Polylines myPolylines = { myPolyline };
//iterate on each point ot find the best place to go into the child //iterate on each point ot find the best place to go into the child
vector<PerimeterGeneratorLoop> childs = children; vector<PerimeterGeneratorLoop> childs = children;
int child_idx = 0;
while (!childs.empty()) { while (!childs.empty()) {
child_idx++;
PerimeterIntersectionPoint nearest = get_nearest_point(childs, my_loop, this->perimeter_flow.scaled_width(), this->perimeter_flow.scaled_width()* 0.8); PerimeterIntersectionPoint nearest = get_nearest_point(childs, my_loop, this->perimeter_flow.scaled_width(), this->perimeter_flow.scaled_width()* 0.8);
if (nearest.idx_children == (size_t)-1) { if (nearest.idx_children == (size_t)-1) {
//return ExtrusionEntityCollection(); //return ExtrusionEntityCollection();
break; break;
} else { } else {
stringstream log_bef;
const PerimeterGeneratorLoop &child = childs[nearest.idx_children]; const PerimeterGeneratorLoop &child = childs[nearest.idx_children];
log_bef << "dist travel @search swap is : " << unscale(nearest.outter_best.distance_to(nearest.child_best))
<< " from " << unscale(nearest.outter_best.x) << ":" << unscale(nearest.outter_best.y)
<< " to " << unscale(nearest.child_best.x) << ":" << unscale(nearest.child_best.y)
<< "\n";
//std::cout << "c." << child_idx << " === i have " << my_loop.paths.size() << " paths" << " == cut_path_is_ccw size " << path_is_ccw.size() << "\n"; //std::cout << "c." << child_idx << " === i have " << my_loop.paths.size() << " paths" << " == cut_path_is_ccw size " << path_is_ccw.size() << "\n";
//std::cout << "change to child " << nearest.idx_children << " @ " << unscale(nearest.outter_best.x) << ":" << unscale(nearest.outter_best.y) //std::cout << "change to child " << nearest.idx_children << " @ " << unscale(nearest.outter_best.x) << ":" << unscale(nearest.outter_best.y)
// << ", idxpolyline = " << nearest.idx_polyline_outter << "\n"; // << ", idxpolyline = " << nearest.idx_polyline_outter << "\n";
@ -960,10 +960,6 @@ PerimeterGenerator::_traverse_and_join_loops(const PerimeterGeneratorLoop &loop,
outer_end->polyline.points.erase(outer_end->polyline.points.begin()+1, outer_end->polyline.points.end()); outer_end->polyline.points.erase(outer_end->polyline.points.begin()+1, outer_end->polyline.points.end());
outer_end->polyline.points.insert(outer_end->polyline.points.begin(), nearest.outter_best); outer_end->polyline.points.insert(outer_end->polyline.points.begin(), nearest.outter_best);
} }
log_bef << "dist travel before child loop get is : " << unscale(outer_start->polyline.points.back().distance_to(nearest.child_best))
<< " from " << unscale(outer_start->polyline.points.back().x) << ":" << unscale(outer_start->polyline.points.back().y)
<< " to " << unscale(nearest.child_best.x) << ":" << unscale(nearest.child_best.y)
<< "\n";
Polyline to_reduce = outer_start->polyline; Polyline to_reduce = outer_start->polyline;
if (to_reduce.points.size()>1) to_reduce.clip_end(SCALED_RESOLUTION); if (to_reduce.points.size()>1) to_reduce.clip_end(SCALED_RESOLUTION);
deletedSection.a = to_reduce.points.back(); deletedSection.a = to_reduce.points.back();
@ -974,7 +970,11 @@ PerimeterGenerator::_traverse_and_join_loops(const PerimeterGeneratorLoop &loop,
//get the inner loop to connect to us. //get the inner loop to connect to us.
ExtrusionLoop child_loop = _extrude_and_cut_loop(child, nearest.child_best, deletedSection); ExtrusionLoop child_loop = _extrude_and_cut_loop(child, nearest.child_best, deletedSection);
//FIXME: if child_loophas no point or 1 point or not enough space !!!!!!! const coord_t inner_child_spacing = child.is_external() ? ext_perimeter_spacing : perimeter_spacing;
const coord_t outer_start_spacing = scale_(outer_start->width - outer_start->height * (1. - 0.25 * PI));
const coord_t outer_end_spacing = scale_(outer_end->width - outer_end->height * (1. - 0.25 * PI));
//FIXME: if child_loop has no point or 1 point or not enough space !!!!!!!
const size_t child_paths_size = child_loop.paths.size(); const size_t child_paths_size = child_loop.paths.size();
my_loop.paths.insert(my_loop.paths.begin() + nearest.idx_polyline_outter + 1, child_loop.paths.begin(), child_loop.paths.end()); my_loop.paths.insert(my_loop.paths.begin() + nearest.idx_polyline_outter + 1, child_loop.paths.begin(), child_loop.paths.end());
for (size_t i = 0; i < child_paths_size; i++) path_is_ccw.insert(path_is_ccw.begin() + nearest.idx_polyline_outter + 1, !cut_path_is_ccw); for (size_t i = 0; i < child_paths_size; i++) path_is_ccw.insert(path_is_ccw.begin() + nearest.idx_polyline_outter + 1, !cut_path_is_ccw);
@ -984,23 +984,19 @@ PerimeterGenerator::_traverse_and_join_loops(const PerimeterGeneratorLoop &loop,
outer_end = &my_loop.paths[nearest.idx_polyline_outter + child_paths_size + 1]; outer_end = &my_loop.paths[nearest.idx_polyline_outter + child_paths_size + 1];
ExtrusionPath *inner_start = &my_loop.paths[nearest.idx_polyline_outter+1]; ExtrusionPath *inner_start = &my_loop.paths[nearest.idx_polyline_outter+1];
ExtrusionPath *inner_end = &my_loop.paths[nearest.idx_polyline_outter + child_paths_size]; ExtrusionPath *inner_end = &my_loop.paths[nearest.idx_polyline_outter + child_paths_size];
log_bef << "dist travel before trim is : " << unscale(outer_start->polyline.points.back().distance_to(inner_start->polyline.points.front()))
<< " from " << unscale(outer_start->polyline.points.back().x) << ":" << unscale(outer_start->polyline.points.back().y)
<< " to " << unscale(inner_start->polyline.points.front().x) << ":" << unscale(inner_start->polyline.points.front().y)
<< "\n";
//TRIM //TRIM
//choose trim direction //choose trim direction
if (outer_start->polyline.points.size() == 1) { if (outer_start->polyline.points.size() == 1) {
outer_end->polyline.clip_start(dist_cut); outer_end->polyline.clip_start(outer_end_spacing);
my_loop.paths[nearest.idx_polyline_outter + child_paths_size ].polyline.clip_end(dist_cut); my_loop.paths[nearest.idx_polyline_outter + child_paths_size].polyline.clip_end(inner_child_spacing);
} else if (outer_end->polyline.points.size() == 1) { } else if (outer_end->polyline.points.size() == 1) {
outer_start->polyline.clip_end(dist_cut); outer_start->polyline.clip_end(outer_start_spacing);
inner_start->polyline.clip_start(dist_cut); inner_start->polyline.clip_start(inner_child_spacing);
} else { } else {
coord_t length_poly_1 = outer_start->polyline.length(); coord_t length_poly_1 = outer_start->polyline.length();
coord_t length_poly_2 = outer_end->polyline.length(); coord_t length_poly_2 = outer_end->polyline.length();
coord_t length_trim_1 = dist_cut / 2; coord_t length_trim_1 = outer_start_spacing / 2;
coord_t length_trim_2 = dist_cut / 2; coord_t length_trim_2 = outer_end_spacing / 2;
if (length_poly_1 < length_trim_1) { if (length_poly_1 < length_trim_1) {
length_trim_2 = length_trim_1 + length_trim_2 - length_poly_1; length_trim_2 = length_trim_1 + length_trim_2 - length_poly_1;
} }
@ -1020,8 +1016,8 @@ PerimeterGenerator::_traverse_and_join_loops(const PerimeterGeneratorLoop &loop,
length_poly_1 = inner_start->polyline.length(); length_poly_1 = inner_start->polyline.length();
length_poly_2 = inner_end->polyline.length(); length_poly_2 = inner_end->polyline.length();
length_trim_1 = dist_cut / 2; length_trim_1 = inner_child_spacing / 2;
length_trim_2 = dist_cut / 2; length_trim_2 = inner_child_spacing / 2;
if (length_poly_1 < length_trim_1) { if (length_poly_1 < length_trim_1) {
length_trim_2 = length_trim_1 + length_trim_2 - length_poly_1; length_trim_2 = length_trim_1 + length_trim_2 - length_poly_1;
} }
@ -1046,10 +1042,6 @@ PerimeterGenerator::_traverse_and_join_loops(const PerimeterGeneratorLoop &loop,
//last check to see if we need a reverse //last check to see if we need a reverse
{ {
log_bef << "dist travel before swap is : " << unscale(outer_start->polyline.points.back().distance_to(inner_start->polyline.points.front()))
<< " from " << unscale(outer_start->polyline.points.back().x) << ":" << unscale(outer_start->polyline.points.back().y)
<< " to " << unscale(inner_start->polyline.points.front().x) << ":" << unscale(inner_start->polyline.points.front().y)
<< "\n";
Line l1(outer_start->polyline.points.back(), inner_start->polyline.points.front()); Line l1(outer_start->polyline.points.back(), inner_start->polyline.points.front());
Line l2(inner_end->polyline.points.back(), outer_end->polyline.points.front()); Line l2(inner_end->polyline.points.back(), outer_end->polyline.points.front());
Point p_inter(0, 0); Point p_inter(0, 0);
@ -1074,15 +1066,7 @@ PerimeterGenerator::_traverse_and_join_loops(const PerimeterGeneratorLoop &loop,
ExtrusionPaths travel_path_end;// (ExtrusionRole::erNone, 0, outer_end->width, outer_end->height); ExtrusionPaths travel_path_end;// (ExtrusionRole::erNone, 0, outer_end->width, outer_end->height);
//travel_path_end.extruder_id = -1; //travel_path_end.extruder_id = -1;
double dist_travel = outer_start->polyline.points.back().distance_to(inner_start->polyline.points.front()); double dist_travel = outer_start->polyline.points.back().distance_to(inner_start->polyline.points.front());
if (dist_travel > max_width_extrusion * 10) { if (dist_travel > max_width_extrusion*1.5 && this->config->fill_density.value > 0) {
std::cout << "ERROR: dist travel is to high : " << unscale(dist_travel)
<< " from " << unscale(outer_start->polyline.points.back().x) << ":" << unscale(outer_start->polyline.points.back().y)
<< " to " << unscale(inner_start->polyline.points.front().x) << ":" << unscale(inner_start->polyline.points.front().y)
<< "\n";
std::cout << log_bef.str();
//std::cout << log.str();
}
if (dist_travel > max_width_extrusion*1.5) {
travel_path_begin.emplace_back(ExtrusionRole::erPerimeter, outer_start->mm3_per_mm, outer_start->width, outer_start->height); travel_path_begin.emplace_back(ExtrusionRole::erPerimeter, outer_start->mm3_per_mm, outer_start->width, outer_start->height);
travel_path_begin.emplace_back(ExtrusionRole::erNone, 0, outer_start->width, outer_start->height); travel_path_begin.emplace_back(ExtrusionRole::erNone, 0, outer_start->width, outer_start->height);
travel_path_begin.emplace_back(ExtrusionRole::erPerimeter, outer_start->mm3_per_mm, outer_start->width, outer_start->height); travel_path_begin.emplace_back(ExtrusionRole::erPerimeter, outer_start->mm3_per_mm, outer_start->width, outer_start->height);
@ -1109,7 +1093,7 @@ PerimeterGenerator::_traverse_and_join_loops(const PerimeterGeneratorLoop &loop,
} else { } else {
// the path is small enough to extrude all along. // the path is small enough to extrude all along.
double flow_mult = 1; double flow_mult = 1;
if (dist_travel > max_width_extrusion) { if (dist_travel > max_width_extrusion && this->config->fill_density.value > 0) {
// the path is a bit too long, reduce the extrusion flow. // the path is a bit too long, reduce the extrusion flow.
flow_mult = max_width_extrusion / dist_travel; flow_mult = max_width_extrusion / dist_travel;
} }
@ -1119,7 +1103,7 @@ PerimeterGenerator::_traverse_and_join_loops(const PerimeterGeneratorLoop &loop,
travel_path_begin[0].polyline.append(inner_start->polyline.points.front()); travel_path_begin[0].polyline.append(inner_start->polyline.points.front());
} }
dist_travel = inner_end->polyline.points.back().distance_to(outer_end->polyline.points.front()); dist_travel = inner_end->polyline.points.back().distance_to(outer_end->polyline.points.front());
if (dist_travel > max_width_extrusion*1.5) { if (dist_travel > max_width_extrusion*1.5 && this->config->fill_density.value > 0) {
travel_path_end.emplace_back(ExtrusionRole::erPerimeter, outer_end->mm3_per_mm, outer_end->width, outer_end->height); travel_path_end.emplace_back(ExtrusionRole::erPerimeter, outer_end->mm3_per_mm, outer_end->width, outer_end->height);
travel_path_end.emplace_back(ExtrusionRole::erNone, 0, outer_end->width, outer_end->height); travel_path_end.emplace_back(ExtrusionRole::erNone, 0, outer_end->width, outer_end->height);
travel_path_end.emplace_back(ExtrusionRole::erPerimeter, outer_end->mm3_per_mm, outer_end->width, outer_end->height); travel_path_end.emplace_back(ExtrusionRole::erPerimeter, outer_end->mm3_per_mm, outer_end->width, outer_end->height);
@ -1146,7 +1130,7 @@ PerimeterGenerator::_traverse_and_join_loops(const PerimeterGeneratorLoop &loop,
} else { } else {
// the path is small enough to extrude all along. // the path is small enough to extrude all along.
double flow_mult = 1; double flow_mult = 1;
if (dist_travel > max_width_extrusion) { if (dist_travel > max_width_extrusion && this->config->fill_density.value > 0) {
// the path is a bit too long, reduce the extrusion flow. // the path is a bit too long, reduce the extrusion flow.
flow_mult = max_width_extrusion / dist_travel; flow_mult = max_width_extrusion / dist_travel;
} }