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