@@ -51,9 +51,7 @@ void SkirtBrimAppender::process(PrintPlan* print_plan)
51
51
const std::optional<ExtruderNumber> skirt_brim_extruder_nr = skirt_brim_extruder_nr_setting >= 0 ? std::make_optional (skirt_brim_extruder_nr_setting) : std::nullopt;
52
52
53
53
// Get the first extruder plan for each extruder
54
- std::vector<ConstExtruderPlanPtr> first_extruder_plans;
55
- ExtrudersSet used_extruders;
56
- std::tie (first_extruder_plans, used_extruders) = generateUsedExtruders (print_plan);
54
+ std::vector<ExtruderNumber> used_extruders = generateUsedExtruders (print_plan);
57
55
58
56
const std::map<ExtruderNumber, ExtruderConfig> extruders_configs = generateExtrudersConfigs (used_extruders, adhesion_type);
59
57
const size_t height = calculateMaxHeight (extruders_configs, adhesion_type);
@@ -66,30 +64,28 @@ void SkirtBrimAppender::process(PrintPlan* print_plan)
66
64
LayerPlanPtr layer_plan = print_plan->findLayerPlan (actual_height);
67
65
if (layer_plan)
68
66
{
69
- generateSkirtBrim (adhesion_type, used_extruders, first_extruder_plans, starting_outlines, allowed_areas_per_extruder, extruders_configs, layer_plan);
67
+ generateSkirtBrim (adhesion_type, used_extruders, starting_outlines, allowed_areas_per_extruder, extruders_configs, layer_plan);
70
68
}
71
69
}
72
70
}
73
71
74
- std::tuple<std:: vector<ConstExtruderPlanPtr>, ExtrudersSet > SkirtBrimAppender::generateUsedExtruders (const PrintPlan* print_plan)
72
+ std::vector<ExtruderNumber > SkirtBrimAppender::generateUsedExtruders (const PrintPlan* print_plan)
75
73
{
76
- std::vector<ConstExtruderPlanPtr> first_extruder_plans;
77
- ExtrudersSet used_extruders;
74
+ std::vector<ExtruderNumber> used_extruders;
78
75
79
76
print_plan->applyOnOperationsByType <ExtruderPlan>(
80
- [&first_extruder_plans, & used_extruders](const ConstExtruderPlanPtr& extruder_plan)
77
+ [&used_extruders](const ConstExtruderPlanPtr& extruder_plan)
81
78
{
82
79
const ExtruderNumber extruder_nr = extruder_plan->getExtruderNr ();
83
- if (! used_extruders. contains (extruder_nr))
80
+ if (! ranges:: contains (used_extruders, extruder_nr))
84
81
{
85
- first_extruder_plans.push_back (extruder_plan);
86
- used_extruders.set (extruder_nr);
82
+ used_extruders.push_back (extruder_nr);
87
83
}
88
84
},
89
85
PrintOperationSequence::SearchOrder::Forward,
90
86
2 );
91
87
92
- return std::make_tuple (first_extruder_plans, used_extruders) ;
88
+ return used_extruders;
93
89
}
94
90
95
91
size_t SkirtBrimAppender::calculateMaxHeight (const std::map<ExtruderNumber, ExtruderConfig>& extruders_configs, const EPlatformAdhesion adhesion_type)
@@ -104,7 +100,7 @@ size_t SkirtBrimAppender::calculateMaxHeight(const std::map<ExtruderNumber, Extr
104
100
return height;
105
101
}
106
102
107
- std::map<ExtruderNumber, SkirtBrimAppender::ExtruderConfig> SkirtBrimAppender::generateExtrudersConfigs (const ExtrudersSet & used_extruders, const EPlatformAdhesion adhesion_type)
103
+ std::map<ExtruderNumber, SkirtBrimAppender::ExtruderConfig> SkirtBrimAppender::generateExtrudersConfigs (std::vector<ExtruderNumber> & used_extruders, const EPlatformAdhesion adhesion_type)
108
104
{
109
105
std::map<ExtruderNumber, ExtruderConfig> extruders_configs;
110
106
@@ -130,10 +126,10 @@ std::map<ExtruderNumber, SkirtBrimAppender::ExtruderConfig> SkirtBrimAppender::g
130
126
131
127
std::map<size_t , Shape> SkirtBrimAppender::generateStartingOutlines (
132
128
const PrintPlan* print_plan,
133
- const std::optional<ExtruderNumber> skirt_brim_extruder_nr ,
129
+ const std::optional<ExtruderNumber> brim_extruder_nr ,
134
130
const size_t height,
135
131
const EPlatformAdhesion adhesion_type,
136
- const ExtrudersSet & used_extruders)
132
+ std::vector<ExtruderNumber> & used_extruders)
137
133
{
138
134
// Calculate the united footprints of all the extrusion features on the first layers
139
135
std::map<ExtruderNumber, std::vector<Shape>> features_footprints;
@@ -143,7 +139,7 @@ std::map<size_t, Shape> SkirtBrimAppender::generateStartingOutlines(
143
139
{
144
140
for (const ConstExtruderPlanPtr &extruder_plan :layer_plan->getOperationsAs <ExtruderPlan>())
145
141
{
146
- const ExtruderNumber target_extruder_nr = adhesion_type == EPlatformAdhesion::SKIRT ? 0 : skirt_brim_extruder_nr .value_or (extruder_plan->getExtruderNr ());
142
+ const ExtruderNumber target_extruder_nr = adhesion_type == EPlatformAdhesion::SKIRT ? 0 : brim_extruder_nr .value_or (extruder_plan->getExtruderNr ());
147
143
std::vector<Shape> &target_footprints = features_footprints[target_extruder_nr];
148
144
149
145
for (const ConstFeatureExtrusionPtr& feature_extrusion : extruder_plan->getOperationsAs <FeatureExtrusion>())
@@ -175,7 +171,7 @@ std::map<size_t, Shape> SkirtBrimAppender::generateStartingOutlines(
175
171
std::map<ExtruderNumber, Shape> SkirtBrimAppender::generateAllowedAreas (
176
172
const std::map<ExtruderNumber, Shape>& starting_outlines,
177
173
const EPlatformAdhesion adhesion_type,
178
- const ExtrudersSet &used_extruders,
174
+ std::vector<ExtruderNumber> &used_extruders,
179
175
const std::optional<ExtruderNumber> skirt_brim_extruder_nr,
180
176
const std::map<ExtruderNumber, ExtruderConfig>& extruders_configs) const
181
177
{
@@ -214,14 +210,13 @@ std::map<ExtruderNumber, Shape> SkirtBrimAppender::generateAllowedAreas(
214
210
std::map<ExtruderNumber, Shape> allowed_areas_per_extruder;
215
211
for (const ExtruderNumber extruder_nr : used_extruders)
216
212
{
217
- const ExtruderConfig& extruder_config = extruders_configs.at (extruder_nr);
218
-
219
213
// Initialize allowed area to full build plate, then remove disallowed areas
220
214
Shape& allowed_areas = allowed_areas_per_extruder[extruder_nr];
221
215
allowed_areas = storage_.getMachineBorder (extruder_nr);
222
216
223
217
if (adhesion_type == EPlatformAdhesion::BRIM)
224
218
{
219
+ const ExtruderConfig& extruder_config = extruders_configs.at (extruder_nr);
225
220
const coord_t hole_brim_distance = extruder_config.brim_inside_margin_ ;
226
221
227
222
for (size_t other_extruder_nr = 0 ; other_extruder_nr < covered_area_by_extruder.size (); ++other_extruder_nr)
@@ -264,20 +259,24 @@ std::map<ExtruderNumber, Shape> SkirtBrimAppender::generateAllowedAreas(
264
259
}
265
260
266
261
// Anyway, don't allow a brim/skirt to grow inside itself, which may happen e.g. with ooze shield+skirt
267
- const Shape starting_outline = starting_outlines.at (extruder_nr);
268
- allowed_areas = allowed_areas.difference (starting_outline.offset (extruder_config.gap_ - 50 , ClipperLib::jtRound));
262
+ const Shape starting_outline = starting_outlines.at (adhesion_type == EPlatformAdhesion::SKIRT ? 0 : extruder_nr);
263
+
264
+ // When using a skirt, the used gap will be the one of the first processed extruder
265
+ const ExtruderNumber gap_extruder_nr = adhesion_type == EPlatformAdhesion::SKIRT ? used_extruders.front () : extruder_nr;
266
+ const coord_t gap = extruders_configs.at (gap_extruder_nr).gap_ ;
267
+ allowed_areas = allowed_areas.difference (starting_outline.offset (gap - 50 , ClipperLib::jtRound));
269
268
}
270
269
271
270
return allowed_areas_per_extruder;
272
271
}
273
272
274
273
std::vector<ContinuousExtruderMoveSequencePtr> SkirtBrimAppender::generateOffset (
275
- const ExtruderNumber extruder_nr,
276
- const coord_t total_offset,
277
- Shape& covered_area,
278
- std::map<ExtruderNumber, Shape>& allowed_areas_per_extruder,
279
- const std::map<ExtruderNumber, ExtruderConfig>& extruders_configs,
280
- const LayerPlanPtr &layer_plan)
274
+ const ExtruderNumber extruder_nr,
275
+ const coord_t total_offset,
276
+ Shape& covered_area,
277
+ std::map<ExtruderNumber, Shape>& allowed_areas_per_extruder,
278
+ const std::map<ExtruderNumber, ExtruderConfig>& extruders_configs,
279
+ const LayerPlanPtr &layer_plan)
281
280
{
282
281
const ExtruderConfig &extruder_config = extruders_configs.at (extruder_nr);
283
282
@@ -331,8 +330,7 @@ std::vector<ContinuousExtruderMoveSequencePtr> SkirtBrimAppender::generateOffset
331
330
332
331
void SkirtBrimAppender::generateSkirtBrim (
333
332
const EPlatformAdhesion adhesion_type,
334
- const ExtrudersSet &used_extruders,
335
- const std::vector<ConstExtruderPlanPtr> first_extruder_plans,
333
+ std::vector<ExtruderNumber>& used_extruders,
336
334
const std::map<ExtruderNumber, Shape>& starting_outlines,
337
335
std::map<ExtruderNumber, Shape> allowed_areas_per_extruder,
338
336
const std::map<ExtruderNumber, ExtruderConfig>& extruders_configs,
@@ -341,62 +339,70 @@ void SkirtBrimAppender::generateSkirtBrim(
341
339
struct ExtruderOffsetData
342
340
{
343
341
ExtruderNumber extruder_nr;
344
- coord_t next_offset;
345
342
FeatureExtrusionPtr extrusion;
343
+ coord_t total_offset{0 };
346
344
coord_t extruded_length{0 };
347
345
bool done{false };
348
346
size_t processed_offsets{0 };
349
347
};
350
348
351
- // Create a map containing the processing data for each extruder to be processed
349
+ // Create a vector containing the processing data for each extruder to be processed,
350
+ // ordered in actual processing order
352
351
std::vector<ExtruderOffsetData> extruder_offset_datas;
353
352
for (const ExtruderNumber extruder_nr : used_extruders)
354
353
{
355
354
const ExtruderConfig &extruder_config = extruders_configs.at (extruder_nr);
356
355
if (extruder_config.skirt_height_ > layer_plan->getLayerIndex ())
357
356
{
358
- const coord_t first_offset = extruder_config.gap_ + (extruder_config.line_width_ / 2 );
359
357
extruder_offset_datas.push_back (ExtruderOffsetData{
360
358
.extruder_nr = extruder_nr,
361
- .next_offset = first_offset,
362
359
.extrusion = std::make_shared<FeatureExtrusion>(PrintFeatureType::SkirtBrim, extruder_config.line_width_ )
363
360
});
364
361
}
365
362
}
366
363
367
364
// Create a cache containing the extruders processing ordering, we are going to need it extensively
368
- const std::map<ExtruderNumber, size_t > extruder_ordering = [&first_extruder_plans ]()
365
+ const std::map<ExtruderNumber, size_t > extruder_ordering = [&used_extruders ]()
369
366
{
370
- size_t ordering = 0 ;
371
367
std::map<ExtruderNumber, size_t > extruder_ordering;
372
- for (const ConstExtruderPlanPtr &extruder_plan : first_extruder_plans)
368
+
369
+ for (const auto & [index , extruder_number] : used_extruders | ranges::views::enumerate)
373
370
{
374
- extruder_ordering[extruder_plan-> getExtruderNr () ] = ordering++ ;
371
+ extruder_ordering[extruder_number ] = index ;
375
372
}
373
+
376
374
return extruder_ordering;
377
375
}();
378
376
379
377
std::map<ExtruderNumber, Shape> covered_areas = starting_outlines;
378
+ bool first_offset = true ;
380
379
381
380
while (!ranges::all_of (extruder_offset_datas, [](const ExtruderOffsetData &data) {return data.done ;}))
382
381
{
383
- auto iterator = ranges::min_element (extruder_offset_datas, [&extruder_ordering](const auto &offset1, const auto & offset2)
382
+ auto iterator = ranges::min_element (extruder_offset_datas, [&extruder_ordering, &adhesion_type ](const auto &offset1, const auto & offset2)
384
383
{
385
- if (offset1.next_offset == offset2.next_offset )
384
+ if (! offset1.done && ! offset2.done )
386
385
{
387
- return extruder_ordering.at (offset1.extruder_nr ) < extruder_ordering.at (offset2.extruder_nr );
386
+ if (adhesion_type == EPlatformAdhesion::SKIRT || offset1.total_offset == offset2.total_offset )
387
+ {
388
+ return extruder_ordering.at (offset1.extruder_nr ) < extruder_ordering.at (offset2.extruder_nr );
389
+ }
390
+ return offset1.total_offset < offset2.total_offset ;
388
391
}
389
- return offset1.next_offset < offset2. next_offset ;
392
+ return ! offset1.done ;
390
393
});
391
394
392
395
ExtruderOffsetData &extruder_offset_data = *iterator;
393
- extruder_offset_data.processed_offsets ++;
394
396
const ExtruderNumber extruder_nr = extruder_offset_data.extruder_nr ;
395
397
const ExtruderConfig &extruder_config = extruders_configs.at (extruder_nr);
398
+ const bool add_gap = (adhesion_type == EPlatformAdhesion::SKIRT) ? first_offset : (extruder_offset_data.processed_offsets == 0 );
399
+ const coord_t offset = (extruder_config.line_width_ / 2 ) + (add_gap ? extruder_config.gap_ : 0 );
400
+ extruder_offset_data.processed_offsets ++;
401
+ extruder_offset_data.total_offset += offset;
396
402
const std::vector<ContinuousExtruderMoveSequencePtr> offset_extrusions = generateOffset (
397
403
extruder_nr,
398
- extruder_offset_data. next_offset ,
399
- covered_areas.at (extruder_nr),
404
+ offset ,
405
+ covered_areas.at (adhesion_type == EPlatformAdhesion::SKIRT ? 0 : extruder_nr),
400
406
allowed_areas_per_extruder,
401
407
extruders_configs,
402
408
layer_plan);
@@ -407,20 +413,31 @@ void SkirtBrimAppender::generateSkirtBrim(
407
413
extruder_offset_data.extruded_length += offset_extrusion->calculateLength ();
408
414
}
409
415
410
- extruder_offset_data.next_offset = extruder_config.line_width_ / 2 ;
411
-
412
416
if (offset_extrusions.empty () ||
413
417
layer_plan->getLayerIndex () > 0 ||
414
418
(extruder_offset_data.processed_offsets >= extruder_config.line_count_ && extruder_offset_data.extruded_length >= extruder_config.skirt_brim_minimal_length_ ))
415
419
{
416
420
extruder_offset_data.done = true ;
417
421
}
422
+
423
+ first_offset = false ;
418
424
}
419
425
420
- for (auto & extrusion : extruder_offset_datas)
426
+ // Now add the generated feature to the proper extruder plans
427
+ for (auto & extruder_offset_data : extruder_offset_datas)
421
428
{
422
- const auto &feature = extrusion.extrusion ;
423
- layer_plan->getOperationsAs <ExtruderPlan>().front ()->appendFeatureExtrusion (feature);
429
+ const auto &feature_extrusion = extruder_offset_data.extrusion ;
430
+ const ExtruderNumber extruder_nr = extruder_offset_data.extruder_nr ;
431
+ ExtruderPlanPtr extruder_plan = layer_plan->findFirstExtruderPlan (extruder_nr);
432
+ if (!extruder_plan)
433
+ {
434
+ // FIXME: Find a way to easily create an extruder plan (maybe it should not contain the travel speeds)
435
+ const SpeedDerivatives& travel_speed = layer_plan->getConfigsStorage ()->travel_config_per_extruder [extruder_nr].speed_derivatives ;
436
+ extruder_plan = std::make_shared<ExtruderPlan>(extruder_nr, travel_speed);
437
+ }
438
+
439
+ extruder_plan->appendFeatureExtrusion (feature_extrusion);
440
+ layer_plan->appendExtruderPlan (extruder_plan);
424
441
}
425
442
}
426
443
0 commit comments