Stefan Schuermans commited on 2013-01-26 18:55:56
Showing 7 changed files, with 53 additions and 6 deletions.
... | ... |
@@ -5,6 +5,7 @@ |
5 | 5 |
|
6 | 6 |
#include <fstream> |
7 | 7 |
#include <iostream> |
8 |
+#include <math.h> |
|
8 | 9 |
#include <sstream> |
9 | 10 |
#include <string> |
10 | 11 |
|
... | ... |
@@ -220,6 +221,30 @@ bool CmdParser::procCmd_set_move_z(std::istream &strm) |
220 | 221 |
return true; |
221 | 222 |
} |
222 | 223 |
|
224 |
+/** |
|
225 |
+ * @brief process set_precision command |
|
226 |
+ * @param[in] strm stream to read command arguments from |
|
227 |
+ * @return if processing command was successful |
|
228 |
+ */ |
|
229 |
+bool CmdParser::procCmd_set_precision(std::istream &strm) |
|
230 |
+{ |
|
231 |
+ // get arguments and check them |
|
232 |
+ double precision; |
|
233 |
+ strm >> precision; |
|
234 |
+ if (strm.fail()) { |
|
235 |
+ std::cerr << "missing precision" << std::endl; |
|
236 |
+ return false; |
|
237 |
+ } |
|
238 |
+ if (precision < 1.0e-8 || precision > 1.0) { |
|
239 |
+ std::cerr << "invalid precision (" << precision << ")" << std::endl; |
|
240 |
+ return false; |
|
241 |
+ } |
|
242 |
+ |
|
243 |
+ // update settings |
|
244 |
+ mSettings.precision = precision; |
|
245 |
+ return true; |
|
246 |
+} |
|
247 |
+ |
|
223 | 248 |
/** |
224 | 249 |
* @brief process set_tool_diameter command |
225 | 250 |
* @param[in] strm stream to read command arguments from |
... | ... |
@@ -262,8 +287,11 @@ bool CmdParser::procCmd_write_ngc(std::istream &strm) |
262 | 287 |
// re-base NGC file name |
263 | 288 |
fileName = filename_rebase(fileName, mBaseDir); |
264 | 289 |
|
290 |
+ // calculate number of digits after decimal point |
|
291 |
+ unsigned int digits = (unsigned int)ceil(-log10(mSettings.precision)); |
|
292 |
+ |
|
265 | 293 |
// write NGC file |
266 |
- if (!mGCode.toFile(fileName)) { |
|
294 |
+ if (!mGCode.toFile(fileName, digits)) { |
|
267 | 295 |
std::cerr << "could not write NGC file \"" << fileName << "\"" |
268 | 296 |
<< std::endl; |
269 | 297 |
return false; |
... | ... |
@@ -306,6 +334,8 @@ bool CmdParser::procLine(const std::string &strLine) |
306 | 334 |
return procCmd_set_feed_mill(strm); |
307 | 335 |
else if (cmd == "set_move_z") |
308 | 336 |
return procCmd_set_move_z(strm); |
337 |
+ else if (cmd == "set_precision") |
|
338 |
+ return procCmd_set_precision(strm); |
|
309 | 339 |
else if (cmd == "set_tool_diameter") |
310 | 340 |
return procCmd_set_tool_diameter(strm); |
311 | 341 |
else if (cmd == "write_ngc") |
... | ... |
@@ -79,6 +79,13 @@ public: |
79 | 79 |
*/ |
80 | 80 |
bool procCmd_set_move_z(std::istream &strm); |
81 | 81 |
|
82 |
+ /** |
|
83 |
+ * @brief process set_precision command |
|
84 |
+ * @param[in] strm stream to read command arguments from |
|
85 |
+ * @return if processing command was successful |
|
86 |
+ */ |
|
87 |
+ bool procCmd_set_precision(std::istream &strm); |
|
88 |
+ |
|
82 | 89 |
/** |
83 | 90 |
* @brief process set_tool_diameter command |
84 | 91 |
* @param[in] strm stream to read command arguments from |
... | ... |
@@ -100,9 +100,13 @@ void GCode::appendCustom(const std::string &cmd) |
100 | 100 |
/** |
101 | 101 |
* @brief output G-code to stream |
102 | 102 |
* @param[in] strm stream to write G-code to |
103 |
+ * @param[in] digits number of digits to output after decimal point |
|
103 | 104 |
*/ |
104 |
-void GCode::toStrm(std::ostream &strm) const |
|
105 |
+void GCode::toStrm(std::ostream &strm, unsigned int digits) const |
|
105 | 106 |
{ |
107 |
+ strm.precision(digits); |
|
108 |
+ strm << std::fixed; |
|
109 |
+ |
|
106 | 110 |
GCmds::const_iterator gcmd; |
107 | 111 |
for (gcmd = mGCmds.begin(); gcmd != mGCmds.end(); ++gcmd) |
108 | 112 |
(*gcmd)->toStrm(strm); |
... | ... |
@@ -111,9 +115,10 @@ void GCode::toStrm(std::ostream &strm) const |
111 | 115 |
/** |
112 | 116 |
* @brief output G-code to file |
113 | 117 |
* @param[in] strFileName name of file to write G-code to |
118 |
+ * @param[in] digits number of digits to output after decimal point |
|
114 | 119 |
* @return if writing G-code was successful |
115 | 120 |
*/ |
116 |
-bool GCode::toFile(const std::string &strFileName) const |
|
121 |
+bool GCode::toFile(const std::string &strFileName, unsigned int digits) const |
|
117 | 122 |
{ |
118 | 123 |
std::ofstream ofstrm(strFileName.c_str(), std::ios::out); |
119 | 124 |
if (!ofstrm.is_open()) { |
... | ... |
@@ -122,7 +127,7 @@ bool GCode::toFile(const std::string &strFileName) const |
122 | 127 |
return false; |
123 | 128 |
} |
124 | 129 |
|
125 |
- toStrm(ofstrm); |
|
130 |
+ toStrm(ofstrm, digits); |
|
126 | 131 |
return true; |
127 | 132 |
} |
128 | 133 |
|
... | ... |
@@ -72,15 +72,17 @@ public: |
72 | 72 |
/** |
73 | 73 |
* @brief output G-code to stream |
74 | 74 |
* @param[in] strm stream to write G-code to |
75 |
+ * @param[in] digits number of digits to output after decimal point |
|
75 | 76 |
*/ |
76 |
- void toStrm(std::ostream &strm) const; |
|
77 |
+ void toStrm(std::ostream &strm, unsigned int digits) const; |
|
77 | 78 |
|
78 | 79 |
/** |
79 | 80 |
* @brief output G-code to file |
80 | 81 |
* @param[in] strFileName name of file to write G-code to |
82 |
+ * @param[in] digits number of digits to output after decimal point |
|
81 | 83 |
* @return if writing G-code was successful |
82 | 84 |
*/ |
83 |
- bool toFile(const std::string &strFileName) const; |
|
85 |
+ bool toFile(const std::string &strFileName, unsigned int digits) const; |
|
84 | 86 |
|
85 | 87 |
/// G-code commands |
86 | 88 |
GCmds mGCmds; |
... | ... |
@@ -18,6 +18,7 @@ public: |
18 | 18 |
double feed_drill; ///< feed rate for drilling |
19 | 19 |
double feed_mill; ///< feed rate for milling |
20 | 20 |
double move_z; ///< z coordinate for moving |
21 |
+ double precision; ///< precision, >= 1.0e-8 , <= 1.0 |
|
21 | 22 |
double tool_diameter; ///< diameter of cutting tool, >= 0.0 |
22 | 23 |
}; |
23 | 24 |
|
24 | 25 |