ebf23ce
From 2f6d8132a66b142541ed9a6ab21c7ebf800de13c Mon Sep 17 00:00:00 2001
ebf23ce
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
ebf23ce
Date: Sun, 23 Jun 2013 16:30:24 +0200
ebf23ce
Subject: [PATCH] Added PolyTreeToExPolygons function form Clipper
ebf23ce
 documentation and introduced support for Clipper 5.1.x
ebf23ce
ebf23ce
---
ebf23ce
 layerPart.h | 47 ++++++++++++++++++++++++++++++++++++++++++++---
ebf23ce
 1 file changed, 44 insertions(+), 3 deletions(-)
ebf23ce
ebf23ce
diff --git a/layerPart.h b/layerPart.h
ebf23ce
index 1be61f6..ea52eca 100644
ebf23ce
--- a/layerPart.h
ebf23ce
+++ b/layerPart.h
ebf23ce
@@ -15,6 +15,44 @@
ebf23ce
 */
ebf23ce
 
ebf23ce
 
ebf23ce
+//////////////////////////////////////////////////////////////////////////////////////////
ebf23ce
+//
ebf23ce
+// old API compatibility
ebf23ce
+// polytree to expolygons
ebf23ce
+// http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Types/ExPolygons.htm
ebf23ce
+
ebf23ce
+struct ExPolygon
ebf23ce
+{
ebf23ce
+    ClipperLib::Polygon outer;
ebf23ce
+    ClipperLib::Polygons holes;
ebf23ce
+};
ebf23ce
+typedef std::vector<ExPolygon> ExPolygons;
ebf23ce
+
ebf23ce
+void AddOuterPolyNodeToExPolygons(const ClipperLib::PolyNode * polynode, ExPolygons& expolygons)
ebf23ce
+{
ebf23ce
+    size_t cnt = expolygons.size();
ebf23ce
+    expolygons.resize(cnt + 1);
ebf23ce
+    expolygons[cnt].outer = polynode->Contour;
ebf23ce
+    expolygons[cnt].holes.resize(polynode->ChildCount());
ebf23ce
+    for (int i = 0; i < polynode->ChildCount(); ++i)
ebf23ce
+    {
ebf23ce
+        expolygons[cnt].holes[i] = polynode->Childs[i]->Contour;
ebf23ce
+        //Add outer polygons contained by (nested within) holes ...
ebf23ce
+        for (int j = 0; j < polynode->Childs[i]->ChildCount(); ++j)
ebf23ce
+            AddOuterPolyNodeToExPolygons(polynode->Childs[i]->Childs[j], expolygons);
ebf23ce
+    }
ebf23ce
+}
ebf23ce
+
ebf23ce
+void PolyTreeToExPolygons(const ClipperLib::PolyTree * polytree, ExPolygons& expolygons)
ebf23ce
+{
ebf23ce
+    expolygons.clear();
ebf23ce
+    for (int i = 0; i < polytree->ChildCount(); ++i)
ebf23ce
+        AddOuterPolyNodeToExPolygons(polytree->Childs[i], expolygons);
ebf23ce
+}
ebf23ce
+
ebf23ce
+//
ebf23ce
+//////////////////////////////////////////////////////////////////////////////////////////
ebf23ce
+
ebf23ce
 void createLayerWithParts(SliceLayer& storageLayer, SlicerLayer* layer, int unionAllType)
ebf23ce
 {
ebf23ce
     ClipperLib::Polygons polyList;
ebf23ce
@@ -31,13 +69,16 @@ void createLayerWithParts(SliceLayer& storageLayer, SlicerLayer* layer, int unio
ebf23ce
         polyList.push_back(p);
ebf23ce
     }
ebf23ce
     
ebf23ce
-    ClipperLib::ExPolygons resultPolys;
ebf23ce
+    ExPolygons resultPolys;
ebf23ce
+    ClipperLib::PolyTree resultPolyTree;
ebf23ce
     ClipperLib::Clipper clipper;
ebf23ce
     clipper.AddPolygons(polyList, ClipperLib::ptSubject);
ebf23ce
     if (unionAllType)
ebf23ce
-        clipper.Execute(ClipperLib::ctUnion, resultPolys, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
ebf23ce
+        clipper.Execute(ClipperLib::ctUnion, resultPolyTree, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
ebf23ce
     else
ebf23ce
-        clipper.Execute(ClipperLib::ctUnion, resultPolys);
ebf23ce
+        clipper.Execute(ClipperLib::ctUnion, resultPolyTree);
ebf23ce
+    
ebf23ce
+    PolyTreeToExPolygons(&resultPolyTree, resultPolys);
ebf23ce
     
ebf23ce
     for(unsigned int i=0; i
ebf23ce
     {
ebf23ce
-- 
ebf23ce
1.8.1.6
ebf23ce