c8388d9e2e5969091c699d5eab6d4c7a7a672066
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

1) /* drawing (DXF) to G-code (NGC) converter
2)  * Copyright 2013 Stefan Schuermans <stefan@schuermans.info>
Stefan Schuermans license CC-BY-SA --> GPL (m...

Stefan Schuermans authored 11 years ago

3)  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

4)  */
5) 
6) #include <fstream>
7) #include <iostream>
Stefan Schuermans configuration of precision

Stefan Schuermans authored 11 years ago

8) #include <math.h>
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

9) #include <sstream>
10) #include <string>
11) 
12) #include "cmdparser.h"
13) #include "drawing.h"
14) #include "filename.h"
15) #include "gcode.h"
Stefan Schuermans implement converting paths...

Stefan Schuermans authored 11 years ago

16) #include "polygons.h"
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

17) #include "settings.h"
18) 
Stefan Schuermans implement converting paths...

Stefan Schuermans authored 11 years ago

19) /**
20)  * @brief get layer by name from stream
21)  * @param[in] strm stream to read layer name from
22)  * @param[out] name layer name from stream
23)  * @param[out] layer layer indicated by name from stream
24)  * @return if layer could be found
25)  */
26) bool CmdParser::getLayer(std::istream &strm, std::string &name,
27)                          const Layer *&layer) const
28) {
29)   // get layer name argument
30)   strm >> name;
31)   if (strm.fail()) {
32)     std::cerr << "missing layer name" << std::endl;
33)     return false;
34)   }
35) 
36)   // get layer
37)   Drawing::Layers::const_iterator itLayer = mDrawing.mLayers.find(name);
38)   if (itLayer == mDrawing.mLayers.end()) {
39)     std::cerr << "layer \"" << name << "\" not found" << std::endl;
40)     return false;
41)   }
42)   layer = &itLayer->second;
43) 
44)   return true;
45) }
46) 
47) /**
48)  * @brief get layer by name from stream and convert to polygons
49)  * @param[in] strm stream to read layer name from
50)  * @param[out] name layer name from stream
51)  * @param[out] layer layer indicated by name from stream
52)  * @param[in,out] polys polygons created from layer
53)  * @return if layer could be found and converted to polygons
54)  */
55) bool CmdParser::getLayerPolys(std::istream &strm, std::string &name,
56)                               const Layer *&layer, Polygons &polys) const
57) {
58)   // get layer
59)   if (!getLayer(strm, name, layer))
60)     return false;
61) 
62)   // convert layer to polygons
63)   if (!polys.loadLayer(*layer, mSettings.precision)) {
64)     std::cerr << "cannot convert layer \"" << name << "\" to polygons"
65)               << std::endl;
66)     return false;
67)   }
68) 
69)   return true;
70) }
71) 
Stefan Schuermans implement clear_ngc command...

Stefan Schuermans authored 11 years ago

72) /**
73)  * @brief process clear_ngc command
74)  * @param[in] strm stream to read command arguments from
75)  * @return if processing command was successful
76)  */
77) bool CmdParser::procCmd_clear_ngc(std::istream &strm)
78) {
79)   // clear G-code
80)   mGCode.mGCmds.clear();
81) 
82)   return true;
83)   (void)strm;
84) }
85) 
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

86) /**
87)  * @brief process cmd command
88)  * @param[in] strm stream to read command arguments from
89)  * @return if processing command was successful
90)  */
91) bool CmdParser::procCmd_cmd(std::istream &strm)
92) {
93)   // skip whitespace and use rest of line as custom command
94)   strm >> std::ws;
95)   std::string cmd;
96)   getline(strm, cmd);
97) 
98)   // add custom command to G-code
99)   mGCode.appendCustom(cmd);
100) 
101)   return true;
102) }
103) 
104) /**
105)  * @brief process cut command
106)  * @param[in] strm stream to read command arguments from
107)  * @return if processing command was successful
108)  */
109) bool CmdParser::procCmd_cut(std::istream &strm)
110) {
Stefan Schuermans implement converting paths...

Stefan Schuermans authored 11 years ago

111)   // get layer from arguments
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

112)   std::string layerName;
Stefan Schuermans implement converting paths...

