add support for cutting a layer path-by-path (i.e. each path all the way down, then next path)
Stefan Schuermans

Stefan Schuermans commited on 2013-04-22 20:33:49
Showing 6 changed files, with 95 additions and 11 deletions.

... ...
@@ -27,8 +27,10 @@ set_offset_y 0
27 27
 set_cut_z -2
28 28
 cut_pocket pocket
29 29
 
30
+set_layer_mode path_by_path
30 31
 set_cut_z -2
31 32
 cut_inside inner_test
33
+set_layer_mode level_by_level
32 34
 
33 35
 set_cut_z -2
34 36
 cut_outside outer_test
... ...
@@ -288,7 +288,8 @@ bool CmdParser::procCmd_set_cut_z_step(std::istream &strm)
288 288
     return false;
289 289
   }
290 290
   if (z <= 0.0) {
291
-    std::cerr << "invalid z cut step value (" << z << ")" << std::endl;
291
+    std::cerr << "invalid z cut step value (" << z
292
+              << ", expected > 0.0)" << std::endl;
292 293
     return false;
293 294
   }
294 295
 
... ...
@@ -312,7 +313,8 @@ bool CmdParser::procCmd_set_dwell_time(std::istream &strm)
312 313
     return false;
313 314
   }
314 315
   if (dwell_time < 0.0) {
315
-    std::cerr << "invalid dwell time (" << dwell_time << ")" << std::endl;
316
+    std::cerr << "invalid dwell time (" << dwell_time
317
+              << ", expected >= 0.0)" << std::endl;
316 318
     return false;
317 319
   }
318 320
 
... ...
@@ -336,7 +338,8 @@ bool CmdParser::procCmd_set_feed_drill(std::istream &strm)
336 338
     return false;
337 339
   }
338 340
   if (feed <= 0.0) {
339
-    std::cerr << "invalid feed rate (" << feed << ")" << std::endl;
341
+    std::cerr << "invalid feed rate (" << feed
342
+              << ", expected > 0.0)" << std::endl;
340 343
     return false;
341 344
   }
342 345
 
... ...
@@ -360,7 +363,8 @@ bool CmdParser::procCmd_set_feed_mill(std::istream &strm)
360 363
     return false;
361 364
   }
362 365
   if (feed <= 0.0) {
363
-    std::cerr << "invalid feed rate (" << feed << ")" << std::endl;
366
+    std::cerr << "invalid feed rate (" << feed
367
+              << ", expected > 0.0)" << std::endl;
364 368
     return false;
365 369
   }
366 370
 
... ...
@@ -369,6 +373,37 @@ bool CmdParser::procCmd_set_feed_mill(std::istream &strm)
369 373
   return true;
370 374
 }
371 375
 
376
+/**
377
+ * @brief process set_layer_mode command
378
+ * @param[in] strm stream to read command arguments from
379
+ * @return if processing command was successful
380
+ */
381
+bool CmdParser::procCmd_set_layer_mode(std::istream &strm)
382
+{
383
+  // get arguments
384
+  std::string layer_mode_str;
385
+  strm >> layer_mode_str;
386
+  if (strm.fail()) {
387
+    std::cerr << "missing layer mode (\"level_by_level\", \"path_by_path\")"
388
+              << std::endl;
389
+    return false;
390
+  }
391
+
392
+  // check argument and update settings
393
+  if (layer_mode_str == "level_by_level") {
394
+    mSettings.layer_mode = Settings::LevelByLevel;
395
+    return true;
396
+  } else if (layer_mode_str == "path_by_path") {
397
+    mSettings.layer_mode = Settings::PathByPath;
398
+    return true;
399
+  } else {
400
+    std::cerr << "invalid layer mode (\"" << layer_mode_str
401
+              << "\", expected: \"level_by_level\", \"path_by_path\")"
402
+              << std::endl;
403
+    return false;
404
+  }
405
+}
406
+
372 407
 /**
373 408
  * @brief process set_move_z command
374 409
  * @param[in] strm stream to read command arguments from
... ...
@@ -444,7 +479,8 @@ bool CmdParser::procCmd_set_precision(std::istream &strm)
444 479
     return false;
445 480
   }
446 481
   if (precision < 1.0e-8 || precision > 1.0) {
447
-    std::cerr << "invalid precision (" << precision << ")" << std::endl;
482
+    std::cerr << "invalid precision (" << precision
483
+              << ", expected 1.0e-8 ... 1.0)" << std::endl;
448 484
     return false;
449 485
   }
450 486
 
... ...
@@ -468,7 +504,8 @@ bool CmdParser::procCmd_set_tool_diameter(std::istream &strm)
468 504
     return false;
469 505
   }
470 506
   if (diameter < 0.0) {
471
-    std::cerr << "invalid tool diameter (" << diameter << ")" << std::endl;
507
+    std::cerr << "invalid tool diameter (" << diameter
508
+              << ", expected >= 0.0)" << std::endl;
472 509
     return false;
473 510
   }
474 511
 
... ...
@@ -548,6 +585,8 @@ bool CmdParser::procLine(const std::string &strLine)
548 585
     return procCmd_set_feed_drill(strm);
549 586
   else if (cmd == "set_feed_mill")
550 587
     return procCmd_set_feed_mill(strm);
588
+  else if (cmd == "set_layer_mode")
589
+    return procCmd_set_layer_mode(strm);
551 590
   else if (cmd == "set_move_z")
552 591
     return procCmd_set_move_z(strm);
553 592
   else if (cmd == "set_offset_x")
... ...
@@ -123,6 +123,13 @@ public:
123 123
    */
