implement converting polygons back to paths
Stefan Schuermans

Stefan Schuermans commited on 2013-01-27 17:06:35
Showing 3 changed files, with 103 additions and 6 deletions.

... ...
@@ -122,7 +122,11 @@ bool CmdParser::procCmd_cut_inside(std::istream &strm)
122 122
 
123 123
   // TODO
124 124
   std::cerr << "TODO: cut_inside" << std::endl;
125
-  return false;
125
+  Layer newLayer;
126
+  polys.writeToLayer(newLayer);
127
+
128
+  // convert layer to G-code
129
+  newLayer.toGCode(mSettings, mGCode);
126 130
 
127 131
   return true;
128 132
 }
... ...
@@ -143,7 +147,11 @@ bool CmdParser::procCmd_cut_outside(std::istream &strm)
143 147
 
144 148
   // TODO
145 149
   std::cerr << "TODO: cut_outside" << std::endl;
146
-  return false;
150
+  Layer newLayer;
151
+  polys.writeToLayer(newLayer);
152
+
153
+  // convert layer to G-code
154
+  newLayer.toGCode(mSettings, mGCode);
147 155
 
148 156
   return true;
149 157
 }
... ...
@@ -164,7 +172,11 @@ bool CmdParser::procCmd_cut_pocket(std::istream &strm)
164 172
 
165 173
   // TODO
166 174
   std::cerr << "TODO: cut_pocket" << std::endl;
167
-  return false;
175
+  Layer newLayer;
176
+  polys.writeToLayer(newLayer);
177
+
178
+  // convert layer to G-code
179
+  newLayer.toGCode(mSettings, mGCode);
168 180
 
169 181
   return true;
170 182
 }
... ...
@@ -7,7 +7,7 @@
7 7
 #include <iostream>
8 8
 #include <vector>
9 9
 
10
-#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
10
+#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
11 11
 #include <CGAL/Polygon_2.h>
12 12
 #include <CGAL/Polygon_with_holes_2.h>
13 13
 #include <CGAL/create_offset_polygons_2.h>
... ...
@@ -147,3 +147,59 @@ bool Polygons::loadLayer(const Layer &layer, double eqDist)
147 147
   return addLayer(layer, eqDist);
148 148
 }
149 149
 
150
+/**
151
+ * @brief add all polygons with holes as multiple paths to a layer
152
+ * @param[in,out] layer layer to add paths to
153
+ */
154
+void Polygons::addToLayer(Layer &layer) const
155
+{
156
+  CgPolyHolesVec::const_iterator poly;
157
+  for (poly = mPolys.begin(); poly != mPolys.end(); ++poly)
158
+    PolyHolesToLayer(*poly, layer);
159
+}
160
+
161
+/**
162
+ * @brief write all polygons with holes as multiple paths to a layer
163
+ * @param[in,out] layer layer to write paths to
164
+ */
165
+void Polygons::writeToLayer(Layer &layer) const
166
+{
167
+  layer.mPaths.clear();
168
+  addToLayer(layer);
169
+}
170
+
171
+/**
172
+ * @brief add a polygon as path to a layer
173
+ * @param[in] poly polygon to add to layer
174
+ * @param[in,out] layer layer to add path to
175
+ */
176
+void Polygons::PolyToLayer(const CgPoly &poly, Layer &layer)
177
+{
178
+  // ignore empty polygons
179
+  if (poly.vertices_begin() == poly.vertices_end())
180
+    return;
181
+  // create new path
182
+  layer.mPaths.push_back(Path());
183
+  Path &path = layer.mPaths.back();
184
+  // add all points
185
+  CgPoly::Vertex_const_iterator v;
186
+  for (v = poly.vertices_begin(); v != poly.vertices_end(); ++v)
187
+    path.addPoint(v->x(), v->y());
188
+  // add first point again to close path
189
+  v = poly.vertices_begin();
190
+  path.addPoint(v->x(), v->y());
191
+}
192
+
193
+/**
194
+ * @brief add a polygon with holes as multiple paths to a layer
195
+ * @param[in] poly polygon with holes to add to layer
196
+ * @param[in,out] layer layer to add paths to
197
+ */
198
+void Polygons::PolyHolesToLayer(const CgPolyHoles &poly, Layer &layer)
199
+{
200
+  PolyToLayer(poly.outer_boundary(), layer);
201
+  CgPolyHoles::Hole_const_iterator hole;
202
+  for (hole = poly.holes_begin(); hole != poly.holes_end(); ++hole)
203
+    PolyToLayer(*hole, layer);
204
+}
205
+
... ...
@@ -9,7 +9,7 @@
9 9
 #include <boost/shared_ptr.hpp>
10 10
 #include <vector>
11 11
 
12
-#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
12
+#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
13 13
 #include <CGAL/Polygon_2.h>
14 14
 #include <CGAL/Polygon_with_holes_2.h>
15 15
 #include <CGAL/create_offset_polygons_2.h>
... ...
@@ -19,7 +19,8 @@
19 19
 /// a set of polygons
20 20
 class Polygons {
21 21
 public:
22
-  typedef CGAL::Exact_predicates_exact_constructions_kernel CgKern;
22
+  typedef CGAL::Exact_predicates_inexact_constructions_kernel CgKern;
23
+
23 24
   typedef CgKern::Point_2                    CgPoint;
24 25
   typedef CGAL::Polygon_2<CgKern>            CgPoly;
25 26
   typedef CGAL::Polygon_with_holes_2<CgKern> CgPolyHoles;
... ...
@@ -53,6 +54,34 @@ public:
53 54
    */
54 55
   bool loadLayer(const Layer &layer, double eqDist);
55 56
 
57
+  /**
58
+   * @brief add all polygons with holes as multiple paths to a layer
59
+   * @param[in,out] layer layer to add paths to
60
+   */
61
+  void addToLayer(Layer &layer) const;
62
+
63
+  /**
64
+   * @brief write all polygons with holes as multiple paths to a layer
65
+   * @param[in,out] layer layer to write paths to
66
+   */
67
+  void writeToLayer(Layer &layer) const;
68
+
69
+protected:
70
+  /**
71
+   * @brief add a polygon as path to a layer
72
+   * @param[in] poly polygon to add to layer
73
+   * @param[in,out] layer layer to add path to
74
+   */
75
+  static void PolyToLayer(const CgPoly &poly, Layer &layer);
76
+
77
+  /**
78
+   * @brief add a polygon with holes as multiple paths to a layer
79
+   * @param[in] poly polygon with holes to add to layer
80
+   * @param[in,out] layer layer to add paths to
81
+   */
82
+  static void PolyHolesToLayer(const CgPolyHoles &poly, Layer &layer);
83
+
84
+public:
56 85
   /// polygons
57 86
   CgPolyHolesVec mPolys;
58 87
 };
59 88