Stefan Schuermans authored 11 years ago

113)   const Layer *layer;
114)   if (!getLayer(strm, layerName, layer))
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

115)     return false;
116) 
Stefan Schuermans implement converting paths...

Stefan Schuermans authored 11 years ago

117)   // convert layer to G-code
118)   layer->toGCode(mSettings, mGCode);
119) 
120)   return true;
121) }
122) 
123) /**
124)  * @brief process cut_inside command
125)  * @param[in] strm stream to read command arguments from
126)  * @return if processing command was successful
127)  */
128) bool CmdParser::procCmd_cut_inside(std::istream &strm)
129) {
130)   // get layer from arguments and convert to polygons
131)   std::string layerName;
132)   const Layer *layer;
133)   Polygons polys;
134)   if (!getLayerPolys(strm, layerName, layer, polys))
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

135)     return false;
136) 
Stefan Schuermans implement outer polygon off...

Stefan Schuermans authored 11 years ago

137)   // inner offset polygons
Stefan Schuermans implement inside cutting (h...

Stefan Schuermans authored 11 years ago

138)   Polygons newPolys;
Stefan Schuermans implement outer polygon off...

Stefan Schuermans authored 11 years ago

139)   if (!polys.createInnerOffset(mSettings.tool_diameter * 0.5, newPolys)) {
140)     std::cerr << "creating inner offset polygons failed" << std::endl;
141)     return false;
142)   }
Stefan Schuermans implement inside cutting (h...

Stefan Schuermans authored 11 years ago

143) 
144)   // convert polygons back to layer (containing paths)
Stefan Schuermans implement converting polygo...

Stefan Schuermans authored 11 years ago

145)   Layer newLayer;
Stefan Schuermans implement inside cutting (h...

Stefan Schuermans authored 11 years ago

146)   newPolys.writeToLayer(newLayer);
Stefan Schuermans improve paths of layers aft...

Stefan Schuermans authored 11 years ago

147)   newLayer.improvePaths(mSettings.precision);
Stefan Schuermans implement converting polygo...

Stefan Schuermans authored 11 years ago

148) 
149)   // convert layer to G-code
150)   newLayer.toGCode(mSettings, mGCode);
Stefan Schuermans implement converting paths...

Stefan Schuermans authored 11 years ago

151) 
152)   return true;
153) }
154) 
155) /**
156)  * @brief process cut_outside command
157)  * @param[in] strm stream to read command arguments from
158)  * @return if processing command was successful
159)  */
160) bool CmdParser::procCmd_cut_outside(std::istream &strm)
161) {
162)   // get layer from arguments and convert to polygons
163)   std::string layerName;
164)   const Layer *layer;
165)   Polygons polys;
166)   if (!getLayerPolys(strm, layerName, layer, polys))
167)     return false;
168) 
Stefan Schuermans implement outer polygon off...

Stefan Schuermans authored 11 years ago

169)   // outer offset polygons
170)   Polygons newPolys;
171)   if (!polys.createOuterOffset(mSettings.tool_diameter * 0.5, newPolys)) {
172)     std::cerr << "creating outer offset polygons failed" << std::endl;
173)     return false;
174)   }
175) 
176)   // convert polygons back to layer (containing paths)
Stefan Schuermans implement converting polygo...

Stefan Schuermans authored 11 years ago

177)   Layer newLayer;
Stefan Schuermans implement outer polygon off...

Stefan Schuermans authored 11 years ago

178)   newPolys.writeToLayer(newLayer);
Stefan Schuermans improve paths of layers aft...

Stefan Schuermans authored 11 years ago

179)   newLayer.improvePaths(mSettings.precision);
Stefan Schuermans implement converting polygo...

Stefan Schuermans authored 11 years ago

180) 
181)   // convert layer to G-code
182)   newLayer.toGCode(mSettings, mGCode);
Stefan Schuermans implement converting paths...

Stefan Schuermans authored 11 years ago

