void Weaver::connect(Polygons& parts0, int z0, Polygons& parts1, int z1, WeaveConnection& result, bool include_last) { // TODO: convert polygons (with outset + difference) such that after printing the first polygon, we can't be in the way of the printed stuff // something like: // for (m > n) // parts[m] = parts[m].difference(parts[n].offset(nozzle_top_diameter)) // according to the printing order! // // OR! : // // unify different parts if gap is too small Polygons& supported = result.supported; if (parts1.size() == 0) return; Point& start_close_to = (parts0.size() > 0)? parts0.back().back() : parts1.back().back(); chainify_polygons(parts1, start_close_to, supported, include_last); if (parts0.size() == 0) return; connect_polygons(parts0, z0, supported, z1, result); }
Polygons top_level_islands(const Slic3r::Polygons &polygons) { ClipperLib::Paths input; Slic3rMultiPoints_to_ClipperPaths(polygons, &input); // init Clipper ClipperLib::Clipper clipper; clipper.Clear(); // perform union clipper.AddPaths(input, ClipperLib::ptSubject, true); ClipperLib::PolyTree polytree; clipper.Execute(ClipperLib::ctUnion, polytree, ClipperLib::pftEvenOdd, ClipperLib::pftEvenOdd); // Convert only the top level islands to the output. Polygons out; out.reserve(polytree.ChildCount()); for (int i = 0; i < polytree.ChildCount(); ++i) { out.push_back(Polygon()); ClipperPath_to_Slic3rMultiPoint(polytree.Childs[i]->Contour, &out.back()); } return out; }