Stefan Schuermans commited on 2013-01-26 23:15:34
Showing 9 changed files, with 192 additions and 3 deletions.
... | ... |
@@ -62,3 +62,14 @@ bool Drawing::loadDxf(const std::string &strFileName) |
62 | 62 |
return addDxf(strFileName); |
63 | 63 |
} |
64 | 64 |
|
65 |
+/** |
|
66 |
+ * @brief improve paths in layers |
|
67 |
+ * @param[in] eqDist maximum distance of tho points to be considered equal |
|
68 |
+ */ |
|
69 |
+void Drawing::improvePaths(double eqDist) |
|
70 |
+{ |
|
71 |
+ Layers::iterator layer; |
|
72 |
+ for (layer = mLayers.begin(); layer != mLayers.end(); ++layer) |
|
73 |
+ layer->second.improvePaths(eqDist); |
|
74 |
+} |
|
75 |
+ |
... | ... |
@@ -36,6 +36,12 @@ public: |
36 | 36 |
*/ |
37 | 37 |
bool loadDxf(const std::string &strFileName); |
38 | 38 |
|
39 |
+ /** |
|
40 |
+ * @brief improve paths in layers |
|
41 |
+ * @param[in] eqDist maximum distance of tho points to be considered equal |
|
42 |
+ */ |
|
43 |
+ void improvePaths(double eqDist); |
|
44 |
+ |
|
39 | 45 |
Layers mLayers; ///< layers in drawing |
40 | 46 |
}; |
41 | 47 |
|
... | ... |
@@ -3,7 +3,7 @@ |
3 | 3 |
* Copyleft: CC-BY-SA http://creativecommons.org/licenses/by-sa/3.0/ |
4 | 4 |
*/ |
5 | 5 |
|
6 |
-#include <vector> |
|
6 |
+#include <list> |
|
7 | 7 |
|
8 | 8 |
#include "gcode.h" |
9 | 9 |
#include "layer.h" |
... | ... |
@@ -20,6 +20,65 @@ Path & Layer::addPath() |
20 | 20 |
return mPaths.back(); |
21 | 21 |
} |
22 | 22 |
|
23 |
+/** |
|
24 |
+ * @brief improve paths |
|
25 |
+ * @param[in] eqDist maximum distance of two points to be considered equal |
|
26 |
+ */ |
|
27 |
+void Layer::improvePaths(double eqDist) |
|
28 |
+{ |
|
29 |
+ Paths::iterator path, other; |
|
30 |
+ bool change; |
|
31 |
+ |
|
32 |
+ // join paths with equal begin/end points |
|
33 |
+ do { |
|
34 |
+ change = false; |
|
35 |
+ for (path = mPaths.begin(); path != mPaths.end(); ++path) { |
|
36 |
+ other = path; |
|
37 |
+ ++other; |
|
38 |
+ while (other != mPaths.end()) { |
|
39 |
+ if (other->mPoints.front().equals(path->mPoints.back(), |
|
40 |
+ eqDist)) { |
|
41 |
+ path->appendPath(*other); |
|
42 |
+ other = mPaths.erase(other); |
|
43 |
+ change = true; |
|
44 |
+ } |
|
45 |
+ else if (other->mPoints.back().equals(path->mPoints.back(), |
|
46 |
+ eqDist)) { |
|
47 |
+ path->appendReversedPath(*other); |
|
48 |
+ other = mPaths.erase(other); |
|
49 |
+ change = true; |
|
50 |
+ } |
|
51 |
+ else if (other->mPoints.back().equals(path->mPoints.front(), |
|
52 |
+ eqDist)) { |
|
53 |
+ path->prependPath(*other); |
|
54 |
+ other = mPaths.erase(other); |
|
55 |
+ change = true; |
|
56 |
+ } |
|
57 |
+ else if (other->mPoints.front().equals(path->mPoints.front(), |
|
58 |
+ eqDist)) { |
|
59 |
+ path->prependReversedPath(*other); |
|
60 |
+ other = mPaths.erase(other); |
|
61 |
+ change = true; |
|
62 |
+ } |
|
63 |
+ else |
|
64 |
+ ++other; |
|
65 |
+ } |
|
66 |
+ } |
|
67 |
+ } while (change); |
|
68 |
+ |
|
69 |
+ // remove nearby points in paths |
|
70 |
+ for (path = mPaths.begin(); path != mPaths.end(); ++path) |
|
71 |
+ path->removeEqPoints(eqDist); |
|
72 |
+ |
|
73 |
+ // remove empty paths |
|
74 |
+ path = mPaths.begin(); |
|
75 |
+ while (path != mPaths.end()) |
|
76 |
+ if (path->mPoints.empty()) |
|
77 |
+ path = mPaths.erase(path); |
|
78 |
+ else |
|
79 |
+ ++path; |
|
80 |
+} |
|
81 |
+ |
|
23 | 82 |
/** |
24 | 83 |
* @brief convert layer to G-code |
25 | 84 |
* @param[in] settings G-code creation settings |
... | ... |
@@ -6,7 +6,7 @@ |
6 | 6 |
#ifndef LAYER_H |
7 | 7 |
#define LAYER_H |
8 | 8 |
|
9 |
-#include <vector> |
|
9 |
+#include <list> |
|
10 | 10 |
|
11 | 11 |
#include "gcode.h" |
12 | 12 |
#include "path.h" |
... | ... |
@@ -15,7 +15,7 @@ |
15 | 15 |
/// layer of drawing |
16 | 16 |
class Layer { |
17 | 17 |
public: |
18 |
- typedef std::vector<Path> Paths; ///< type for paths in layer |
|
18 |
+ typedef std::list<Path> Paths; ///< type for paths in layer |
|
19 | 19 |
|
20 | 20 |
/** |
21 | 21 |
* @brief add a new empty path to the layer |
... | ... |
@@ -23,6 +23,12 @@ public: |
23 | 23 |
*/ |
24 | 24 |
Path & addPath(); |
25 | 25 |
|
26 |
+ /** |
|
27 |
+ * @brief improve paths |
|
28 |
+ * @param[in] eqDist maximum distance of two points to be considered equal |
|
29 |
+ */ |
|
30 |
+ void improvePaths(double eqDist); |
|
31 |
+ |
|
26 | 32 |
/** |
27 | 33 |
* @brief convert layer to G-code |
28 | 34 |
* @param[in] settings G-code creation settings |
... | ... |
@@ -29,6 +29,62 @@ void Path::addPoint(double x, double y) |
29 | 29 |
addPoint(Point(x, y)); |
30 | 30 |
} |
31 | 31 |
|
32 |
+/** |
|
33 |
+ * @brief prepend other path to this one |
|
34 |
+ * @param[in] other other path to prepend |
|
35 |
+ */ |
|
36 |
+void Path::prependPath(const Path &other) |
|
37 |
+{ |
|
38 |
+ mPoints.insert(mPoints.begin(), |
|
39 |
+ other.mPoints.begin(), other.mPoints.end()); |
|
40 |
+} |
|
41 |
+ |
|
42 |
+/** |
|
43 |
+ * @brief prepend other path in reverse to this one |
|
44 |
+ * @param[in] other other path to prepend |
|
45 |
+ */ |
|
46 |
+void Path::prependReversedPath(const Path &other) |
|
47 |
+{ |
|
48 |
+ mPoints.insert(mPoints.begin(), |
|
49 |
+ other.mPoints.rbegin(), other.mPoints.rend()); |
|
50 |
+} |
|
51 |
+ |
|
52 |
+/** |
|
53 |
+ * @brief append other path to this one |
|
54 |
+ * @param[in] other other path to appepend |
|
55 |
+ */ |
|
56 |
+void Path::appendPath(const Path &other) |
|
57 |
+{ |
|
58 |
+ mPoints.insert(mPoints.end(), |
|
59 |
+ other.mPoints.begin(), other.mPoints.end()); |
|
60 |
+} |
|
61 |
+ |
|
62 |
+/** |
|
63 |
+ * @brief append other path in reverse to this one |
|
64 |
+ * @param[in] other other path to appepend |
|
65 |
+ */ |
|
66 |
+void Path::appendReversedPath(const Path &other) |
|
67 |
+{ |
|
68 |
+ mPoints.insert(mPoints.end(), |
|
69 |
+ other.mPoints.rbegin(), other.mPoints.rend()); |
|
70 |
+} |
|
71 |
+ |
|
72 |
+/** |
|
73 |
+ * @brief remove points too close to each other |
|
74 |
+ * @param[in] eqDist maximum distance of two points to be considered equal |
|
75 |
+ */ |
|
76 |
+void Path::removeEqPoints(double eqDist) |
|
77 |
+{ |
|
78 |
+ Points::iterator pt = mPoints.begin(); |
|
79 |
+ while (pt != mPoints.end()) { |
|
80 |
+ Points::iterator next = pt + 1; |
|
81 |
+ if (next != mPoints.end() && pt->equals(*next, eqDist)) |
|
82 |
+ mPoints.erase(next); |
|
83 |
+ else |
|
84 |
+ pt++; |
|
85 |
+ } |
|
86 |
+} |
|
87 |
+ |
|
32 | 88 |
/** |
33 | 89 |
* @brief convert path to G-code |
34 | 90 |
* @param[in] settings G-code creation settings |
... | ... |
@@ -30,6 +30,36 @@ public: |
30 | 30 |
*/ |
31 | 31 |
void addPoint(double x, double y); |
32 | 32 |
|
33 |
+ /** |
|
34 |
+ * @brief prepend other path to this one |
|
35 |
+ * @param[in] other other path to prepend |
|
36 |
+ */ |
|
37 |
+ void prependPath(const Path &other); |
|
38 |
+ |
|
39 |
+ /** |
|
40 |
+ * @brief prepend other path in reverse to this one |
|
41 |
+ * @param[in] other other path to prepend |
|
42 |
+ */ |
|
43 |
+ void prependReversedPath(const Path &other); |
|
44 |
+ |
|
45 |
+ /** |
|
46 |
+ * @brief append other path to this one |
|
47 |
+ * @param[in] other other path to appepend |
|
48 |
+ */ |
|
49 |
+ void appendPath(const Path &other); |
|
50 |
+ |
|
51 |
+ /** |
|
52 |
+ * @brief append other path in reverse to this one |
|
53 |
+ * @param[in] other other path to appepend |
|
54 |
+ */ |
|
55 |
+ void appendReversedPath(const Path &other); |
|
56 |
+ |
|
57 |
+ /** |
|
58 |
+ * @brief remove points too close to each other |
|
59 |
+ * @param[in] eqDist maximum distance of two points to be considered equal |
|
60 |
+ */ |
|
61 |
+ void removeEqPoints(double eqDist); |
|
62 |
+ |
|
33 | 63 |
/** |
34 | 64 |
* @brief convert path to G-code |
35 | 65 |
* @param[in] settings G-code creation settings |
... | ... |
@@ -82,3 +82,13 @@ Point &Point::operator/=(double factor) |
82 | 82 |
return *this; |
83 | 83 |
} |
84 | 84 |
|
85 |
+/** |
|
86 |
+ * @brief check if point is equal to another one |
|
87 |
+ * @param[in] that other point |
|
88 |
+ * @param[in] eqDist maximum distance of two points to be considered equal |
|
89 |
+ */ |
|
90 |
+bool Point::equals(const Point &that, double eqDist) const |
|
91 |
+{ |
|
92 |
+ return (*this - that).abs_sq() <= eqDist * eqDist; |
|
93 |
+} |
|
94 |
+ |
... | ... |
@@ -22,6 +22,14 @@ public: |
22 | 22 |
Point &operator-=(const Point &that); |
23 | 23 |
Point &operator*=(double factor); |
24 | 24 |
Point &operator/=(double factor); |
25 |
+ |
|
26 |
+ /** |
|
27 |
+ * @brief check if point is equal to another one |
|
28 |
+ * @param[in] that other point |
|
29 |
+ * @param[in] eqDist maximum distance of two points to be considered equal |
|
30 |
+ */ |
|
31 |
+ bool equals(const Point &that, double eqDist) const; |
|
32 |
+ |
|
25 | 33 |
double mX; ///< x coordinate |
26 | 34 |
double mY; ///< y coordinate |
27 | 35 |
}; |
28 | 36 |