183) 
184)   return true;
185) }
186) 
187) /**
188)  * @brief process cut_pocket command
189)  * @param[in] strm stream to read command arguments from
190)  * @return if processing command was successful
191)  */
192) bool CmdParser::procCmd_cut_pocket(std::istream &strm)
193) {
194)   // get layer from arguments and convert to polygons
195)   std::string layerName;
196)   const Layer *layer;
197)   Polygons polys;
198)   if (!getLayerPolys(strm, layerName, layer, polys))
199)     return false;
200) 
Stefan Schuermans implement filling polygon w...

Stefan Schuermans authored 11 years ago

201)   // fill insides of polygons by creating inner offset polygons
202)   Polygons newPolys;
203)   if (!polys.fillInnerOffset(mSettings.tool_diameter * 0.5, newPolys)) {
204)     std::cerr << "filling insides of polygons failed" << std::endl;
205)     return false;
206)   }
207) 
208)   // convert polygons back to layer (containing paths)
Stefan Schuermans implement converting polygo...

Stefan Schuermans authored 11 years ago

209)   Layer newLayer;
Stefan Schuermans implement filling polygon w...

Stefan Schuermans authored 11 years ago

210)   newPolys.writeToLayer(newLayer);
Stefan Schuermans improve paths of layers aft...

Stefan Schuermans authored 11 years ago

211)   newLayer.improvePaths(mSettings.precision);
Stefan Schuermans implement converting polygo...

Stefan Schuermans authored 11 years ago

212) 
213)   // convert layer to G-code
214)   newLayer.toGCode(mSettings, mGCode);
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

215) 
216)   return true;
217) }
218) 
219) /**
220)  * @brief process read_dxf command
221)  * @param[in] strm stream to read command arguments from
222)  * @return if processing command was successful
223)  */
224) bool CmdParser::procCmd_read_dxf(std::istream &strm)
225) {
226)   // get arguments
227)   std::string fileName;
228)   strm >> fileName;
229)   if (strm.fail()) {
230)     std::cerr << "missing DXF file name" << std::endl;
231)     return false;
232)   }
233) 
234)   // re-base DXF file name
235)   fileName = filename_rebase(fileName, mBaseDir);
236) 
237)   // read DXF file
Stefan Schuermans implement finer approximati...

Stefan Schuermans authored 11 years ago

238)   if (!mDrawing.loadDxf(fileName, mSettings.precision)) {
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

239)     std::cerr << "could not read DXF file \"" << fileName << "\""
240)               << std::endl;
241)     return false;
242)   }
243) 
Stefan Schuermans implement joining and impro...

Stefan Schuermans authored 11 years ago

244)   // improve paths in layers
245)   mDrawing.improvePaths(mSettings.precision);
246) 
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

247)   return true;
248) }
249) 
250) /**
251)  * @brief process set_base_z command
252)  * @param[in] strm stream to read command arguments from
253)  * @return if processing command was successful
254)  */
255) bool CmdParser::procCmd_set_base_z(std::istream &strm)
256) {
257)   // get arguments
258)   double z;
259)   strm >> z;
260)   if (strm.fail()) {
261)     std::cerr << "missing z coordinate" << std::endl;
262)     return false;
263)   }
264) 
265)   // update settings
266)   mSettings.base_z = z;
267)   return true;
268) }
269) 
270) /**
271)  * @brief process set_cut_z command
272)  * @param[in] strm stream to read command arguments from
273)  * @return if processing command was successful
274)  */
275) bool CmdParser::procCmd_set_cut_z(std::istream &strm)
276) {
277)   // get arguments
278)   double z;
279)   strm >> z;
280)   if (strm.fail()) {
281)     std::cerr << "missing z coordinate" << std::endl;
282)     return false;
283)   }
284) 
285)   // update settings
286)   mSettings.cut_z = z;
287)   return true;
288) }
289) 
290) /**
291)  * @brief process set_cut_z_step command
292)  * @param[in] strm stream to read command arguments from
293)  * @return if processing command was successful
294)  */
295) bool CmdParser::procCmd_set_cut_z_step(std::istream &strm)
296) {
297)   // get arguments and check them
298)   double z;
299)   strm >> z;
300)   if (strm.fail()) {
301)     std::cerr << "missing z value" << std::endl;
302)     return false;
303)   }
304)   if (z <= 0.0) {
Stefan Schuermans add support for cutting a l...

Stefan Schuermans authored 11 years ago

305)     std::cerr << "invalid z cut step value (" << z
306)               << ", expected > 0.0)" << std::endl;
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

