5dbde6512203cb4a62e5422a1b908c403b74bc35
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) 
Stefan Schuermans supoort rotation around z axis

Stefan Schuermans authored 11 years ago

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

Stefan Schuermans authored 11 years ago

7) #include <vector>
8) 
9) #include "gcode.h"
10) #include "path.h"
11) #include "point.h"
12) #include "settings.h"
13) 
14) /**
15)  * @brief add a new point to the end of the path
16)  * @param[in] point point to add
17)  */
18) void Path::addPoint(const Point &point)
19) {
20)   mPoints.push_back(point);
21) }
22) 
23) /**
24)  * @brief add a new point to the end of the path
25)  * @param[in] x x coordinate of point to add
26)  * @param[in] y y coordinate of point to add
27)  */
28) void Path::addPoint(double x, double y)
29) {
30)   addPoint(Point(x, y));
31) }
32) 
Stefan Schuermans implement joining and impro...

Stefan Schuermans authored 11 years ago

33) /**
34)  * @brief prepend other path to this one
35)  * @param[in] other other path to prepend
36)  */
37) void Path::prependPath(const Path &other)
38) {
39)   mPoints.insert(mPoints.begin(),
40)                  other.mPoints.begin(), other.mPoints.end());
41) }
42) 
43) /**
44)  * @brief prepend other path in reverse to this one
45)  * @param[in] other other path to prepend
46)  */
47) void Path::prependReversedPath(const Path &other)
48) {
49)   mPoints.insert(mPoints.begin(),
50)                  other.mPoints.rbegin(), other.mPoints.rend());
51) }
52) 
53) /**
54)  * @brief append other path to this one
55)  * @param[in] other other path to appepend
56)  */
57) void Path::appendPath(const Path &other)
58) {
59)   mPoints.insert(mPoints.end(),
60)                  other.mPoints.begin(), other.mPoints.end());
61) }
62) 
63) /**
64)  * @brief append other path in reverse to this one
65)  * @param[in] other other path to appepend
66)  */
67) void Path::appendReversedPath(const Path &other)
68) {
69)   mPoints.insert(mPoints.end(),
70)                  other.mPoints.rbegin(), other.mPoints.rend());
71) }
72) 
73) /**
74)  * @brief remove points too close to each other
75)  * @param[in] eqDist maximum distance of two points to be considered equal
76)  */
77) void Path::removeEqPoints(double eqDist)
78) {
79)   Points::iterator pt = mPoints.begin();
80)   while (pt != mPoints.end()) {
81)     Points::iterator next = pt + 1;
82)     if (next != mPoints.end() && pt->equals(*next, eqDist))
83)       mPoints.erase(next);
84)     else
85)       pt++;
86)   }
87) }
88) 
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

89) /**
90)  * @brief convert path to G-code
91)  * @param[in] settings G-code creation settings
Stefan Schuermans process each layer z step b...

Stefan Schuermans authored 11 years ago

92)  * @param[in] z z coordinate to use for G-code of path
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

93)  * @param[in,out] gcode new G-code is appended to existing G-code
94)  */
Stefan Schuermans process each layer z step b...

Stefan Schuermans authored 11 years ago

95) void Path::toGCode(const Settings &settings, double z, GCode &gcode) const
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

96) {
Stefan Schuermans implement scaling

Stefan Schuermans authored 11 years ago

97)   double sx = settings.scale_x, sy = settings.scale_y;
98)   double rot = settings.rotation_z * M_PI / 180.0;
Stefan Schuermans add support for offset in x...

Stefan Schuermans authored 11 years ago

99)   Point offset(settings.offset_x, settings.offset_y);
100) 
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

101)   // leave if no points
102)   if (mPoints.empty())
103)     return;
104) 
105)   // move up
106)   gcode.appendUp(settings.move_z);
107) 
Stefan Schuermans process each layer z step b...

Stefan Schuermans authored 11 years ago

108)   // move to start
Stefan Schuermans implement scaling

Stefan Schuermans authored 11 years ago

109)   gcode.appendFast(mPoints.front().scale_xy(sx, sy).rotate(rot) + offset);
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

110) 
Stefan Schuermans add support for dwell time...

Stefan Schuermans authored 11 years ago

111)   // dwell
112)   if (settings.dwell_time > 0.0)
113)     gcode.appendDwell(settings.dwell_time);
114) 
Stefan Schuermans process each layer z step b...

Stefan Schuermans authored 11 years ago

115)   // cut down
116)   gcode.appendFeed(settings.feed_drill);
117)   gcode.appendDown(z);
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

118) 
Stefan Schuermans process each layer z step b...

Stefan Schuermans authored 11 years ago

119)   // cut along all points
120)   gcode.appendFeed(settings.feed_mill);
121)   Points::const_iterator pt = mPoints.begin();
122)   for (++pt; pt != mPoints.end(); ++pt)
Stefan Schuermans implement scaling

Stefan Schuermans authored 11 years ago

123)     gcode.appendLinear(pt->scale_xy(sx, sy).rotate(rot) + offset);
Stefan Schuermans initial version, DXFs can b...

Stefan Schuermans authored 11 years ago

124) 
Stefan Schuermans process each layer z step b...

Stefan Schuermans authored 11 years ago

125)   // move up
126)   gcode.appendUp(settings.move_z);