Pagaliau prijungiau Diamond ekstruderį prie atnaujinto savo spausdintuvo. Viskas gerai kol spausdini viena kuria nors spalva arba spalvų mišiniu, bet kai tik nori panaudoti kelias spalvas viename dirbinyje reikia keičiant spalvas išspausti prieš tai naudotos spalvos likučius. Naudoti sliceriai to normaliai atlikti nemoka, nors jei objektas pakankamai didelis ir kiekviena spalva spausdinamas nemažas tūris, pildant iš vidinės pusės ne horizontaliuose sluoksniuose, pirmieji sluoksniai maišyto plastiko lieka viduje ir išorėje viskas gerai atrodo. Bet horizontalūs paviršiai išeina visiškai murzini, tam reikalingas papildomas spausdinamas objektas į kurį būtų nuvalomi plastiko likučiai keičiant spalvas.
Plastiko keitimo funkciją turi Prusa i3 MK2.5S/MK3S Multi Material priedas, kurį puikiai valdo Slic3rPE sliceris. Ši programa platinama su pradiniu kodu, kurį truputį pamodifikavus galima pritaikyti Diamond galvai. Programa keisdama plastiką Multi Material priede ištraukia jį iš ekstruderio ir per tą pačią skylę sukiša kitą plastiko giją atgal. Kad plastikas nepriliptų prie vamzdelio ar nesusidarytų gumbai, traukia jį per specialų aušinimo vamzdelį, o prieš kišant atgal nukerpa aplydytą plastiko gijos galiuką. Diamond galvai tokių stumdymų nereikia, užtenka prieš spausdinant nauja spalva, išstumti senos spalvos likučius. Pastumdžius karštą plastiką taip kaip daroma Multi Material, Diamond galvoje ir dar netinkamame vamzdelyje jis išsiploja ir prisiklijuoja prie šaltos sienelės, turim kamštį kurio be ekstruderio ardymo sutvarkyti neišeina. Diamond galvoje tūris, kuriame maišosi plastikai, labai nedidelis, tai ir tų likučių palyginus mažai, 5-7mm3 paprastai užtenka, kad išeitų nebemaišytas plastikas. Iš kitos pusės, kai maišymosi tūris mažas, tai prastai susimaišo spalvos, kai norima spausdinti maišyta spalva, pavyzdžiui spausdinant geltonu ir mėlynu plastiku vienu metu dirbinys nesigauna visiškai žalias, bus kažkuri dalis geltona, kita mėlyna ir aplinkui visokių žalių atspalvių.
Modifikavimui buvo pasirinkta naujausia Slic3r_1.42.0-beta2 Prusa Edition versija. Modifikuoti du failai:
./Slic3r-version_1.42.0-beta2/src/libslic3r/GCode/WipeTowerPrusaMM.cpp
ir
./Slic3r-version_1.42.0-beta2/src/libslic3r/PrintConfig.cpp.
WipeTowerPrusaMM.cpp failas visiškai toks pats ir keliose paskutinėse alpha versijose bei beta1 versijoje. PrintConfig.cpp failas skirtingose versijose skirtingas. bet modifikuojamas tik išstumiamo plastiko tūris keičiant virtualų ekstruderį. Todėl norint pamodifikuoti kitas Slic3r versijas neturėtų būti problematiška. (Papildymas: su tais pačiais diff failais puikiai kompiliuojasi ir veikia naujausia PrusaSlicer-2.0.0 programos versija.) Sukompiliavus programą ir kiek pakoregavus nustatymus gavau tvarkingai su Diamond galva veikiantį slicerį.
./Slic3r-version_1.42.0-beta2/src/libslic3r/GCode/WipeTowerPrusaMM.diff turinys:
--- WipeTowerPrusaMM.cpp.mano 2019-03-23 11:04:00.000000000 +0200 +++ WipeTowerPrusaMM.cpp 2019-04-24 12:32:00.000000000 +0300 @@ -663,8 +663,7 @@ writer.set_extruder_trimpot(550); // Reset the extruder current to a normal value. if (m_retain_speed_override) writer.speed_override_restore(); - writer.feedrate(6000) - .flush_planner_queue() + writer.flush_planner_queue() .reset_extruder() .append("; CP TOOLCHANGE END\n" ";------------------\n" @@ -709,11 +708,12 @@ // The tool is supposed to be active and primed at the time when the wipe tower brim is extruded. // Extrude 4 rounds of a brim around the future wipe tower. box_coordinates box(wipeTower_box); + box.expand(m_perimeter_width); for (size_t i = 0; i < 4; ++ i) { - box.expand(m_perimeter_width - m_layer_height*(1.f-M_PI_4)); // the brim shall have 'normal' spacing with no extra void space writer.travel (box.ld, 7000) .extrude(box.lu, 2100).extrude(box.ru) .extrude(box.rd ).extrude(box.ld); + box.expand(m_perimeter_width); } writer.travel(wipeTower_box.ld, 7000); // Move to the front left corner. @@ -837,18 +837,8 @@ float old_x = writer.x(); float turning_point = (!m_left_to_right ? xl : xr ); float total_retraction_distance = m_cooling_tube_retraction + m_cooling_tube_length/2.f - 15.f; // the 15mm is reserved for the first part after ramming - writer.suppress_preview() - .retract(15.f, m_filpar[m_current_tool].unloading_speed_start * 60.f) // feedrate 5000mm/min = 83mm/s - .retract(0.70f * total_retraction_distance, 1.0f * m_filpar[m_current_tool].unloading_speed * 60.f) - .retract(0.20f * total_retraction_distance, 0.5f * m_filpar[m_current_tool].unloading_speed * 60.f) - .retract(0.10f * total_retraction_distance, 0.3f * m_filpar[m_current_tool].unloading_speed * 60.f) - - /*.load_move_x_advanced(turning_point, -15.f, 83.f, 50.f) // this is done at fixed speed - .load_move_x_advanced(old_x, -0.70f * total_retraction_distance, 1.0f * m_filpar[m_current_tool].unloading_speed) - .load_move_x_advanced(turning_point, -0.20f * total_retraction_distance, 0.5f * m_filpar[m_current_tool].unloading_speed) - .load_move_x_advanced(old_x, -0.10f * total_retraction_distance, 0.3f * m_filpar[m_current_tool].unloading_speed) - .travel(old_x, writer.y()) // in case previous move was shortened to limit feedrate*/ - .resume_preview(); + + if (new_temperature != 0 && (new_temperature != m_old_temperature || m_is_first_layer) ) { // Set the extruder temperature, but don't wait. // If the required temperature is the same as last time, don't emit the M104 again (if user adjusted the value, it would be reset) // However, always change temperatures on the first layer (this is to avoid issues with priming lines turned off). @@ -876,11 +866,6 @@ } } - // let's wait is necessary: - writer.wait(m_filpar[m_current_tool].delay); - // we should be at the beginning of the cooling tube again - let's move to parking position: - writer.retract(-m_cooling_tube_length/2.f+m_parking_pos_retraction-m_cooling_tube_retraction, 2000); - // this is to align ramming and future wiping extrusions, so the future y-steps can be uniform from the start: // the perimeter_width will later be subtracted, it is there to not load while moving over just extruded material writer.travel(end_of_ramming.x, end_of_ramming.y + (y_step/m_extra_spacing-m_perimeter_width) / 2.f + m_perimeter_width, 2400.f); @@ -930,16 +915,7 @@ writer.append("; CP TOOLCHANGE LOAD\n") .suppress_preview() - /*.load_move_x_advanced(turning_point, 0.2f * edist, 0.3f * m_filpar[m_current_tool].loading_speed) // Acceleration - .load_move_x_advanced(oldx, 0.5f * edist, m_filpar[m_current_tool].loading_speed) // Fast phase - .load_move_x_advanced(turning_point, 0.2f * edist, 0.3f * m_filpar[m_current_tool].loading_speed) // Slowing down - .load_move_x_advanced(oldx, 0.1f * edist, 0.1f * m_filpar[m_current_tool].loading_speed) // Super slow*/ - - .load(0.2f * edist, 60.f * m_filpar[m_current_tool].loading_speed_start) - .load_move_x_advanced(turning_point, 0.7f * edist, m_filpar[m_current_tool].loading_speed) // Fast phase - .load_move_x_advanced(oldx, 0.1f * edist, 0.1f * m_filpar[m_current_tool].loading_speed) // Super slow*/ - - .travel(oldx, writer.y()) // in case last move was shortened to limit x feedrate + .travel(oldx, writer.y()) // in case last move was shortened to limit x feedrate .resume_preview(); // Reset the extruder current to the normal value. @@ -985,9 +961,9 @@ float traversed_x = writer.x(); if (m_left_to_right) - writer.extrude(xr - (i % 4 == 0 ? 0 : 1.5*m_perimeter_width), writer.y(), wipe_speed * wipe_coeff); + writer.extrude(xr - (i % 4 == 0 ? 0 : 1.5*m_perimeter_width), writer.y()); else - writer.extrude(xl + (i % 4 == 1 ? 0 : 1.5*m_perimeter_width), writer.y(), wipe_speed * wipe_coeff); + writer.extrude(xl + (i % 4 == 1 ? 0 : 1.5*m_perimeter_width), writer.y()); if (writer.y()+EPSILON > cleaning_box.lu.y-0.5f*m_perimeter_width) break; // in case next line would not fit @@ -995,7 +971,7 @@ traversed_x -= writer.x(); x_to_wipe -= fabs(traversed_x); if (x_to_wipe < WT_EPSILON) { - writer.travel(m_left_to_right ? xl + 1.5*m_perimeter_width : xr - 1.5*m_perimeter_width, writer.y(), 7200); + writer.travel(m_left_to_right ? xl + 1.5*m_perimeter_width : xr - 1.5*m_perimeter_width, writer.y()); break; } // stepping to the next line:
./Slic3r-version_1.42.0-beta2/src/libslic3r/PrintConfig.diff turinys:
--- PrintConfig.cpp.originalas 2019-05-20 19:49:36.000000000 +0300 +++ PrintConfig.cpp 2019-05-21 08:37:47.440841965 +0300 @@ -2142,17 +2142,17 @@ def->tooltip = L("This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " "volumes below."); - def->set_default_value(new ConfigOptionFloats { 70.f, 70.f, 70.f, 70.f, 70.f, 70.f, 70.f, 70.f, 70.f, 70.f }); + def->set_default_value(new ConfigOptionFloats { 10.f, 10.f, 10.f, 10.f, 10.f, 10.f, 10.f, 10.f, 10.f, 10.f }); def = this->add("wiping_volumes_matrix", coFloats); def->label = L("Purging volumes - matrix"); def->tooltip = L("This matrix describes volumes (in cubic milimetres) required to purge the" " new filament on the wipe tower for any given pair of tools."); - def->set_default_value(new ConfigOptionFloats { 0.f, 140.f, 140.f, 140.f, 140.f, - 140.f, 0.f, 140.f, 140.f, 140.f, - 140.f, 140.f, 0.f, 140.f, 140.f, - 140.f, 140.f, 140.f, 0.f, 140.f, - 140.f, 140.f, 140.f, 140.f, 0.f }); + def->set_default_value(new ConfigOptionFloats { 0.f, 20.f, 20.f, 20.f, 10.f, + 20.f, 0.f, 20.f, 20.f, 20.f, + 20.f, 20.f, 0.f, 20.f, 20.f, + 20.f, 20.f, 20.f, 0.f, 20.f, + 20.f, 20.f, 20.f, 20.f, 0.f}); def = this->add("wipe_tower_x", coFloat); def->label = L("Position X");