124 124
   bool procCmd_set_feed_mill(std::istream &strm);
125 125
 
126
+  /**
127
+   * @brief process set_layer_mode command
128
+   * @param[in] strm stream to read command arguments from
129
+   * @return if processing command was successful
130
+   */
131
+  bool procCmd_set_layer_mode(std::istream &strm);
132
+
126 133
   /**
127 134
    * @brief process set_move_z command
128 135
    * @param[in] strm stream to read command arguments from
... ...
@@ -124,18 +124,46 @@ void Layer::improvePaths(double eqDist)
124 124
  */
125 125
 void Layer::toGCode(const Settings &settings, GCode &gcode) const
126 126
 {
127
+  double z;
128
+  Paths::const_iterator path;
129
+
130
+  switch (settings.layer_mode) {
131
+
132
+    case Settings::LevelByLevel:
133
+
127 134
       // cut step-wise
128
-  double z = settings.base_z;
135
+      z = settings.base_z;
129 136
       do {
130 137
         z -= settings.cut_z_step;
131 138
         if (z < settings.cut_z)
132 139
           z = settings.cut_z;
133 140
 
134
-    // cut path at current z
135
-    Paths::const_iterator path;
141
+        // cut all paths at current z
136 142
         for (path = mPaths.begin(); path != mPaths.end(); ++path)
137 143
           path->toGCode(settings, z, gcode);
138 144
 
139 145
       } while (z > settings.cut_z);
146
+
147
+      break;
148
+
149
+    case Settings::PathByPath:
150
+
151
+      // cut each path
152
+      for (path = mPaths.begin(); path != mPaths.end(); ++path) {
153
+
154
+        // cut current path step-wise
155
+        z = settings.base_z;
156
+        do {
157
+          z -= settings.cut_z_step;
158
+          if (z < settings.cut_z)
159
+            z = settings.cut_z;
160
+          path->toGCode(settings, z, gcode);
161
+        } while (z > settings.cut_z);
162
+
163
+      } // for path
164
+
165
+      break;
166
+
167
+  } // switch (settings.layer_mode)
140 168
 }
141 169
 
... ...
@@ -13,6 +13,7 @@ Settings::Settings():
13 13
   dwell_time(0.0),
14 14
   feed_drill(10.0),
15 15
   feed_mill(10.0),
16
+  layer_mode(LevelByLevel),
16 17
   move_z(10.0),
17 18
   offset_x(0.0),
18 19
   offset_y(0.0),
... ...
@@ -9,15 +9,22 @@
9 9
 /// settings for creation of G-code
10 10
 class Settings {
11 11
 public:
12
+  /// layer mode
13
+  enum LayerMode {
14
+    LevelByLevel, ///< cut all paths at the each level (z), then next level
15
+    PathByPath,   ///< cut each path all the way down, then next path
16
+  };
17
+
12 18
   /// set some reasonable/safe default settings
13 19
   Settings();
14 20
 
15 21
   double    base_z;        ///< z coordinate of workpiece surface
16 22
   double    cut_z;         ///< z coordinate of maximum cutting
17
-  double cut_z_step;    ///< z coordinate difference to cut in one step, > 0.0
18
-  double dwell_time;    ///< dwell time before cutting each path (in seconds)
23
+  double    cut_z_step;    ///< z coordinate delta to cut in one step, > 0.0
24
+  double    dwell_time;    ///< dwell time before cutting each path (in sec)
19 25
   double    feed_drill;    ///< feed rate for drilling
20 26
   double    feed_mill;     ///< feed rate for milling
27
+  LayerMode layer_mode;    ///< layer cutting mode (see LayerMode)
21 28
   double    move_z;        ///< z coordinate for moving
22 29
   double    offset_x;      ///< offset to add to X coordinate
23 30
   double    offset_y;      ///< offset to add to Y coordinate
24 31