Stefan Schuermans commited on 2013-05-18 14:37:50
Showing 7 changed files, with 56 additions and 2 deletions.
| ... | ... |
@@ -489,6 +489,26 @@ bool CmdParser::procCmd_set_precision(std::istream &strm) |
| 489 | 489 |
return true; |
| 490 | 490 |
} |
| 491 | 491 |
|
| 492 |
+/** |
|
| 493 |
+ * @brief process set_rotation_z command |
|
| 494 |
+ * @param[in] strm stream to read command arguments from |
|
| 495 |
+ * @return if processing command was successful |
|
| 496 |
+ */ |
|
| 497 |
+bool CmdParser::procCmd_set_rotation_z(std::istream &strm) |
|
| 498 |
+{
|
|
| 499 |
+ // get arguments |
|
| 500 |
+ double z_angle; |
|
| 501 |
+ strm >> z_angle; |
|
| 502 |
+ if (strm.fail()) {
|
|
| 503 |
+ std::cerr << "missing Z axis rotation angle" << std::endl; |
|
| 504 |
+ return false; |
|
| 505 |
+ } |
|
| 506 |
+ |
|
| 507 |
+ // update settings |
|
| 508 |
+ mSettings.rotation_z = z_angle; |
|
| 509 |
+ return true; |
|
| 510 |
+} |
|
| 511 |
+ |
|
| 492 | 512 |
/** |
| 493 | 513 |
* @brief process set_tool_diameter command |
| 494 | 514 |
* @param[in] strm stream to read command arguments from |
| ... | ... |
@@ -589,6 +609,8 @@ bool CmdParser::procLine(const std::string &strLine) |
| 589 | 609 |
return procCmd_set_layer_mode(strm); |
| 590 | 610 |
else if (cmd == "set_move_z") |
| 591 | 611 |
return procCmd_set_move_z(strm); |
| 612 |
+ else if (cmd == "set_rotation_z") |
|
| 613 |
+ return procCmd_set_rotation_z(strm); |
|
| 592 | 614 |
else if (cmd == "set_offset_x") |
| 593 | 615 |
return procCmd_set_offset_x(strm); |
| 594 | 616 |
else if (cmd == "set_offset_y") |
| ... | ... |
@@ -158,6 +158,13 @@ public: |
| 158 | 158 |
*/ |
| 159 | 159 |
bool procCmd_set_precision(std::istream &strm); |
| 160 | 160 |
|
| 161 |
+ /** |
|
| 162 |
+ * @brief process set_rotation_z command |
|
| 163 |
+ * @param[in] strm stream to read command arguments from |
|
| 164 |
+ * @return if processing command was successful |
|
| 165 |
+ */ |
|
| 166 |
+ bool procCmd_set_rotation_z(std::istream &strm); |
|
| 167 |
+ |
|
| 161 | 168 |
/** |
| 162 | 169 |
* @brief process set_tool_diameter command |
| 163 | 170 |
* @param[in] strm stream to read command arguments from |
| ... | ... |
@@ -3,6 +3,7 @@ |
| 3 | 3 |
* Copyleft: CC-BY-SA http://creativecommons.org/licenses/by-sa/3.0/ |
| 4 | 4 |
*/ |
| 5 | 5 |
|
| 6 |
+#include <math.h> |
|
| 6 | 7 |
#include <vector> |
| 7 | 8 |
|
| 8 | 9 |
#include "gcode.h" |
| ... | ... |
@@ -93,6 +94,7 @@ void Path::removeEqPoints(double eqDist) |
| 93 | 94 |
*/ |
| 94 | 95 |
void Path::toGCode(const Settings &settings, double z, GCode &gcode) const |
| 95 | 96 |
{
|
| 97 |
+ double rot = settings.rotation_z * M_PI / 180.0; |
|
| 96 | 98 |
Point offset(settings.offset_x, settings.offset_y); |
| 97 | 99 |
|
| 98 | 100 |
// leave if no points |
| ... | ... |
@@ -103,7 +105,7 @@ void Path::toGCode(const Settings &settings, double z, GCode &gcode) const |
| 103 | 105 |
gcode.appendUp(settings.move_z); |
| 104 | 106 |
|
| 105 | 107 |
// move to start |
| 106 |
- gcode.appendFast(mPoints.front() + offset); |
|
| 108 |
+ gcode.appendFast(mPoints.front().rotate(rot) + offset); |
|
| 107 | 109 |
|
| 108 | 110 |
// dwell |
| 109 | 111 |
if (settings.dwell_time > 0.0) |
| ... | ... |
@@ -117,7 +119,7 @@ void Path::toGCode(const Settings &settings, double z, GCode &gcode) const |
| 117 | 119 |
gcode.appendFeed(settings.feed_mill); |
| 118 | 120 |
Points::const_iterator pt = mPoints.begin(); |
| 119 | 121 |
for (++pt; pt != mPoints.end(); ++pt) |
| 120 |
- gcode.appendLinear(*pt + offset); |
|
| 122 |
+ gcode.appendLinear(pt->rotate(rot) + offset); |
|
| 121 | 123 |
|
| 122 | 124 |
// move up |
| 123 | 125 |
gcode.appendUp(settings.move_z); |
| ... | ... |
@@ -92,3 +92,17 @@ bool Point::equals(const Point &that, double eqDist) const |
| 92 | 92 |
return (*this - that).abs_sq() <= eqDist * eqDist; |
| 93 | 93 |
} |
| 94 | 94 |
|
| 95 |
+/** |
|
| 96 |
+ * @brief rotate around origin |
|
| 97 |
+ * @param[in] rad angle in radians |
|
| 98 |
+ * @return rotated point |
|
| 99 |
+ */ |
|
| 100 |
+Point Point::rotate(double rad) const |
|
| 101 |
+{
|
|
| 102 |
+ double c = cos(rad); |
|
| 103 |
+ double s = sin(rad); |
|
| 104 |
+ double rx = mX * c - mY * s; |
|
| 105 |
+ double ry = mY * c + mX * s; |
|
| 106 |
+ return Point(rx, ry); |
|
| 107 |
+} |
|
| 108 |
+ |
| ... | ... |
@@ -30,6 +30,13 @@ public: |
| 30 | 30 |
*/ |
| 31 | 31 |
bool equals(const Point &that, double eqDist) const; |
| 32 | 32 |
|
| 33 |
+ /** |
|
| 34 |
+ * @brief rotate around origin |
|
| 35 |
+ * @param[in] rad angle in radians |
|
| 36 |
+ * @return rotated point |
|
| 37 |
+ */ |
|
| 38 |
+ Point rotate(double rad) const; |
|
| 39 |
+ |
|
| 33 | 40 |
double mX; ///< x coordinate |
| 34 | 41 |
double mY; ///< y coordinate |
| 35 | 42 |
}; |
| ... | ... |
@@ -29,6 +29,7 @@ public: |
| 29 | 29 |
double offset_x; ///< offset to add to X coordinate |
| 30 | 30 |
double offset_y; ///< offset to add to Y coordinate |
| 31 | 31 |
double precision; ///< precision, >= 1.0e-8 , <= 1.0 |
| 32 |
+ double rotation_z; ///< rotation around Z axis in degrees |
|
| 32 | 33 |
double tool_diameter; ///< diameter of cutting tool, >= 0.0 |
| 33 | 34 |
}; |
| 34 | 35 |
|
| 35 | 36 |