307)     return false;
308)   }
309) 
310)   // update settings
311)   mSettings.cut_z_step = z;
312)   return true;
313) }
314) 
Stefan Schuermans add support for dwell time...

Stefan Schuermans authored 11 years ago

315) /**
316)  * @brief process set_dwell_time command
317)  * @param[in] strm stream to read command arguments from
318)  * @return if processing command was successful
319)  */
320) bool CmdParser::procCmd_set_dwell_time(std::istream &strm)
321) {
322)   // get arguments and check them
323)   double dwell_time;
324)   strm >> dwell_time;
325)   if (strm.fail()) {
326)     std::cerr << "missing dwell time" << std::endl;
327)     return false;
328)   }
329)   if (dwell_time < 0.0) {
Stefan Schuermans add support for cutting a l...

Stefan Schuermans authored 11 years ago

330)     std::cerr << "invalid dwell time (" << dwell_time
331)               << ", expected >= 0.0)" << std::endl;
Stefan Schuermans add support for dwell time...

Stefan Schuermans authored 11 years ago

332)     return false;
333)   }
334) 
335)   // update settings
336)   mSettings.dwell_time = dwell_time;
337)   return true;
338) }
339) 
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

340) /**
341)  * @brief process set_feed_drill command
342)  * @param[in] strm stream to read command arguments from
343)  * @return if processing command was successful
344)  */
345) bool CmdParser::procCmd_set_feed_drill(std::istream &strm)
346) {
347)   // get arguments and check them
348)   double feed;
349)   strm >> feed;
350)   if (strm.fail()) {
351)     std::cerr << "missing feed rate" << std::endl;
352)     return false;
353)   }
354)   if (feed <= 0.0) {
Stefan Schuermans add support for cutting a l...

Stefan Schuermans authored 11 years ago

355)     std::cerr << "invalid feed rate (" << feed
356)               << ", expected > 0.0)" << std::endl;
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

357)     return false;
358)   }
359) 
360)   // update settings
361)   mSettings.feed_drill = feed;
362)   return true;
363) }
364) 
365) /**
366)  * @brief process set_feed_mill command
367)  * @param[in] strm stream to read command arguments from
368)  * @return if processing command was successful
369)  */
370) bool CmdParser::procCmd_set_feed_mill(std::istream &strm)
371) {
372)   // get arguments and check them
373)   double feed;
374)   strm >> feed;
375)   if (strm.fail()) {
376)     std::cerr << "missing feed rate" << std::endl;
377)     return false;
378)   }
379)   if (feed <= 0.0) {
Stefan Schuermans add support for cutting a l...

Stefan Schuermans authored 11 years ago

380)     std::cerr << "invalid feed rate (" << feed
381)               << ", expected > 0.0)" << std::endl;
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

382)     return false;
383)   }
384) 
385)   // update settings
386)   mSettings.feed_mill = feed;
387)   return true;
388) }
389) 
Stefan Schuermans add support for cutting a l...

Stefan Schuermans authored 11 years ago

390) /**
391)  * @brief process set_layer_mode command
392)  * @param[in] strm stream to read command arguments from
393)  * @return if processing command was successful
394)  */
395) bool CmdParser::procCmd_set_layer_mode(std::istream &strm)
396) {
397)   // get arguments
398)   std::string layer_mode_str;
399)   strm >> layer_mode_str;
400)   if (strm.fail()) {
401)     std::cerr << "missing layer mode (\"level_by_level\", \"path_by_path\")"
402)               << std::endl;
403)     return false;
404)   }
405) 
406)   // check argument and update settings
407)   if (layer_mode_str == "level_by_level") {
408)     mSettings.layer_mode = Settings::LevelByLevel;
409)     return true;
410)   } else if (layer_mode_str == "path_by_path") {
411)     mSettings.layer_mode = Settings::PathByPath;
412)     return true;
413)   } else {
414)     std::cerr << "invalid layer mode (\"" << layer_mode_str
415)               << "\", expected: \"level_by_level\", \"path_by_path\")"
416)               << std::endl;
417)     return false;
418)   }
419) }
420) 
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

