@@ -480,7 +480,9 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage)
480480 double fill_overlap = 0 ; // raft line shouldn't be expanded - there is no boundary polygon printed
481481 int extra_infill_shift = 0 ;
482482 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+
484486 { // raft base layer
485487 int layer_nr = initial_raft_layer_nr;
486488 int layer_height = train->getSettingInMicrons (" raft_base_thickness" );
@@ -514,6 +516,15 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage)
514516 infill_comp.generate (raft_polygons, raftLines);
515517 gcode_layer.addLinesByOptimizer (raftLines, &gcode_layer.configs_storage .raft_base_config , SpaceFillType::Lines);
516518
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+
517528 layer_plan_buffer.handle (gcode_layer, gcode);
518529 }
519530
@@ -531,10 +542,11 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage)
531542 fan_speed_layer_time_settings.cool_fan_speed_0 = regular_fan_speed; // ignore initial layer fan speed stuff
532543 }
533544
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" ));
535546 gcode_layer.setIsInside (true );
536547
537548 gcode_layer.setExtruder (extruder_nr); // reset to extruder number, because we might have primed in the last layer
549+ current_extruder_nr = extruder_nr;
538550
539551 if (CommandSocket::isInstantiated ())
540552 {
@@ -570,6 +582,10 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage)
570582 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" ));
571583 gcode_layer.setIsInside (true );
572584
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+
573589 if (CommandSocket::isInstantiated ())
574590 {
575591 CommandSocket::getInstance ()->sendOptimizedLayerInfo (layer_nr, z, layer_height);
@@ -823,13 +839,13 @@ void FffGcodeWriter::calculateExtruderOrderPerLayer(const SliceDataStorage& stor
823839 for (int layer_nr = -Raft::getTotalExtraLayers (storage); layer_nr < static_cast <int >(storage.print_layer_count ); layer_nr++)
824840 {
825841 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));
827843 last_extruder = extruder_order_per_layer_here.back ().back ();
828844 extruder_prime_layer_nr[last_extruder] = std::min (extruder_prime_layer_nr[last_extruder], layer_nr);
829845 }
830846}
831847
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
833849{
834850 unsigned int extruder_count = storage.getSettingAsCount (" machine_extruder_count" );
835851 assert (static_cast <int >(extruder_count) > 0 );
@@ -838,7 +854,7 @@ std::vector<unsigned int> FffGcodeWriter::calculateLayerExtruderOrder(const Slic
838854 std::vector<bool > extruder_is_used_on_this_layer = storage.getExtrudersUsed (layer_nr);
839855
840856 // 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))
842858 || (getSettingAsPlatformAdhesion (" adhesion_type" ) != EPlatformAdhesion::RAFT && layer_nr == 0 ))
843859 {
844860 // check if we need prime blob on the first layer
0 commit comments