|
|
75613e7 |
--- src/geomgeos.cc.clipper 2013-03-04 16:38:26.385181723 +0100
|
|
|
75613e7 |
+++ src/geomgeos.cc 2013-03-04 17:11:36.433503798 +0100
|
|
|
75613e7 |
@@ -80,21 +80,37 @@
|
|
|
75613e7 |
return p;
|
|
|
75613e7 |
}
|
|
|
75613e7 |
|
|
|
75613e7 |
-PolygonHole from_clipper(const ClipperLib::ExPolygon& cp, const Point& offs)
|
|
|
75613e7 |
+void from_clipper(MultiPolygonHole& ph, const ClipperLib::PolyNode& cp, const Point& offs)
|
|
|
75613e7 |
{
|
|
|
75613e7 |
- PolygonHole p;
|
|
|
75613e7 |
- p.set_exterior(from_clipper(cp.outer, offs));
|
|
|
75613e7 |
- for (ClipperLib::Polygons::const_iterator i(cp.holes.begin()), e(cp.holes.end()); i != e; ++i)
|
|
|
75613e7 |
- p.add_interior(from_clipper(*i, offs));
|
|
|
75613e7 |
+ if (!cp.Contour.size())
|
|
|
75613e7 |
+ return;
|
|
|
75613e7 |
+ if (cp.IsHole())
|
|
|
75613e7 |
+ throw std::runtime_error("from_clipper: outer polygon is a hole!");
|
|
|
75613e7 |
+ ph.push_back(PolygonHole());
|
|
|
75613e7 |
+ PolygonHole& p(ph.back());
|
|
|
75613e7 |
+ p.set_exterior(from_clipper(cp.Contour, offs));
|
|
|
75613e7 |
+ for (std::vector<ClipperLib::PolyNode *>::const_iterator chi(cp.Childs.begin()), che(cp.Childs.end()); chi != che; ++chi) {
|
|
|
75613e7 |
+ const ClipperLib::PolyNode& cpc(**chi);
|
|
|
75613e7 |
+ if (!cpc.IsHole())
|
|
|
75613e7 |
+ throw std::runtime_error("from_clipper: outer polygon is a child of an outer polygon");
|
|
|
75613e7 |
+ p.add_interior(from_clipper(cpc.Contour, offs));
|
|
|
75613e7 |
+ for (std::vector<ClipperLib::PolyNode *>::const_iterator cchi(cpc.Childs.begin()), cche(cpc.Childs.end()); cchi != cche; ++cchi) {
|
|
|
75613e7 |
+ const ClipperLib::PolyNode& cpcc(**cchi);
|
|
|
75613e7 |
+ from_clipper(ph, cpcc, offs);
|
|
|
75613e7 |
+ }
|
|
|
75613e7 |
+ }
|
|
|
75613e7 |
p.normalize();
|
|
|
75613e7 |
- return p;
|
|
|
75613e7 |
}
|
|
|
75613e7 |
|
|
|
75613e7 |
-MultiPolygonHole from_clipper(const ClipperLib::ExPolygons& cp, const Point& offs)
|
|
|
75613e7 |
+MultiPolygonHole from_clipper(const ClipperLib::PolyTree& cp, const Point& offs)
|
|
|
75613e7 |
{
|
|
|
75613e7 |
MultiPolygonHole p;
|
|
|
75613e7 |
- for (ClipperLib::ExPolygons::const_iterator i(cp.begin()), e(cp.end()); i != e; ++i)
|
|
|
75613e7 |
- p.push_back(from_clipper(*i, offs));
|
|
|
75613e7 |
+ if (cp.Contour.size())
|
|
|
75613e7 |
+ throw std::runtime_error("from_clipper: PolyTree has a contour!");
|
|
|
75613e7 |
+ for (std::vector<ClipperLib::PolyNode *>::const_iterator chi(cp.Childs.begin()), che(cp.Childs.end()); chi != che; ++chi) {
|
|
|
75613e7 |
+ const ClipperLib::PolyNode& cpc(**chi);
|
|
|
75613e7 |
+ from_clipper(p, cpc, offs);
|
|
|
75613e7 |
+ }
|
|
|
75613e7 |
return p;
|
|
|
75613e7 |
}
|
|
|
75613e7 |
|
|
|
75613e7 |
@@ -113,7 +129,7 @@
|
|
|
75613e7 |
offs.set_invalid();
|
|
|
75613e7 |
ClipperLib::Clipper c;
|
|
|
75613e7 |
c.AddPolygon(to_clipper(*this, offs), ClipperLib::ptSubject);
|
|
|
75613e7 |
- ClipperLib::ExPolygons sol;
|
|
|
75613e7 |
+ ClipperLib::PolyTree sol;
|
|
|
75613e7 |
c.Execute(ClipperLib::ctUnion, sol, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
|
|
|
75613e7 |
return from_clipper(sol, offs);
|
|
|
75613e7 |
}
|
|
|
75613e7 |
@@ -151,7 +167,7 @@
|
|
|
75613e7 |
to_clipper(cp, mp, offs);
|
|
|
75613e7 |
c.AddPolygons(cp, ClipperLib::ptSubject);
|
|
|
75613e7 |
}
|
|
|
75613e7 |
- ClipperLib::ExPolygons sol;
|
|
|
75613e7 |
+ ClipperLib::PolyTree sol;
|
|
|
75613e7 |
c.Execute(ClipperLib::ctUnion, sol, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
|
|
|
75613e7 |
MultiPolygonHole mp(from_clipper(sol, offs));
|
|
|
75613e7 |
swap(mp);
|
|
|
75613e7 |
@@ -176,7 +192,7 @@
|
|
|
75613e7 |
to_clipper(cp, mp, offs);
|
|
|
75613e7 |
c.AddPolygons(cp, ClipperLib::ptClip);
|
|
|
75613e7 |
}
|
|
|
75613e7 |
- ClipperLib::ExPolygons sol;
|
|
|
75613e7 |
+ ClipperLib::PolyTree sol;
|
|
|
75613e7 |
c.Execute(ClipperLib::ctDifference, sol, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
|
|
|
75613e7 |
MultiPolygonHole mp(from_clipper(sol, offs));
|
|
|
75613e7 |
swap(mp);
|
|
|
75613e7 |
@@ -201,7 +217,7 @@
|
|
|
75613e7 |
to_clipper(cp, mp, offs);
|
|
|
75613e7 |
c.AddPolygons(cp, ClipperLib::ptClip);
|
|
|
75613e7 |
}
|
|
|
75613e7 |
- ClipperLib::ExPolygons sol;
|
|
|
75613e7 |
+ ClipperLib::PolyTree sol;
|
|
|
75613e7 |
c.Execute(ClipperLib::ctIntersection, sol, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
|
|
|
75613e7 |
MultiPolygonHole mp(from_clipper(sol, offs));
|
|
|
75613e7 |
swap(mp);
|