@@ -480,7 +480,9 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage)
480
480
double fill_overlap = 0 ; // raft line shouldn't be expanded - there is no boundary polygon printed
481
481
int extra_infill_shift = 0 ;
482
482
Polygons raft_polygons; // should remain empty, since we only have the lines pattern for the raft...
483
-
483
+
484
+ unsigned int current_extruder_nr = extruder_nr;
485
+
484
486
{ // raft base layer
485
487
int layer_nr = initial_raft_layer_nr;
486
488
int layer_height = train->getSettingInMicrons (" raft_base_thickness" );
@@ -514,6 +516,15 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage)
514
516
infill_comp.generate (raft_polygons, raftLines);
515
517
gcode_layer.addLinesByOptimizer (raftLines, &gcode_layer.configs_storage .raft_base_config , SpaceFillType::Lines);
516
518
519
+ // When we use raft, we need to make sure that all used extruders for this print will get primed on the first raft layer,
520
+ // and then switch back to the original extruder.
521
+ std::vector<unsigned int > extruder_order = getUsedExtrudersOnLayerExcludingStartingExtruder (storage, extruder_nr, layer_nr);
522
+ for (unsigned int to_be_primed_extruder_nr : extruder_order)
523
+ {
524
+ setExtruder_addPrime (storage, gcode_layer, layer_nr, to_be_primed_extruder_nr);
525
+ current_extruder_nr = to_be_primed_extruder_nr;
526
+ }
527
+
517
528
layer_plan_buffer.handle (gcode_layer, gcode);
518
529
}
519
530
@@ -531,10 +542,11 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage)
531
542
fan_speed_layer_time_settings.cool_fan_speed_0 = regular_fan_speed; // ignore initial layer fan speed stuff
532
543
}
533
544
534
- LayerPlan& gcode_layer = *new LayerPlan (storage, layer_nr, z, layer_height, extruder_nr , fan_speed_layer_time_settings_per_extruder_raft_interface, combing_mode, comb_offset, train->getSettingBoolean (" travel_avoid_other_parts" ), train->getSettingInMicrons (" travel_avoid_distance" ));
545
+ LayerPlan& gcode_layer = *new LayerPlan (storage, layer_nr, z, layer_height, current_extruder_nr , fan_speed_layer_time_settings_per_extruder_raft_interface, combing_mode, comb_offset, train->getSettingBoolean (" travel_avoid_other_parts" ), train->getSettingInMicrons (" travel_avoid_distance" ));
535
546
gcode_layer.setIsInside (true );
536
547
537
548
gcode_layer.setExtruder (extruder_nr); // reset to extruder number, because we might have primed in the last layer
549
+ current_extruder_nr = extruder_nr;
538
550
539
551
if (CommandSocket::isInstantiated ())
540
552
{
@@ -570,6 +582,10 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage)
570
582
LayerPlan& gcode_layer = *new LayerPlan (storage, layer_nr, z, layer_height, extruder_nr, fan_speed_layer_time_settings_per_extruder_raft_surface, combing_mode, comb_offset, train->getSettingBoolean (" travel_avoid_other_parts" ), train->getSettingInMicrons (" travel_avoid_distance" ));
571
583
gcode_layer.setIsInside (true );
572
584
585
+ // make sure that we are using the correct extruder to print raft
586
+ gcode_layer.setExtruder (extruder_nr);
587
+ current_extruder_nr = extruder_nr;
588
+
573
589
if (CommandSocket::isInstantiated ())
574
590
{
575
591
CommandSocket::getInstance ()->sendOptimizedLayerInfo (layer_nr, z, layer_height);
@@ -823,13 +839,13 @@ void FffGcodeWriter::calculateExtruderOrderPerLayer(const SliceDataStorage& stor
823
839
for (int layer_nr = -Raft::getTotalExtraLayers (storage); layer_nr < static_cast <int >(storage.print_layer_count ); layer_nr++)
824
840
{
825
841
std::vector<std::vector<unsigned int >>& extruder_order_per_layer_here = (layer_nr < 0 )? extruder_order_per_layer_negative_layers : extruder_order_per_layer;
826
- extruder_order_per_layer_here.push_back (calculateLayerExtruderOrder (storage, last_extruder, layer_nr));
842
+ extruder_order_per_layer_here.push_back (getUsedExtrudersOnLayerExcludingStartingExtruder (storage, last_extruder, layer_nr));
827
843
last_extruder = extruder_order_per_layer_here.back ().back ();
828
844
extruder_prime_layer_nr[last_extruder] = std::min (extruder_prime_layer_nr[last_extruder], layer_nr);
829
845
}
830
846
}
831
847
832
- std::vector<unsigned int > FffGcodeWriter::calculateLayerExtruderOrder (const SliceDataStorage& storage, const unsigned int start_extruder, const int layer_nr) const
848
+ std::vector<unsigned int > FffGcodeWriter::getUsedExtrudersOnLayerExcludingStartingExtruder (const SliceDataStorage& storage, const unsigned int start_extruder, const int layer_nr) const
833
849
{
834
850
unsigned int extruder_count = storage.getSettingAsCount (" machine_extruder_count" );
835
851
assert (static_cast <int >(extruder_count) > 0 );
@@ -838,7 +854,7 @@ std::vector<unsigned int> FffGcodeWriter::calculateLayerExtruderOrder(const Slic
838
854
std::vector<bool > extruder_is_used_on_this_layer = storage.getExtrudersUsed (layer_nr);
839
855
840
856
// check if we are on the first layer
841
- if ((getSettingAsPlatformAdhesion (" adhesion_type" ) == EPlatformAdhesion::RAFT && layer_nr == -Raft::getFillerLayerCount (storage))
857
+ if ((getSettingAsPlatformAdhesion (" adhesion_type" ) == EPlatformAdhesion::RAFT && layer_nr == -Raft::getTotalExtraLayers (storage))
842
858
|| (getSettingAsPlatformAdhesion (" adhesion_type" ) != EPlatformAdhesion::RAFT && layer_nr == 0 ))
843
859
{
844
860
// check if we need prime blob on the first layer
0 commit comments