Stefan Schuermans commited on 2013-07-06 20:31:45
Showing 8 changed files, with 151 additions and 16 deletions.
... | ... |
@@ -483,11 +483,12 @@ write_ngc logo.ngc]]></programlisting> |
483 | 483 |
|
484 | 484 |
<para> |
485 | 485 |
|
486 |
- The coordinates from the drawing are rotated around the origin and the |
|
487 |
- offsets in X and Y direction are added afterwards. The resulting |
|
488 |
- coordinate is then used for G-code generation. This allows to adapt |
|
489 |
- the coordinate system between the drawing and the CNC mill. The offset |
|
490 |
- can also be used to cut a workpiece drawn once at multiple positions. |
|
486 |
+ The coordinates from the drawing are scaled using different factors |
|
487 |
+ for X and Y directions, rotated around the origin and the offsets in |
|
488 |
+ X and Y direction are added afterwards. The resulting coordinate is |
|
489 |
+ then used for G-code generation. This allows to adapt the coordinate |
|
490 |
+ system between the drawing and the CNC mill. The offset can also be |
|
491 |
+ used to cut a workpiece drawn once at multiple positions. |
|
491 | 492 |
|
492 | 493 |
</para> |
493 | 494 |
|
... | ... |
@@ -507,11 +508,12 @@ write_ngc logo.ngc]]></programlisting> |
507 | 508 |
|
508 | 509 |
<para> |
509 | 510 |
|
510 |
- The coordinates from the drawing are rotated around the origin and |
|
511 |
- the offsets in X and Y direction are added afterwards. The resulting |
|
512 |
- coordinate is then used for G-code generation. This allows to adapt |
|
513 |
- the coordinate system between the drawing and the CNC mill. The offset |
|
514 |
- can also be used to cut a workpiece drawn once at multiple positions. |
|
511 |
+ The coordinates from the drawing are scaled using different factors |
|
512 |
+ for X and Y directions, rotated around the origin and the offsets in |
|
513 |
+ X and Y direction are added afterwards. The resulting coordinate is |
|
514 |
+ then used for G-code generation. This allows to adapt the coordinate |
|
515 |
+ system between the drawing and the CNC mill. The offset can also be |
|
516 |
+ used to cut a workpiece drawn once at multiple positions. |
|
515 | 517 |
|
516 | 518 |
</para> |
517 | 519 |
|
... | ... |
@@ -547,10 +549,61 @@ write_ngc logo.ngc]]></programlisting> |
547 | 549 |
|
548 | 550 |
<para> |
549 | 551 |
|
550 |
- The coordinates from the drawing are rotated around the origin and |
|
551 |
- the offsets in X and Y direction are added afterwards. The resulting |
|
552 |
- coordinate is then used for G-code generation. This allows to adapt |
|
553 |
- the coordinate system between the drawing and the CNC mill. |
|
552 |
+ The coordinates from the drawing are scaled using different factors |
|
553 |
+ for X and Y directions, rotated around the origin and the offsets in |
|
554 |
+ X and Y direction are added afterwards. The resulting coordinate is |
|
555 |
+ then used for G-code generation. This allows to adapt the coordinate |
|
556 |
+ system between the drawing and the CNC mill. |
|
557 |
+ |
|
558 |
+ </para> |
|
559 |
+ |
|
560 |
+ </sect2> |
|
561 |
+ |
|
562 |
+ <sect2> |
|
563 |
+ |
|
564 |
+ <title>set_scale_x</title> |
|
565 |
+ |
|
566 |
+ <para> |
|
567 |
+ |
|
568 |
+ The command <code>set_scale_x <x></code> sets a scaling factor |
|
569 |
+ for the X direction. All floating point values are valid, the default |
|
570 |
+ is 1, i.e. no scaling. |
|
571 |
+ |
|
572 |
+ </para> |
|
573 |
+ |
|
574 |
+ <para> |
|
575 |
+ |
|
576 |
+ The coordinates from the drawing are scaled using different factors |
|
577 |
+ for X and Y directions, rotated around the origin and the offsets in |
|
578 |
+ X and Y direction are added afterwards. The resulting coordinate is |
|
579 |
+ then used for G-code generation. This allows to adapt the coordinate |
|
580 |
+ system between the drawing and the CNC mill. The scaling can also be |
|
581 |
+ used to mirror a drawing by setting it to -1. |
|
582 |
+ |
|
583 |
+ </para> |
|
584 |
+ |
|
585 |
+ </sect2> |
|
586 |
+ |
|
587 |
+ <sect2> |
|
588 |
+ |
|
589 |
+ <title>set_scale_y</title> |
|
590 |
+ |
|
591 |
+ <para> |
|
592 |
+ |
|
593 |
+ The command <code>set_scale_y <x></code> sets a scaling factor |
|
594 |
+ for the Y direction. All floating point values are valid, the default |
|
595 |
+ is 1, i.e. no scaling. |
|
596 |
+ |
|
597 |
+ </para> |
|
598 |
+ |
|
599 |
+ <para> |
|
600 |
+ |
|
601 |
+ The coordinates from the drawing are scaled using different factors |
|
602 |
+ for X and Y directions, rotated around the origin and the offsets in |
|
603 |
+ X and Y direction are added afterwards. The resulting coordinate is |
|
604 |
+ then used for G-code generation. This allows to adapt the coordinate |
|
605 |
+ system between the drawing and the CNC mill. The scaling can also be |
|
606 |
+ used to mirror a drawing by setting it to -1. |
|
554 | 607 |
|
555 | 608 |
</para> |
556 | 609 |
|
... | ... |
@@ -523,6 +523,46 @@ bool CmdParser::procCmd_set_rotation_z(std::istream &strm) |
523 | 523 |
return true; |
524 | 524 |
} |
525 | 525 |
|
526 |
+/** |
|
527 |
+ * @brief process set_scale_x command |
|
528 |
+ * @param[in] strm stream to read command arguments from |
|
529 |
+ * @return if processing command was successful |
|
530 |
+ */ |
|
531 |
+bool CmdParser::procCmd_set_scale_x(std::istream &strm) |
|
532 |
+{ |
|
533 |
+ // get arguments |
|
534 |
+ double x; |
|
535 |
+ strm >> x; |
|
536 |
+ if (strm.fail()) { |
|
537 |
+ std::cerr << "missing x scale factor" << std::endl; |
|
538 |
+ return false; |
|
539 |
+ } |
|
540 |
+ |
|
541 |
+ // update settings |
|
542 |
+ mSettings.scale_x = x; |
|
543 |
+ return true; |
|
544 |
+} |
|
545 |
+ |
|
546 |
+/** |
|
547 |
+ * @brief process set_scale_y command |
|
548 |
+ * @param[in] strm stream to read command arguments from |
|
549 |
+ * @return if processing command was successful |
|
550 |
+ */ |
|
551 |
+bool CmdParser::procCmd_set_scale_y(std::istream &strm) |
|
552 |
+{ |
|
553 |
+ // get arguments |
|
554 |
+ double y; |
|
555 |
+ strm >> y; |
|
556 |
+ if (strm.fail()) { |
|
557 |
+ std::cerr << "missing y scale factor" << std::endl; |
|
558 |
+ return false; |
|
559 |
+ } |
|
560 |
+ |
|
561 |
+ // update settings |
|
562 |
+ mSettings.scale_y = y; |
|
563 |
+ return true; |
|
564 |
+} |
|
565 |
+ |
|
526 | 566 |
/** |
527 | 567 |
* @brief process set_tool_diameter command |
528 | 568 |
* @param[in] strm stream to read command arguments from |
... | ... |
@@ -633,6 +673,10 @@ bool CmdParser::procLine(const std::string &strLine) |
633 | 673 |
return procCmd_set_precision(strm); |
634 | 674 |
else if (cmd == "set_rotation_z") |
635 | 675 |
return procCmd_set_rotation_z(strm); |
676 |
+ else if (cmd == "set_scale_x") |
|
677 |
+ return procCmd_set_scale_x(strm); |
|
678 |
+ else if (cmd == "set_scale_y") |
|
679 |
+ return procCmd_set_scale_y(strm); |
|
636 | 680 |
else if (cmd == "set_tool_diameter") |
637 | 681 |
return procCmd_set_tool_diameter(strm); |
638 | 682 |
else if (cmd == "write_ngc") |
... | ... |
@@ -172,6 +172,20 @@ public: |
172 | 172 |
*/ |
173 | 173 |
bool procCmd_set_rotation_z(std::istream &strm); |
174 | 174 |
|
175 |
+ /** |
|
176 |
+ * @brief process set_scale_x command |
|
177 |
+ * @param[in] strm stream to read command arguments from |
|
178 |
+ * @return if processing command was successful |
|
179 |
+ */ |
|
180 |
+ bool procCmd_set_scale_x(std::istream &strm); |
|
181 |
+ |
|
182 |
+ /** |
|
183 |
+ * @brief process set_scale_y command |
|
184 |
+ * @param[in] strm stream to read command arguments from |
|
185 |
+ * @return if processing command was successful |
|
186 |
+ */ |
|
187 |
+ bool procCmd_set_scale_y(std::istream &strm); |
|
188 |
+ |
|
175 | 189 |
/** |
176 | 190 |
* @brief process set_tool_diameter command |
177 | 191 |
* @param[in] strm stream to read command arguments from |
... | ... |
@@ -94,6 +94,7 @@ void Path::removeEqPoints(double eqDist) |
94 | 94 |
*/ |
95 | 95 |
void Path::toGCode(const Settings &settings, double z, GCode &gcode) const |
96 | 96 |
{ |
97 |
+ double sx = settings.scale_x, sy = settings.scale_y; |
|
97 | 98 |
double rot = settings.rotation_z * M_PI / 180.0; |
98 | 99 |
Point offset(settings.offset_x, settings.offset_y); |
99 | 100 |
|
... | ... |
@@ -105,7 +106,7 @@ void Path::toGCode(const Settings &settings, double z, GCode &gcode) const |
105 | 106 |
gcode.appendUp(settings.move_z); |
106 | 107 |
|
107 | 108 |
// move to start |
108 |
- gcode.appendFast(mPoints.front().rotate(rot) + offset); |
|
109 |
+ gcode.appendFast(mPoints.front().scale_xy(sx, sy).rotate(rot) + offset); |
|
109 | 110 |
|
110 | 111 |
// dwell |
111 | 112 |
if (settings.dwell_time > 0.0) |
... | ... |
@@ -119,7 +120,7 @@ void Path::toGCode(const Settings &settings, double z, GCode &gcode) const |
119 | 120 |
gcode.appendFeed(settings.feed_mill); |
120 | 121 |
Points::const_iterator pt = mPoints.begin(); |
121 | 122 |
for (++pt; pt != mPoints.end(); ++pt) |
122 |
- gcode.appendLinear(pt->rotate(rot) + offset); |
|
123 |
+ gcode.appendLinear(pt->scale_xy(sx, sy).rotate(rot) + offset); |
|
123 | 124 |
|
124 | 125 |
// move up |
125 | 126 |
gcode.appendUp(settings.move_z); |
... | ... |
@@ -106,3 +106,14 @@ Point Point::rotate(double rad) const |
106 | 106 |
return Point(rx, ry); |
107 | 107 |
} |
108 | 108 |
|
109 |
+/** |
|
110 |
+ * @brief scale differently in X and Y direction |
|
111 |
+ * @param[in] fx scale factor in X direction |
|
112 |
+ * @param[in] fy scale factor in Y direction |
|
113 |
+ * @return scaled point |
|
114 |
+ */ |
|
115 |
+Point Point::scale_xy(double fx, double fy) const |
|
116 |
+{ |
|
117 |
+ return Point(fx * mX, fy * mY); |
|
118 |
+} |
|
119 |
+ |
... | ... |
@@ -37,6 +37,14 @@ public: |
37 | 37 |
*/ |
38 | 38 |
Point rotate(double rad) const; |
39 | 39 |
|
40 |
+ /** |
|
41 |
+ * @brief scale differently in X and Y direction |
|
42 |
+ * @param[in] fx scale factor in X direction |
|
43 |
+ * @param[in] fy scale factor in Y direction |
|
44 |
+ * @return scaled point |
|
45 |
+ */ |
|
46 |
+ Point scale_xy(double fx, double fy) const; |
|
47 |
+ |
|
40 | 48 |
double mX; ///< x coordinate |
41 | 49 |
double mY; ///< y coordinate |
42 | 50 |
}; |
... | ... |
@@ -30,6 +30,8 @@ public: |
30 | 30 |
double offset_y; ///< offset to add to Y coordinate |
31 | 31 |
double precision; ///< precision, >= 1.0e-8 , <= 1.0 |
32 | 32 |
double rotation_z; ///< rotation around Z axis in degrees |
33 |
+ double scale_x; ///< scale to apply to X coordinate |
|
34 |
+ double scale_y; ///< scale to apply to Y coordinate |
|
33 | 35 |
double tool_diameter; ///< diameter of cutting tool, >= 0.0 |
34 | 36 |
}; |
35 | 37 |
|
36 | 38 |