b44cc2a3153084dc9d78a7b22bf872e8ee15d01e
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>
3)  * Copyleft: CC-BY-SA http://creativecommons.org/licenses/by-sa/3.0/
4)  */
5) 
Stefan Schuermans implement joining and impro...

Stefan Schuermans authored 11 years ago

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

Stefan Schuermans authored 11 years ago

7) 
8) #include "gcode.h"
9) #include "layer.h"
10) #include "path.h"
11) #include "settings.h"
12) 
13) /**
14)  * @brief add a new empty path to the layer
15)  * @return reference to new empty path
16)  */
17) Path & Layer::addPath()
18) {
19)   mPaths.push_back(Path());
20)   return mPaths.back();
21) }
22) 
Stefan Schuermans implement joining and impro...

Stefan Schuermans authored 11 years ago

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)