2019-06-17 10:16:07 +02:00
#ifndef WipeTower_
#define WipeTower_
2017-05-16 13:45:28 +02:00
2017-05-16 16:02:52 +02:00
#include <cmath>
2017-05-16 13:45:28 +02:00
#include <string>
2018-02-28 16:04:56 +01:00
#include <sstream>
2017-05-16 13:45:28 +02:00
#include <utility>
2018-05-31 16:21:10 +02:00
#include <algorithm>
2017-05-16 13:45:28 +02:00
2019-06-17 10:16:07 +02:00
#include "libslic3r/PrintConfig.hpp"
2017-05-16 13:45:28 +02:00
2018-02-28 16:04:56 +01:00
2017-05-16 13:45:28 +02:00
namespace Slic3r
{
2019-06-17 10:16:07 +02:00
class WipeTowerWriter ;
2017-05-16 13:45:28 +02:00
2018-02-28 16:04:56 +01:00
2019-06-17 10:16:07 +02:00
class WipeTower
2017-05-16 13:45:28 +02:00
{
public :
2019-06-17 10:16:07 +02:00
struct Extrusion
{
Extrusion ( const Vec2f & pos , float width , unsigned int tool ) : pos ( pos ), width ( width ), tool ( tool ) {}
// End position of this extrusion.
Vec2f pos ;
// Width of a squished extrusion, corrected for the roundings of the squished extrusions.
// This is left zero if it is a travel move.
float width ;
// Current extruder index.
unsigned int tool ;
};
struct ToolChangeResult
{
// Print heigh of this tool change.
float print_z ;
float layer_height ;
// G-code section to be directly included into the output G-code.
std :: string gcode ;
// For path preview.
std :: vector < Extrusion > extrusions ;
// Initial position, at which the wipe tower starts its action.
// At this position the extruder is loaded and there is no Z-hop applied.
Vec2f start_pos ;
// Last point, at which the normal G-code generator of Slic3r shall continue.
// At this position the extruder is loaded and there is no Z-hop applied.
Vec2f end_pos ;
// Time elapsed over this tool change.
// This is useful not only for the print time estimation, but also for the control of layer cooling.
float elapsed_time ;
// Is this a priming extrusion? (If so, the wipe tower rotation & translation will not be applied later)
bool priming ;
// Initial tool
int initial_tool ;
// New tool
int new_tool ;
// Sum the total length of the extrusion.
float total_extrusion_length_in_plane () {
float e_length = 0.f ;
for ( size_t i = 1 ; i < this -> extrusions . size (); ++ i ) {
const Extrusion & e = this -> extrusions [ i ];
if ( e . width > 0 ) {
Vec2f v = e . pos - ( & e - 1 ) -> pos ;
e_length += v . norm ();
}
}
return e_length ;
}
};
2017-05-16 13:45:28 +02:00
// x -- x coordinates of wipe tower in mm ( left bottom corner )
// y -- y coordinates of wipe tower in mm ( left bottom corner )
// width -- width of wipe tower in mm ( default 60 mm - leave as it is )
// wipe_area -- space available for one toolchange in mm
2019-06-17 10:16:07 +02:00
WipeTower ( bool semm , float x , float y , float width , float rotation_angle , float cooling_tube_retraction ,
float cooling_tube_length , float parking_pos_retraction , float extra_loading_move ,
float bridging , bool set_extruder_trimpot , GCodeFlavor flavor ,
const std :: vector < std :: vector < float >>& wiping_matrix , unsigned int initial_tool ) :
2019-06-12 10:54:52 +02:00
m_semm ( semm ),
m_wipe_tower_pos ( x , y ),
2017-05-16 13:45:28 +02:00
m_wipe_tower_width ( width ),
2017-11-30 12:08:22 +01:00
m_wipe_tower_rotation_angle ( rotation_angle ),
2018-02-21 13:07:32 +01:00
m_y_shift ( 0.f ),
2017-05-25 22:27:53 +02:00
m_z_pos ( 0.f ),
2018-02-21 13:07:32 +01:00
m_is_first_layer ( false ),
2019-04-24 12:01:57 +02:00
m_gcode_flavor ( flavor ),
2019-06-12 10:54:52 +02:00
m_bridging ( bridging ),
2018-05-24 17:24:37 +02:00
m_current_tool ( initial_tool ),
wipe_volumes ( wiping_matrix )
2019-06-12 10:54:52 +02:00
{
// If this is a single extruder MM printer, we will use all the SE-specific config values.
// Otherwise, the defaults will be used to turn off the SE stuff.
if ( m_semm ) {
m_cooling_tube_retraction = cooling_tube_retraction ;
m_cooling_tube_length = cooling_tube_length ;
m_parking_pos_retraction = parking_pos_retraction ;
m_extra_loading_move = extra_loading_move ;
m_set_extruder_trimpot = set_extruder_trimpot ;
}
}
2017-05-25 22:27:53 +02:00
2019-06-17 10:16:07 +02:00
virtual ~ WipeTower () {}
2017-05-16 13:45:28 +02:00
2017-12-21 13:28:26 +01:00
2017-05-16 13:45:28 +02:00
// Set the extruder properties.
2019-06-14 14:31:53 +02:00
void set_extruder ( size_t idx , std :: string material , int temp , int first_layer_temp , float loading_speed , float loading_speed_start ,
2018-08-14 16:23:23 +02:00
float unloading_speed , float unloading_speed_start , float delay , int cooling_moves ,
2019-06-10 12:26:47 +02:00
float cooling_initial_speed , float cooling_final_speed , std :: string ramming_parameters , float max_volumetric_speed , float nozzle_diameter )
2017-05-16 13:45:28 +02:00
{
2018-03-21 15:57:17 +01:00
//while (m_filpar.size() < idx+1) // makes sure the required element is in the vector
m_filpar . push_back ( FilamentParameters ());
2018-03-05 10:45:35 +01:00
m_filpar [ idx ]. material = material ;
m_filpar [ idx ]. temperature = temp ;
m_filpar [ idx ]. first_layer_temperature = first_layer_temp ;
2019-06-12 10:54:52 +02:00
// If this is a single extruder MM printer, we will use all the SE-specific config values.
// Otherwise, the defaults will be used to turn off the SE stuff.
if ( m_semm ) {
m_filpar [ idx ]. loading_speed = loading_speed ;
m_filpar [ idx ]. loading_speed_start = loading_speed_start ;
m_filpar [ idx ]. unloading_speed = unloading_speed ;
m_filpar [ idx ]. unloading_speed_start = unloading_speed_start ;
m_filpar [ idx ]. delay = delay ;
m_filpar [ idx ]. cooling_moves = cooling_moves ;
m_filpar [ idx ]. cooling_initial_speed = cooling_initial_speed ;
m_filpar [ idx ]. cooling_final_speed = cooling_final_speed ;
}
2019-06-10 12:26:47 +02:00
if ( max_volumetric_speed != 0.f )
m_filpar [ idx ]. max_e_speed = ( max_volumetric_speed / Filament_Area );
2018-03-29 15:32:09 +02:00
m_filpar [ idx ]. nozzle_diameter = nozzle_diameter ; // to be used in future with (non-single) multiextruder MM
m_perimeter_width = nozzle_diameter * Width_To_Nozzle_Ratio ; // all extruders are now assumed to have the same diameter
2018-03-21 15:57:17 +01:00
2019-07-19 12:59:56 +02:00
if ( m_semm ) {
std :: stringstream stream { ramming_parameters };
float speed = 0.f ;
stream >> m_filpar [ idx ]. ramming_line_width_multiplicator >> m_filpar [ idx ]. ramming_step_multiplicator ;
m_filpar [ idx ]. ramming_line_width_multiplicator /= 100 ;
m_filpar [ idx ]. ramming_step_multiplicator /= 100 ;
while ( stream >> speed )
m_filpar [ idx ]. ramming_speed . push_back ( speed );
}
2018-09-17 15:12:13 +02:00
m_used_filament_length . resize ( std :: max ( m_used_filament_length . size (), idx + 1 )); // makes sure that the vector is big enough so we don't have to check later
2017-05-16 13:45:28 +02:00
}
2017-12-21 13:28:26 +01:00
2018-03-21 15:57:17 +01:00
// Appends into internal structure m_plan containing info about the future wipe tower
2017-12-21 13:28:26 +01:00
// to be used before building begins. The entries must be added ordered in z.
2018-05-30 11:56:30 +02:00
void plan_toolchange ( float z_par , float layer_height_par , unsigned int old_tool , unsigned int new_tool , bool brim , float wipe_volume = 0.f );
2017-12-21 13:28:26 +01:00
2018-02-22 11:03:29 +01:00
// Iterates through prepared m_plan, generates ToolChangeResults and appends them to "result"
2019-06-17 10:16:07 +02:00
void generate ( std :: vector < std :: vector < ToolChangeResult >> & result );
2017-12-21 13:28:26 +01:00
2018-07-27 15:56:27 +02:00
float get_depth () const { return m_wipe_tower_depth ; }
2018-02-21 13:07:32 +01:00
2018-03-06 19:14:12 +01:00
2017-05-16 13:45:28 +02:00
// Switch to a next layer.
2019-06-17 10:16:07 +02:00
void set_layer (
2017-05-16 13:45:28 +02:00
// Print height of this layer.
2017-12-21 13:28:26 +01:00
float print_z ,
// Layer height, used to calculate extrusion the rate.
float layer_height ,
2017-05-16 13:45:28 +02:00
// Maximum number of tool changes on this layer or the layers below.
2017-12-21 13:28:26 +01:00
size_t max_tool_changes ,
2017-05-16 13:45:28 +02:00
// Is this the first layer of the print? In that case print the brim first.
2017-12-21 13:28:26 +01:00
bool is_first_layer ,
2017-05-16 13:45:28 +02:00
// Is this the last layer of the waste tower?
2017-12-21 13:28:26 +01:00
bool is_last_layer )
2017-05-16 13:45:28 +02:00
{
m_z_pos = print_z ;
2017-05-25 22:27:53 +02:00
m_layer_height = layer_height ;
2017-05-16 13:45:28 +02:00
m_is_first_layer = is_first_layer ;
2017-12-21 13:28:26 +01:00
m_print_brim = is_first_layer ;
2018-03-21 15:57:17 +01:00
m_depth_traversed = 0.f ;
2017-05-17 16:45:37 +02:00
m_current_shape = ( ! is_first_layer && m_current_shape == SHAPE_NORMAL ) ? SHAPE_REVERSED : SHAPE_NORMAL ;
2018-04-06 12:02:52 +02:00
if ( is_first_layer ) {
this -> m_num_layer_changes = 0 ;
this -> m_num_tool_changes = 0 ;
}
else
++ m_num_layer_changes ;
2017-12-07 11:59:14 +01:00
2018-03-21 15:57:17 +01:00
// Calculate extrusion flow from desired line width, nozzle diameter, filament diameter and layer_height:
2017-12-21 13:28:26 +01:00
m_extrusion_flow = extrusion_flow ( layer_height );
2018-03-21 15:57:17 +01:00
// Advance m_layer_info iterator, making sure we got it right
while ( ! m_plan . empty () && m_layer_info -> z < print_z - WT_EPSILON && m_layer_info + 1 != m_plan . end ())
2018-02-22 11:03:29 +01:00
++ m_layer_info ;
2017-05-16 13:45:28 +02:00
}
// Return the wipe tower position.
2019-06-17 10:16:07 +02:00
const Vec2f & position () const { return m_wipe_tower_pos ; }
2017-05-19 19:24:21 +02:00
// Return the wipe tower width.
2019-06-17 10:16:07 +02:00
float width () const { return m_wipe_tower_width ; }
2017-05-16 13:45:28 +02:00
// The wipe tower is finished, there should be no more tool changes or wipe tower prints.
2019-06-17 10:16:07 +02:00
bool finished () const { return m_max_color_changes == 0 ; }
2017-05-16 13:45:28 +02:00
2017-09-01 17:30:18 +02:00
// Returns gcode to prime the nozzles at the front edge of the print bed.
2019-06-17 10:16:07 +02:00
std :: vector < ToolChangeResult > prime (
2017-09-12 15:55:38 +02:00
// print_z of the first layer.
float first_layer_height ,
// Extruder indices, in the order to be primed. The last extruder will later print the wipe tower brim, print brim and the object.
2017-12-03 09:43:00 +01:00
const std :: vector < unsigned int > & tools ,
2017-09-12 15:55:38 +02:00
// If true, the last priming are will be the same as the other priming areas, and the rest of the wipe will be performed inside the wipe tower.
// If false, the last priming are will be large enough to wipe the last extruder sufficiently.
2018-03-08 16:44:52 +01:00
bool last_wipe_inside_wipe_tower );
2017-09-01 17:30:18 +02:00
2017-05-17 10:42:39 +02:00
// Returns gcode for a toolchange and a final print head position.
// On the first layer, extrude a brim around the future wipe tower first.
2019-06-17 10:16:07 +02:00
ToolChangeResult tool_change ( unsigned int new_tool , bool last_in_layer );
2017-05-16 13:45:28 +02:00
2018-03-21 15:57:17 +01:00
// Fill the unfilled space with a sparse infill.
2017-05-17 16:45:37 +02:00
// Call this method only if layer_finished() is false.
2019-06-17 10:16:07 +02:00
ToolChangeResult finish_layer ();
2017-05-17 16:45:37 +02:00
2018-02-22 11:03:29 +01:00
// Is the current layer finished?
2019-06-17 10:16:07 +02:00
bool layer_finished () const {
2018-02-21 13:07:32 +01:00
return ( ( m_is_first_layer ? m_wipe_tower_depth - m_perimeter_width : m_layer_info -> depth ) - WT_EPSILON < m_depth_traversed );
2017-12-21 13:28:26 +01:00
}
2019-06-17 10:16:07 +02:00
std :: vector < float > get_used_filament () const { return m_used_filament_length ; }
int get_number_of_toolchanges () const { return m_num_tool_changes ; }
2018-09-17 15:12:13 +02:00
2019-06-10 12:26:47 +02:00
struct FilamentParameters {
2019-06-14 14:31:53 +02:00
std :: string material = "PLA" ;
2019-06-10 12:26:47 +02:00
int temperature = 0 ;
int first_layer_temperature = 0 ;
float loading_speed = 0.f ;
float loading_speed_start = 0.f ;
float unloading_speed = 0.f ;
float unloading_speed_start = 0.f ;
float delay = 0.f ;
int cooling_moves = 0 ;
float cooling_initial_speed = 0.f ;
float cooling_final_speed = 0.f ;
2019-07-19 12:59:56 +02:00
float ramming_line_width_multiplicator = 1.f ;
float ramming_step_multiplicator = 1.f ;
2019-06-10 12:26:47 +02:00
float max_e_speed = std :: numeric_limits < float >:: max ();
std :: vector < float > ramming_speed ;
float nozzle_diameter ;
};
2017-05-16 13:45:28 +02:00
private :
2019-06-17 10:16:07 +02:00
WipeTower ();
2017-05-16 13:45:28 +02:00
2018-03-21 15:57:17 +01:00
enum wipe_shape // A fill-in direction
2017-05-16 13:45:28 +02:00
{
2018-02-21 13:07:32 +01:00
SHAPE_NORMAL = 1 ,
2017-05-16 13:45:28 +02:00
SHAPE_REVERSED = - 1
};
2018-03-21 15:57:17 +01:00
const bool m_peters_wipe_tower = false ; // sparse wipe tower inspired by Peter's post processor - not finished yet
2019-04-16 14:25:50 +02:00
const float Filament_Area = float ( M_PI * 1.75f * 1.75f / 4.f ); // filament area in mm^2
2018-03-21 15:57:17 +01:00
const float Width_To_Nozzle_Ratio = 1.25f ; // desired line width (oval) in multiples of nozzle diameter - may not be actually neccessary to adjust
const float WT_EPSILON = 1e-3 f ;
2019-06-12 10:54:52 +02:00
bool m_semm = true ; // Are we using a single extruder multimaterial printer?
2019-06-17 10:16:07 +02:00
Vec2f m_wipe_tower_pos ; // Left front corner of the wipe tower in mm.
2018-02-21 13:07:32 +01:00
float m_wipe_tower_width ; // Width of the wipe tower.
float m_wipe_tower_depth = 0.f ; // Depth of the wipe tower
2018-03-21 15:57:17 +01:00
float m_wipe_tower_rotation_angle = 0.f ; // Wipe tower rotation angle in degrees (with respect to x axis)
2018-07-27 15:56:27 +02:00
float m_internal_rotation = 0.f ;
2018-02-21 13:07:32 +01:00
float m_y_shift = 0.f ; // y shift passed to writer
float m_z_pos = 0.f ; // Current Z position.
float m_layer_height = 0.f ; // Current layer height.
size_t m_max_color_changes = 0 ; // Maximum number of color changes per layer.
bool m_is_first_layer = false ; // Is this the 1st layer of the print? If so, print the brim around the waste tower.
2018-05-11 17:35:42 +02:00
int m_old_temperature = - 1 ; // To keep track of what was the last temp that we set (so we don't issue the command when not neccessary)
2017-05-16 13:45:28 +02:00
// G-code generator parameters.
2018-03-01 16:15:00 +01:00
float m_cooling_tube_retraction = 0.f ;
float m_cooling_tube_length = 0.f ;
float m_parking_pos_retraction = 0.f ;
2018-04-16 14:26:57 +02:00
float m_extra_loading_move = 0.f ;
2018-03-12 15:41:25 +01:00
float m_bridging = 0.f ;
2018-12-14 20:09:10 +01:00
bool m_set_extruder_trimpot = false ;
2018-03-12 15:41:25 +01:00
bool m_adhesion = true ;
2019-04-24 12:01:57 +02:00
GCodeFlavor m_gcode_flavor ;
2018-03-05 10:45:35 +01:00
2019-04-16 14:25:50 +02:00
float m_perimeter_width = 0.4f * Width_To_Nozzle_Ratio ; // Width of an extrusion line, also a perimeter spacing for 100% infill.
float m_extrusion_flow = 0.038f ; //0.029f;// Extrusion flow is derived from m_perimeter_width, layer height and filament diameter.
2017-05-16 13:45:28 +02:00
// Extruder specific parameters.
2018-03-20 15:45:11 +01:00
std :: vector < FilamentParameters > m_filpar ;
2018-03-05 10:45:35 +01:00
2017-05-16 13:45:28 +02:00
2018-03-21 15:57:17 +01:00
// State of the wipe tower generator.
2018-02-21 13:07:32 +01:00
unsigned int m_num_layer_changes = 0 ; // Layer change counter for the output statistics.
unsigned int m_num_tool_changes = 0 ; // Tool change change counter for the output statistics.
///unsigned int m_idx_tool_change_in_layer = 0; // Layer change counter in this layer. Counting up to m_max_color_changes.
2017-12-21 13:28:26 +01:00
bool m_print_brim = true ;
2017-05-17 10:42:39 +02:00
// A fill-in direction (positive Y, negative Y) alternates with each layer.
2017-05-16 13:45:28 +02:00
wipe_shape m_current_shape = SHAPE_NORMAL ;
2017-05-25 22:27:53 +02:00
unsigned int m_current_tool = 0 ;
2018-05-24 17:24:37 +02:00
const std :: vector < std :: vector < float >> wipe_volumes ;
2018-02-21 13:07:32 +01:00
2018-03-21 15:57:17 +01:00
float m_depth_traversed = 0.f ; // Current y position at the wipe tower.
bool m_left_to_right = true ;
float m_extra_spacing = 1.f ;
2018-02-22 11:03:29 +01:00
// Calculates extrusion flow needed to produce required line width for given layer height
float extrusion_flow ( float layer_height = - 1.f ) const // negative layer_height - return current m_extrusion_flow
2017-12-21 13:28:26 +01:00
{
if ( layer_height < 0 )
return m_extrusion_flow ;
2019-04-16 14:25:50 +02:00
return layer_height * ( m_perimeter_width - layer_height * ( 1.f - float ( M_PI ) / 4.f )) / Filament_Area ;
2017-12-21 13:28:26 +01:00
}
2018-02-22 11:03:29 +01:00
// Calculates length of extrusion line to extrude given volume
2018-02-21 13:07:32 +01:00
float volume_to_length ( float volume , float line_width , float layer_height ) const {
2019-04-16 14:25:50 +02:00
return std :: max ( 0.f , volume / ( layer_height * ( line_width - layer_height * ( 1.f - float ( M_PI ) / 4.f ))));
2018-02-21 13:07:32 +01:00
}
2018-03-21 15:57:17 +01:00
// Calculates depth for all layers and propagates them downwards
void plan_tower ();
// Goes through m_plan and recalculates depths and width of the WT to make it exactly square - experimental
void make_wipe_tower_square ();
// Goes through m_plan, calculates border and finish_layer extrusions and subtracts them from last wipe
void save_on_last_wipe ();
2018-02-21 13:07:32 +01:00
2017-05-16 13:45:28 +02:00
struct box_coordinates
{
box_coordinates ( float left , float bottom , float width , float height ) :
ld ( left , bottom ),
lu ( left , bottom + height ),
rd ( left + width , bottom ),
ru ( left + width , bottom + height ) {}
2019-06-17 10:16:07 +02:00
box_coordinates ( const Vec2f & pos , float width , float height ) : box_coordinates ( pos ( 0 ), pos ( 1 ), width , height ) {}
void translate ( const Vec2f & shift ) {
2017-05-17 16:45:37 +02:00
ld += shift ; lu += shift ;
rd += shift ; ru += shift ;
}
2019-06-17 10:16:07 +02:00
void translate ( const float dx , const float dy ) { translate ( Vec2f ( dx , dy )); }
2017-05-16 13:45:28 +02:00
void expand ( const float offset ) {
2019-06-17 10:16:07 +02:00
ld += Vec2f ( - offset , - offset );
lu += Vec2f ( - offset , offset );
rd += Vec2f ( offset , - offset );
ru += Vec2f ( offset , offset );
2017-05-16 13:45:28 +02:00
}
2017-05-17 16:45:37 +02:00
void expand ( const float offset_x , const float offset_y ) {
2019-06-17 10:16:07 +02:00
ld += Vec2f ( - offset_x , - offset_y );
lu += Vec2f ( - offset_x , offset_y );
rd += Vec2f ( offset_x , - offset_y );
ru += Vec2f ( offset_x , offset_y );
2017-05-17 16:45:37 +02:00
}
2019-06-17 10:16:07 +02:00
Vec2f ld ; // left down
Vec2f lu ; // left upper
Vec2f rd ; // right lower
Vec2f ru ; // right upper
2017-05-16 13:45:28 +02:00
};
2017-12-21 13:28:26 +01:00
// to store information about tool changes for a given layer
struct WipeTowerInfo {
struct ToolChange {
unsigned int old_tool ;
unsigned int new_tool ;
float required_depth ;
2018-03-06 19:14:12 +01:00
float ramming_depth ;
float first_wipe_line ;
2018-05-24 17:24:37 +02:00
float wipe_volume ;
ToolChange ( unsigned int old , unsigned int newtool , float depth = 0.f , float ramming_depth = 0.f , float fwl = 0.f , float wv = 0.f )
: old_tool { old }, new_tool { newtool }, required_depth { depth }, ramming_depth { ramming_depth }, first_wipe_line { fwl }, wipe_volume { wv } {}
2017-12-21 13:28:26 +01:00
};
float z ; // z position of the layer
float height ; // layer height
float depth ; // depth of the layer based on all layers above
2018-02-21 13:07:32 +01:00
float extra_spacing ;
2017-12-21 13:28:26 +01:00
float toolchanges_depth () const { float sum = 0.f ; for ( const auto & a : tool_changes ) sum += a . required_depth ; return sum ; }
std :: vector < ToolChange > tool_changes ;
WipeTowerInfo ( float z_par , float layer_height_par )
2018-02-21 13:07:32 +01:00
: z { z_par }, height { layer_height_par }, depth { 0 }, extra_spacing { 1.f } {}
2017-12-21 13:28:26 +01:00
};
2018-02-22 11:03:29 +01:00
std :: vector < WipeTowerInfo > m_plan ; // Stores information about all layers and toolchanges for the future wipe tower (filled by plan_toolchange(...))
2018-03-07 11:44:47 +01:00
std :: vector < WipeTowerInfo >:: iterator m_layer_info = m_plan . end ();
2017-12-21 13:28:26 +01:00
2018-09-17 15:12:13 +02:00
// Stores information about used filament length per extruder:
std :: vector < float > m_used_filament_length ;
2017-12-21 13:28:26 +01:00
2017-05-16 13:45:28 +02:00
// Returns gcode for wipe tower brim
2017-12-21 13:28:26 +01:00
// sideOnly -- set to false -- experimental, draw brim on sides of wipe tower
2017-05-16 13:45:28 +02:00
// offset -- set to 0 -- experimental, offset to replace brim in front / rear of wipe tower
2018-03-08 16:44:52 +01:00
ToolChangeResult toolchange_Brim ( bool sideOnly = false , float y_offset = 0.f );
2017-05-16 13:45:28 +02:00
void toolchange_Unload (
2019-06-17 10:16:07 +02:00
WipeTowerWriter & writer ,
2017-05-16 13:45:28 +02:00
const box_coordinates & cleaning_box ,
2019-06-14 14:31:53 +02:00
const std :: string & current_material ,
2017-05-17 16:45:37 +02:00
const int new_temperature );
2017-05-16 13:45:28 +02:00
void toolchange_Change (
2019-06-17 10:16:07 +02:00
WipeTowerWriter & writer ,
2017-09-01 17:30:18 +02:00
const unsigned int new_tool ,
2019-06-14 14:31:53 +02:00
const std :: string & new_material );
2017-05-16 13:45:28 +02:00
void toolchange_Load (
2019-06-17 10:16:07 +02:00
WipeTowerWriter & writer ,
2017-05-16 13:45:28 +02:00
const box_coordinates & cleaning_box );
void toolchange_Wipe (
2019-06-17 10:16:07 +02:00
WipeTowerWriter & writer ,
2017-09-12 15:55:38 +02:00
const box_coordinates & cleaning_box ,
2018-03-09 12:40:39 +01:00
float wipe_volume );
2017-05-16 13:45:28 +02:00
};
2018-02-28 16:04:56 +01:00
2017-05-16 13:45:28 +02:00
}; // namespace Slic3r
2019-06-17 10:16:07 +02:00
#endif // WipeTowerPrusaMM_hpp_