Stefan Schuermans commited on 2013-01-28 21:50:18
Showing 3 changed files, with 70 additions and 5 deletions.
| ... | ... |
@@ -182,10 +182,16 @@ bool CmdParser::procCmd_cut_pocket(std::istream &strm) |
| 182 | 182 |
if (!getLayerPolys(strm, layerName, layer, polys)) |
| 183 | 183 |
return false; |
| 184 | 184 |
|
| 185 |
- // TODO |
|
| 186 |
- std::cerr << "TODO: cut_pocket" << std::endl; |
|
| 185 |
+ // fill insides of polygons by creating inner offset polygons |
|
| 186 |
+ Polygons newPolys; |
|
| 187 |
+ if (!polys.fillInnerOffset(mSettings.tool_diameter * 0.5, newPolys)) {
|
|
| 188 |
+ std::cerr << "filling insides of polygons failed" << std::endl; |
|
| 189 |
+ return false; |
|
| 190 |
+ } |
|
| 191 |
+ |
|
| 192 |
+ // convert polygons back to layer (containing paths) |
|
| 187 | 193 |
Layer newLayer; |
| 188 |
- polys.writeToLayer(newLayer); |
|
| 194 |
+ newPolys.writeToLayer(newLayer); |
|
| 189 | 195 |
|
| 190 | 196 |
// convert layer to G-code |
| 191 | 197 |
newLayer.toGCode(mSettings, mGCode); |
| ... | ... |
@@ -12,6 +12,7 @@ |
| 12 | 12 |
#include <CGAL/Polygon_with_holes_2.h> |
| 13 | 13 |
#include <CGAL/Boolean_set_operations_2.h> |
| 14 | 14 |
#include <CGAL/create_offset_polygons_from_polygon_with_holes_2.h> |
| 15 |
+#include <CGAL/create_straight_skeleton_from_polygon_with_holes_2.h> |
|
| 15 | 16 |
|
| 16 | 17 |
#include "layer.h" |
| 17 | 18 |
#include "path.h" |
| ... | ... |
@@ -161,7 +162,7 @@ bool Polygons::createInnerOffset(double offset, Polygons &offsetPolys) const |
| 161 | 162 |
{
|
| 162 | 163 |
// clear output polygons |
| 163 | 164 |
offsetPolys.mPolys.clear(); |
| 164 |
- // leave if tool diameter is invalid |
|
| 165 |
+ // leave if offset size is invalid |
|
| 165 | 166 |
if (offset <= 0.0) {
|
| 166 | 167 |
std::cerr << "invalid polygon offset distance " << offset << std::endl; |
| 167 | 168 |
return false; |
| ... | ... |
@@ -196,7 +197,7 @@ bool Polygons::createOuterOffset(double offset, Polygons &offsetPolys) const |
| 196 | 197 |
{
|
| 197 | 198 |
// clear output polygons |
| 198 | 199 |
offsetPolys.mPolys.clear(); |
| 199 |
- // leave if tool diameter is invalid |
|
| 200 |
+ // leave if offset size is invalid |
|
| 200 | 201 |
if (offset <= 0.0) {
|
| 201 | 202 |
std::cerr << "invalid polygon offset distance " << offset << std::endl; |
| 202 | 203 |
return false; |
| ... | ... |
@@ -212,6 +213,53 @@ bool Polygons::createOuterOffset(double offset, Polygons &offsetPolys) const |
| 212 | 213 |
return true; |
| 213 | 214 |
} |
| 214 | 215 |
|
| 216 |
+/** |
|
| 217 |
+ * @brief fill insides of polygons by creating inner offset polygons |
|
| 218 |
+ * @param[in] offset offset, > 0.0 |
|
| 219 |
+ * @param[out] offsetPolys offset polygons (!= *this) |
|
| 220 |
+ * @return if insides of polygons could be filles with inner offset polygons |
|
| 221 |
+ */ |
|
| 222 |
+bool Polygons::fillInnerOffset(double offset, Polygons &offsetPolys) const |
|
| 223 |
+{
|
|
| 224 |
+ // clear output polygons |
|
| 225 |
+ offsetPolys.mPolys.clear(); |
|
| 226 |
+ // leave if offset size is invalid |
|
| 227 |
+ if (offset <= 0.0) {
|
|
| 228 |
+ std::cerr << "invalid polygon offset distance " << offset << std::endl; |
|
| 229 |
+ return false; |
|
| 230 |
+ } |
|
| 231 |
+ |
|
| 232 |
+ // process all polygons |
|
| 233 |
+ CgPolyHolesVec::const_iterator poly; |
|
| 234 |
+ for (poly = mPolys.begin(); poly != mPolys.end(); ++poly) {
|
|
| 235 |
+ |
|
| 236 |
+ // create interior straight skeleton |
|
| 237 |
+ CgSsPtr skel = CGAL::create_interior_straight_skeleton_2(*poly); |
|
| 238 |
+ |
|
| 239 |
+ // create inner offset polygons with increasing offset |
|
| 240 |
+ size_t i; |
|
| 241 |
+ for (i = 1; ; ++i) {
|
|
| 242 |
+ |
|
| 243 |
+ // create inner offset polygons |
|
| 244 |
+ CgPolyPtrVec offPolys = |
|
| 245 |
+ CGAL::create_offset_polygons_2<CgPoly>(offset * i, *skel); |
|
| 246 |
+ |
|
| 247 |
+ // no offset polygons -> done |
|
| 248 |
+ if (offPolys.empty()) |
|
| 249 |
+ break; |
|
| 250 |
+ |
|
| 251 |
+ // add offset polygons to output polygons |
|
| 252 |
+ CgPolyPtrVec::const_iterator offPoly; |
|
| 253 |
+ for (offPoly = offPolys.begin(); offPoly != offPolys.end(); ++offPoly) |
|
| 254 |
+ offsetPolys.mPolys.push_back(CgPolyHoles(**offPoly)); |
|
| 255 |
+ |
|
| 256 |
+ } // for i |
|
| 257 |
+ |
|
| 258 |
+ } // for poly |
|
| 259 |
+ |
|
| 260 |
+ return true; |
|
| 261 |
+} |
|
| 262 |
+ |
|
| 215 | 263 |
/** |
| 216 | 264 |
* @brief add all polygons with holes as multiple paths to a layer |
| 217 | 265 |
* @param[in,out] layer layer to add paths to |
| ... | ... |
@@ -12,6 +12,7 @@ |
| 12 | 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 |
+#include <CGAL/create_straight_skeleton_from_polygon_with_holes_2.h> |
|
| 15 | 16 |
|
| 16 | 17 |
#include "layer.h" |
| 17 | 18 |
|
| ... | ... |
@@ -23,10 +24,12 @@ public: |
| 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; |
| 27 |
+ typedef CGAL::Straight_skeleton_2<CgKern> CgSs; |
|
| 26 | 28 |
typedef std::vector<CgPoly> CgPolyVec; |
| 27 | 29 |
typedef std::vector<CgPolyHoles> CgPolyHolesVec; |
| 28 | 30 |
typedef boost::shared_ptr<CgPoly> CgPolyPtr; |
| 29 | 31 |
typedef boost::shared_ptr<CgPolyHoles> CgPolyHolesPtr; |
| 32 |
+ typedef boost::shared_ptr<CgSs> CgSsPtr; |
|
| 30 | 33 |
typedef std::vector<CgPolyPtr> CgPolyPtrVec; |
| 31 | 34 |
typedef std::vector<CgPolyHolesPtr> CgPolyHolesPtrVec; |
| 32 | 35 |
|
| ... | ... |
@@ -67,6 +70,14 @@ public: |
| 67 | 70 |
*/ |
| 68 | 71 |
bool createOuterOffset(double offset, Polygons &offsetPolys) const; |
| 69 | 72 |
|
| 73 |
+ /** |
|
| 74 |
+ * @brief fill insides of polygons by creating inner offset polygons |
|
| 75 |
+ * @param[in] offset offset, > 0.0 |
|
| 76 |
+ * @param[out] offsetPolys offset polygons (!= *this) |
|
| 77 |
+ * @return if insides of polygons could be filles with inner offset polygons |
|
| 78 |
+ */ |
|
| 79 |
+ bool fillInnerOffset(double offset, Polygons &offsetPolys) const; |
|
| 80 |
+ |
|
| 70 | 81 |
/** |
| 71 | 82 |
* @brief add all polygons with holes as multiple paths to a layer |
| 72 | 83 |
* @param[in,out] layer layer to add paths to |
| 73 | 84 |