74{
75
76
77
78
79
80
81
82
83
84
88 }
89
90
91 float total_layer_length = 0;
93 float z = 0.f;
94
95 {
96
98 bool set_z = false;
99 r.parse_buffer(gcode, [&total_layer_length, &
layer_height, &z, &set_z]
100 (GCodeReader &reader, const GCodeReader::GCodeLine &line) {
101 if (line.cmd_is("G1")) {
102 if (line.extruding(reader)) {
103 total_layer_length += line.dist_XY(reader);
104 }
else if (line.has(
Z)) {
106 if (!set_z) {
107 z = line.new_Z(reader);
108 set_z = true;
109 }
110 }
111 }
112 });
113 }
114
115
117
118 std::vector<SpiralVase::SpiralPoint>* current_layer = new std::vector<SpiralVase::SpiralPoint>();
120
122 std::string new_gcode;
123 std::string transition_gcode;
125
126
127
128
130 bool transition_out = last_layer &&
m_config.use_relative_e_distances.value;
131
132 float starting_flowrate = float(
m_config.spiral_starting_flow_ratio.value);
133 float finishing_flowrate = float(
m_config.spiral_finishing_flow_ratio.value);
134 const float min_segment_length = std::max(
float(
EPSILON), 2 *
float(
m_config.resolution.value));
135
138 float len = 0.f;
139 SpiralVase::SpiralPoint last_point = previous_layer != NULL && previous_layer->size() >0? previous_layer->at(previous_layer->size()-1): SpiralVase::SpiralPoint(0,0);
140 m_reader.parse_buffer(gcode, [&new_gcode, &z, total_layer_length,
layer_height, transition_in, &len, ¤t_layer, &previous_layer, &transition_gcode, transition_out, smooth_spiral, &max_xy_dist_for_smoothing, &last_point, starting_flowrate, finishing_flowrate, min_segment_length, xyz_digits, e_digits]
141 (GCodeReader &reader, GCodeReader::GCodeLine line) {
142 if (line.cmd_is("G1")) {
143
144 if (line.retracting(reader) || (line.extruding(reader) && line.dist_XY(reader) < min_segment_length)) return;
145 if (line.has_z() && !(line.has_x() || line.has_y())) {
146
147
148 line.set(
Z, z, xyz_digits);
149 new_gcode += line.raw() + '\n';
150 return;
151 } else {
152 float dist_XY = line.dist_XY(reader);
153 if (line.has_x() || line.has_y()) {
154 if (dist_XY > 0 && line.extruding(reader)) {
155 len += dist_XY;
156 float factor = len / total_layer_length;
157 if (transition_in){
158
159 float starting_e_factor = starting_flowrate + (factor * (1.f - starting_flowrate));
160 line.set(
E, line.e() * starting_e_factor, e_digits);
161 } else if (transition_out) {
162
163
164
165
166 GCodeReader::GCodeLine transitionLine(line);
167 float finishing_e_factor = finishing_flowrate + ((1.f -factor) * (1.f - finishing_flowrate));
168 transitionLine.set(
E, line.e() * finishing_e_factor, e_digits);
169 transition_gcode += transitionLine.raw() + '\n';
170 }
171
173 if (smooth_spiral) {
174
175 SpiralVase::SpiralPoint p(line.x(), line.y());
176 current_layer->push_back(p);
177 if (previous_layer != NULL) {
178 bool found = false;
181 if (found &&
dist < max_xy_dist_for_smoothing) {
182
184
185
186
188 if (modified_dist_XY < min_segment_length)
189 line.clear();
190 else {
191 line.set(
X, target.x, xyz_digits);
192 line.set(
Y, target.y, xyz_digits);
193
194 line.set(
E, line.e() * modified_dist_XY / dist_XY, e_digits);
195 last_point = target;
196 }
197 } else {
198 last_point = p;
199 }
200 }
201 }
202 new_gcode += line.raw() + '\n';
203 }
204 return;
205
206
207
208
209
210
211
212 }
213 }
214 }
215 new_gcode += line.raw() + '\n';
216 if(transition_out) {
217 transition_gcode += line.raw() + '\n';
218 }
219 });
220
223
224 return new_gcode + transition_gcode;
225}
#define EPSILON
Definition ColorUtils.cpp:64
float m_max_xy_smoothing
Definition SpiralVase.hpp:44
T dist(const boost::polygon::point_data< T > &p1, const boost::polygon::point_data< T > &p2)
Definition Geometry.cpp:298
SpiralVase::SpiralPoint add(SpiralVase::SpiralPoint a, SpiralVase::SpiralPoint b)
Definition SpiralVase.cpp:26
SpiralVase::SpiralPoint nearest_point_on_lines(SpiralVase::SpiralPoint p, std::vector< SpiralVase::SpiralPoint > *points, bool &found, float &dist)
Definition SpiralVase.cpp:48
SpiralVase::SpiralPoint scale(SpiralVase::SpiralPoint a, float factor)
Definition SpiralVase.cpp:28
float distance(SpiralVase::SpiralPoint a, SpiralVase::SpiralPoint b)
Definition SpiralVase.cpp:19
@ gcode
Definition Time.hpp:14
layer_height((ConfigOptionInt, faded_layers))((ConfigOptionFloat
@ Y
Definition libslic3r.h:142
@ Z
Definition libslic3r.h:143
@ E
Definition libslic3r.h:144
@ X
Definition libslic3r.h:141