//----------------------------------------------------------- // legacy code from Clipper documentation void AddOuterPolyNodeToExPolygons(ClipperLib::PolyNode& polynode, Slic3r::ExPolygons& expolygons) { size_t cnt = expolygons.size(); expolygons.resize(cnt + 1); ClipperPath_to_Slic3rMultiPoint(polynode.Contour, expolygons[cnt].contour); expolygons[cnt].holes.resize(polynode.ChildCount()); for (int i = 0; i < polynode.ChildCount(); ++i) { ClipperPath_to_Slic3rMultiPoint(polynode.Childs[i]->Contour, expolygons[cnt].holes[i]); //Add outer polygons contained by (nested within) holes ... for (int j = 0; j < polynode.Childs[i]->ChildCount(); ++j) AddOuterPolyNodeToExPolygons(*polynode.Childs[i]->Childs[j], expolygons); } }
//----------------------------------------------------------- // legacy code from Clipper documentation void AddOuterPolyNodeToExPolygons(ClipperLib::PolyNode& polynode, ExPolygons* expolygons) { size_t cnt = expolygons->size(); expolygons->resize(cnt + 1); (*expolygons)[cnt].contour = ClipperPath_to_Slic3rPolygon(polynode.Contour); (*expolygons)[cnt].holes.resize(polynode.ChildCount()); for (int i = 0; i < polynode.ChildCount(); ++i) { (*expolygons)[cnt].holes[i] = ClipperPath_to_Slic3rPolygon(polynode.Childs[i]->Contour); //Add outer polygons contained by (nested within) holes ... for (int j = 0; j < polynode.Childs[i]->ChildCount(); ++j) AddOuterPolyNodeToExPolygons(*polynode.Childs[i]->Childs[j], expolygons); } }
void Polygons::splitIntoParts_processPolyTreeNode(ClipperLib::PolyNode* node, std::vector<PolygonsPart>& ret) const { for(int n=0; n<node->ChildCount(); n++) { ClipperLib::PolyNode* child = node->Childs[n]; PolygonsPart part; part.add(child->Contour); for(int i=0; i<child->ChildCount(); i++) { part.add(child->Childs[i]->Contour); splitIntoParts_processPolyTreeNode(child->Childs[i], ret); } ret.push_back(part); } }
void Polygons::splitIntoPartsView_processPolyTreeNode(PartsView& partsView, Polygons& reordered, ClipperLib::PolyNode* node) { for(int n=0; n<node->ChildCount(); n++) { ClipperLib::PolyNode* child = node->Childs[n]; partsView.emplace_back(); unsigned int pos = partsView.size() - 1; partsView[pos].push_back(reordered.size()); reordered.add(child->Contour); for(int i = 0; i < child->ChildCount(); i++) { partsView[pos].push_back(reordered.size()); reordered.add(child->Childs[i]->Contour); splitIntoPartsView_processPolyTreeNode(partsView, reordered, child->Childs[i]); } } }
void BooleanTool::outerPolyNodeToPathObjects(const ClipperLib::PolyNode& node, PathObjects& out_objects, const PathObject* proto, const PolyMap& polymap) { auto object = std::unique_ptr<PathObject>{ new PathObject{ *proto } }; object->clearCoordinates(); try { polygonToPathPart(node.Contour, polymap, object.get()); for (int i = 0, i_count = node.ChildCount(); i < i_count; ++i) { polygonToPathPart(node.Childs[i]->Contour, polymap, object.get()); // Add outer polygons contained by (nested within) holes ... for (int j = 0, j_count = node.Childs[i]->ChildCount(); j < j_count; ++j) outerPolyNodeToPathObjects(*node.Childs[i]->Childs[j], out_objects, proto, polymap); } out_objects.push_back(object.release()); } catch (std::range_error) { // Do nothing } }