mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-06 01:56:09 +08:00
Merge branch 'lm_skinnydip' into master_27x
This commit is contained in:
commit
c45655f330
@ -29,6 +29,20 @@
|
|||||||
namespace Slic3r
|
namespace Slic3r
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// Calculates length of extrusion line to extrude given volume
|
||||||
|
static float volume_to_length(float volume, float line_width, float layer_height)
|
||||||
|
{
|
||||||
|
return std::max(0.f, volume / (layer_height * (line_width - layer_height * (1.f - float(M_PI) / 4.f))));
|
||||||
|
}
|
||||||
|
|
||||||
|
static float length_to_volume(float length, float line_width, float layer_height)
|
||||||
|
{
|
||||||
|
return std::max(0.f, length * layer_height * (line_width - layer_height * (1.f - float(M_PI) / 4.f)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class WipeTowerWriter
|
class WipeTowerWriter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -109,6 +123,11 @@ public:
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WipeTowerWriter& switch_filament_monitoring(bool enable) {
|
||||||
|
m_gcode += std::string("G4 S0\n") + "M591 " + (enable ? "R" : "S0") + "\n";
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
// Suppress / resume G-code preview in Slic3r. Slic3r will have difficulty to differentiate the various
|
// Suppress / resume G-code preview in Slic3r. Slic3r will have difficulty to differentiate the various
|
||||||
// filament loading and cooling moves from normal extrusion moves. Therefore the writer
|
// filament loading and cooling moves from normal extrusion moves. Therefore the writer
|
||||||
// is asked to suppres output of some lines, which look like extrusions.
|
// is asked to suppres output of some lines, which look like extrusions.
|
||||||
@ -291,6 +310,25 @@ public:
|
|||||||
return extrude_explicit(end_point, y(), loading_dist, x_speed * 60.f, false, false);
|
return extrude_explicit(end_point, y(), loading_dist, x_speed * 60.f, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Loads filament while also moving towards given point in x-axis. Unlike the previous function, this one respects
|
||||||
|
// both the loading_speed and x_speed. Can shorten the move.
|
||||||
|
WipeTowerWriter& load_move_x_advanced_there_and_back(float farthest_x, float e_dist, float e_speed, float x_speed)
|
||||||
|
{
|
||||||
|
float old_x = x();
|
||||||
|
float time = std::abs(e_dist / e_speed); // time that the whole move must take
|
||||||
|
float x_max_dist = std::abs(farthest_x - x()); // max x-distance that we can travel
|
||||||
|
float x_dist = x_speed * time; // totel x-distance to travel during the move
|
||||||
|
int n = int(x_dist / (2*x_max_dist) + 1.f); // how many there and back moves should we do
|
||||||
|
float r = 2*n*x_max_dist / x_dist; // actual/required dist if the move is not shortened
|
||||||
|
|
||||||
|
float end_point = x() + (farthest_x > x() ? 1.f : -1.f) * x_max_dist / r;
|
||||||
|
for (int i=0; i<n; ++i) {
|
||||||
|
extrude_explicit(end_point, y(), e_dist/(2.f*n), x_speed * 60.f, false, false);
|
||||||
|
extrude_explicit(old_x, y(), e_dist/(2.f*n), x_speed * 60.f, false, false);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
// Elevate the extruder head above the current print_z position.
|
// Elevate the extruder head above the current print_z position.
|
||||||
WipeTowerWriter& z_hop(float hop, float f = 0.f)
|
WipeTowerWriter& z_hop(float hop, float f = 0.f)
|
||||||
{
|
{
|
||||||
@ -333,6 +371,7 @@ public:
|
|||||||
// Set extruder temperature, don't wait by default.
|
// Set extruder temperature, don't wait by default.
|
||||||
WipeTowerWriter& set_extruder_temp(int temperature, bool wait = false)
|
WipeTowerWriter& set_extruder_temp(int temperature, bool wait = false)
|
||||||
{
|
{
|
||||||
|
m_gcode += "G4 S0\n"; // to flush planner queue
|
||||||
m_gcode += "M" + std::to_string(wait ? 109 : 104) + " S" + std::to_string(temperature) + "\n";
|
m_gcode += "M" + std::to_string(wait ? 109 : 104) + " S" + std::to_string(temperature) + "\n";
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -530,7 +569,9 @@ WipeTower::WipeTower(const PrintConfig& config, const PrintRegionConfig& default
|
|||||||
m_wipe_tower_rotation_angle(float(config.wipe_tower_rotation_angle)),
|
m_wipe_tower_rotation_angle(float(config.wipe_tower_rotation_angle)),
|
||||||
m_wipe_tower_brim_width(float(config.wipe_tower_brim_width)),
|
m_wipe_tower_brim_width(float(config.wipe_tower_brim_width)),
|
||||||
m_wipe_tower_cone_angle(float(config.wipe_tower_cone_angle)),
|
m_wipe_tower_cone_angle(float(config.wipe_tower_cone_angle)),
|
||||||
m_extra_spacing(float(config.wipe_tower_extra_spacing/100.)),
|
m_extra_flow(float(config.wipe_tower_extra_flow/100.)),
|
||||||
|
m_extra_spacing_wipe(float(config.wipe_tower_extra_spacing/100. * config.wipe_tower_extra_flow/100.)),
|
||||||
|
m_extra_spacing_ramming(float(config.wipe_tower_extra_spacing/100.)),
|
||||||
m_y_shift(0.f),
|
m_y_shift(0.f),
|
||||||
m_z_pos(0.f),
|
m_z_pos(0.f),
|
||||||
m_bridging(float(config.wipe_tower_bridging)),
|
m_bridging(float(config.wipe_tower_bridging)),
|
||||||
@ -567,6 +608,8 @@ WipeTower::WipeTower(const PrintConfig& config, const PrintRegionConfig& default
|
|||||||
m_set_extruder_trimpot = config.high_current_on_filament_swap;
|
m_set_extruder_trimpot = config.high_current_on_filament_swap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_is_mk4mmu3 = boost::icontains(config.printer_notes.value, "PRINTER_MODEL_MK4") && boost::icontains(config.printer_notes.value, "MMU");
|
||||||
|
|
||||||
// Calculate where the priming lines should be - very naive test not detecting parallelograms etc.
|
// Calculate where the priming lines should be - very naive test not detecting parallelograms etc.
|
||||||
const std::vector<Vec2d>& bed_points = config.bed_shape.values;
|
const std::vector<Vec2d>& bed_points = config.bed_shape.values;
|
||||||
BoundingBoxf bb(bed_points);
|
BoundingBoxf bb(bed_points);
|
||||||
@ -601,6 +644,7 @@ void WipeTower::set_extruder(size_t idx, const PrintConfig& config)
|
|||||||
m_filpar[idx].is_soluble = config.wipe_tower_extruder == 0 ? config.filament_soluble.get_at(idx) : (idx != size_t(config.wipe_tower_extruder - 1));
|
m_filpar[idx].is_soluble = config.wipe_tower_extruder == 0 ? config.filament_soluble.get_at(idx) : (idx != size_t(config.wipe_tower_extruder - 1));
|
||||||
m_filpar[idx].temperature = config.temperature.get_at(idx);
|
m_filpar[idx].temperature = config.temperature.get_at(idx);
|
||||||
m_filpar[idx].first_layer_temperature = config.first_layer_temperature.get_at(idx);
|
m_filpar[idx].first_layer_temperature = config.first_layer_temperature.get_at(idx);
|
||||||
|
m_filpar[idx].filament_minimal_purge_on_wipe_tower = config.filament_minimal_purge_on_wipe_tower.get_at(idx);
|
||||||
|
|
||||||
// If this is a single extruder MM printer, we will use all the SE-specific config values.
|
// 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.
|
// Otherwise, the defaults will be used to turn off the SE stuff.
|
||||||
@ -613,6 +657,8 @@ void WipeTower::set_extruder(size_t idx, const PrintConfig& config)
|
|||||||
m_filpar[idx].cooling_moves = config.filament_cooling_moves.get_at(idx);
|
m_filpar[idx].cooling_moves = config.filament_cooling_moves.get_at(idx);
|
||||||
m_filpar[idx].cooling_initial_speed = float(config.filament_cooling_initial_speed.get_at(idx));
|
m_filpar[idx].cooling_initial_speed = float(config.filament_cooling_initial_speed.get_at(idx));
|
||||||
m_filpar[idx].cooling_final_speed = float(config.filament_cooling_final_speed.get_at(idx));
|
m_filpar[idx].cooling_final_speed = float(config.filament_cooling_final_speed.get_at(idx));
|
||||||
|
m_filpar[idx].filament_stamping_loading_speed = float(config.filament_stamping_loading_speed.get_at(idx));
|
||||||
|
m_filpar[idx].filament_stamping_distance = float(config.filament_stamping_distance.get_at(idx));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_filpar[idx].filament_area = float((M_PI/4.f) * pow(config.filament_diameter.get_at(idx), 2)); // all extruders are assumed to have the same filament diameter at this point
|
m_filpar[idx].filament_area = float((M_PI/4.f) * pow(config.filament_diameter.get_at(idx), 2)); // all extruders are assumed to have the same filament diameter at this point
|
||||||
@ -726,7 +772,7 @@ std::vector<WipeTower::ToolChangeResult> WipeTower::prime(
|
|||||||
toolchange_Wipe(writer, cleaning_box , 20.f);
|
toolchange_Wipe(writer, cleaning_box , 20.f);
|
||||||
box_coordinates box = cleaning_box;
|
box_coordinates box = cleaning_box;
|
||||||
box.translate(0.f, writer.y() - cleaning_box.ld.y() + m_perimeter_width);
|
box.translate(0.f, writer.y() - cleaning_box.ld.y() + m_perimeter_width);
|
||||||
toolchange_Unload(writer, box , m_filpar[m_current_tool].material, m_filpar[tools[idx_tool + 1]].first_layer_temperature);
|
toolchange_Unload(writer, box , m_filpar[m_current_tool].material, m_filpar[m_current_tool].first_layer_temperature, m_filpar[tools[idx_tool + 1]].first_layer_temperature);
|
||||||
cleaning_box.translate(prime_section_width, 0.f);
|
cleaning_box.translate(prime_section_width, 0.f);
|
||||||
writer.travel(cleaning_box.ld, 7200);
|
writer.travel(cleaning_box.ld, 7200);
|
||||||
}
|
}
|
||||||
@ -773,7 +819,7 @@ WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool)
|
|||||||
for (const auto &b : m_layer_info->tool_changes)
|
for (const auto &b : m_layer_info->tool_changes)
|
||||||
if ( b.new_tool == tool ) {
|
if ( b.new_tool == tool ) {
|
||||||
wipe_volume = b.wipe_volume;
|
wipe_volume = b.wipe_volume;
|
||||||
wipe_area = b.required_depth * m_layer_info->extra_spacing;
|
wipe_area = b.required_depth;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -814,14 +860,15 @@ WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool)
|
|||||||
// Ram the hot material out of the melt zone, retract the filament into the cooling tubes and let it cool.
|
// Ram the hot material out of the melt zone, retract the filament into the cooling tubes and let it cool.
|
||||||
if (tool != (unsigned int)-1){ // This is not the last change.
|
if (tool != (unsigned int)-1){ // This is not the last change.
|
||||||
toolchange_Unload(writer, cleaning_box, m_filpar[m_current_tool].material,
|
toolchange_Unload(writer, cleaning_box, m_filpar[m_current_tool].material,
|
||||||
is_first_layer() ? m_filpar[tool].first_layer_temperature : m_filpar[tool].temperature);
|
(is_first_layer() ? m_filpar[m_current_tool].first_layer_temperature : m_filpar[m_current_tool].temperature),
|
||||||
|
(is_first_layer() ? m_filpar[tool].first_layer_temperature : m_filpar[tool].temperature));
|
||||||
toolchange_Change(writer, tool, m_filpar[tool].material); // Change the tool, set a speed override for soluble and flex materials.
|
toolchange_Change(writer, tool, m_filpar[tool].material); // Change the tool, set a speed override for soluble and flex materials.
|
||||||
toolchange_Load(writer, cleaning_box);
|
toolchange_Load(writer, cleaning_box);
|
||||||
writer.travel(writer.x(), writer.y()-m_perimeter_width); // cooling and loading were done a bit down the road
|
writer.travel(writer.x(), writer.y()-m_perimeter_width); // cooling and loading were done a bit down the road
|
||||||
toolchange_Wipe(writer, cleaning_box, wipe_volume); // Wipe the newly loaded filament until the end of the assigned wipe area.
|
toolchange_Wipe(writer, cleaning_box, wipe_volume); // Wipe the newly loaded filament until the end of the assigned wipe area.
|
||||||
++ m_num_tool_changes;
|
++ m_num_tool_changes;
|
||||||
} else
|
} else
|
||||||
toolchange_Unload(writer, cleaning_box, m_filpar[m_current_tool].material, m_filpar[m_current_tool].temperature);
|
toolchange_Unload(writer, cleaning_box, m_filpar[m_current_tool].material, m_filpar[m_current_tool].temperature, m_filpar[m_current_tool].temperature);
|
||||||
|
|
||||||
m_depth_traversed += wipe_area;
|
m_depth_traversed += wipe_area;
|
||||||
|
|
||||||
@ -848,13 +895,14 @@ void WipeTower::toolchange_Unload(
|
|||||||
WipeTowerWriter &writer,
|
WipeTowerWriter &writer,
|
||||||
const box_coordinates &cleaning_box,
|
const box_coordinates &cleaning_box,
|
||||||
const std::string& current_material,
|
const std::string& current_material,
|
||||||
|
const int old_temperature,
|
||||||
const int new_temperature)
|
const int new_temperature)
|
||||||
{
|
{
|
||||||
float xl = cleaning_box.ld.x() + 1.f * m_perimeter_width;
|
float xl = cleaning_box.ld.x() + 1.f * m_perimeter_width;
|
||||||
float xr = cleaning_box.rd.x() - 1.f * m_perimeter_width;
|
float xr = cleaning_box.rd.x() - 1.f * m_perimeter_width;
|
||||||
|
|
||||||
const float line_width = m_perimeter_width * m_filpar[m_current_tool].ramming_line_width_multiplicator; // desired ramming line thickness
|
const float line_width = m_perimeter_width * m_filpar[m_current_tool].ramming_line_width_multiplicator; // desired ramming line thickness
|
||||||
const float y_step = line_width * m_filpar[m_current_tool].ramming_step_multiplicator * m_extra_spacing; // spacing between lines in mm
|
const float y_step = line_width * m_filpar[m_current_tool].ramming_step_multiplicator * m_extra_spacing_ramming; // spacing between lines in mm
|
||||||
|
|
||||||
const Vec2f ramming_start_pos = Vec2f(xl, cleaning_box.ld.y() + m_depth_traversed + y_step/2.f);
|
const Vec2f ramming_start_pos = Vec2f(xl, cleaning_box.ld.y() + m_depth_traversed + y_step/2.f);
|
||||||
|
|
||||||
@ -867,10 +915,14 @@ void WipeTower::toolchange_Unload(
|
|||||||
float e_done = 0; // measures E move done from each segment
|
float e_done = 0; // measures E move done from each segment
|
||||||
|
|
||||||
const bool do_ramming = m_semm || m_filpar[m_current_tool].multitool_ramming;
|
const bool do_ramming = m_semm || m_filpar[m_current_tool].multitool_ramming;
|
||||||
|
const bool cold_ramming = m_is_mk4mmu3;
|
||||||
|
|
||||||
if (do_ramming) {
|
if (do_ramming) {
|
||||||
writer.travel(ramming_start_pos); // move to starting position
|
writer.travel(ramming_start_pos); // move to starting position
|
||||||
|
if (! m_is_mk4mmu3)
|
||||||
writer.disable_linear_advance();
|
writer.disable_linear_advance();
|
||||||
|
if (cold_ramming)
|
||||||
|
writer.set_extruder_temp(old_temperature - 20);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
writer.set_position(ramming_start_pos);
|
writer.set_position(ramming_start_pos);
|
||||||
@ -891,7 +943,7 @@ void WipeTower::toolchange_Unload(
|
|||||||
if (tch.old_tool == m_current_tool) {
|
if (tch.old_tool == m_current_tool) {
|
||||||
sum_of_depths += tch.ramming_depth;
|
sum_of_depths += tch.ramming_depth;
|
||||||
float ramming_end_y = sum_of_depths;
|
float ramming_end_y = sum_of_depths;
|
||||||
ramming_end_y -= (y_step/m_extra_spacing-m_perimeter_width) / 2.f; // center of final ramming line
|
ramming_end_y -= (y_step/m_extra_spacing_ramming-m_perimeter_width) / 2.f; // center of final ramming line
|
||||||
|
|
||||||
if ( (m_current_shape == SHAPE_REVERSED && ramming_end_y < sparse_beginning_y - 0.5f*m_perimeter_width ) ||
|
if ( (m_current_shape == SHAPE_REVERSED && ramming_end_y < sparse_beginning_y - 0.5f*m_perimeter_width ) ||
|
||||||
(m_current_shape == SHAPE_NORMAL && ramming_end_y > sparse_beginning_y + 0.5f*m_perimeter_width ) )
|
(m_current_shape == SHAPE_NORMAL && ramming_end_y > sparse_beginning_y + 0.5f*m_perimeter_width ) )
|
||||||
@ -905,6 +957,11 @@ void WipeTower::toolchange_Unload(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_is_mk4mmu3) {
|
||||||
|
writer.switch_filament_monitoring(false);
|
||||||
|
writer.wait(1.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// now the ramming itself:
|
// now the ramming itself:
|
||||||
while (do_ramming && i < m_filpar[m_current_tool].ramming_speed.size())
|
while (do_ramming && i < m_filpar[m_current_tool].ramming_speed.size())
|
||||||
@ -945,31 +1002,69 @@ void WipeTower::toolchange_Unload(
|
|||||||
.retract(0.10f * total_retraction_distance, 0.3f * 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)
|
||||||
.resume_preview();
|
.resume_preview();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const int& number_of_cooling_moves = m_filpar[m_current_tool].cooling_moves;
|
||||||
|
const bool cooling_will_happen = m_semm && number_of_cooling_moves > 0;
|
||||||
|
bool change_temp_later = false;
|
||||||
|
|
||||||
// Wipe tower should only change temperature with single extruder MM. Otherwise, all temperatures should
|
// Wipe tower should only change temperature with single extruder MM. Otherwise, all temperatures should
|
||||||
// be already set and there is no need to change anything. Also, the temperature could be changed
|
// be already set and there is no need to change anything. Also, the temperature could be changed
|
||||||
// for wrong extruder.
|
// for wrong extruder.
|
||||||
if (m_semm) {
|
if (m_semm) {
|
||||||
if (new_temperature != 0 && (new_temperature != m_old_temperature || is_first_layer()) ) { // Set the extruder temperature, but don't wait.
|
if (new_temperature != 0 && (new_temperature != m_old_temperature || is_first_layer() || cold_ramming) ) { // 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)
|
// 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).
|
// However, always change temperatures on the first layer (this is to avoid issues with priming lines turned off).
|
||||||
|
if (cold_ramming && cooling_will_happen)
|
||||||
|
change_temp_later = true;
|
||||||
|
else
|
||||||
writer.set_extruder_temp(new_temperature, false);
|
writer.set_extruder_temp(new_temperature, false);
|
||||||
m_old_temperature = new_temperature;
|
m_old_temperature = new_temperature;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cooling:
|
// Cooling:
|
||||||
const int& number_of_moves = m_filpar[m_current_tool].cooling_moves;
|
if (cooling_will_happen) {
|
||||||
if (m_semm && number_of_moves > 0) {
|
|
||||||
const float& initial_speed = m_filpar[m_current_tool].cooling_initial_speed;
|
const float& initial_speed = m_filpar[m_current_tool].cooling_initial_speed;
|
||||||
const float& final_speed = m_filpar[m_current_tool].cooling_final_speed;
|
const float& final_speed = m_filpar[m_current_tool].cooling_final_speed;
|
||||||
|
|
||||||
float speed_inc = (final_speed - initial_speed) / (2.f * number_of_moves - 1.f);
|
float speed_inc = (final_speed - initial_speed) / (2.f * number_of_cooling_moves - 1.f);
|
||||||
|
|
||||||
|
if (m_is_mk4mmu3)
|
||||||
|
writer.disable_linear_advance();
|
||||||
|
|
||||||
writer.suppress_preview()
|
writer.suppress_preview()
|
||||||
.travel(writer.x(), writer.y() + y_step);
|
.travel(writer.x(), writer.y() + y_step);
|
||||||
old_x = writer.x();
|
old_x = writer.x();
|
||||||
turning_point = xr-old_x > old_x-xl ? xr : xl;
|
turning_point = xr-old_x > old_x-xl ? xr : xl;
|
||||||
for (int i=0; i<number_of_moves; ++i) {
|
float stamping_dist_e = m_filpar[m_current_tool].filament_stamping_distance + m_cooling_tube_length / 2.f;
|
||||||
|
|
||||||
|
for (int i=0; i<number_of_cooling_moves; ++i) {
|
||||||
|
|
||||||
|
// Stamping - happens after every cooling move except for the last one.
|
||||||
|
if (i>0 && m_filpar[m_current_tool].filament_stamping_distance != 0) {
|
||||||
|
|
||||||
|
// Stamping turning point shall be no farther than 20mm from the current nozzle position:
|
||||||
|
float stamping_turning_point = std::clamp(old_x + 20.f * (turning_point - old_x > 0.f ? 1.f : -1.f), xl, xr);
|
||||||
|
|
||||||
|
// Only last 5mm will be done with the fast x travel. The point is to spread possible blobs
|
||||||
|
// along the whole wipe tower.
|
||||||
|
if (stamping_dist_e > 5) {
|
||||||
|
float cent = writer.x();
|
||||||
|
writer.load_move_x_advanced(stamping_turning_point, (stamping_dist_e - 5), m_filpar[m_current_tool].filament_stamping_loading_speed, 200);
|
||||||
|
writer.load_move_x_advanced(cent, 5, m_filpar[m_current_tool].filament_stamping_loading_speed, m_travel_speed);
|
||||||
|
writer.travel(cent, writer.y());
|
||||||
|
} else
|
||||||
|
writer.load_move_x_advanced_there_and_back(stamping_turning_point, stamping_dist_e, m_filpar[m_current_tool].filament_stamping_loading_speed, m_travel_speed);
|
||||||
|
|
||||||
|
// Retract while the print head is stationary, so if there is a blob, it is not dragged along.
|
||||||
|
writer.retract(stamping_dist_e, m_filpar[m_current_tool].unloading_speed * 60.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == number_of_cooling_moves - 1 && change_temp_later) {
|
||||||
|
// If cold_ramming, the temperature change should be done before the last cooling move.
|
||||||
|
writer.set_extruder_temp(new_temperature, false);
|
||||||
|
}
|
||||||
|
|
||||||
float speed = initial_speed + speed_inc * 2*i;
|
float speed = initial_speed + speed_inc * 2*i;
|
||||||
writer.load_move_x_advanced(turning_point, m_cooling_tube_length, speed);
|
writer.load_move_x_advanced(turning_point, m_cooling_tube_length, speed);
|
||||||
speed += speed_inc;
|
speed += speed_inc;
|
||||||
@ -986,7 +1081,7 @@ void WipeTower::toolchange_Unload(
|
|||||||
|
|
||||||
// this is to align ramming and future wiping extrusions, so the future y-steps can be uniform from the start:
|
// 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
|
// the perimeter_width will later be subtracted, it is there to not load while moving over just extruded material
|
||||||
Vec2f pos = Vec2f(end_of_ramming.x(), end_of_ramming.y() + (y_step/m_extra_spacing-m_perimeter_width) / 2.f + m_perimeter_width);
|
Vec2f pos = Vec2f(end_of_ramming.x(), end_of_ramming.y() + (y_step/m_extra_spacing_ramming-m_perimeter_width) / 2.f + m_perimeter_width);
|
||||||
if (do_ramming)
|
if (do_ramming)
|
||||||
writer.travel(pos, 2400.f);
|
writer.travel(pos, 2400.f);
|
||||||
else
|
else
|
||||||
@ -1011,6 +1106,9 @@ void WipeTower::toolchange_Change(
|
|||||||
//writer.append("[end_filament_gcode]\n");
|
//writer.append("[end_filament_gcode]\n");
|
||||||
writer.append("[toolchange_gcode_from_wipe_tower_generator]\n");
|
writer.append("[toolchange_gcode_from_wipe_tower_generator]\n");
|
||||||
|
|
||||||
|
if (m_is_mk4mmu3)
|
||||||
|
writer.switch_filament_monitoring(true);
|
||||||
|
|
||||||
// Travel to where we assume we are. Custom toolchange or some special T code handling (parking extruder etc)
|
// Travel to where we assume we are. Custom toolchange or some special T code handling (parking extruder etc)
|
||||||
// gcode could have left the extruder somewhere, we cannot just start extruding. We should also inform the
|
// gcode could have left the extruder somewhere, we cannot just start extruding. We should also inform the
|
||||||
// postprocessor that we absolutely want to have this in the gcode, even if it thought it is the same as before.
|
// postprocessor that we absolutely want to have this in the gcode, even if it thought it is the same as before.
|
||||||
@ -1072,20 +1170,24 @@ void WipeTower::toolchange_Wipe(
|
|||||||
const float& xl = cleaning_box.ld.x();
|
const float& xl = cleaning_box.ld.x();
|
||||||
const float& xr = cleaning_box.rd.x();
|
const float& xr = cleaning_box.rd.x();
|
||||||
|
|
||||||
|
writer.set_extrusion_flow(m_extrusion_flow * m_extra_flow);
|
||||||
|
const float line_width = m_perimeter_width * m_extra_flow;
|
||||||
|
writer.change_analyzer_line_width(line_width);
|
||||||
|
|
||||||
// Variables x_to_wipe and traversed_x are here to be able to make sure it always wipes at least
|
// Variables x_to_wipe and traversed_x are here to be able to make sure it always wipes at least
|
||||||
// the ordered volume, even if it means violating the box. This can later be removed and simply
|
// the ordered volume, even if it means violating the box. This can later be removed and simply
|
||||||
// wipe until the end of the assigned area.
|
// wipe until the end of the assigned area.
|
||||||
|
|
||||||
float x_to_wipe = volume_to_length(wipe_volume, m_perimeter_width, m_layer_height) * (is_first_layer() ? m_extra_spacing : 1.f);
|
float x_to_wipe = volume_to_length(wipe_volume, m_perimeter_width, m_layer_height) / m_extra_flow;
|
||||||
float dy = (is_first_layer() ? 1.f : m_extra_spacing) * m_perimeter_width; // Don't use the extra spacing for the first layer.
|
float dy = (is_first_layer() ? m_extra_flow : m_extra_spacing_wipe) * m_perimeter_width; // Don't use the extra spacing for the first layer, but do use the spacing resulting from increased flow.
|
||||||
// All the calculations in all other places take the spacing into account for all the layers.
|
// All the calculations in all other places take the spacing into account for all the layers.
|
||||||
|
|
||||||
const float target_speed = is_first_layer() ? m_first_layer_speed * 60.f : m_infill_speed * 60.f;
|
const float target_speed = is_first_layer() ? m_first_layer_speed * 60.f : m_infill_speed * 60.f;
|
||||||
float wipe_speed = 0.33f * target_speed;
|
float wipe_speed = 0.33f * target_speed;
|
||||||
|
|
||||||
// if there is less than 2.5*m_perimeter_width to the edge, advance straightaway (there is likely a blob anyway)
|
// if there is less than 2.5*line_width to the edge, advance straightaway (there is likely a blob anyway)
|
||||||
if ((m_left_to_right ? xr-writer.x() : writer.x()-xl) < 2.5f*m_perimeter_width) {
|
if ((m_left_to_right ? xr-writer.x() : writer.x()-xl) < 2.5f*line_width) {
|
||||||
writer.travel((m_left_to_right ? xr-m_perimeter_width : xl+m_perimeter_width),writer.y()+dy);
|
writer.travel((m_left_to_right ? xr-line_width : xl+line_width),writer.y()+dy);
|
||||||
m_left_to_right = !m_left_to_right;
|
m_left_to_right = !m_left_to_right;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1100,21 +1202,21 @@ void WipeTower::toolchange_Wipe(
|
|||||||
|
|
||||||
float traversed_x = writer.x();
|
float traversed_x = writer.x();
|
||||||
if (m_left_to_right)
|
if (m_left_to_right)
|
||||||
writer.extrude(xr - (i % 4 == 0 ? 0 : 1.5f*m_perimeter_width), writer.y(), wipe_speed);
|
writer.extrude(xr - (i % 4 == 0 ? 0 : 1.5f*line_width), writer.y(), wipe_speed);
|
||||||
else
|
else
|
||||||
writer.extrude(xl + (i % 4 == 1 ? 0 : 1.5f*m_perimeter_width), writer.y(), wipe_speed);
|
writer.extrude(xl + (i % 4 == 1 ? 0 : 1.5f*line_width), writer.y(), wipe_speed);
|
||||||
|
|
||||||
if (writer.y()+float(EPSILON) > cleaning_box.lu.y()-0.5f*m_perimeter_width)
|
if (writer.y()+float(EPSILON) > cleaning_box.lu.y()-0.5f*line_width)
|
||||||
break; // in case next line would not fit
|
break; // in case next line would not fit
|
||||||
|
|
||||||
traversed_x -= writer.x();
|
traversed_x -= writer.x();
|
||||||
x_to_wipe -= std::abs(traversed_x);
|
x_to_wipe -= std::abs(traversed_x);
|
||||||
if (x_to_wipe < WT_EPSILON) {
|
if (x_to_wipe < WT_EPSILON) {
|
||||||
writer.travel(m_left_to_right ? xl + 1.5f*m_perimeter_width : xr - 1.5f*m_perimeter_width, writer.y(), 7200);
|
writer.travel(m_left_to_right ? xl + 1.5f*line_width : xr - 1.5f*line_width, writer.y(), 7200);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// stepping to the next line:
|
// stepping to the next line:
|
||||||
writer.extrude(writer.x() + (i % 4 == 0 ? -1.f : (i % 4 == 1 ? 1.f : 0.f)) * 1.5f*m_perimeter_width, writer.y() + dy);
|
writer.extrude(writer.x() + (i % 4 == 0 ? -1.f : (i % 4 == 1 ? 1.f : 0.f)) * 1.5f*line_width, writer.y() + dy);
|
||||||
m_left_to_right = !m_left_to_right;
|
m_left_to_right = !m_left_to_right;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1128,6 +1230,7 @@ void WipeTower::toolchange_Wipe(
|
|||||||
m_left_to_right = !m_left_to_right;
|
m_left_to_right = !m_left_to_right;
|
||||||
|
|
||||||
writer.set_extrusion_flow(m_extrusion_flow); // Reset the extrusion flow.
|
writer.set_extrusion_flow(m_extrusion_flow); // Reset the extrusion flow.
|
||||||
|
writer.change_analyzer_line_width(m_perimeter_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1418,6 +1521,17 @@ std::vector<std::vector<float>> WipeTower::extract_wipe_volumes(const PrintConfi
|
|||||||
return wipe_volumes;
|
return wipe_volumes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static float get_wipe_depth(float volume, float layer_height, float perimeter_width, float extra_flow, float extra_spacing, float width)
|
||||||
|
{
|
||||||
|
float length_to_extrude = (volume_to_length(volume, perimeter_width, layer_height)) / extra_flow;
|
||||||
|
length_to_extrude = std::max(length_to_extrude,0.f);
|
||||||
|
|
||||||
|
return (int(length_to_extrude / width) + 1) * perimeter_width * extra_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Appends a toolchange into m_plan and calculates neccessary depth of the corresponding box
|
// Appends a toolchange into m_plan and calculates neccessary depth of the corresponding box
|
||||||
void WipeTower::plan_toolchange(float z_par, float layer_height_par, unsigned int old_tool,
|
void WipeTower::plan_toolchange(float z_par, float layer_height_par, unsigned int old_tool,
|
||||||
unsigned int new_tool, float wipe_volume)
|
unsigned int new_tool, float wipe_volume)
|
||||||
@ -1434,22 +1548,17 @@ void WipeTower::plan_toolchange(float z_par, float layer_height_par, unsigned in
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// this is an actual toolchange - let's calculate depth to reserve on the wipe tower
|
// this is an actual toolchange - let's calculate depth to reserve on the wipe tower
|
||||||
float depth = 0.f;
|
|
||||||
float width = m_wipe_tower_width - 3*m_perimeter_width;
|
float width = m_wipe_tower_width - 3*m_perimeter_width;
|
||||||
float length_to_extrude = volume_to_length(0.25f * std::accumulate(m_filpar[old_tool].ramming_speed.begin(), m_filpar[old_tool].ramming_speed.end(), 0.f),
|
float length_to_extrude = volume_to_length(0.25f * std::accumulate(m_filpar[old_tool].ramming_speed.begin(), m_filpar[old_tool].ramming_speed.end(), 0.f),
|
||||||
m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator,
|
m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator,
|
||||||
layer_height_par);
|
layer_height_par);
|
||||||
depth = (int(length_to_extrude / width) + 1) * (m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator * m_filpar[old_tool].ramming_step_multiplicator);
|
float ramming_depth = (int(length_to_extrude / width) + 1) * (m_perimeter_width * m_filpar[old_tool].ramming_line_width_multiplicator * m_filpar[old_tool].ramming_step_multiplicator) * m_extra_spacing_ramming;
|
||||||
float ramming_depth = depth;
|
float first_wipe_line = - (width*((length_to_extrude / width)-int(length_to_extrude / width)) - width);
|
||||||
length_to_extrude = width*((length_to_extrude / width)-int(length_to_extrude / width)) - width;
|
|
||||||
float first_wipe_line = -length_to_extrude;
|
|
||||||
length_to_extrude += volume_to_length(wipe_volume, m_perimeter_width, layer_height_par);
|
|
||||||
length_to_extrude = std::max(length_to_extrude,0.f);
|
|
||||||
|
|
||||||
depth += (int(length_to_extrude / width) + 1) * m_perimeter_width;
|
float first_wipe_volume = length_to_volume(first_wipe_line, m_perimeter_width * m_extra_flow, layer_height_par);
|
||||||
depth *= m_extra_spacing;
|
float wiping_depth = get_wipe_depth(wipe_volume - first_wipe_volume, layer_height_par, m_perimeter_width, m_extra_flow, m_extra_spacing_wipe, width);
|
||||||
|
|
||||||
m_plan.back().tool_changes.push_back(WipeTowerInfo::ToolChange(old_tool, new_tool, depth, ramming_depth, first_wipe_line, wipe_volume));
|
m_plan.back().tool_changes.push_back(WipeTowerInfo::ToolChange(old_tool, new_tool, ramming_depth + wiping_depth, ramming_depth, first_wipe_line, wipe_volume));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1500,14 +1609,14 @@ void WipeTower::save_on_last_wipe()
|
|||||||
|
|
||||||
if (i == idx) {
|
if (i == idx) {
|
||||||
float width = m_wipe_tower_width - 3*m_perimeter_width; // width we draw into
|
float width = m_wipe_tower_width - 3*m_perimeter_width; // width we draw into
|
||||||
float length_to_save = finish_layer().total_extrusion_length_in_plane();
|
|
||||||
float length_to_wipe = volume_to_length(toolchange.wipe_volume,
|
|
||||||
m_perimeter_width, m_layer_info->height) - toolchange.first_wipe_line - length_to_save;
|
|
||||||
|
|
||||||
length_to_wipe = std::max(length_to_wipe,0.f);
|
float volume_to_save = length_to_volume(finish_layer().total_extrusion_length_in_plane(), m_perimeter_width, m_layer_info->height);
|
||||||
float depth_to_wipe = m_perimeter_width * (std::floor(length_to_wipe/width) + ( length_to_wipe > 0.f ? 1.f : 0.f ) );
|
float volume_left_to_wipe = std::max(m_filpar[toolchange.new_tool].filament_minimal_purge_on_wipe_tower, toolchange.wipe_volume_total - volume_to_save);
|
||||||
|
float volume_we_need_depth_for = std::max(0.f, volume_left_to_wipe - length_to_volume(toolchange.first_wipe_line, m_perimeter_width*m_extra_flow, m_layer_info->height));
|
||||||
|
float depth_to_wipe = get_wipe_depth(volume_we_need_depth_for, m_layer_info->height, m_perimeter_width, m_extra_flow, m_extra_spacing_wipe, width);
|
||||||
|
|
||||||
toolchange.required_depth = (toolchange.ramming_depth + depth_to_wipe) * m_extra_spacing;
|
toolchange.required_depth = toolchange.ramming_depth + depth_to_wipe;
|
||||||
|
toolchange.wipe_volume = volume_left_to_wipe;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1552,7 +1661,7 @@ void WipeTower::generate(std::vector<std::vector<WipeTower::ToolChangeResult>> &
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
plan_tower();
|
plan_tower();
|
||||||
for (int i=0;i<5;++i) {
|
for (int i = 0; i<5; ++i) {
|
||||||
save_on_last_wipe();
|
save_on_last_wipe();
|
||||||
plan_tower();
|
plan_tower();
|
||||||
}
|
}
|
||||||
|
@ -236,6 +236,10 @@ public:
|
|||||||
float unloading_speed = 0.f;
|
float unloading_speed = 0.f;
|
||||||
float unloading_speed_start = 0.f;
|
float unloading_speed_start = 0.f;
|
||||||
float delay = 0.f ;
|
float delay = 0.f ;
|
||||||
|
|
||||||
|
float filament_stamping_loading_speed = 0.f;
|
||||||
|
float filament_stamping_distance = 0.f;
|
||||||
|
|
||||||
int cooling_moves = 0;
|
int cooling_moves = 0;
|
||||||
float cooling_initial_speed = 0.f;
|
float cooling_initial_speed = 0.f;
|
||||||
float cooling_final_speed = 0.f;
|
float cooling_final_speed = 0.f;
|
||||||
@ -247,6 +251,7 @@ public:
|
|||||||
float filament_area;
|
float filament_area;
|
||||||
bool multitool_ramming;
|
bool multitool_ramming;
|
||||||
float multitool_ramming_time = 0.f;
|
float multitool_ramming_time = 0.f;
|
||||||
|
float filament_minimal_purge_on_wipe_tower = 0.f;
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -264,6 +269,7 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
bool m_semm = true; // Are we using a single extruder multimaterial printer?
|
bool m_semm = true; // Are we using a single extruder multimaterial printer?
|
||||||
|
bool m_is_mk4mmu3 = false;
|
||||||
Vec2f m_wipe_tower_pos; // Left front corner of the wipe tower in mm.
|
Vec2f m_wipe_tower_pos; // Left front corner of the wipe tower in mm.
|
||||||
float m_wipe_tower_width; // Width of the wipe tower.
|
float m_wipe_tower_width; // Width of the wipe tower.
|
||||||
float m_wipe_tower_depth = 0.f; // Depth of the wipe tower
|
float m_wipe_tower_depth = 0.f; // Depth of the wipe tower
|
||||||
@ -313,8 +319,7 @@ private:
|
|||||||
// State of the wipe tower generator.
|
// State of the wipe tower generator.
|
||||||
unsigned int m_num_layer_changes = 0; // Layer change counter for the output statistics.
|
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_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.
|
|
||||||
bool m_print_brim = true;
|
|
||||||
// A fill-in direction (positive Y, negative Y) alternates with each layer.
|
// A fill-in direction (positive Y, negative Y) alternates with each layer.
|
||||||
wipe_shape m_current_shape = SHAPE_NORMAL;
|
wipe_shape m_current_shape = SHAPE_NORMAL;
|
||||||
size_t m_current_tool = 0;
|
size_t m_current_tool = 0;
|
||||||
@ -323,7 +328,9 @@ private:
|
|||||||
float m_depth_traversed = 0.f; // Current y position at the wipe tower.
|
float m_depth_traversed = 0.f; // Current y position at the wipe tower.
|
||||||
bool m_current_layer_finished = false;
|
bool m_current_layer_finished = false;
|
||||||
bool m_left_to_right = true;
|
bool m_left_to_right = true;
|
||||||
float m_extra_spacing = 1.f;
|
float m_extra_flow = 1.f;
|
||||||
|
float m_extra_spacing_wipe = 1.f;
|
||||||
|
float m_extra_spacing_ramming = 1.f;
|
||||||
|
|
||||||
bool is_first_layer() const { return size_t(m_layer_info - m_plan.begin()) == m_first_layer_idx; }
|
bool is_first_layer() const { return size_t(m_layer_info - m_plan.begin()) == m_first_layer_idx; }
|
||||||
|
|
||||||
@ -335,17 +342,10 @@ private:
|
|||||||
return layer_height * ( m_perimeter_width - layer_height * (1.f-float(M_PI)/4.f)) / filament_area();
|
return layer_height * ( m_perimeter_width - layer_height * (1.f-float(M_PI)/4.f)) / filament_area();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculates length of extrusion line to extrude given volume
|
|
||||||
float volume_to_length(float volume, float line_width, float layer_height) const {
|
|
||||||
return std::max(0.f, volume / (layer_height * (line_width - layer_height * (1.f - float(M_PI) / 4.f))));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculates depth for all layers and propagates them downwards
|
// Calculates depth for all layers and propagates them downwards
|
||||||
void plan_tower();
|
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
|
// Goes through m_plan, calculates border and finish_layer extrusions and subtracts them from last wipe
|
||||||
void save_on_last_wipe();
|
void save_on_last_wipe();
|
||||||
|
|
||||||
@ -359,19 +359,19 @@ private:
|
|||||||
float ramming_depth;
|
float ramming_depth;
|
||||||
float first_wipe_line;
|
float first_wipe_line;
|
||||||
float wipe_volume;
|
float wipe_volume;
|
||||||
|
float wipe_volume_total;
|
||||||
ToolChange(size_t old, size_t newtool, float depth=0.f, float ramming_depth=0.f, float fwl=0.f, float wv=0.f)
|
ToolChange(size_t old, size_t 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} {}
|
: old_tool{old}, new_tool{newtool}, required_depth{depth}, ramming_depth{ramming_depth}, first_wipe_line{fwl}, wipe_volume{wv}, wipe_volume_total{wv} {}
|
||||||
};
|
};
|
||||||
float z; // z position of the layer
|
float z; // z position of the layer
|
||||||
float height; // layer height
|
float height; // layer height
|
||||||
float depth; // depth of the layer based on all layers above
|
float depth; // depth of the layer based on all layers above
|
||||||
float extra_spacing;
|
|
||||||
float toolchanges_depth() const { float sum = 0.f; for (const auto &a : tool_changes) sum += a.required_depth; return sum; }
|
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;
|
std::vector<ToolChange> tool_changes;
|
||||||
|
|
||||||
WipeTowerInfo(float z_par, float layer_height_par)
|
WipeTowerInfo(float z_par, float layer_height_par)
|
||||||
: z{z_par}, height{layer_height_par}, depth{0}, extra_spacing{1.f} {}
|
: z{z_par}, height{layer_height_par}, depth{0} {}
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<WipeTowerInfo> m_plan; // Stores information about all layers and toolchanges for the future wipe tower (filled by plan_toolchange(...))
|
std::vector<WipeTowerInfo> m_plan; // Stores information about all layers and toolchanges for the future wipe tower (filled by plan_toolchange(...))
|
||||||
@ -394,6 +394,7 @@ private:
|
|||||||
WipeTowerWriter &writer,
|
WipeTowerWriter &writer,
|
||||||
const box_coordinates &cleaning_box,
|
const box_coordinates &cleaning_box,
|
||||||
const std::string& current_material,
|
const std::string& current_material,
|
||||||
|
const int old_temperature,
|
||||||
const int new_temperature);
|
const int new_temperature);
|
||||||
|
|
||||||
void toolchange_Change(
|
void toolchange_Change(
|
||||||
|
@ -106,7 +106,11 @@ std::string WipeTowerIntegration::append_tcr(GCodeGenerator &gcodegen, const Wip
|
|||||||
boost::replace_first(tcr_rotated_gcode, "[deretraction_from_wipe_tower_generator]", deretraction_str);
|
boost::replace_first(tcr_rotated_gcode, "[deretraction_from_wipe_tower_generator]", deretraction_str);
|
||||||
std::string tcr_gcode;
|
std::string tcr_gcode;
|
||||||
unescape_string_cstyle(tcr_rotated_gcode, tcr_gcode);
|
unescape_string_cstyle(tcr_rotated_gcode, tcr_gcode);
|
||||||
|
|
||||||
|
if (gcodegen.config().default_acceleration > 0)
|
||||||
|
gcode += gcodegen.writer().set_print_acceleration(fast_round_up<unsigned int>(gcodegen.config().wipe_tower_acceleration.value));
|
||||||
gcode += tcr_gcode;
|
gcode += tcr_gcode;
|
||||||
|
gcode += gcodegen.writer().set_print_acceleration(fast_round_up<unsigned int>(gcodegen.config().default_acceleration.value));
|
||||||
|
|
||||||
// A phony move to the end position at the wipe tower.
|
// A phony move to the end position at the wipe tower.
|
||||||
gcodegen.writer().travel_to_xy(end_pos.cast<double>());
|
gcodegen.writer().travel_to_xy(end_pos.cast<double>());
|
||||||
|
@ -450,7 +450,7 @@ static std::vector<std::string> s_Preset_print_options {
|
|||||||
"enable_dynamic_overhang_speeds", "overhang_speed_0", "overhang_speed_1", "overhang_speed_2", "overhang_speed_3",
|
"enable_dynamic_overhang_speeds", "overhang_speed_0", "overhang_speed_1", "overhang_speed_2", "overhang_speed_3",
|
||||||
"top_solid_infill_speed", "support_material_speed", "support_material_xy_spacing", "support_material_interface_speed",
|
"top_solid_infill_speed", "support_material_speed", "support_material_xy_spacing", "support_material_interface_speed",
|
||||||
"bridge_speed", "gap_fill_speed", "gap_fill_enabled", "travel_speed", "travel_speed_z", "first_layer_speed", "first_layer_speed_over_raft", "perimeter_acceleration", "infill_acceleration",
|
"bridge_speed", "gap_fill_speed", "gap_fill_enabled", "travel_speed", "travel_speed_z", "first_layer_speed", "first_layer_speed_over_raft", "perimeter_acceleration", "infill_acceleration",
|
||||||
"external_perimeter_acceleration", "top_solid_infill_acceleration", "solid_infill_acceleration", "travel_acceleration",
|
"external_perimeter_acceleration", "top_solid_infill_acceleration", "solid_infill_acceleration", "travel_acceleration", "wipe_tower_acceleration",
|
||||||
"bridge_acceleration", "first_layer_acceleration", "first_layer_acceleration_over_raft", "default_acceleration", "skirts", "skirt_distance", "skirt_height", "draft_shield",
|
"bridge_acceleration", "first_layer_acceleration", "first_layer_acceleration_over_raft", "default_acceleration", "skirts", "skirt_distance", "skirt_height", "draft_shield",
|
||||||
"min_skirt_length", "brim_width", "brim_separation", "brim_type", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers",
|
"min_skirt_length", "brim_width", "brim_separation", "brim_type", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers",
|
||||||
"raft_layers", "raft_first_layer_density", "raft_first_layer_expansion", "raft_contact_distance", "raft_expansion",
|
"raft_layers", "raft_first_layer_density", "raft_first_layer_expansion", "raft_contact_distance", "raft_expansion",
|
||||||
@ -470,7 +470,7 @@ static std::vector<std::string> s_Preset_print_options {
|
|||||||
"elefant_foot_compensation", "xy_size_compensation", "resolution", "gcode_resolution", "arc_fitting",
|
"elefant_foot_compensation", "xy_size_compensation", "resolution", "gcode_resolution", "arc_fitting",
|
||||||
"wipe_tower", "wipe_tower_x", "wipe_tower_y",
|
"wipe_tower", "wipe_tower_x", "wipe_tower_y",
|
||||||
"wipe_tower_width", "wipe_tower_cone_angle", "wipe_tower_rotation_angle", "wipe_tower_brim_width", "wipe_tower_bridging", "single_extruder_multi_material_priming", "mmu_segmented_region_max_width",
|
"wipe_tower_width", "wipe_tower_cone_angle", "wipe_tower_rotation_angle", "wipe_tower_brim_width", "wipe_tower_bridging", "single_extruder_multi_material_priming", "mmu_segmented_region_max_width",
|
||||||
"mmu_segmented_region_interlocking_depth", "wipe_tower_extruder", "wipe_tower_no_sparse_layers", "wipe_tower_extra_spacing", "compatible_printers", "compatible_printers_condition", "inherits",
|
"mmu_segmented_region_interlocking_depth", "wipe_tower_extruder", "wipe_tower_no_sparse_layers", "wipe_tower_extra_flow", "wipe_tower_extra_spacing", "compatible_printers", "compatible_printers_condition", "inherits",
|
||||||
"perimeter_generator", "wall_transition_length", "wall_transition_filter_deviation", "wall_transition_angle",
|
"perimeter_generator", "wall_transition_length", "wall_transition_filter_deviation", "wall_transition_angle",
|
||||||
"wall_distribution_count", "min_feature_size", "min_bead_width"
|
"wall_distribution_count", "min_feature_size", "min_bead_width"
|
||||||
};
|
};
|
||||||
@ -478,7 +478,7 @@ static std::vector<std::string> s_Preset_print_options {
|
|||||||
static std::vector<std::string> s_Preset_filament_options {
|
static std::vector<std::string> s_Preset_filament_options {
|
||||||
"filament_colour", "filament_diameter", "filament_type", "filament_soluble", "filament_notes", "filament_max_volumetric_speed",
|
"filament_colour", "filament_diameter", "filament_type", "filament_soluble", "filament_notes", "filament_max_volumetric_speed",
|
||||||
"extrusion_multiplier", "filament_density", "filament_cost", "filament_spool_weight", "filament_loading_speed", "filament_loading_speed_start", "filament_load_time",
|
"extrusion_multiplier", "filament_density", "filament_cost", "filament_spool_weight", "filament_loading_speed", "filament_loading_speed_start", "filament_load_time",
|
||||||
"filament_unloading_speed", "filament_unloading_speed_start", "filament_unload_time", "filament_toolchange_delay", "filament_cooling_moves",
|
"filament_unloading_speed", "filament_unloading_speed_start", "filament_unload_time", "filament_toolchange_delay", "filament_cooling_moves", "filament_stamping_loading_speed", "filament_stamping_distance",
|
||||||
"filament_cooling_initial_speed", "filament_cooling_final_speed", "filament_ramming_parameters", "filament_minimal_purge_on_wipe_tower",
|
"filament_cooling_initial_speed", "filament_cooling_final_speed", "filament_ramming_parameters", "filament_minimal_purge_on_wipe_tower",
|
||||||
"filament_multitool_ramming", "filament_multitool_ramming_volume", "filament_multitool_ramming_flow",
|
"filament_multitool_ramming", "filament_multitool_ramming_volume", "filament_multitool_ramming_flow",
|
||||||
"temperature", "idle_temperature", "first_layer_temperature", "bed_temperature", "first_layer_bed_temperature", "fan_always_on", "cooling", "min_fan_speed",
|
"temperature", "idle_temperature", "first_layer_temperature", "bed_temperature", "first_layer_bed_temperature", "fan_always_on", "cooling", "min_fan_speed",
|
||||||
|
@ -172,7 +172,8 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n
|
|||||||
"use_relative_e_distances",
|
"use_relative_e_distances",
|
||||||
"use_volumetric_e",
|
"use_volumetric_e",
|
||||||
"variable_layer_height",
|
"variable_layer_height",
|
||||||
"wipe"
|
"wipe",
|
||||||
|
"wipe_tower_acceleration"
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::unordered_set<std::string> steps_ignore;
|
static std::unordered_set<std::string> steps_ignore;
|
||||||
@ -218,6 +219,8 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n
|
|||||||
|| opt_key == "filament_unloading_speed_start"
|
|| opt_key == "filament_unloading_speed_start"
|
||||||
|| opt_key == "filament_toolchange_delay"
|
|| opt_key == "filament_toolchange_delay"
|
||||||
|| opt_key == "filament_cooling_moves"
|
|| opt_key == "filament_cooling_moves"
|
||||||
|
|| opt_key == "filament_stamping_loading_speed"
|
||||||
|
|| opt_key == "filament_stamping_distance"
|
||||||
|| opt_key == "filament_minimal_purge_on_wipe_tower"
|
|| opt_key == "filament_minimal_purge_on_wipe_tower"
|
||||||
|| opt_key == "filament_cooling_initial_speed"
|
|| opt_key == "filament_cooling_initial_speed"
|
||||||
|| opt_key == "filament_cooling_final_speed"
|
|| opt_key == "filament_cooling_final_speed"
|
||||||
@ -238,6 +241,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n
|
|||||||
|| opt_key == "wipe_tower_cone_angle"
|
|| opt_key == "wipe_tower_cone_angle"
|
||||||
|| opt_key == "wipe_tower_bridging"
|
|| opt_key == "wipe_tower_bridging"
|
||||||
|| opt_key == "wipe_tower_extra_spacing"
|
|| opt_key == "wipe_tower_extra_spacing"
|
||||||
|
|| opt_key == "wipe_tower_extra_flow"
|
||||||
|| opt_key == "wipe_tower_no_sparse_layers"
|
|| opt_key == "wipe_tower_no_sparse_layers"
|
||||||
|| opt_key == "wipe_tower_extruder"
|
|| opt_key == "wipe_tower_extruder"
|
||||||
|| opt_key == "wiping_volumes_matrix"
|
|| opt_key == "wiping_volumes_matrix"
|
||||||
|
@ -1093,6 +1093,21 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->mode = comExpert;
|
def->mode = comExpert;
|
||||||
def->set_default_value(new ConfigOptionFloats { 0. });
|
def->set_default_value(new ConfigOptionFloats { 0. });
|
||||||
|
|
||||||
|
def = this->add("filament_stamping_loading_speed", coFloats);
|
||||||
|
def->label = L("Stamping loading speed");
|
||||||
|
def->tooltip = L("Speed used for stamping.");
|
||||||
|
def->min = 0;
|
||||||
|
def->mode = comExpert;
|
||||||
|
def->set_default_value(new ConfigOptionFloats { 20. });
|
||||||
|
|
||||||
|
def = this->add("filament_stamping_distance", coFloats);
|
||||||
|
def->label = L("Stamping distance measured from the center of the cooling tube");
|
||||||
|
def->tooltip = L("If set to nonzero value, filament is moved toward the nozzle between the individual cooling moves (\"stamping\"). "
|
||||||
|
"This option configures how long this movement should be before the filament is retracted again.");
|
||||||
|
def->min = 0;
|
||||||
|
def->mode = comExpert;
|
||||||
|
def->set_default_value(new ConfigOptionFloats { 0. });
|
||||||
|
|
||||||
def = this->add("filament_cooling_moves", coInts);
|
def = this->add("filament_cooling_moves", coInts);
|
||||||
def->label = L("Number of cooling moves");
|
def->label = L("Number of cooling moves");
|
||||||
def->tooltip = L("Filament is cooled by being moved back and forth in the "
|
def->tooltip = L("Filament is cooled by being moved back and forth in the "
|
||||||
@ -1546,6 +1561,15 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->mode = comExpert;
|
def->mode = comExpert;
|
||||||
def->set_default_value(new ConfigOptionFloat(0));
|
def->set_default_value(new ConfigOptionFloat(0));
|
||||||
|
|
||||||
|
def = this->add("wipe_tower_acceleration", coFloat);
|
||||||
|
def->label = L("Wipe tower");
|
||||||
|
def->tooltip = L("This is the acceleration your printer will use for wipe tower. Set zero to disable "
|
||||||
|
"acceleration control for the wipe tower.");
|
||||||
|
def->sidetext = L("mm/s²");
|
||||||
|
def->min = 0;
|
||||||
|
def->mode = comExpert;
|
||||||
|
def->set_default_value(new ConfigOptionFloat(0));
|
||||||
|
|
||||||
def = this->add("travel_acceleration", coFloat);
|
def = this->add("travel_acceleration", coFloat);
|
||||||
def->label = L("Travel");
|
def->label = L("Travel");
|
||||||
def->tooltip = L("This is the acceleration your printer will use for travel moves. Set zero to disable "
|
def->tooltip = L("This is the acceleration your printer will use for travel moves. Set zero to disable "
|
||||||
@ -3333,6 +3357,15 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->max = 300.;
|
def->max = 300.;
|
||||||
def->set_default_value(new ConfigOptionPercent(100.));
|
def->set_default_value(new ConfigOptionPercent(100.));
|
||||||
|
|
||||||
|
def = this->add("wipe_tower_extra_flow", coPercent);
|
||||||
|
def->label = L("Extra flow for purging");
|
||||||
|
def->tooltip = L("");
|
||||||
|
def->sidetext = L("%");
|
||||||
|
def->mode = comExpert;
|
||||||
|
def->min = 100.;
|
||||||
|
def->max = 300.;
|
||||||
|
def->set_default_value(new ConfigOptionPercent(100.));
|
||||||
|
|
||||||
def = this->add("wipe_into_infill", coBool);
|
def = this->add("wipe_into_infill", coBool);
|
||||||
def->category = L("Wipe options");
|
def->category = L("Wipe options");
|
||||||
def->label = L("Wipe into this object's infill");
|
def->label = L("Wipe into this object's infill");
|
||||||
|
@ -731,6 +731,8 @@ PRINT_CONFIG_CLASS_DEFINE(
|
|||||||
((ConfigOptionBools, filament_multitool_ramming))
|
((ConfigOptionBools, filament_multitool_ramming))
|
||||||
((ConfigOptionFloats, filament_multitool_ramming_volume))
|
((ConfigOptionFloats, filament_multitool_ramming_volume))
|
||||||
((ConfigOptionFloats, filament_multitool_ramming_flow))
|
((ConfigOptionFloats, filament_multitool_ramming_flow))
|
||||||
|
((ConfigOptionFloats, filament_stamping_loading_speed))
|
||||||
|
((ConfigOptionFloats, filament_stamping_distance))
|
||||||
((ConfigOptionBool, gcode_comments))
|
((ConfigOptionBool, gcode_comments))
|
||||||
((ConfigOptionEnum<GCodeFlavor>, gcode_flavor))
|
((ConfigOptionEnum<GCodeFlavor>, gcode_flavor))
|
||||||
((ConfigOptionEnum<LabelObjectsStyle>, gcode_label_objects))
|
((ConfigOptionEnum<LabelObjectsStyle>, gcode_label_objects))
|
||||||
@ -866,6 +868,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE(
|
|||||||
((ConfigOptionFloat, travel_acceleration))
|
((ConfigOptionFloat, travel_acceleration))
|
||||||
((ConfigOptionBools, wipe))
|
((ConfigOptionBools, wipe))
|
||||||
((ConfigOptionBool, wipe_tower))
|
((ConfigOptionBool, wipe_tower))
|
||||||
|
((ConfigOptionFloat, wipe_tower_acceleration))
|
||||||
((ConfigOptionFloat, wipe_tower_x))
|
((ConfigOptionFloat, wipe_tower_x))
|
||||||
((ConfigOptionFloat, wipe_tower_y))
|
((ConfigOptionFloat, wipe_tower_y))
|
||||||
((ConfigOptionFloat, wipe_tower_width))
|
((ConfigOptionFloat, wipe_tower_width))
|
||||||
@ -874,6 +877,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE(
|
|||||||
((ConfigOptionFloat, wipe_tower_brim_width))
|
((ConfigOptionFloat, wipe_tower_brim_width))
|
||||||
((ConfigOptionFloat, wipe_tower_cone_angle))
|
((ConfigOptionFloat, wipe_tower_cone_angle))
|
||||||
((ConfigOptionPercent, wipe_tower_extra_spacing))
|
((ConfigOptionPercent, wipe_tower_extra_spacing))
|
||||||
|
((ConfigOptionPercent, wipe_tower_extra_flow))
|
||||||
((ConfigOptionFloat, wipe_tower_bridging))
|
((ConfigOptionFloat, wipe_tower_bridging))
|
||||||
((ConfigOptionInt, wipe_tower_extruder))
|
((ConfigOptionInt, wipe_tower_extruder))
|
||||||
((ConfigOptionFloats, wiping_volumes_matrix))
|
((ConfigOptionFloats, wiping_volumes_matrix))
|
||||||
|
@ -261,7 +261,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
|
|||||||
bool have_default_acceleration = config->opt_float("default_acceleration") > 0;
|
bool have_default_acceleration = config->opt_float("default_acceleration") > 0;
|
||||||
for (auto el : { "perimeter_acceleration", "infill_acceleration", "top_solid_infill_acceleration",
|
for (auto el : { "perimeter_acceleration", "infill_acceleration", "top_solid_infill_acceleration",
|
||||||
"solid_infill_acceleration", "external_perimeter_acceleration",
|
"solid_infill_acceleration", "external_perimeter_acceleration",
|
||||||
"bridge_acceleration", "first_layer_acceleration" })
|
"bridge_acceleration", "first_layer_acceleration", "wipe_tower_acceleration"})
|
||||||
toggle_field(el, have_default_acceleration);
|
toggle_field(el, have_default_acceleration);
|
||||||
|
|
||||||
bool have_skirt = config->opt_int("skirts") > 0;
|
bool have_skirt = config->opt_int("skirts") > 0;
|
||||||
@ -325,7 +325,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
|
|||||||
|
|
||||||
bool have_wipe_tower = config->opt_bool("wipe_tower");
|
bool have_wipe_tower = config->opt_bool("wipe_tower");
|
||||||
for (auto el : { "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_brim_width", "wipe_tower_cone_angle",
|
for (auto el : { "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_brim_width", "wipe_tower_cone_angle",
|
||||||
"wipe_tower_extra_spacing", "wipe_tower_bridging", "wipe_tower_no_sparse_layers", "single_extruder_multi_material_priming" })
|
"wipe_tower_extra_spacing", "wipe_tower_extra_flow", "wipe_tower_bridging", "wipe_tower_no_sparse_layers", "single_extruder_multi_material_priming" })
|
||||||
toggle_field(el, have_wipe_tower);
|
toggle_field(el, have_wipe_tower);
|
||||||
|
|
||||||
bool have_non_zero_mmu_segmented_region_max_width = config->opt_float("mmu_segmented_region_max_width") > 0.;
|
bool have_non_zero_mmu_segmented_region_max_width = config->opt_float("mmu_segmented_region_max_width") > 0.;
|
||||||
|
@ -2127,7 +2127,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
|
|||||||
, config(Slic3r::DynamicPrintConfig::new_from_defaults_keys({
|
, config(Slic3r::DynamicPrintConfig::new_from_defaults_keys({
|
||||||
"bed_shape", "bed_custom_texture", "bed_custom_model", "complete_objects", "duplicate_distance", "extruder_clearance_radius", "skirts", "skirt_distance",
|
"bed_shape", "bed_custom_texture", "bed_custom_model", "complete_objects", "duplicate_distance", "extruder_clearance_radius", "skirts", "skirt_distance",
|
||||||
"brim_width", "brim_separation", "brim_type", "variable_layer_height", "nozzle_diameter", "single_extruder_multi_material",
|
"brim_width", "brim_separation", "brim_type", "variable_layer_height", "nozzle_diameter", "single_extruder_multi_material",
|
||||||
"wipe_tower", "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_brim_width", "wipe_tower_cone_angle", "wipe_tower_extra_spacing", "wipe_tower_extruder",
|
"wipe_tower", "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_brim_width", "wipe_tower_cone_angle", "wipe_tower_extra_spacing", "wipe_tower_extra_flow", "wipe_tower_extruder",
|
||||||
"extruder_colour", "filament_colour", "material_colour", "max_print_height", "printer_model", "printer_notes", "printer_technology",
|
"extruder_colour", "filament_colour", "material_colour", "max_print_height", "printer_model", "printer_notes", "printer_technology",
|
||||||
// These values are necessary to construct SlicingParameters by the Canvas3D variable layer height editor.
|
// These values are necessary to construct SlicingParameters by the Canvas3D variable layer height editor.
|
||||||
"layer_height", "first_layer_height", "min_layer_height", "max_layer_height",
|
"layer_height", "first_layer_height", "min_layer_height", "max_layer_height",
|
||||||
|
@ -115,6 +115,7 @@ void Chart::mouse_right_button_clicked(wxMouseEvent& event) {
|
|||||||
|
|
||||||
|
|
||||||
void Chart::mouse_clicked(wxMouseEvent& event) {
|
void Chart::mouse_clicked(wxMouseEvent& event) {
|
||||||
|
m_uniform = (event.GetModifiers() == wxMOD_CONTROL);
|
||||||
wxPoint point = event.GetPosition();
|
wxPoint point = event.GetPosition();
|
||||||
int button_index = which_button_is_clicked(point);
|
int button_index = which_button_is_clicked(point);
|
||||||
if ( button_index != -1) {
|
if ( button_index != -1) {
|
||||||
@ -136,7 +137,15 @@ void Chart::mouse_moved(wxMouseEvent& event) {
|
|||||||
}
|
}
|
||||||
int delta_x = pos.x - m_previous_mouse.x;
|
int delta_x = pos.x - m_previous_mouse.x;
|
||||||
int delta_y = pos.y - m_previous_mouse.y;
|
int delta_y = pos.y - m_previous_mouse.y;
|
||||||
m_dragged->move(fixed_x?0:double(delta_x)/m_rect.GetWidth() * visible_area.m_width,-double(delta_y)/m_rect.GetHeight() * visible_area.m_height);
|
|
||||||
|
double new_y = m_dragged->get_pos().m_y - double(delta_y) / m_rect.GetHeight() * visible_area.m_height;
|
||||||
|
|
||||||
|
if (m_uniform)
|
||||||
|
for (ButtonToDrag& b : m_buttons)
|
||||||
|
b.move(fixed_x?0:double(delta_x)/m_rect.GetWidth() * visible_area.m_width, new_y - b.get_pos().m_y);
|
||||||
|
else
|
||||||
|
m_dragged->move(fixed_x?0:double(delta_x)/m_rect.GetWidth() * visible_area.m_width, new_y - m_dragged->get_pos().m_y);
|
||||||
|
|
||||||
m_previous_mouse = pos;
|
m_previous_mouse = pos;
|
||||||
recalculate_line();
|
recalculate_line();
|
||||||
}
|
}
|
||||||
@ -263,7 +272,7 @@ std::vector<float> Chart::get_ramming_speed(float sampling) const {
|
|||||||
std::vector<float> speeds_out;
|
std::vector<float> speeds_out;
|
||||||
|
|
||||||
const int number_of_samples = std::round( visible_area.m_width / sampling);
|
const int number_of_samples = std::round( visible_area.m_width / sampling);
|
||||||
if (number_of_samples>0) {
|
if (number_of_samples>0 && !m_line_to_draw.empty()) {
|
||||||
const int dx = (m_line_to_draw.size()-1) / number_of_samples;
|
const int dx = (m_line_to_draw.size()-1) / number_of_samples;
|
||||||
for (int j=0;j<number_of_samples;++j) {
|
for (int j=0;j<number_of_samples;++j) {
|
||||||
float left = screen_to_math(wxPoint(0,m_line_to_draw[j*dx])).m_y;
|
float left = screen_to_math(wxPoint(0,m_line_to_draw[j*dx])).m_y;
|
||||||
|
@ -23,7 +23,7 @@ public:
|
|||||||
{
|
{
|
||||||
SetBackgroundStyle(wxBG_STYLE_PAINT);
|
SetBackgroundStyle(wxBG_STYLE_PAINT);
|
||||||
m_rect = wxRect(wxPoint(legend_side,0),rect.GetSize()-wxSize(legend_side,legend_side));
|
m_rect = wxRect(wxPoint(legend_side,0),rect.GetSize()-wxSize(legend_side,legend_side));
|
||||||
visible_area = wxRect2DDouble(0.0, 0.0, sampling*ramming_speed_size, 20.);
|
visible_area = wxRect2DDouble(0.0, 0.0, sampling*ramming_speed_size, 60.);
|
||||||
m_buttons.clear();
|
m_buttons.clear();
|
||||||
if (initial_buttons.size()>0)
|
if (initial_buttons.size()>0)
|
||||||
for (const auto& pair : initial_buttons)
|
for (const auto& pair : initial_buttons)
|
||||||
@ -31,7 +31,7 @@ public:
|
|||||||
recalculate_line();
|
recalculate_line();
|
||||||
}
|
}
|
||||||
void set_xy_range(float x,float y) {
|
void set_xy_range(float x,float y) {
|
||||||
x = int(x/0.5) * 0.5;
|
x = int(x/0.25) * 0.25;
|
||||||
if (x>=0) visible_area.SetRight(x);
|
if (x>=0) visible_area.SetRight(x);
|
||||||
if (y>=0) visible_area.SetBottom(y);
|
if (y>=0) visible_area.SetBottom(y);
|
||||||
recalculate_line();
|
recalculate_line();
|
||||||
@ -105,10 +105,7 @@ private:
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void recalculate_line();
|
void recalculate_line();
|
||||||
void recalculate_volume();
|
|
||||||
|
|
||||||
|
|
||||||
wxRect m_rect; // rectangle on screen the chart is mapped into (screen coordinates)
|
wxRect m_rect; // rectangle on screen the chart is mapped into (screen coordinates)
|
||||||
wxPoint m_previous_mouse;
|
wxPoint m_previous_mouse;
|
||||||
@ -118,6 +115,7 @@ private:
|
|||||||
ButtonToDrag* m_dragged = nullptr;
|
ButtonToDrag* m_dragged = nullptr;
|
||||||
float m_total_volume = 0.f;
|
float m_total_volume = 0.f;
|
||||||
|
|
||||||
|
bool m_uniform = false; // testing only
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1621,6 +1621,7 @@ void TabPrint::build()
|
|||||||
optgroup->append_single_option_line("bridge_acceleration");
|
optgroup->append_single_option_line("bridge_acceleration");
|
||||||
optgroup->append_single_option_line("first_layer_acceleration");
|
optgroup->append_single_option_line("first_layer_acceleration");
|
||||||
optgroup->append_single_option_line("first_layer_acceleration_over_raft");
|
optgroup->append_single_option_line("first_layer_acceleration_over_raft");
|
||||||
|
optgroup->append_single_option_line("wipe_tower_acceleration");
|
||||||
optgroup->append_single_option_line("travel_acceleration");
|
optgroup->append_single_option_line("travel_acceleration");
|
||||||
optgroup->append_single_option_line("default_acceleration");
|
optgroup->append_single_option_line("default_acceleration");
|
||||||
|
|
||||||
@ -1655,6 +1656,7 @@ void TabPrint::build()
|
|||||||
optgroup->append_single_option_line("wipe_tower_bridging");
|
optgroup->append_single_option_line("wipe_tower_bridging");
|
||||||
optgroup->append_single_option_line("wipe_tower_cone_angle");
|
optgroup->append_single_option_line("wipe_tower_cone_angle");
|
||||||
optgroup->append_single_option_line("wipe_tower_extra_spacing");
|
optgroup->append_single_option_line("wipe_tower_extra_spacing");
|
||||||
|
optgroup->append_single_option_line("wipe_tower_extra_flow");
|
||||||
optgroup->append_single_option_line("wipe_tower_no_sparse_layers");
|
optgroup->append_single_option_line("wipe_tower_no_sparse_layers");
|
||||||
optgroup->append_single_option_line("single_extruder_multi_material_priming");
|
optgroup->append_single_option_line("single_extruder_multi_material_priming");
|
||||||
|
|
||||||
@ -2269,6 +2271,8 @@ void TabFilament::build()
|
|||||||
optgroup->append_single_option_line("filament_cooling_moves");
|
optgroup->append_single_option_line("filament_cooling_moves");
|
||||||
optgroup->append_single_option_line("filament_cooling_initial_speed");
|
optgroup->append_single_option_line("filament_cooling_initial_speed");
|
||||||
optgroup->append_single_option_line("filament_cooling_final_speed");
|
optgroup->append_single_option_line("filament_cooling_final_speed");
|
||||||
|
optgroup->append_single_option_line("filament_stamping_loading_speed");
|
||||||
|
optgroup->append_single_option_line("filament_stamping_distance");
|
||||||
|
|
||||||
create_line_with_widget(optgroup.get(), "filament_ramming_parameters", "", [this](wxWindow* parent) {
|
create_line_with_widget(optgroup.get(), "filament_ramming_parameters", "", [this](wxWindow* parent) {
|
||||||
auto ramming_dialog_btn = new wxButton(parent, wxID_ANY, _(L("Ramming settings"))+dots, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);
|
auto ramming_dialog_btn = new wxButton(parent, wxID_ANY, _(L("Ramming settings"))+dots, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "BitmapCache.hpp"
|
#include "BitmapCache.hpp"
|
||||||
#include "GUI.hpp"
|
#include "GUI.hpp"
|
||||||
#include "I18N.hpp"
|
#include "I18N.hpp"
|
||||||
|
#include "slic3r/GUI/format.hpp"
|
||||||
#include "GUI_App.hpp"
|
#include "GUI_App.hpp"
|
||||||
#include "MsgDialog.hpp"
|
#include "MsgDialog.hpp"
|
||||||
|
|
||||||
@ -109,11 +110,11 @@ RammingPanel::RammingPanel(wxWindow* parent, const std::string& parameters)
|
|||||||
#endif
|
#endif
|
||||||
sizer_chart->Add(m_chart, 0, wxALL, 5);
|
sizer_chart->Add(m_chart, 0, wxALL, 5);
|
||||||
|
|
||||||
m_widget_time = new ::SpinInputDouble(this,"", wxEmptyString, wxDefaultPosition, wxSize(ITEM_WIDTH(), -1), style, 0., 5., 3., 0.5);
|
m_widget_time = new ::SpinInputDouble(this,"", wxEmptyString, wxDefaultPosition, wxSize(ITEM_WIDTH(), -1), style, 0., 5., 3., 0.25);
|
||||||
m_widget_time->SetDigits(2);
|
m_widget_time->SetDigits(2);
|
||||||
m_widget_volume = new ::SpinInput(this,"",wxEmptyString,wxDefaultPosition,wxSize(ITEM_WIDTH(), -1),style,0,10000,0);
|
m_widget_volume = new ::SpinInput(this,"",wxEmptyString,wxDefaultPosition,wxSize(ITEM_WIDTH(), -1),style,0,10000,0);
|
||||||
m_widget_ramming_line_width_multiplicator = new ::SpinInput(this,"",wxEmptyString,wxDefaultPosition,wxSize(ITEM_WIDTH(), -1),style,10,200,100);
|
m_widget_ramming_line_width_multiplicator = new ::SpinInput(this,"",wxEmptyString,wxDefaultPosition,wxSize(ITEM_WIDTH(), -1),style,10,300,100);
|
||||||
m_widget_ramming_step_multiplicator = new ::SpinInput(this,"",wxEmptyString,wxDefaultPosition,wxSize(ITEM_WIDTH(), -1),style,10,200,100);
|
m_widget_ramming_step_multiplicator = new ::SpinInput(this,"",wxEmptyString,wxDefaultPosition,wxSize(ITEM_WIDTH(), -1),style,10,300,100);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
update_ui(m_widget_time->GetText());
|
update_ui(m_widget_time->GetText());
|
||||||
@ -133,6 +134,15 @@ RammingPanel::RammingPanel(wxWindow* parent, const std::string& parameters)
|
|||||||
gsizer_param->Add(m_widget_ramming_line_width_multiplicator);
|
gsizer_param->Add(m_widget_ramming_line_width_multiplicator);
|
||||||
gsizer_param->Add(new wxStaticText(this, wxID_ANY, wxString(_(L("Ramming line spacing")) + " (%):")), 0, wxALIGN_CENTER_VERTICAL);
|
gsizer_param->Add(new wxStaticText(this, wxID_ANY, wxString(_(L("Ramming line spacing")) + " (%):")), 0, wxALIGN_CENTER_VERTICAL);
|
||||||
gsizer_param->Add(m_widget_ramming_step_multiplicator);
|
gsizer_param->Add(m_widget_ramming_step_multiplicator);
|
||||||
|
gsizer_param->AddSpacer(40);
|
||||||
|
gsizer_param->AddSpacer(40);
|
||||||
|
|
||||||
|
std::string ctrl_str = shortkey_ctrl_prefix();
|
||||||
|
if (! ctrl_str.empty() && ctrl_str.back() == '+')
|
||||||
|
ctrl_str.pop_back();
|
||||||
|
// TRN: The placeholder expands to Ctrl or Cmd (on macOS).
|
||||||
|
gsizer_param->Add(new wxStaticText(this, wxID_ANY, format_wxstr(_L("For constant flow rate, hold %1% while dragging."), ctrl_str)), 0, wxALIGN_CENTER_VERTICAL);
|
||||||
|
|
||||||
|
|
||||||
sizer_param->Add(gsizer_param, 0, wxTOP, scale(10));
|
sizer_param->Add(gsizer_param, 0, wxTOP, scale(10));
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user