void Clipping::addPolys(const vector<Poly> &polys, PolyType type) { CL::Paths cp = getClipperPolygons(polys); if(debug) { if (type==clip) clippolygons.push_back(cp); else if (type==subject) subjpolygons.push_back(cp); } // try { clpr.AddPaths(cp, CLType(type), true); // } catch (...) { // vector<CL::Paths> vcp; // vcp.push_back(cp); // printCLpolygons(vcp); // for (uint i = 0; i < cp.size(); i++) { // cerr << "try polygon "<< i << endl; // clpr.Clear(); // printCLpolygon(cp[i]); // clpr.AddPath(cp[i],CLType(type), true); // } // throw("end"); // } if (polys.size()>0) { lastZ = polys.back().getZ(); lastExtrF = polys.back().getExtrusionFactor(); } }
CL::PolyTree Clipping::getClipperTree(const vector<Poly> &polys) { CL::Polygons cpolys = getClipperPolygons(polys); CL::Clipper clpr; clpr.AddPolygons(cpolys, CL::ptSubject); CL::PolyTree ctree; clpr.Execute(CL::ctUnion, ctree, CL::pftEvenOdd, CL::pftEvenOdd); return ctree; }
// overlap a bit and unite to merge adjacent polys vector<Poly> Clipping::getMerged(const vector<Poly> &polys, double overlap) { CL::Polygons cpolys = getClipperPolygons(polys); CL::Polygons merged = getMerged(cpolys, CL_FACTOR*overlap); double z=0, extrf = 1.; if (polys.size()>0) { z= polys.back().getZ(); extrf = polys.back().getExtrusionFactor(); } return getPolys(merged, z, extrf); }
vector<Poly> Clipping::getOffset(const vector<Poly> &polys, double distance, JoinType jtype, double miterdist) { CL::Polygons cpolys = getClipperPolygons(polys); CL::Polygons offset = CLOffset(cpolys, CL_FACTOR*distance, CLType(jtype), miterdist); double z=0, extrf=1.;; if (polys.size()>0) { z = polys.back().getZ(); extrf = polys.back().getExtrusionFactor(); } return getPolys(offset,z,extrf); }
// first goes in then out to get capped corners vector<Poly> Clipping::getShrinkedCapped(const vector<Poly> &polys, double distance, JoinType jtype, double miterdist) { CL::Paths cpolys = getClipperPolygons(polys); CL::Paths offset1 = CLOffset(cpolys, -2*CL_FACTOR*distance, CLType(jtype), 0);// CL::jtRound); CL::Paths offset = CLOffset(offset1, 1*CL_FACTOR*distance, CLType(jtype), 0); double z=0, extrf=1.;; if (polys.size()>0) { z= polys.back().getZ(); extrf = polys.back().getExtrusionFactor(); } return getPolys(offset,z,extrf); }
void Clipping::addPolys(const vector<Poly> &polys, PolyType type) { CL::Polygons cp = getClipperPolygons(polys); if(debug) { if (type==clip) clippolygons.push_back(cp); else if (type==subject) subjpolygons.push_back(cp); } clpr.AddPolygons(cp,CLType(type)); if (polys.size()>0) { lastZ = polys.back().getZ(); lastExtrF = polys.back().getExtrusionFactor(); } }
CL::Polygons Clipping::getClipperPolygons(const ExPoly &expoly) { return getClipperPolygons(getPolys(expoly)); }