mirror of
https://github.com/QIDITECH/QIDISlicer.git
synced 2026-01-30 23:48:44 +03:00
Merge branch 'main' of https://github.com/QIDITECH/QIDISlicer
This commit is contained in:
@@ -276,7 +276,6 @@ namespace Slic3r {
|
|||||||
deretraction_str = gcodegen.unretract();
|
deretraction_str = gcodegen.unretract();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Insert the toolchange and deretraction gcode into the generated gcode.
|
// Insert the toolchange and deretraction gcode into the generated gcode.
|
||||||
@@ -1487,6 +1486,15 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
|
|||||||
|
|
||||||
// Write end commands to file.
|
// Write end commands to file.
|
||||||
file.write(this->retract());
|
file.write(this->retract());
|
||||||
|
|
||||||
|
//B38
|
||||||
|
{
|
||||||
|
std::string gcode;
|
||||||
|
m_writer.add_object_change_labels(gcode);
|
||||||
|
file.write(gcode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
file.write(m_writer.set_fan(0));
|
file.write(m_writer.set_fan(0));
|
||||||
|
|
||||||
// adds tag for processor
|
// adds tag for processor
|
||||||
@@ -2215,6 +2223,9 @@ LayerResult GCode::process_layer(
|
|||||||
bool first_layer = layer.id() == 0;
|
bool first_layer = layer.id() == 0;
|
||||||
unsigned int first_extruder_id = layer_tools.extruders.front();
|
unsigned int first_extruder_id = layer_tools.extruders.front();
|
||||||
|
|
||||||
|
//B36
|
||||||
|
m_writer.set_is_first_layer(first_layer);
|
||||||
|
|
||||||
// Initialize config with the 1st object to be printed at this layer.
|
// Initialize config with the 1st object to be printed at this layer.
|
||||||
m_config.apply(layer.object()->config(), true);
|
m_config.apply(layer.object()->config(), true);
|
||||||
|
|
||||||
@@ -2452,7 +2463,13 @@ void GCode::process_layer_single_object(
|
|||||||
break;
|
break;
|
||||||
else
|
else
|
||||||
++ object_id;
|
++ object_id;
|
||||||
gcode += std::string("; printing object ") + print_object.model_object()->name + " id:" + std::to_string(object_id) + " copy " + std::to_string(print_instance.instance_id) + "\n";
|
//B38
|
||||||
|
if (this->config().gcode_flavor == gcfKlipper) {
|
||||||
|
m_writer.set_object_start_str(std::string("EXCLUDE_OBJECT_START NAME=") + print_object.model_object()->name + "\n");
|
||||||
|
} else {
|
||||||
|
gcode += std::string("; printing object ") + print_object.model_object()->name + " id:" + std::to_string(object_id) +
|
||||||
|
" copy " + std::to_string(print_instance.instance_id) + "\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -2625,8 +2642,21 @@ void GCode::process_layer_single_object(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (! first && this->config().gcode_label_objects)
|
|
||||||
gcode += std::string("; stop printing object ") + print_object.model_object()->name + " id:" + std::to_string(object_id) + " copy " + std::to_string(print_instance.instance_id) + "\n";
|
if (!first && this->config().gcode_label_objects) {
|
||||||
|
//B38
|
||||||
|
if (this->config().gcode_flavor == gcfKlipper) {
|
||||||
|
if (!m_writer.is_object_start_str_empty()) {
|
||||||
|
m_writer.set_object_start_str("");
|
||||||
|
} else {
|
||||||
|
m_writer.set_object_end_str(std::string("EXCLUDE_OBJECT_END NAME=") + print_object.model_object()->name + "\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
gcode += std::string("; stop printing object ") + print_object.model_object()->name + " id:" + std::to_string(object_id) +
|
||||||
|
" copy " + std::to_string(print_instance.instance_id) + "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GCode::apply_print_config(const PrintConfig &print_config)
|
void GCode::apply_print_config(const PrintConfig &print_config)
|
||||||
@@ -2703,8 +2733,13 @@ std::string GCode::change_layer(coordf_t print_z)
|
|||||||
// Increment a progress bar indicator.
|
// Increment a progress bar indicator.
|
||||||
gcode += m_writer.update_progress(++ m_layer_index, m_layer_count);
|
gcode += m_writer.update_progress(++ m_layer_index, m_layer_count);
|
||||||
coordf_t z = print_z + m_config.z_offset.value; // in unscaled coordinates
|
coordf_t z = print_z + m_config.z_offset.value; // in unscaled coordinates
|
||||||
if (EXTRUDER_CONFIG(retract_layer_change) && m_writer.will_move_z(z))
|
if (EXTRUDER_CONFIG(retract_layer_change) && m_writer.will_move_z(z)) {
|
||||||
gcode += this->retract();
|
gcode += this->retract();
|
||||||
|
}
|
||||||
|
|
||||||
|
//B38
|
||||||
|
m_writer.add_object_change_labels(gcode);
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
std::ostringstream comment;
|
std::ostringstream comment;
|
||||||
@@ -2998,6 +3033,9 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string_view de
|
|||||||
gcode += this->travel_to(path.first_point(), path.role(), comment);
|
gcode += this->travel_to(path.first_point(), path.role(), comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//B38
|
||||||
|
m_writer.add_object_change_labels(gcode);
|
||||||
|
|
||||||
// compensate retraction
|
// compensate retraction
|
||||||
gcode += this->unretract();
|
gcode += this->unretract();
|
||||||
|
|
||||||
@@ -3057,8 +3095,9 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string_view de
|
|||||||
}
|
}
|
||||||
if (m_volumetric_speed != 0. && speed == 0)
|
if (m_volumetric_speed != 0. && speed == 0)
|
||||||
speed = m_volumetric_speed / path.mm3_per_mm;
|
speed = m_volumetric_speed / path.mm3_per_mm;
|
||||||
|
//B37
|
||||||
if (this->on_first_layer())
|
if (this->on_first_layer())
|
||||||
speed = m_config.get_abs_value("first_layer_speed", speed);
|
speed = path.role() == ExtrusionRole::ExternalPerimeter ? m_config.get_abs_value("first_layer_external_perimeter_speed") : m_config.get_abs_value("first_layer_speed", speed);
|
||||||
else if (this->object_layer_over_raft())
|
else if (this->object_layer_over_raft())
|
||||||
speed = m_config.get_abs_value("first_layer_speed_over_raft", speed);
|
speed = m_config.get_abs_value("first_layer_speed_over_raft", speed);
|
||||||
if (m_config.max_volumetric_speed.value > 0) {
|
if (m_config.max_volumetric_speed.value > 0) {
|
||||||
@@ -3296,6 +3335,10 @@ std::string GCode::travel_to(const Point &point, ExtrusionRole role, std::string
|
|||||||
// Reset the wipe path when traveling, so one would not wipe along an old path.
|
// Reset the wipe path when traveling, so one would not wipe along an old path.
|
||||||
m_wipe.reset_path();
|
m_wipe.reset_path();
|
||||||
|
|
||||||
|
//B38
|
||||||
|
m_writer.add_object_change_labels(gcode);
|
||||||
|
|
||||||
|
|
||||||
// use G1 because we rely on paths being straight (G0 may make round paths)
|
// use G1 because we rely on paths being straight (G0 may make round paths)
|
||||||
if (travel.size() >= 2) {
|
if (travel.size() >= 2) {
|
||||||
|
|
||||||
|
|||||||
@@ -320,7 +320,10 @@ std::string GCodeWriter::travel_to_xy(const Vec2d &point, const std::string &com
|
|||||||
|
|
||||||
GCodeG1Formatter w;
|
GCodeG1Formatter w;
|
||||||
w.emit_xy(point);
|
w.emit_xy(point);
|
||||||
w.emit_f(this->config.travel_speed.value * 60.0);
|
//B36
|
||||||
|
auto speed = m_is_first_layer ? this->config.get_abs_value("first_layer_travel_speed") :
|
||||||
|
this->config.travel_speed.value;
|
||||||
|
w.emit_f(speed * 60.0);
|
||||||
w.emit_comment(this->config.gcode_comments, comment);
|
w.emit_comment(this->config.gcode_comments, comment);
|
||||||
return w.string();
|
return w.string();
|
||||||
}
|
}
|
||||||
@@ -596,6 +599,31 @@ std::string GCodeWriter::set_fan(unsigned int speed) const
|
|||||||
return GCodeWriter::set_fan(this->config.gcode_flavor, this->config.gcode_comments, speed);
|
return GCodeWriter::set_fan(this->config.gcode_flavor, this->config.gcode_comments, speed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//B38
|
||||||
|
void GCodeWriter::add_object_start_labels(std::string &gcode)
|
||||||
|
{
|
||||||
|
if (!m_gcode_label_objects_start.empty()) {
|
||||||
|
gcode += m_gcode_label_objects_start;
|
||||||
|
m_gcode_label_objects_start = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GCodeWriter::add_object_end_labels(std::string &gcode)
|
||||||
|
{
|
||||||
|
if (!m_gcode_label_objects_end.empty()) {
|
||||||
|
gcode += m_gcode_label_objects_end;
|
||||||
|
m_gcode_label_objects_end = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GCodeWriter::add_object_change_labels(std::string &gcode)
|
||||||
|
{
|
||||||
|
add_object_end_labels(gcode);
|
||||||
|
add_object_start_labels(gcode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void GCodeFormatter::emit_axis(const char axis, const double v, size_t digits) {
|
void GCodeFormatter::emit_axis(const char axis, const double v, size_t digits) {
|
||||||
assert(digits <= 9);
|
assert(digits <= 9);
|
||||||
static constexpr const std::array<int, 10> pow_10{1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
|
static constexpr const std::array<int, 10> pow_10{1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ public:
|
|||||||
//B24
|
//B24
|
||||||
m_last_volume_temperature(0), m_last_volume_temperature_reached(true),
|
m_last_volume_temperature(0), m_last_volume_temperature_reached(true),
|
||||||
m_lifted(0)
|
m_lifted(0)
|
||||||
|
//B36
|
||||||
|
, m_is_first_layer(true)
|
||||||
{}
|
{}
|
||||||
Extruder* extruder() { return m_extruder; }
|
Extruder* extruder() { return m_extruder; }
|
||||||
const Extruder* extruder() const { return m_extruder; }
|
const Extruder* extruder() const { return m_extruder; }
|
||||||
@@ -96,6 +98,19 @@ public:
|
|||||||
// Keeping the state is left to the CoolingBuffer, which runs asynchronously on another thread.
|
// Keeping the state is left to the CoolingBuffer, which runs asynchronously on another thread.
|
||||||
std::string set_fan(unsigned int speed) const;
|
std::string set_fan(unsigned int speed) const;
|
||||||
|
|
||||||
|
//B36
|
||||||
|
void set_is_first_layer(bool bval) { m_is_first_layer = bval; }
|
||||||
|
|
||||||
|
//B38
|
||||||
|
void set_object_start_str(std::string start_string) { m_gcode_label_objects_start = start_string; }
|
||||||
|
bool is_object_start_str_empty() { return m_gcode_label_objects_start.empty(); }
|
||||||
|
void set_object_end_str(std::string end_string) { m_gcode_label_objects_end = end_string; }
|
||||||
|
bool is_object_end_str_empty() { return m_gcode_label_objects_end.empty(); }
|
||||||
|
void add_object_start_labels(std::string &gcode);
|
||||||
|
void add_object_end_labels(std::string &gcode);
|
||||||
|
void add_object_change_labels(std::string &gcode);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Extruders are sorted by their ID, so that binary search is possible.
|
// Extruders are sorted by their ID, so that binary search is possible.
|
||||||
std::vector<Extruder> m_extruders;
|
std::vector<Extruder> m_extruders;
|
||||||
@@ -117,6 +132,13 @@ private:
|
|||||||
double m_lifted;
|
double m_lifted;
|
||||||
Vec3d m_pos = Vec3d::Zero();
|
Vec3d m_pos = Vec3d::Zero();
|
||||||
|
|
||||||
|
//B36
|
||||||
|
bool m_is_first_layer = true;
|
||||||
|
|
||||||
|
//B38
|
||||||
|
std::string m_gcode_label_objects_start;
|
||||||
|
std::string m_gcode_label_objects_end;
|
||||||
|
|
||||||
enum class Acceleration {
|
enum class Acceleration {
|
||||||
Travel,
|
Travel,
|
||||||
Print
|
Print
|
||||||
|
|||||||
@@ -484,8 +484,10 @@ static std::vector<std::string> s_Preset_print_options {
|
|||||||
"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_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"
|
||||||
//B15
|
//B36
|
||||||
// "enable_auxiliary_fan"
|
,"first_layer_travel_speed"
|
||||||
|
//B37
|
||||||
|
,"first_layer_external_perimeter_speed"
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::vector<std::string> s_Preset_filament_options {
|
static std::vector<std::string> s_Preset_filament_options {
|
||||||
|
|||||||
@@ -222,6 +222,10 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n
|
|||||||
|| opt_key == "travel_speed"
|
|| opt_key == "travel_speed"
|
||||||
|| opt_key == "travel_speed_z"
|
|| opt_key == "travel_speed_z"
|
||||||
|| opt_key == "first_layer_speed"
|
|| opt_key == "first_layer_speed"
|
||||||
|
//B36
|
||||||
|
|| opt_key == "first_layer_travel_speed"
|
||||||
|
//B37
|
||||||
|
|| opt_key == "first_layer_external_perimeter_speed"
|
||||||
|| opt_key == "z_offset") {
|
|| opt_key == "z_offset") {
|
||||||
steps.emplace_back(psWipeTower);
|
steps.emplace_back(psWipeTower);
|
||||||
steps.emplace_back(psSkirtBrim);
|
steps.emplace_back(psSkirtBrim);
|
||||||
|
|||||||
@@ -1366,16 +1366,24 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->set_default_value(new ConfigOptionFloatOrPercent(30, false));
|
def->set_default_value(new ConfigOptionFloatOrPercent(30, false));
|
||||||
|
|
||||||
//B36
|
//B36
|
||||||
// def = this->add("first_layer_travel_speed", coFloatOrPercent);
|
def = this->add("first_layer_travel_speed", coFloat);
|
||||||
// def->label = L("First layer travel speed");
|
def->label = L("First layer travel");
|
||||||
// def->tooltip = L("If expressed as absolute value in mm/s, this speed will be applied to all the print moves "
|
def->tooltip = L("Speed for travel moves (jumps between distant extrusion points).");
|
||||||
// "of the first layer, regardless of their type. If expressed as a percentage "
|
def->sidetext = L("mm/s");
|
||||||
// "(for example: 40%) it will scale the default speeds.");
|
def->aliases = {"travel_feed_rate"};
|
||||||
// def->sidetext = L("mm/s or %");
|
def->min = 1;
|
||||||
// def->min = 0;
|
def->mode = comAdvanced;
|
||||||
// def->max_literal = 20;
|
def->set_default_value(new ConfigOptionFloat(130));
|
||||||
// def->mode = comAdvanced;
|
|
||||||
// def->set_default_value(new ConfigOptionFloatOrPercent(200, false));
|
//B37
|
||||||
|
def = this->add("first_layer_external_perimeter_speed", coFloat);
|
||||||
|
def->label = L("First layer external perimeters");
|
||||||
|
def->tooltip = L("Speed for travel moves (jumps between distant extrusion points).");
|
||||||
|
def->sidetext = L("mm/s");
|
||||||
|
def->aliases = {"travel_feed_rate"};
|
||||||
|
def->min = 1;
|
||||||
|
def->mode = comAdvanced;
|
||||||
|
def->set_default_value(new ConfigOptionFloat(130));
|
||||||
|
|
||||||
|
|
||||||
def = this->add("first_layer_speed_over_raft", coFloatOrPercent);
|
def = this->add("first_layer_speed_over_raft", coFloatOrPercent);
|
||||||
|
|||||||
@@ -731,6 +731,12 @@ PRINT_CONFIG_CLASS_DEFINE(
|
|||||||
((ConfigOptionBool, wipe_tower_no_sparse_layers))
|
((ConfigOptionBool, wipe_tower_no_sparse_layers))
|
||||||
((ConfigOptionString, toolchange_gcode))
|
((ConfigOptionString, toolchange_gcode))
|
||||||
((ConfigOptionFloat, travel_speed))
|
((ConfigOptionFloat, travel_speed))
|
||||||
|
|
||||||
|
//B36
|
||||||
|
((ConfigOptionFloat, first_layer_travel_speed))
|
||||||
|
//B37
|
||||||
|
((ConfigOptionFloat, first_layer_external_perimeter_speed))
|
||||||
|
|
||||||
((ConfigOptionFloat, travel_speed_z))
|
((ConfigOptionFloat, travel_speed_z))
|
||||||
((ConfigOptionBool, use_firmware_retraction))
|
((ConfigOptionBool, use_firmware_retraction))
|
||||||
((ConfigOptionBool, use_relative_e_distances))
|
((ConfigOptionBool, use_relative_e_distances))
|
||||||
@@ -800,8 +806,6 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE(
|
|||||||
((ConfigOptionFloatOrPercent, first_layer_extrusion_width))
|
((ConfigOptionFloatOrPercent, first_layer_extrusion_width))
|
||||||
((ConfigOptionFloatOrPercent, first_layer_height))
|
((ConfigOptionFloatOrPercent, first_layer_height))
|
||||||
((ConfigOptionFloatOrPercent, first_layer_speed))
|
((ConfigOptionFloatOrPercent, first_layer_speed))
|
||||||
//B36
|
|
||||||
// ((ConfigOptionFloatOrPercent, first_layer_travel_speed))
|
|
||||||
((ConfigOptionInts, first_layer_temperature))
|
((ConfigOptionInts, first_layer_temperature))
|
||||||
((ConfigOptionIntsNullable, idle_temperature))
|
((ConfigOptionIntsNullable, idle_temperature))
|
||||||
//B26
|
//B26
|
||||||
|
|||||||
@@ -1574,6 +1574,10 @@ void TabPrint::build()
|
|||||||
optgroup = page->new_optgroup(L("Modifiers"));
|
optgroup = page->new_optgroup(L("Modifiers"));
|
||||||
optgroup->append_single_option_line("first_layer_speed");
|
optgroup->append_single_option_line("first_layer_speed");
|
||||||
optgroup->append_single_option_line("first_layer_speed_over_raft");
|
optgroup->append_single_option_line("first_layer_speed_over_raft");
|
||||||
|
//B36
|
||||||
|
optgroup->append_single_option_line("first_layer_travel_speed");
|
||||||
|
//B37
|
||||||
|
optgroup->append_single_option_line("first_layer_external_perimeter_speed");
|
||||||
|
|
||||||
optgroup = page->new_optgroup(L("Acceleration control (advanced)"));
|
optgroup = page->new_optgroup(L("Acceleration control (advanced)"));
|
||||||
optgroup->append_single_option_line("external_perimeter_acceleration");
|
optgroup->append_single_option_line("external_perimeter_acceleration");
|
||||||
|
|||||||
Reference in New Issue
Block a user