Skip to content

Commit 60395d0

Browse files
committed
Merge branch 'LipuFei-fix_priming_with_raft' into 2.6
2 parents dfbfa12 + 69618e1 commit 60395d0

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

src/FffGcodeWriter.cpp

+21-5
Original file line numberDiff line numberDiff line change
@@ -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

src/FffGcodeWriter.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,8 @@ class FffGcodeWriter : public SettingsMessenger, NoCopy
291291
void calculateExtruderOrderPerLayer(const SliceDataStorage& storage);
292292

293293
/*!
294-
* Calculate in which order to plan the extruders.
295-
* Only extruders which are (most probably) going to be used are planned
294+
* Gets a list of extruders that are used on the given layer, but excluding the given starting extruder.
295+
* When it's on the first layer, the prime blob will also be taken into account.
296296
*
297297
* \note At the planning stage we only have information on areas, not how those are filled.
298298
* If an area is too small to be filled with anything it will still get specified as being used with the extruder for that area.
@@ -301,7 +301,7 @@ class FffGcodeWriter : public SettingsMessenger, NoCopy
301301
* \param current_extruder The current extruder with which we last printed
302302
* \return The order of extruders for a layer beginning with \p current_extruder
303303
*/
304-
std::vector<unsigned int> calculateLayerExtruderOrder(const SliceDataStorage& storage, const unsigned int start_extruder, const int layer_nr) const;
304+
std::vector<unsigned int> getUsedExtrudersOnLayerExcludingStartingExtruder(const SliceDataStorage& storage, const unsigned int start_extruder, const int layer_nr) const;
305305

306306
/*!
307307
* Calculate in which order to plan the meshes of a specific extruder

0 commit comments

Comments
 (0)