421) /**
422)  * @brief process set_move_z command
423)  * @param[in] strm stream to read command arguments from
424)  * @return if processing command was successful
425)  */
426) bool CmdParser::procCmd_set_move_z(std::istream &strm)
427) {
428)   // get arguments
429)   double z;
430)   strm >> z;
431)   if (strm.fail()) {
432)     std::cerr << "missing z coordinate" << std::endl;
433)     return false;
434)   }
435) 
436)   // update settings
437)   mSettings.move_z = z;
438)   return true;
439) }
440) 
Stefan Schuermans add support for offset in x...

Stefan Schuermans authored 11 years ago

441) /**
442)  * @brief process set_offset_x command
443)  * @param[in] strm stream to read command arguments from
444)  * @return if processing command was successful
445)  */
446) bool CmdParser::procCmd_set_offset_x(std::istream &strm)
447) {
448)   // get arguments
449)   double x;
450)   strm >> x;
451)   if (strm.fail()) {
452)     std::cerr << "missing x coordinate" << std::endl;
453)     return false;
454)   }
455) 
456)   // update settings
457)   mSettings.offset_x = x;
458)   return true;
459) }
460) 
461) /**
462)  * @brief process set_offset_y command
463)  * @param[in] strm stream to read command arguments from
464)  * @return if processing command was successful
465)  */
466) bool CmdParser::procCmd_set_offset_y(std::istream &strm)
467) {
468)   // get arguments
469)   double y;
470)   strm >> y;
471)   if (strm.fail()) {
472)     std::cerr << "missing y coordinate" << std::endl;
473)     return false;
474)   }
475) 
476)   // update settings
477)   mSettings.offset_y = y;
478)   return true;
479) }
480) 
Stefan Schuermans configuration of precision

Stefan Schuermans authored 11 years ago

481) /**
482)  * @brief process set_precision command
483)  * @param[in] strm stream to read command arguments from
484)  * @return if processing command was successful
485)  */
486) bool CmdParser::procCmd_set_precision(std::istream &strm)
487) {
488)   // get arguments and check them
489)   double precision;
490)   strm >> precision;
491)   if (strm.fail()) {
492)     std::cerr << "missing precision" << std::endl;
493)     return false;
494)   }
495)   if (precision < 1.0e-8 || precision > 1.0) {
Stefan Schuermans add support for cutting a l...

Stefan Schuermans authored 11 years ago

496)     std::cerr << "invalid precision (" << precision
497)               << ", expected 1.0e-8 ... 1.0)" << std::endl;
Stefan Schuermans configuration of precision

Stefan Schuermans authored 11 years ago

498)     return false;
499)   }
500) 
501)   // update settings
502)   mSettings.precision = precision;
503)   return true;
504) }
505) 
Stefan Schuermans supoort rotation around z axis

Stefan Schuermans authored 11 years ago

506) /**
507)  * @brief process set_rotation_z command
508)  * @param[in] strm stream to read command arguments from
509)  * @return if processing command was successful
510)  */
511) bool CmdParser::procCmd_set_rotation_z(std::istream &strm)
512) {
513)   // get arguments
514)   double z_angle;
515)   strm >> z_angle;
516)   if (strm.fail()) {
517)     std::cerr << "missing Z axis rotation angle" << std::endl;
518)     return false;
519)   }
520) 
521)   // update settings
522)   mSettings.rotation_z = z_angle;
523)   return true;
524) }
525) 
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

526) /**
527)  * @brief process set_tool_diameter command
528)  * @param[in] strm stream to read command arguments from
529)  * @return if processing command was successful
530)  */
531) bool CmdParser::procCmd_set_tool_diameter(std::istream &strm)
532) {
533)   // get arguments and check them
534)   double diameter;
535)   strm >> diameter;
536)   if (strm.fail()) {
537)     std::cerr << "missing tool diameter" << std::endl;
538)     return false;
539)   }
540)   if (diameter < 0.0) {
Stefan Schuermans add support for cutting a l...

Stefan Schuermans authored 11 years ago

541)     std::cerr << "invalid tool diameter (" << diameter
542)               << ", expected >= 0.0)" << std::endl;
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

