[repsnapper/f18] Added the old-clipper patch

Miro Hrončok churchyard at fedoraproject.org
Thu May 9 18:41:02 UTC 2013


commit a047c321ef3da8ffdf807d1995c063ff0a4eaea0
Author: Miro Hrončok <miro at hroncok.cz>
Date:   Thu May 9 20:40:38 2013 +0200

    Added the old-clipper patch

 repsnapper-old-clipper.patch |  278 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 278 insertions(+), 0 deletions(-)
---
diff --git a/repsnapper-old-clipper.patch b/repsnapper-old-clipper.patch
new file mode 100644
index 0000000..b4a49c9
--- /dev/null
+++ b/repsnapper-old-clipper.patch
@@ -0,0 +1,278 @@
+diff --git a/src/slicer/clipping.cpp b/src/slicer/clipping.cpp
+index 2abbb22..131aac4 100644
+--- a/src/slicer/clipping.cpp
++++ b/src/slicer/clipping.cpp
+@@ -20,41 +20,6 @@
+ 
+ #include "clipping.h"
+ 
+-//////////////////////////////////////////////////////////////////////////////////////////
+-//
+-// old API compatibility
+-// polytree to expolygons
+-// http://www.angusj.com/delphi/clipper/documentation/Docs/Overview/Compatibility%20with%20Prior%20Versions.htm
+-
+-void Clipping::AddOuterPolyNodeToExPolygons(const CL::PolyNode * polynode,
+-					    ExPolygons& expolygons)
+-{
+-  size_t cnt = expolygons.size();
+-  expolygons.resize(cnt + 1);
+-  expolygons[cnt].outer = polynode->Contour;
+-  expolygons[cnt].holes.resize(polynode->ChildCount());
+-  for (int i = 0; i < polynode->ChildCount(); ++i)
+-  {
+-    expolygons[cnt].holes[i] = 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 Clipping::PolyTreeToExPolygons(const CL::PolyTree * polytree, ExPolygons& expolygons)
+-{
+-  expolygons.clear();
+-  for (int i = 0; i < polytree->ChildCount(); ++i)
+-    AddOuterPolyNodeToExPolygons(polytree->Childs[i], expolygons);
+-}
+-
+-//
+-//////////////////////////////////////////////////////////////////////////////////////////
+-
+-
+-
+-
+ //CL::Clipper Clipping::clpr; // not static
+ 
+ void printCLpolygons(vector<CL::Polygons> &p) {
+@@ -126,23 +91,16 @@ CL::Polygons Clipping::getClipperPolygons(const ExPoly &expoly)
+   return getClipperPolygons(getPolys(expoly));
+ }
+ 
+-/*  // not used
+-CL::PolyTree Clipping::getClipperTree(const vector<ExPoly> &expolys)
++CL::ExPolygons Clipping::getClipperPolygons(const vector<ExPoly> &expolys)
+ {
+-  CL::PolyTree polytree;
+-  // for (uint i=0; i<expolys.size(); i++)     {
+-  //   CL::PolyNode expoly;
+-  //   polytree[i].Contour = getClipperPolygon(expolys[i].outer);
+-  //   for (uint h=0; h<expolys[i].holes.size(); h++) {
+-  //     CL::PolyNode hole;
+-  //     hole.Contour = getClipperPolygon(expolys[i].holes[h]);
+-  //     hole.Parent  = &polytrees[i];
+-  //     polytrees[i].Childs.push_back(&hole);
+-  //   }
+-  // }
+-  return polytree;
++  ClipperLib::ExPolygons excpolys(expolys.size());
++  for (uint i=0; i<expolys.size(); i++)     {
++    excpolys[i].outer = getClipperPolygon(expolys[i].outer);
++    for (uint h=0; h<expolys.size(); h++)
++      excpolys[i].holes[h] = getClipperPolygon(expolys[i].holes[h]);
++    }
++  return excpolys;
+ }
+-*/
+ 
+ CL::JoinType Clipping::CLType(JoinType type)
+ {
+@@ -237,7 +195,7 @@ vector<Poly> Clipping::intersect(CL::PolyFillType sft,
+ vector<ExPoly> Clipping::ext_intersect(CL::PolyFillType sft,
+ 				       CL::PolyFillType cft)
+ {
+-  CL::PolyTree inter;
++  CL::ExPolygons inter;
+   clpr.Execute(CL::ctIntersection, inter, sft, cft);
+   return getExPolys(inter, lastZ, lastExtrF);
+ }
+@@ -253,7 +211,7 @@ vector<Poly> Clipping::unite(CL::PolyFillType sft,
+ vector<ExPoly> Clipping::ext_unite(CL::PolyFillType sft,
+ 				   CL::PolyFillType cft)
+ {
+-  CL::PolyTree inter;
++  CL::ExPolygons inter;
+   clpr.Execute(CL::ctUnion, inter, sft, cft);
+   return getExPolys(inter, lastZ, lastExtrF);
+ }
+@@ -270,24 +228,25 @@ vector<Poly> Clipping::subtract(CL::PolyFillType sft,
+ vector<ExPoly> Clipping::ext_subtract(CL::PolyFillType sft,
+ 				      CL::PolyFillType cft)
+ {
+-  CL::PolyTree diff;
+-  // if (debug) {
+-  //   try {
+-  //     clpr.Execute(CL::ctDifference, diff, sft, cft);
+-  //   } catch (int e){
+-  //     cerr << lastZ<<" - " << lastExtrF<< endl;
+-  //     if (e == 22){
+-  // 	cout << "Subject" << endl;
+-  // 	printCLpolygons(subjpolygons);
+-  // 	cout << "Clip" << endl;
+-  // 	printCLpolygons(clippolygons);
+-  // 	// vector<ExPoly> empty;
+-  // 	// return empty;
+-  //     }
+-  //   }
+-  // }
+-  // else
+-  clpr.Execute(CL::ctDifference, diff, sft, cft);//CL::pftEvenOdd, CL::pftEvenOdd);
++  CL::ExPolygons diff;
++  if (debug) {
++    try {
++      clpr.Execute(CL::ctDifference, diff, sft, cft);
++    } catch (int e){
++      cerr << lastZ<<" - " << lastExtrF<< endl;
++      if (e == 22){
++	cout << "Subject" << endl;
++	printCLpolygons(subjpolygons);
++	cout << "Clip" << endl;
++	printCLpolygons(clippolygons);
++	// vector<ExPoly> empty;
++	// return empty;
++      }
++    }
++  }
++  else
++    clpr.Execute(CL::ctDifference, diff,
++		 CL::pftEvenOdd, CL::pftEvenOdd);
+   return getExPolys(diff, lastZ, lastExtrF);
+ }
+ vector<Poly> Clipping::subtractMerged(double dist,
+@@ -445,19 +404,16 @@ vector<Poly> Clipping::getPolys(const CL::Polygons &cpolys, double z, double ext
+     polys[i] = getPoly(cpolys[i], z, extrusionfactor);
+   return polys;
+ }
+-
+-vector<ExPoly> Clipping::getExPolys(const CL::PolyTree &ctree, double z,
++vector<ExPoly> Clipping::getExPolys(const CL::ExPolygons &excpolys, double z,
+ 				    double extrusionfactor)
+ {
+-  ExPolygons cexpolys;
+-  PolyTreeToExPolygons(&ctree, cexpolys);
+-  vector<ExPoly> expolys(cexpolys.size());
+-  for (uint j = 0 ; j < cexpolys.size(); j++) {
+-    expolys[j].outer = getPoly(cexpolys[0].outer, z, extrusionfactor);
+-    for (uint i = 0 ; i < cexpolys[j].holes.size(); i++)
+-      expolys[j].holes.push_back(getPoly(cexpolys[j].holes[i], z, extrusionfactor));
++  uint count = excpolys.size();
++  vector<ExPoly> polys(count);
++  for (uint i = 0 ; i < count; i++) {
++    polys[i].outer = getPoly(excpolys[i].outer, z, extrusionfactor);
++    polys[i].holes = getPolys(excpolys[i].holes, z, extrusionfactor);
+   }
+-  return expolys;
++  return polys;
+ }
+ vector<Poly> Clipping::getPolys(const ExPoly &expoly)
+ {
+@@ -479,10 +435,8 @@ vector<Poly> Clipping::getPolys(const vector<ExPoly> &expolys)
+ 
+ vector<ExPoly> Clipping::getExPolys(const vector<Poly> &polys)
+ {
+-  /*
+-  CL::PolyTree tree = getClipperTree(polys);
+-  return getExPolys(tree, polys.back().getZ(), polys.back().getExtrusionFactor());
+-  */
++  // return getExPolys(getExClipperPolygons(polys),
++  // 		    polys.back().getZ(),polys.back().getExtrusionFactor());
+   vector<ExPoly> expolys;
+   vector<Poly> holes;
+   for (uint i = 0; i<polys.size(); i++) {
+@@ -494,10 +448,11 @@ vector<ExPoly> Clipping::getExPolys(const vector<Poly> &polys)
+       expolys.push_back(expoly);
+     }
+   }
+-  for (uint i = 0; i<holes.size(); i++)
+-    for (uint j = 0; j<expolys.size(); j++)
++  for (uint j = 0; j<expolys.size(); j++)
++    for (uint i = 0; i<holes.size(); i++)
++      // just test one point
+       if (holes[i].size()>0)
+-	if (expolys[j].outer.vertexInside(holes[i].vertices[0])) // just test one point
++	if (expolys[j].outer.vertexInside(holes[i].vertices[0]))
+ 	  //if (holes[i].isInside(expolys[j].outer)) // test all
+ 	  expolys[j].holes.push_back(holes[i]);
+   return expolys;
+@@ -513,15 +468,27 @@ vector<ExPoly> Clipping::getExPolys(const vector<Poly> &polys,
+   }
+   return getExPolys(ppolys);
+ }
++//   CL::ExPolygons excpolys = getExClipperPolygons(polys);
++//   uint count = excpolys.size();
++//   vector<ExPoly> expolys(count);
++//   for (uint i = 0 ; i < count;  i++)  {
++//     expolys[i].outer = getPoly(excpolys[i].outer, z, extrusionfactor);
++//     expolys[i].holes.resize(excpolys[i].holes.size());
++//     for (uint j = 0 ; j < excpolys[i].holes.size();  i++) {
++//       expolys[i].holes[j] = getPoly(excpolys[i].holes[j], z, extrusionfactor);
++//     }
++//   }
++//   return expolys;
++// }
+ 
+-CL::PolyTree Clipping::getClipperTree(const vector<Poly> &polys)
++CL::ExPolygons Clipping::getExClipperPolygons(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;
++  CL::ExPolygons cexpolys;
++  clpr.Execute(CL::ctUnion, cexpolys, CL::pftEvenOdd, CL::pftEvenOdd);
++  return cexpolys;
+ }
+ 
+ double Clipping::Area(const Poly &poly){
+@@ -553,7 +520,3 @@ void Clipping::ReversePoints(vector<Poly> &polys) {
+   for (uint i=0; i<polys.size(); i++)
+     polys[i].reverse();
+ }
+-
+-
+-
+-
+diff --git a/src/slicer/clipping.h b/src/slicer/clipping.h
+index dfaf33b..8beabc2 100644
+--- a/src/slicer/clipping.h
++++ b/src/slicer/clipping.h
+@@ -121,18 +121,18 @@ public:
+   static vector<Poly>   getPolys(const ExPoly &expoly);
+   static vector<Poly>   getPolys(const vector<ExPoly> &expolys);
+   static vector<Poly>   getPolys(const CL::Polygons &cpoly, double z, double extrusionfactor);
+-  static vector<ExPoly> getExPolys(const CL::PolyTree &ctree, double z,
++  static vector<ExPoly> getExPolys(const CL::ExPolygons &excpolys, double z,
+ 				   double extrusionfactor);
+ 
+   static vector<ExPoly> getExPolys(const vector<Poly> &polys,
+ 				   double z, double extrusionfactor);
+   static vector<ExPoly> getExPolys(const vector<Poly> &polys);
+-  static CL::PolyTree   getClipperTree(const vector<Poly> &polys);
++  static CL::ExPolygons getExClipperPolygons(const vector<Poly> &polys);
+ 
+   static CL::Polygon    getClipperPolygon (const Poly &poly);
+   static CL::Polygons   getClipperPolygons(const vector<Poly> &polys);
+   static CL::Polygons   getClipperPolygons(const ExPoly &expoly);
+-  //static CL::PolyTree   getClipperTree(const vector<ExPoly> &expolys);
++  static CL::ExPolygons getClipperPolygons(const vector<ExPoly> &expolys);
+ 
+   static double Area(const Poly &poly);
+   static double Area(const vector<Poly> &polys);
+@@ -141,16 +141,4 @@ public:
+ 
+   static void ReversePoints(vector<Poly> &polys);
+ 
+- protected:
+-  // old API compatibility
+-  // polytree to expolygons
+-  struct ExPolygon {
+-    CL::Polygon outer;
+-    CL::Polygons holes;
+-  };
+-  typedef std::vector< ExPolygon > ExPolygons;
+-  static void AddOuterPolyNodeToExPolygons(const CL::PolyNode *polynode,
+-					   ExPolygons& expolygons);
+-  static void PolyTreeToExPolygons(const CL::PolyTree * polytree, ExPolygons& expolygons);
+-
+ };


More information about the scm-commits mailing list