543)     return false;
544)   }
545) 
546)   // update settings
547)   mSettings.tool_diameter = diameter;
548)   return true;
549) }
550) 
551) /**
552)  * @brief process write_ngc command
553)  * @param[in] strm stream to read command arguments from
554)  * @return if processing command was successful
555)  */
556) bool CmdParser::procCmd_write_ngc(std::istream &strm)
557) {
558)   // get arguments
559)   std::string fileName;
560)   strm >> fileName;
561)   if (strm.fail()) {
562)     std::cerr << "missing NGC file name" << std::endl;
563)     return false;
564)   }
565) 
566)   // re-base NGC file name
567)   fileName = filename_rebase(fileName, mBaseDir);
568) 
Stefan Schuermans configuration of precision

Stefan Schuermans authored 11 years ago

569)   // calculate number of digits after decimal point
570)   unsigned int digits = (unsigned int)ceil(-log10(mSettings.precision));
571) 
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

572)   // write NGC file
Stefan Schuermans configuration of precision

Stefan Schuermans authored 11 years ago

573)   if (!mGCode.toFile(fileName, digits)) {
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

574)     std::cerr << "could not write NGC file \"" << fileName << "\""
575)               << std::endl;
576)     return false;
577)   }
578) 
579)   return true;
580) }
581) 
582) /**
583)  * @brief process command from line of text
584)  * @param[in] strLine line containing command to process
585)  * @return if processing command was successful
586)  */
587) bool CmdParser::procLine(const std::string &strLine)
588) {
589)   std::stringstream strm(strLine);
590) 
591)   // read command
592)   std::string cmd;
593)   strm >> cmd;
594)   if (strm.fail())
595)     return true; // ignore empty lines
596) 
597)   // commands
Stefan Schuermans implement clear_ngc command...

Stefan Schuermans authored 11 years ago

598)   if (cmd == "clear_ngc")
599)     return procCmd_clear_ngc(strm);
600)   else if (cmd == "cmd")
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

601)     return procCmd_cmd(strm);
602)   else if (cmd == "cut")
603)     return procCmd_cut(strm);
Stefan Schuermans implement converting paths...

Stefan Schuermans authored 11 years ago

604)   else if (cmd == "cut_inside")
605)     return procCmd_cut_inside(strm);
606)   else if (cmd == "cut_outside")
607)     return procCmd_cut_outside(strm);
608)   else if (cmd == "cut_pocket")
609)     return procCmd_cut_pocket(strm);
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

610)   else if (cmd == "read_dxf")
611)     return procCmd_read_dxf(strm);
612)   else if (cmd == "set_base_z")
613)     return procCmd_set_base_z(strm);
614)   else if (cmd == "set_cut_z")
615)     return procCmd_set_cut_z(strm);
616)   else if (cmd == "set_cut_z_step")
617)     return procCmd_set_cut_z_step(strm);
Stefan Schuermans add support for dwell time...

Stefan Schuermans authored 11 years ago

618)   else if (cmd == "set_dwell_time")
619)     return procCmd_set_dwell_time(strm);
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

620)   else if (cmd == "set_feed_drill")
621)     return procCmd_set_feed_drill(strm);
622)   else if (cmd == "set_feed_mill")
623)     return procCmd_set_feed_mill(strm);
Stefan Schuermans add support for cutting a l...

Stefan Schuermans authored 11 years ago

624)   else if (cmd == "set_layer_mode")
625)     return procCmd_set_layer_mode(strm);
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

626)   else if (cmd == "set_move_z")
627)     return procCmd_set_move_z(strm);
Stefan Schuermans add support for offset in x...

Stefan Schuermans authored 11 years ago

628)   else if (cmd == "set_offset_x")
629)     return procCmd_set_offset_x(strm);
630)   else if (cmd == "set_offset_y")
631)     return procCmd_set_offset_y(strm);
Stefan Schuermans configuration of precision

Stefan Schuermans authored 11 years ago

632)   else if (cmd == "set_precision")
633)     return procCmd_set_precision(strm);
Stefan Schuermans sort alphabetically

Stefan Schuermans authored 11 years ago

634)   else if (cmd == "set_rotation_z")
635)     return procCmd_set_rotation_z(strm);