mirror of
https://git.mirrors.martin98.com/https://github.com/slic3r/Slic3r.git
synced 2025-08-15 00:36:10 +08:00
Merge branch 'master' into dev
This commit is contained in:
commit
e586d67be5
@ -504,7 +504,7 @@ endif()
|
|||||||
if (WIN32)
|
if (WIN32)
|
||||||
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources")
|
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources")
|
||||||
elseif (SLIC3R_FHS)
|
elseif (SLIC3R_FHS)
|
||||||
set(SLIC3R_FHS_RESOURCES "${CMAKE_INSTALL_FULL_DATAROOTDIR}/slic3r++")
|
set(SLIC3R_FHS_RESOURCES "${CMAKE_INSTALL_FULL_DATAROOTDIR}/SuperSlicer")
|
||||||
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${SLIC3R_FHS_RESOURCES}")
|
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${SLIC3R_FHS_RESOURCES}")
|
||||||
else ()
|
else ()
|
||||||
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources")
|
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources")
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
min_slic3r_version = 2.2.0-alpha3
|
min_slic3r_version = 2.2.0-alpha3
|
||||||
|
0.0.4 superslicer: remove top_fan_speed
|
||||||
0.0.3 slic3r++ adaptation: overlapping & top pattern.
|
0.0.3 slic3r++ adaptation: overlapping & top pattern.
|
||||||
0.0.2 changed flow ratio from float to %
|
0.0.2 changed flow ratio from float to %
|
||||||
0.0.1 Multiple Print models were unified into a single one.
|
0.0.1 Multiple Print models were unified into a single one.
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
name = BIBO
|
name = BIBO
|
||||||
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
||||||
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
||||||
config_version = 0.0.3
|
config_version = 0.0.4
|
||||||
# Where to get the updates from?
|
# Where to get the updates from?
|
||||||
config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/BIBO/
|
config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/BIBO/
|
||||||
|
|
||||||
@ -468,7 +468,6 @@ fan_always_on = 0
|
|||||||
max_fan_speed = 0
|
max_fan_speed = 0
|
||||||
min_fan_speed = 0
|
min_fan_speed = 0
|
||||||
bridge_fan_speed = 25
|
bridge_fan_speed = 25
|
||||||
top_fan_speed = 0
|
|
||||||
temperature = 245
|
temperature = 245
|
||||||
|
|
||||||
[filament:*FLEX*]
|
[filament:*FLEX*]
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
name = Custom
|
name = Custom
|
||||||
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
||||||
# This means, the server may force the Slic3r configuration to be downgraded.
|
# This means, the server may force the Slic3r configuration to be downgraded.
|
||||||
config_version = 0.1.1
|
config_version = 0.1.2
|
||||||
# Where to get the updates from?
|
# Where to get the updates from?
|
||||||
config_update_url =
|
config_update_url =
|
||||||
|
|
||||||
@ -694,5 +694,4 @@ fan_always_on = 0
|
|||||||
max_fan_speed = 0
|
max_fan_speed = 0
|
||||||
min_fan_speed = 0
|
min_fan_speed = 0
|
||||||
bridge_fan_speed = 30
|
bridge_fan_speed = 30
|
||||||
top_fan_speed = 0
|
|
||||||
temperature = 240
|
temperature = 240
|
@ -1,4 +1,5 @@
|
|||||||
min_slic3r_version = 2.2.0-alpha3
|
min_slic3r_version = 2.2.0-alpha3
|
||||||
|
0.2.5 superslicer: remove top_fan_speed
|
||||||
0.2.4 slic3r++ adaptation: overlapping & top pattern.
|
0.2.4 slic3r++ adaptation: overlapping & top pattern.
|
||||||
0.2.3 changed flow ratio from float to %
|
0.2.3 changed flow ratio from float to %
|
||||||
0.2.2 version
|
0.2.2 version
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
name = Creality
|
name = Creality
|
||||||
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
||||||
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
||||||
config_version = 0.2.4
|
config_version = 0.2.5
|
||||||
# Where to get the updates from?
|
# Where to get the updates from?
|
||||||
config_update_url =
|
config_update_url =
|
||||||
|
|
||||||
@ -690,5 +690,4 @@ fan_always_on = 0
|
|||||||
max_fan_speed = 0
|
max_fan_speed = 0
|
||||||
min_fan_speed = 0
|
min_fan_speed = 0
|
||||||
bridge_fan_speed = 30
|
bridge_fan_speed = 30
|
||||||
top_fan_speed = 0
|
|
||||||
temperature = 245
|
temperature = 245
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
min_slic3r_version = 2.2.0-alpha3
|
min_slic3r_version = 2.2.0-alpha3
|
||||||
1.1.6 superslicer: thumbnails.
|
1.1.6 superslicer: thumbnails & remove top_fan_speed
|
||||||
1.1.5 slic3r++ adaptation: overlapping & top pattern.
|
1.1.5 slic3r++ adaptation: overlapping & top pattern.
|
||||||
1.1.4 changed flow ratio from float to %
|
1.1.4 changed flow ratio from float to %
|
||||||
1.1.3 slic3r++ version
|
1.1.3 slic3r++ version
|
||||||
|
@ -1980,7 +1980,7 @@ filament_colour = #FFF2EC
|
|||||||
first_layer_bed_temperature = 100
|
first_layer_bed_temperature = 100
|
||||||
first_layer_temperature = 270
|
first_layer_temperature = 270
|
||||||
temperature = 270
|
temperature = 270
|
||||||
bridge_fan_speed = 0
|
bridge_fan_speed = -1
|
||||||
filament_max_volumetric_speed = 8
|
filament_max_volumetric_speed = 8
|
||||||
|
|
||||||
[filament:PrimaSelect PVA+]
|
[filament:PrimaSelect PVA+]
|
||||||
@ -2912,7 +2912,7 @@ filament_colour = #FFF2EC
|
|||||||
first_layer_bed_temperature = 100
|
first_layer_bed_temperature = 100
|
||||||
first_layer_temperature = 270
|
first_layer_temperature = 270
|
||||||
temperature = 270
|
temperature = 270
|
||||||
bridge_fan_speed = 0
|
bridge_fan_speed = -1
|
||||||
filament_cost = 77.3
|
filament_cost = 77.3
|
||||||
filament_density = 1.20
|
filament_density = 1.20
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
min_slic3r_version = 2.2.0
|
min_slic3r_version = 2.2.0
|
||||||
|
0.0.3 superslicer: remove top_fan_speed
|
||||||
0.0.2 Update from DocJeeves settings, adding afterburner / mobius difference
|
0.0.2 Update from DocJeeves settings, adding afterburner / mobius difference
|
||||||
0.0.1 Initial version
|
0.0.1 Initial version
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
name = Voron
|
name = Voron
|
||||||
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
# Configuration version of this file. Config file will only be installed, if the config_version differs.
|
||||||
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
# This means, the server may force the PrusaSlicer configuration to be downgraded.
|
||||||
config_version = 0.0.2
|
config_version = 0.0.3
|
||||||
# Where to get the updates from?
|
# Where to get the updates from?
|
||||||
config_update_url =
|
config_update_url =
|
||||||
|
|
||||||
@ -1037,7 +1037,6 @@ max_fan_speed = 0
|
|||||||
min_fan_speed = 0
|
min_fan_speed = 0
|
||||||
bridge_fan_speed = 30
|
bridge_fan_speed = 30
|
||||||
slowdown_below_layer_time = 15
|
slowdown_below_layer_time = 15
|
||||||
top_fan_speed = 0
|
|
||||||
temperature = 250
|
temperature = 250
|
||||||
|
|
||||||
[filament:Basic ABS @VORON]
|
[filament:Basic ABS @VORON]
|
||||||
|
@ -238,6 +238,7 @@ group:Extrusion width
|
|||||||
setting:top_infill_extrusion_width
|
setting:top_infill_extrusion_width
|
||||||
setting:support_material_extrusion_width
|
setting:support_material_extrusion_width
|
||||||
setting:skirt_extrusion_width
|
setting:skirt_extrusion_width
|
||||||
|
recommended_extrusion_width_description
|
||||||
group:Overlap
|
group:Overlap
|
||||||
line:Perimeter overlap
|
line:Perimeter overlap
|
||||||
setting:label$External:external_perimeter_overlap
|
setting:label$External:external_perimeter_overlap
|
||||||
|
@ -417,7 +417,7 @@ int CLI::run(int argc, char **argv)
|
|||||||
PrintBase *print = (printer_technology == ptFFF) ? static_cast<PrintBase*>(&fff_print) : static_cast<PrintBase*>(&sla_print);
|
PrintBase *print = (printer_technology == ptFFF) ? static_cast<PrintBase*>(&fff_print) : static_cast<PrintBase*>(&sla_print);
|
||||||
if (! m_config.opt_bool("dont_arrange")) {
|
if (! m_config.opt_bool("dont_arrange")) {
|
||||||
//FIXME make the min_object_distance configurable.
|
//FIXME make the min_object_distance configurable.
|
||||||
model.arrange_objects(fff_print);
|
model.arrange_objects(print);
|
||||||
model.center_instances_around_point((! user_center_specified && m_print_config.has("bed_shape")) ?
|
model.center_instances_around_point((! user_center_specified && m_print_config.has("bed_shape")) ?
|
||||||
BoundingBoxf(m_print_config.opt<ConfigOptionPoints>("bed_shape")->values).center() :
|
BoundingBoxf(m_print_config.opt<ConfigOptionPoints>("bed_shape")->values).center() :
|
||||||
m_config.option<ConfigOptionPoint>("center")->value);
|
m_config.option<ConfigOptionPoint>("center")->value);
|
||||||
|
@ -1191,6 +1191,51 @@ std::vector<const PrintInstance*> sort_object_instances_by_model_order(const Pri
|
|||||||
return instances;
|
return instances;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set standby temp for extruders
|
||||||
|
// Parse the custom G-code, try to find T, and add it if not present
|
||||||
|
static void init_multiextruders(FILE *file, Print &print, GCodeWriter & writer, ToolOrdering &tool_ordering, const std::string &custom_gcode )
|
||||||
|
{
|
||||||
|
|
||||||
|
//set standby temp for reprap
|
||||||
|
if (std::set<uint8_t>{gcfRepRap}.count(print.config().gcode_flavor.value) > 0) {
|
||||||
|
for (uint16_t tool_id : tool_ordering.all_extruders()) {
|
||||||
|
fprintf(file, "G10 P%d R%d S%d ; sets the standby temperature\n",
|
||||||
|
tool_id,
|
||||||
|
int(print.config().filament_toolchange_temp.get_at(tool_id)),
|
||||||
|
int(print.config().temperature.get_at(tool_id)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//activate first extruder is multi-extruder and not in start-gcode
|
||||||
|
if (writer.multiple_extruders) {
|
||||||
|
if (std::set<uint8_t>{gcfRepRap}.count(print.config().gcode_flavor.value) > 0) {
|
||||||
|
//if not in gcode
|
||||||
|
bool find = false;
|
||||||
|
if (!custom_gcode.empty()) {
|
||||||
|
const char *ptr = custom_gcode.data();
|
||||||
|
while (*ptr != 0) {
|
||||||
|
// Skip whitespaces.
|
||||||
|
for (; *ptr == ' ' || *ptr == '\t'; ++ptr);
|
||||||
|
if (*ptr == 'T') {
|
||||||
|
find = true;
|
||||||
|
break;
|
||||||
|
} else if (*ptr == 'A') {
|
||||||
|
//TODO: ACTIVATE_EXTRUDER for klipper (if used)
|
||||||
|
}
|
||||||
|
// Skip the rest of the line.
|
||||||
|
for (; *ptr != 0 && *ptr != '\r' && *ptr != '\n'; ++ptr);
|
||||||
|
// Skip the end of line indicators.
|
||||||
|
for (; *ptr == '\r' || *ptr == '\n'; ++ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!find) {
|
||||||
|
fprintf(file, writer.toolchange(tool_ordering.first_extruder()).c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
writer.toolchange(tool_ordering.first_extruder());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if ENABLE_THUMBNAIL_GENERATOR
|
#if ENABLE_THUMBNAIL_GENERATOR
|
||||||
void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thumbnail_cb)
|
void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thumbnail_cb)
|
||||||
#else
|
#else
|
||||||
@ -1437,6 +1482,10 @@ void GCode::_do_export(Print &print, FILE *file)
|
|||||||
std::string start_gcode = this->placeholder_parser_process("start_gcode", print.config().start_gcode.value, initial_extruder_id);
|
std::string start_gcode = this->placeholder_parser_process("start_gcode", print.config().start_gcode.value, initial_extruder_id);
|
||||||
// Set bed temperature if the start G-code does not contain any bed temp control G-codes.
|
// Set bed temperature if the start G-code does not contain any bed temp control G-codes.
|
||||||
this->_print_first_layer_bed_temperature(file, print, start_gcode, initial_extruder_id, true);
|
this->_print_first_layer_bed_temperature(file, print, start_gcode, initial_extruder_id, true);
|
||||||
|
|
||||||
|
//init extruders
|
||||||
|
init_multiextruders(file, print, m_writer, tool_ordering, start_gcode);
|
||||||
|
|
||||||
// Set extruder(s) temperature before and after start G-code.
|
// Set extruder(s) temperature before and after start G-code.
|
||||||
this->_print_first_layer_extruder_temperatures(file, print, start_gcode, initial_extruder_id, false);
|
this->_print_first_layer_extruder_temperatures(file, print, start_gcode, initial_extruder_id, false);
|
||||||
|
|
||||||
|
@ -726,9 +726,17 @@ std::string CoolingBuffer::apply_layer_cooldown(
|
|||||||
top_fan_speed = EXTRUDER_CONFIG(top_fan_speed);
|
top_fan_speed = EXTRUDER_CONFIG(top_fan_speed);
|
||||||
ext_peri_fan_speed = EXTRUDER_CONFIG(external_perimeter_fan_speed);
|
ext_peri_fan_speed = EXTRUDER_CONFIG(external_perimeter_fan_speed);
|
||||||
#undef EXTRUDER_CONFIG
|
#undef EXTRUDER_CONFIG
|
||||||
bridge_fan_control = bridge_fan_speed > fan_speed_new && bridge_fan_speed != 0;
|
// 0 is deprecated for diable: take care of temp settings.
|
||||||
top_fan_control = top_fan_speed != fan_speed_new && top_fan_speed != 0;
|
if (bridge_fan_speed == 0) bridge_fan_speed = -1;
|
||||||
ext_peri_fan_control = ext_peri_fan_speed != fan_speed_new && ext_peri_fan_speed != 0;
|
if (ext_peri_fan_speed == 0) ext_peri_fan_speed = -1;
|
||||||
|
if (top_fan_speed == 0) top_fan_speed = -1;
|
||||||
|
if (bridge_fan_speed == 1) bridge_fan_speed = 0;
|
||||||
|
if (ext_peri_fan_speed == 1) ext_peri_fan_speed = 0;
|
||||||
|
if (top_fan_speed == 1) top_fan_speed = 0;
|
||||||
|
// end deprecation
|
||||||
|
bridge_fan_control = bridge_fan_speed > fan_speed_new && bridge_fan_speed >= 0;
|
||||||
|
top_fan_control = top_fan_speed != fan_speed_new && top_fan_speed >= 0;
|
||||||
|
ext_peri_fan_control = ext_peri_fan_speed != fan_speed_new && ext_peri_fan_speed >= 0;
|
||||||
} else {
|
} else {
|
||||||
bridge_fan_control = false;
|
bridge_fan_control = false;
|
||||||
bridge_fan_speed = 0;
|
bridge_fan_speed = 0;
|
||||||
|
@ -330,12 +330,13 @@ public:
|
|||||||
//add toolchange_temp -skinnydip
|
//add toolchange_temp -skinnydip
|
||||||
WipeTowerWriter& wait_for_toolchange_temp(int tc_temp, bool fan_on, int fan_speed, bool fast)
|
WipeTowerWriter& wait_for_toolchange_temp(int tc_temp, bool fan_on, int fan_speed, bool fast)
|
||||||
{
|
{
|
||||||
char all[128];
|
//char all[128];
|
||||||
if (fan_on == true){
|
if (fan_on == true){
|
||||||
set_fan(fan_speed, " ;Part fan on to cool hotend");
|
set_fan(fan_speed, " ;Part fan on to cool hotend");
|
||||||
}
|
}
|
||||||
sprintf(all, "M109 S%d ;SKINNYDIP TOOLCHANGE WAIT FOR TEMP %s\n", tc_temp, fast ? "FAST MODE":"NORMAL MODE");
|
//sprintf(all, "M109 S%d ;SKINNYDIP TOOLCHANGE WAIT FOR TEMP %s\n", tc_temp, fast ? "FAST MODE":"NORMAL MODE");
|
||||||
this->append(all);
|
//this->append(all);
|
||||||
|
set_extruder_temp(tc_temp, this->m_current_tool, true, ";SKINNYDIP TOOLCHANGE WAIT FOR TEMP " + fast ? "FAST MODE" : "NORMAL MODE");
|
||||||
if (fan_on == true){
|
if (fan_on == true){
|
||||||
set_fan(m_last_fan_speed, " ;restore cooling");
|
set_fan(m_last_fan_speed, " ;restore cooling");
|
||||||
}
|
}
|
||||||
@ -345,25 +346,65 @@ public:
|
|||||||
//begin toolchange_temp -skinnydip
|
//begin toolchange_temp -skinnydip
|
||||||
WipeTowerWriter& begin_toolchange_temp(int tc_temp, bool fast)
|
WipeTowerWriter& begin_toolchange_temp(int tc_temp, bool fast)
|
||||||
{
|
{
|
||||||
char tdbuf[128];
|
//char tdbuf[128];
|
||||||
sprintf(tdbuf, "M104 S%d ;SKINNYDIP BEGIN TOOLCHANGE TEMP %s\n", tc_temp, fast ? "FAST MODE":"NORMAL MODE");
|
//sprintf(tdbuf, "M104 S%d ;SKINNYDIP BEGIN TOOLCHANGE TEMP %s\n", tc_temp, fast ? "FAST MODE":"NORMAL MODE");
|
||||||
m_gcode += tdbuf;
|
//m_gcode += tdbuf;
|
||||||
|
set_extruder_temp(tc_temp, this->m_current_tool, false, ";SKINNYDIP BEGIN TOOLCHANGE TEMP " + fast ? "FAST MODE" : "NORMAL MODE");
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
//restore toolchange_temp -skinnydip
|
//restore toolchange_temp -skinnydip
|
||||||
WipeTowerWriter& restore_pre_toolchange_temp(int tc_temp, bool fast)
|
WipeTowerWriter& restore_pre_toolchange_temp(int tc_temp, bool fast)
|
||||||
{
|
{
|
||||||
char tdbuf[128];
|
//char tdbuf[128];
|
||||||
sprintf(tdbuf, "M104 S%d ;RESTORE PRE-TOOLCHANGE TEMP %s\n", tc_temp, fast ? "FAST MODE":"NORMAL MODE");
|
//sprintf(tdbuf, "M104 S%d ;RESTORE PRE-TOOLCHANGE TEMP %s\n", tc_temp, fast ? "FAST MODE":"NORMAL MODE");
|
||||||
m_gcode += tdbuf;
|
//m_gcode += tdbuf;
|
||||||
|
set_extruder_temp(tc_temp, this->m_current_tool , false, ";RESTORE PRE-TOOLCHANGE TEMP " + fast ? "FAST MODE" : "NORMAL MODE");
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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(unsigned int temperature, size_t tool, bool wait = false, std::string comment = "")
|
||||||
{
|
{
|
||||||
m_gcode += "M" + std::to_string(wait ? 109 : 104) + " S" + std::to_string(temperature) + "\n";
|
if (wait && (this->m_gcode_flavor == gcfMakerWare || this->m_gcode_flavor == (gcfSailfish)))
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
std::string code;
|
||||||
|
if (wait && this->m_gcode_flavor != (gcfTeacup) && this->m_gcode_flavor != (gcfRepRap) && this->m_gcode_flavor != (gcfSprinter)) {
|
||||||
|
code = "M109";
|
||||||
|
} else {
|
||||||
|
if (this->m_gcode_flavor == (gcfRepRap)) { // M104 is deprecated on RepRapFirmware
|
||||||
|
code = "G10";
|
||||||
|
} else {
|
||||||
|
code = "M104";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostringstream gcode;
|
||||||
|
gcode << code << " ";
|
||||||
|
if (this->m_gcode_flavor == (gcfMach3) || this->m_gcode_flavor == (gcfMachinekit)) {
|
||||||
|
gcode << "P";
|
||||||
|
} else if (this->m_gcode_flavor == (gcfRepRap)) {
|
||||||
|
gcode << "P" << tool << " S";
|
||||||
|
} else {
|
||||||
|
gcode << "S";
|
||||||
|
}
|
||||||
|
gcode << temperature;
|
||||||
|
bool multiple_tools = false; // ?
|
||||||
|
if (this->m_current_tool != -1 && (multiple_tools || this->m_gcode_flavor == (gcfMakerWare) || this->m_gcode_flavor == (gcfSailfish))) {
|
||||||
|
if (this->m_gcode_flavor != (gcfRepRap)) {
|
||||||
|
gcode << " T" << tool;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!comment.empty())
|
||||||
|
gcode << " ; " << comment << "\n";
|
||||||
|
|
||||||
|
if ((this->m_gcode_flavor == (gcfTeacup) || this->m_gcode_flavor == (gcfRepRap)) && wait)
|
||||||
|
gcode << "M116 ; wait for temperature to be reached\n";
|
||||||
|
|
||||||
|
gcode << "\n";
|
||||||
|
m_gcode += gcode.str();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -685,7 +726,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[tools[idx_tool + 1]].first_layer_temperature, idx_tool + 1);
|
||||||
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);
|
||||||
}
|
}
|
||||||
@ -793,14 +834,14 @@ WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool, bool last_in_lay
|
|||||||
// 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,
|
||||||
m_is_first_layer ? m_filpar[tool].first_layer_temperature : m_filpar[tool].temperature);
|
m_is_first_layer ? m_filpar[tool].first_layer_temperature : m_filpar[tool].temperature, tool);
|
||||||
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_current_tool);
|
||||||
|
|
||||||
m_depth_traversed += wipe_area;
|
m_depth_traversed += wipe_area;
|
||||||
|
|
||||||
@ -912,7 +953,8 @@ 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 new_temperature)
|
const int new_temperature,
|
||||||
|
const size_t next_tool)
|
||||||
{
|
{
|
||||||
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;
|
||||||
@ -1039,7 +1081,7 @@ void WipeTower::toolchange_Unload(
|
|||||||
if (new_temperature != 0 && (new_temperature != m_old_temperature || m_is_first_layer)) { // Set the extruder temperature, but don't wait.
|
if (new_temperature != 0 && (new_temperature != m_old_temperature || m_is_first_layer)) { // Set the extruder temperature, but don't wait.
|
||||||
// If the required temperature is the same as last time, don't emit the M104 again (if user adjusted the value, it would be reset)
|
// 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).
|
||||||
writer.set_extruder_temp(new_temperature, false);
|
writer.set_extruder_temp(new_temperature, next_tool, false);
|
||||||
m_old_temperature = new_temperature;
|
m_old_temperature = new_temperature;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -367,7 +367,8 @@ 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 new_temperature);
|
const int new_temperature,
|
||||||
|
const size_t temp_tool);
|
||||||
|
|
||||||
void toolchange_Change(
|
void toolchange_Change(
|
||||||
WipeTowerWriter &writer,
|
WipeTowerWriter &writer,
|
||||||
|
@ -111,15 +111,15 @@ std::string GCodeWriter::set_temperature(unsigned int temperature, bool wait, in
|
|||||||
gcode << code << " ";
|
gcode << code << " ";
|
||||||
if (FLAVOR_IS(gcfMach3) || FLAVOR_IS(gcfMachinekit)) {
|
if (FLAVOR_IS(gcfMach3) || FLAVOR_IS(gcfMachinekit)) {
|
||||||
gcode << "P";
|
gcode << "P";
|
||||||
|
} else if (FLAVOR_IS(gcfRepRap)) {
|
||||||
|
gcode << "P" << tool << " S";
|
||||||
} else {
|
} else {
|
||||||
gcode << "S";
|
gcode << "S";
|
||||||
}
|
}
|
||||||
gcode << temperature;
|
gcode << temperature;
|
||||||
bool multiple_tools = this->multiple_extruders && ! m_single_extruder_multi_material;
|
bool multiple_tools = this->multiple_extruders && ! m_single_extruder_multi_material;
|
||||||
if (tool != -1 && (multiple_tools || FLAVOR_IS(gcfMakerWare) || FLAVOR_IS(gcfSailfish)) ) {
|
if (tool != -1 && (multiple_tools || FLAVOR_IS(gcfMakerWare) || FLAVOR_IS(gcfSailfish)) ) {
|
||||||
if (FLAVOR_IS(gcfRepRap)) {
|
if (FLAVOR_IS_NOT(gcfRepRap)) {
|
||||||
gcode << " P" << tool;
|
|
||||||
} else {
|
|
||||||
gcode << " T" << tool;
|
gcode << " T" << tool;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -227,7 +227,7 @@ std::string GCodeWriter::write_acceleration(){
|
|||||||
if (FLAVOR_IS(gcfRepetier)) {
|
if (FLAVOR_IS(gcfRepetier)) {
|
||||||
// M201: Set max printing acceleration
|
// M201: Set max printing acceleration
|
||||||
gcode << "M201 X" << m_current_acceleration << " Y" << m_current_acceleration;
|
gcode << "M201 X" << m_current_acceleration << " Y" << m_current_acceleration;
|
||||||
} else if(FLAVOR_IS(gcfMarlin) || FLAVOR_IS(gcfLerdge)){
|
} else if(FLAVOR_IS(gcfMarlin) || FLAVOR_IS(gcfLerdge) || FLAVOR_IS(gcfRepRap) || FLAVOR_IS(gcfSprinter)){
|
||||||
// M204: Set printing acceleration
|
// M204: Set printing acceleration
|
||||||
gcode << "M204 P" << m_current_acceleration;
|
gcode << "M204 P" << m_current_acceleration;
|
||||||
} else {
|
} else {
|
||||||
|
@ -389,7 +389,7 @@ static bool _arrange(const Pointfs &sizes, coordf_t dist, const BoundingBoxf* bb
|
|||||||
|
|
||||||
/* arrange objects preserving their instance count
|
/* arrange objects preserving their instance count
|
||||||
but altering their instance positions */
|
but altering their instance positions */
|
||||||
bool Model::arrange_objects(const Print &print, const BoundingBoxf* bb)
|
bool Model::arrange_objects(const PrintBase *print, const BoundingBoxf* bb)
|
||||||
{
|
{
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
for (auto obj : objects) count += obj->instances.size();
|
for (auto obj : objects) count += obj->instances.size();
|
||||||
@ -1823,7 +1823,7 @@ void ModelInstance::transform_polygon(Polygon* polygon) const
|
|||||||
polygon->scale(get_scaling_factor(X), get_scaling_factor(Y)); // scale around polygon origin
|
polygon->scale(get_scaling_factor(X), get_scaling_factor(Y)); // scale around polygon origin
|
||||||
}
|
}
|
||||||
|
|
||||||
arrangement::ArrangePolygon ModelInstance::get_arrange_polygon(const Print& print) const
|
arrangement::ArrangePolygon ModelInstance::get_arrange_polygon(const PrintBase *print_base) const
|
||||||
{
|
{
|
||||||
static const double SIMPLIFY_TOLERANCE_MM = 0.1;
|
static const double SIMPLIFY_TOLERANCE_MM = 0.1;
|
||||||
|
|
||||||
@ -1841,13 +1841,17 @@ arrangement::ArrangePolygon ModelInstance::get_arrange_polygon(const Print& prin
|
|||||||
// https://github.com/prusa3d/PrusaSlicer/issues/2209
|
// https://github.com/prusa3d/PrusaSlicer/issues/2209
|
||||||
if (!p.points.empty()) {
|
if (!p.points.empty()) {
|
||||||
Polygons pp{p};
|
Polygons pp{p};
|
||||||
|
if (const Print* print = dynamic_cast<const Print*>(print_base))
|
||||||
|
{
|
||||||
//grow
|
//grow
|
||||||
double dist = print.config().min_object_distance(&print.full_print_config());
|
double dist = print->config().min_object_distance(&print->full_print_config());
|
||||||
std::cout << "min_object_distance = " << dist << "\n";
|
std::cout << "min_object_distance = " << dist << "\n";
|
||||||
pp = offset(pp, scale_(dist));
|
pp = offset(pp, scale_(dist));
|
||||||
//simplify
|
//simplify
|
||||||
if (!pp.empty())
|
if (!pp.empty())
|
||||||
pp = pp.front().simplify(scaled<double>(SIMPLIFY_TOLERANCE_MM));
|
pp = pp.front().simplify(scaled<double>(SIMPLIFY_TOLERANCE_MM));
|
||||||
|
}else
|
||||||
|
pp = p.simplify(scaled<double>(SIMPLIFY_TOLERANCE_MM));
|
||||||
if (!pp.empty()) p = pp.front();
|
if (!pp.empty()) p = pp.front();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ class ModelMaterial;
|
|||||||
class ModelObject;
|
class ModelObject;
|
||||||
class ModelVolume;
|
class ModelVolume;
|
||||||
class ModelWipeTower;
|
class ModelWipeTower;
|
||||||
|
class PrintBase;
|
||||||
class Print;
|
class Print;
|
||||||
class SLAPrint;
|
class SLAPrint;
|
||||||
|
|
||||||
@ -667,7 +668,7 @@ public:
|
|||||||
bool is_printable() const { return object->printable && printable && (print_volume_state == PVS_Inside); }
|
bool is_printable() const { return object->printable && printable && (print_volume_state == PVS_Inside); }
|
||||||
|
|
||||||
// Getting the input polygon for arrange
|
// Getting the input polygon for arrange
|
||||||
arrangement::ArrangePolygon get_arrange_polygon(const Print& print) const;
|
arrangement::ArrangePolygon get_arrange_polygon(const PrintBase* print) const;
|
||||||
|
|
||||||
// Apply the arrange result on the ModelInstance
|
// Apply the arrange result on the ModelInstance
|
||||||
void apply_arrange_result(const Vec2crd& offs, double rotation)
|
void apply_arrange_result(const Vec2crd& offs, double rotation)
|
||||||
@ -804,7 +805,7 @@ public:
|
|||||||
bool center_instances_around_point(const Vec2d &point);
|
bool center_instances_around_point(const Vec2d &point);
|
||||||
void translate(coordf_t x, coordf_t y, coordf_t z) { for (ModelObject *o : this->objects) o->translate(x, y, z); }
|
void translate(coordf_t x, coordf_t y, coordf_t z) { for (ModelObject *o : this->objects) o->translate(x, y, z); }
|
||||||
TriangleMesh mesh() const;
|
TriangleMesh mesh() const;
|
||||||
bool arrange_objects(const Print& print, const BoundingBoxf* bb = NULL);
|
bool arrange_objects(const PrintBase* print, const BoundingBoxf* bb = NULL);
|
||||||
// Croaks if the duplicated objects do not fit the print bed.
|
// Croaks if the duplicated objects do not fit the print bed.
|
||||||
void duplicate(size_t copies_num, coordf_t dist, const BoundingBoxf* bb = NULL);
|
void duplicate(size_t copies_num, coordf_t dist, const BoundingBoxf* bb = NULL);
|
||||||
void duplicate_objects(size_t copies_num, coordf_t dist, const BoundingBoxf* bb = NULL);
|
void duplicate_objects(size_t copies_num, coordf_t dist, const BoundingBoxf* bb = NULL);
|
||||||
|
@ -900,12 +900,19 @@ void PerimeterGenerator::process()
|
|||||||
this->fill_surfaces->append(infill_exp, stPosInternal | stDensSparse);
|
this->fill_surfaces->append(infill_exp, stPosInternal | stDensSparse);
|
||||||
|
|
||||||
if (infill_peri_overlap != 0) {
|
if (infill_peri_overlap != 0) {
|
||||||
ExPolygons polyWithoutOverlap = offset2_ex(
|
ExPolygons polyWithoutOverlap;
|
||||||
|
if (min_perimeter_infill_spacing / 2 > infill_peri_overlap)
|
||||||
|
polyWithoutOverlap = offset2_ex(
|
||||||
not_filled_exp,
|
not_filled_exp,
|
||||||
-inset - infill_gap - min_perimeter_infill_spacing / 2,
|
-inset - infill_gap - min_perimeter_infill_spacing / 2 + infill_peri_overlap,
|
||||||
(float) min_perimeter_infill_spacing / 2);
|
(float)min_perimeter_infill_spacing / 2 - infill_peri_overlap);
|
||||||
|
else
|
||||||
|
polyWithoutOverlap = offset_ex(
|
||||||
|
not_filled_exp,
|
||||||
|
-inset - infill_gap);
|
||||||
if (!top_fills.empty()) {
|
if (!top_fills.empty()) {
|
||||||
polyWithoutOverlap = union_ex(polyWithoutOverlap, top_infill_exp);
|
polyWithoutOverlap = union_ex(polyWithoutOverlap, top_infill_exp);
|
||||||
|
}
|
||||||
this->fill_no_overlap.insert(this->fill_no_overlap.end(), polyWithoutOverlap.begin(), polyWithoutOverlap.end());
|
this->fill_no_overlap.insert(this->fill_no_overlap.end(), polyWithoutOverlap.begin(), polyWithoutOverlap.end());
|
||||||
/*{
|
/*{
|
||||||
std::stringstream stri;
|
std::stringstream stri;
|
||||||
@ -920,7 +927,6 @@ void PerimeterGenerator::process()
|
|||||||
svg.Close();
|
svg.Close();
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} // for each island
|
} // for each island
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,9 +270,11 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->label = L("Bridges fan speed");
|
def->label = L("Bridges fan speed");
|
||||||
def->category = OptionCategory::cooling;
|
def->category = OptionCategory::cooling;
|
||||||
def->tooltip = L("This fan speed is enforced during all bridges and overhangs. It won't slow down the fan if it's currently running at a higher speed."
|
def->tooltip = L("This fan speed is enforced during all bridges and overhangs. It won't slow down the fan if it's currently running at a higher speed."
|
||||||
"\nSet to 0 to disable this override. Can only be overriden by disable_fan_first_layers.");
|
"\nSet to 1 to disable the fan."
|
||||||
|
"\nSet to -1 to disable this override."
|
||||||
|
"\nCan only be overriden by disable_fan_first_layers.");
|
||||||
def->sidetext = L("%");
|
def->sidetext = L("%");
|
||||||
def->min = 0;
|
def->min = -1;
|
||||||
def->max = 100;
|
def->max = 100;
|
||||||
def->mode = comAdvanced;
|
def->mode = comAdvanced;
|
||||||
def->set_default_value(new ConfigOptionInts { 100 });
|
def->set_default_value(new ConfigOptionInts { 100 });
|
||||||
@ -281,12 +283,14 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->label = L("Top fan speed");
|
def->label = L("Top fan speed");
|
||||||
def->category = OptionCategory::cooling;
|
def->category = OptionCategory::cooling;
|
||||||
def->tooltip = L("This fan speed is enforced during all top fills."
|
def->tooltip = L("This fan speed is enforced during all top fills."
|
||||||
"\nSet to 0 to disable this override. Can only be overriden by disable_fan_first_layers.");
|
"\nSet to 1 to disable the fan."
|
||||||
|
"\nSet to -1 to disable this override."
|
||||||
|
"\nCan only be overriden by disable_fan_first_layers.");
|
||||||
def->sidetext = L("%");
|
def->sidetext = L("%");
|
||||||
def->min = 0;
|
def->min = -1;
|
||||||
def->max = 100;
|
def->max = 100;
|
||||||
def->mode = comAdvanced;
|
def->mode = comAdvanced;
|
||||||
def->set_default_value(new ConfigOptionInts{ 0 });
|
def->set_default_value(new ConfigOptionInts{ -1 });
|
||||||
|
|
||||||
def = this->add("bridge_flow_ratio", coPercent);
|
def = this->add("bridge_flow_ratio", coPercent);
|
||||||
def->label = L("Bridge");
|
def->label = L("Bridge");
|
||||||
@ -764,14 +768,15 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def = this->add("external_perimeter_fan_speed", coInts);
|
def = this->add("external_perimeter_fan_speed", coInts);
|
||||||
def->label = L("External perimeter fan speed");
|
def->label = L("External perimeter fan speed");
|
||||||
def->tooltip = L("When set to a non-zero value this fan speed is used only for external perimeters (visible ones). "
|
def->tooltip = L("When set to a non-zero value this fan speed is used only for external perimeters (visible ones). "
|
||||||
"When set to zero the normal fan speed is used on external perimeters. "
|
"\nSet to 1 to disable the fan."
|
||||||
|
"\nSet to -1 to use the normal fan speed on external perimeters."
|
||||||
"External perimeters can benefit from higher fan speed to improve surface finish, "
|
"External perimeters can benefit from higher fan speed to improve surface finish, "
|
||||||
"while internal perimeters, infill, etc. benefit from lower fan speed to improve layer adhesion.");
|
"while internal perimeters, infill, etc. benefit from lower fan speed to improve layer adhesion.");
|
||||||
def->sidetext = L("%");
|
def->sidetext = L("%");
|
||||||
def->min = 0;
|
def->min = -1;
|
||||||
def->max = 100;
|
def->max = 100;
|
||||||
def->mode = comAdvanced;
|
def->mode = comAdvanced;
|
||||||
def->set_default_value(new ConfigOptionInts { 0 });
|
def->set_default_value(new ConfigOptionInts { -1 });
|
||||||
|
|
||||||
def = this->add("external_perimeter_overlap", coPercent);
|
def = this->add("external_perimeter_overlap", coPercent);
|
||||||
def->label = L("external perimeter overlap");
|
def->label = L("external perimeter overlap");
|
||||||
@ -1293,7 +1298,7 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->set_default_value(new ConfigOptionFloats{ 1.75 });
|
def->set_default_value(new ConfigOptionFloats{ 1.75 });
|
||||||
|
|
||||||
def = this->add("filament_shrink", coPercents);
|
def = this->add("filament_shrink", coPercents);
|
||||||
def->label = L("Shrikage");
|
def->label = L("Shrinkage");
|
||||||
def->tooltip = L("Enter the shrinkage percentage that the filament will get after cooling (94% if you measure 94mm instead of 100mm)."
|
def->tooltip = L("Enter the shrinkage percentage that the filament will get after cooling (94% if you measure 94mm instead of 100mm)."
|
||||||
" The part will be scaled in xy to conpensate."
|
" The part will be scaled in xy to conpensate."
|
||||||
" Only the filament used for the perimeter is taken into account."
|
" Only the filament used for the perimeter is taken into account."
|
||||||
@ -1491,7 +1496,9 @@ void PrintConfigDef::init_fff_params()
|
|||||||
def->full_label = L("First layer flow ratio");
|
def->full_label = L("First layer flow ratio");
|
||||||
def->sidetext = L("%");
|
def->sidetext = L("%");
|
||||||
def->category = OptionCategory::width;
|
def->category = OptionCategory::width;
|
||||||
def->tooltip = L("You can increase this to over-extrude on the first layer if there are not enough plastic because your bed isn't levelled.");
|
def->tooltip = L("You can increase this to over-extrude on the first layer if there are not enough plastic because your bed isn't levelled."
|
||||||
|
"\nNote: DON'T USE THIS if your only problem is bed levelling, LEVEL YOUR BED!"
|
||||||
|
" Use this setting only as last resort after all calibrations failed.");
|
||||||
def->min = 0;
|
def->min = 0;
|
||||||
def->mode = comExpert;
|
def->mode = comExpert;
|
||||||
def->set_default_value(new ConfigOptionPercent(100));
|
def->set_default_value(new ConfigOptionPercent(100));
|
||||||
@ -4544,6 +4551,9 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va
|
|||||||
float v = boost::lexical_cast<float>(value);
|
float v = boost::lexical_cast<float>(value);
|
||||||
if (v > 0)
|
if (v > 0)
|
||||||
value = boost::lexical_cast<std::string>(-v);
|
value = boost::lexical_cast<std::string>(-v);
|
||||||
|
} else if (opt_key == "thumbnails") {
|
||||||
|
if (value.empty())
|
||||||
|
value = "0x0,0x0";
|
||||||
} else if (opt_key == "z_steps_per_mm") {
|
} else if (opt_key == "z_steps_per_mm") {
|
||||||
opt_key = "z_step";
|
opt_key = "z_step";
|
||||||
float v = boost::lexical_cast<float>(value);
|
float v = boost::lexical_cast<float>(value);
|
||||||
|
@ -48,8 +48,19 @@ enum WipeAlgo {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum GCodeFlavor : uint8_t {
|
enum GCodeFlavor : uint8_t {
|
||||||
gcfRepRap, gcfRepetier, gcfTeacup, gcfMakerWare, gcfMarlin, gcfKlipper, gcfSailfish, gcfMach3, gcfMachinekit,
|
gcfRepRap,
|
||||||
gcfSmoothie, gcfSprinter, gcfNoExtrusion, gcfLerdge,
|
gcfRepetier,
|
||||||
|
gcfTeacup,
|
||||||
|
gcfMakerWare,
|
||||||
|
gcfMarlin,
|
||||||
|
gcfKlipper,
|
||||||
|
gcfSailfish,
|
||||||
|
gcfMach3,
|
||||||
|
gcfMachinekit,
|
||||||
|
gcfSmoothie,
|
||||||
|
gcfSprinter,
|
||||||
|
gcfNoExtrusion,
|
||||||
|
gcfLerdge,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum PrintHostType {
|
enum PrintHostType {
|
||||||
|
@ -32,7 +32,7 @@ coordf_t check_z_step(const coordf_t val, const coordf_t z_step) {
|
|||||||
//return int((val + z_step * 0.5) / z_step) * z_step;
|
//return int((val + z_step * 0.5) / z_step) * z_step;
|
||||||
}
|
}
|
||||||
inline bool test_z_step(const coordf_t val, const coordf_t z_step) {
|
inline bool test_z_step(const coordf_t val, const coordf_t z_step) {
|
||||||
if (z_step <= EPSILON) return val;
|
if (z_step <= EPSILON) return true;
|
||||||
uint64_t valint = uint64_t(val * 100000000. + 0.1);
|
uint64_t valint = uint64_t(val * 100000000. + 0.1);
|
||||||
uint64_t stepint = uint64_t(z_step * 100000000. + 0.1);
|
uint64_t stepint = uint64_t(z_step * 100000000. + 0.1);
|
||||||
return valint % stepint == 0;
|
return valint % stepint == 0;
|
||||||
|
@ -1522,7 +1522,7 @@ struct Plater::priv
|
|||||||
apply_wipe_tower();
|
apply_wipe_tower();
|
||||||
}
|
}
|
||||||
|
|
||||||
ArrangePolygon get_arrange_polygon(const Print &print) const
|
ArrangePolygon get_arrange_polygon(const PrintBase *print) const
|
||||||
{
|
{
|
||||||
Polygon p({
|
Polygon p({
|
||||||
{coord_t(0), coord_t(0)},
|
{coord_t(0), coord_t(0)},
|
||||||
@ -1627,7 +1627,8 @@ struct Plater::priv
|
|||||||
|
|
||||||
// Set up arrange polygon for a ModelInstance and Wipe tower
|
// Set up arrange polygon for a ModelInstance and Wipe tower
|
||||||
template<class T> ArrangePolygon get_arrange_poly(T *obj) const {
|
template<class T> ArrangePolygon get_arrange_poly(T *obj) const {
|
||||||
ArrangePolygon ap = obj->get_arrange_polygon(this->plater().fff_print);
|
ArrangePolygon ap = obj->get_arrange_polygon(
|
||||||
|
this->plater().printer_technology == ptFFF ? (PrintBase*)&this->plater().fff_print : (PrintBase*)&this->plater().sla_print);
|
||||||
ap.priority = 0;
|
ap.priority = 0;
|
||||||
ap.bed_idx = ap.translation.x() / bed_stride();
|
ap.bed_idx = ap.translation.x() / bed_stride();
|
||||||
ap.setter = [obj, this](const ArrangePolygon &p) {
|
ap.setter = [obj, this](const ArrangePolygon &p) {
|
||||||
@ -2888,7 +2889,8 @@ void Plater::priv::find_new_position(const ModelInstancePtrs &instances,
|
|||||||
for (const ModelObject *mo : model.objects)
|
for (const ModelObject *mo : model.objects)
|
||||||
for (const ModelInstance *inst : mo->instances) {
|
for (const ModelInstance *inst : mo->instances) {
|
||||||
auto it = std::find(instances.begin(), instances.end(), inst);
|
auto it = std::find(instances.begin(), instances.end(), inst);
|
||||||
auto arrpoly = inst->get_arrange_polygon(this->fff_print);
|
arrangement::ArrangePolygon arrpoly = inst->get_arrange_polygon(
|
||||||
|
this->printer_technology == ptFFF ? (PrintBase*)&this->fff_print : (PrintBase*)&this->sla_print);
|
||||||
|
|
||||||
if (it == instances.end())
|
if (it == instances.end())
|
||||||
fixed.emplace_back(std::move(arrpoly));
|
fixed.emplace_back(std::move(arrpoly));
|
||||||
@ -2897,7 +2899,8 @@ void Plater::priv::find_new_position(const ModelInstancePtrs &instances,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (updated_wipe_tower())
|
if (updated_wipe_tower())
|
||||||
fixed.emplace_back(wipetower.get_arrange_polygon(this->fff_print));
|
fixed.emplace_back(wipetower.get_arrange_polygon(
|
||||||
|
this->printer_technology == ptFFF ? (PrintBase*)&this->fff_print : (PrintBase*)&this->sla_print));
|
||||||
|
|
||||||
arrangement::arrange(movable, fixed, min_d, get_bed_shape_hint());
|
arrangement::arrange(movable, fixed, min_d, get_bed_shape_hint());
|
||||||
|
|
||||||
@ -4660,6 +4663,9 @@ const Print& Plater::fff_print() const { return p->fff_print; }
|
|||||||
Print& Plater::fff_print() { return p->fff_print; }
|
Print& Plater::fff_print() { return p->fff_print; }
|
||||||
const SLAPrint& Plater::sla_print() const { return p->sla_print; }
|
const SLAPrint& Plater::sla_print() const { return p->sla_print; }
|
||||||
SLAPrint& Plater::sla_print() { return p->sla_print; }
|
SLAPrint& Plater::sla_print() { return p->sla_print; }
|
||||||
|
const PrintBase* Plater::current_print() const {
|
||||||
|
return printer_technology() == ptFFF ? (PrintBase*)&p->fff_print : (PrintBase*)&p->sla_print;
|
||||||
|
}
|
||||||
|
|
||||||
void Plater::new_project()
|
void Plater::new_project()
|
||||||
{
|
{
|
||||||
|
@ -25,6 +25,7 @@ namespace Slic3r {
|
|||||||
|
|
||||||
class Model;
|
class Model;
|
||||||
class ModelObject;
|
class ModelObject;
|
||||||
|
class PrintBase;
|
||||||
class Print;
|
class Print;
|
||||||
class SLAPrint;
|
class SLAPrint;
|
||||||
enum SLAPrintObjectStep : unsigned int;
|
enum SLAPrintObjectStep : unsigned int;
|
||||||
@ -150,6 +151,7 @@ public:
|
|||||||
Print& fff_print();
|
Print& fff_print();
|
||||||
const SLAPrint& sla_print() const;
|
const SLAPrint& sla_print() const;
|
||||||
SLAPrint& sla_print();
|
SLAPrint& sla_print();
|
||||||
|
const PrintBase* current_print() const;
|
||||||
|
|
||||||
void new_project();
|
void new_project();
|
||||||
void load_project();
|
void load_project();
|
||||||
|
@ -29,19 +29,27 @@ std::string PresetHints::cooling_description(const Preset &preset)
|
|||||||
int max_speed_reduc = int(preset.config.opt_float("max_speed_reduction", 0));
|
int max_speed_reduc = int(preset.config.opt_float("max_speed_reduction", 0));
|
||||||
int fan_below_layer_time = preset.config.opt_int("fan_below_layer_time", 0);
|
int fan_below_layer_time = preset.config.opt_int("fan_below_layer_time", 0);
|
||||||
|
|
||||||
|
//for the time being, -1 shoudl eb for disabel, but it's 0 from legacy.
|
||||||
|
if (top_fan_speed == 0) top_fan_speed = -1;
|
||||||
|
if (bridge_fan_speed == 0) bridge_fan_speed = -1;
|
||||||
|
if (ext_peri_fan_speed == 0) ext_peri_fan_speed = -1;
|
||||||
|
if (top_fan_speed == 1) top_fan_speed = 0;
|
||||||
|
if (bridge_fan_speed == 1) bridge_fan_speed = 0;
|
||||||
|
if (ext_peri_fan_speed == 1) ext_peri_fan_speed = 0;
|
||||||
|
|
||||||
//if (preset.config.opt_bool("cooling", 0)) {
|
//if (preset.config.opt_bool("cooling", 0)) {
|
||||||
out = _utf8(L("Fan"));
|
out = _utf8(L("Fan"));
|
||||||
if (preset.config.opt_bool("fan_always_on", 0)) {
|
if (preset.config.opt_bool("fan_always_on", 0)) {
|
||||||
|
|
||||||
out += " " + (boost::format(_utf8(L("will run at %1%%% by default"))) % min_fan_speed).str() ;
|
out += " " + (boost::format(_utf8(L("will run at %1%%% by default"))) % min_fan_speed).str() ;
|
||||||
|
|
||||||
if (ext_peri_fan_speed > 0 && ext_peri_fan_speed != min_fan_speed) {
|
if (ext_peri_fan_speed >= 0 && ext_peri_fan_speed != min_fan_speed) {
|
||||||
out += ", " + (boost::format(_utf8(L("at %1%%% over external perimeters"))) % ext_peri_fan_speed).str();
|
out += ", " + (boost::format(_utf8(L("at %1%%% over external perimeters"))) % ext_peri_fan_speed).str();
|
||||||
}
|
}
|
||||||
if (top_fan_speed > 0 && top_fan_speed != min_fan_speed) {
|
if (top_fan_speed >= 0 && top_fan_speed != min_fan_speed) {
|
||||||
out += ", " + (boost::format(_utf8(L("at %1%%% over top fill surfaces"))) % top_fan_speed).str();
|
out += ", " + (boost::format(_utf8(L("at %1%%% over top fill surfaces"))) % top_fan_speed).str();
|
||||||
}
|
}
|
||||||
if (bridge_fan_speed > 0 && bridge_fan_speed > min_fan_speed) {
|
if (bridge_fan_speed >= 0 && bridge_fan_speed > min_fan_speed) {
|
||||||
out += ", " + (boost::format(_utf8(L("at %1%%% over bridges"))) % bridge_fan_speed).str();
|
out += ", " + (boost::format(_utf8(L("at %1%%% over bridges"))) % bridge_fan_speed).str();
|
||||||
}
|
}
|
||||||
if (disable_fan_first_layers > 1)
|
if (disable_fan_first_layers > 1)
|
||||||
@ -66,7 +74,7 @@ std::string PresetHints::cooling_description(const Preset &preset)
|
|||||||
} else if (ext_peri_fan_speed > min_fan_speed) {
|
} else if (ext_peri_fan_speed > min_fan_speed) {
|
||||||
out += ", " + (boost::format(_utf8(L("at %1%%% over external perimeters"))) % ext_peri_fan_speed).str() + " " + L("if it's above the current computed fan speed value");
|
out += ", " + (boost::format(_utf8(L("at %1%%% over external perimeters"))) % ext_peri_fan_speed).str() + " " + L("if it's above the current computed fan speed value");
|
||||||
}
|
}
|
||||||
if (top_fan_speed > 0) {
|
if (top_fan_speed >= 0) {
|
||||||
out += ", " + (boost::format(_utf8(L("at %1%%% over top fill surfaces"))) % top_fan_speed).str();
|
out += ", " + (boost::format(_utf8(L("at %1%%% over top fill surfaces"))) % top_fan_speed).str();
|
||||||
}
|
}
|
||||||
if (bridge_fan_speed > max_fan_speed) {
|
if (bridge_fan_speed > max_fan_speed) {
|
||||||
@ -108,6 +116,17 @@ std::string PresetHints::cooling_description(const Preset &preset)
|
|||||||
% min_print_speed).str();
|
% min_print_speed).str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//tooltip for Depractaed values
|
||||||
|
bridge_fan_speed = preset.config.opt_int("bridge_fan_speed", 0);
|
||||||
|
ext_peri_fan_speed = preset.config.opt_int("external_perimeter_fan_speed", 0);
|
||||||
|
top_fan_speed = preset.config.opt_int("top_fan_speed", 0);
|
||||||
|
if (top_fan_speed == 0)
|
||||||
|
out += "\n\n!!! 0 for the Top fan speed is Deprecated, please set it to -1 to disable it !!!";
|
||||||
|
if (ext_peri_fan_speed == 0)
|
||||||
|
out += "\n\n!!! 0 for the External perimeters fan speed is Deprecated, please set it to -1 to disable it !!!";
|
||||||
|
if (bridge_fan_speed == 0)
|
||||||
|
out += "\n\n!!! 0 for the Bridge fan speed is Deprecated, please set it to -1 to disable it !!!";
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,10 +313,10 @@ std::string PresetHints::maximum_volumetric_flow_description(const PresetBundle
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string PresetHints::recommended_thin_wall_thickness(const PresetBundle &preset_bundle)
|
std::string PresetHints::recommended_thin_wall_thickness(const PresetBundle& preset_bundle)
|
||||||
{
|
{
|
||||||
const DynamicPrintConfig &print_config = preset_bundle.prints .get_edited_preset().config;
|
const DynamicPrintConfig& print_config = preset_bundle.prints.get_edited_preset().config;
|
||||||
const DynamicPrintConfig &printer_config = preset_bundle.printers .get_edited_preset().config;
|
const DynamicPrintConfig& printer_config = preset_bundle.printers.get_edited_preset().config;
|
||||||
|
|
||||||
float layer_height = float(print_config.opt_float("layer_height"));
|
float layer_height = float(print_config.opt_float("layer_height"));
|
||||||
int num_perimeters = print_config.opt_int("perimeters");
|
int num_perimeters = print_config.opt_int("perimeters");
|
||||||
@ -329,18 +348,46 @@ std::string PresetHints::recommended_thin_wall_thickness(const PresetBundle &pre
|
|||||||
out += (boost::format(_utf8(L("%d perimeter: %.2f mm"))) % 1 % (external_perimeter_flow.width + external_perimeter_flow.spacing())).str() + " ";
|
out += (boost::format(_utf8(L("%d perimeter: %.2f mm"))) % 1 % (external_perimeter_flow.width + external_perimeter_flow.spacing())).str() + " ";
|
||||||
// Start with the width of two closely spaced
|
// Start with the width of two closely spaced
|
||||||
try {
|
try {
|
||||||
double width = 2*(external_perimeter_flow.width + external_perimeter_flow.spacing(perimeter_flow));
|
double width = 2 * (external_perimeter_flow.width + external_perimeter_flow.spacing(perimeter_flow));
|
||||||
for (int i = 2; i <= num_lines; thin_walls ? ++ i : i ++) {
|
for (int i = 2; i <= num_lines; thin_walls ? ++i : i++) {
|
||||||
out += ", " + (boost::format(_utf8(L("%d perimeter: %.2f mm"))) % i % width).str() + " ";
|
out += ", " + (boost::format(_utf8(L("%d perimeter: %.2f mm"))) % i % width).str() + " ";
|
||||||
width += perimeter_flow.spacing() * 2;
|
width += perimeter_flow.spacing() * 2;
|
||||||
}
|
}
|
||||||
} catch (const FlowErrorNegativeSpacing &) {
|
}
|
||||||
|
catch (const FlowErrorNegativeSpacing&) {
|
||||||
out = _utf8(L("Recommended object thin wall thickness: Not available due to excessively small extrusion width."));
|
out = _utf8(L("Recommended object thin wall thickness: Not available due to excessively small extrusion width."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string PresetHints::recommended_extrusion_width(const PresetBundle& preset_bundle)
|
||||||
|
{
|
||||||
|
const DynamicPrintConfig& print_config = preset_bundle.prints.get_edited_preset().config;
|
||||||
|
const DynamicPrintConfig& printer_config = preset_bundle.printers.get_edited_preset().config;
|
||||||
|
|
||||||
|
int nb_nozzles = printer_config.option<ConfigOptionFloats>("nozzle_diameter")->values.size();
|
||||||
|
|
||||||
|
double nozzle_diameter = 0;
|
||||||
|
for(int i=0; i< nb_nozzles; i++)
|
||||||
|
nozzle_diameter = std::max(nozzle_diameter, printer_config.opt_float("nozzle_diameter", i));
|
||||||
|
double layer_height = print_config.opt_float("layer_height");
|
||||||
|
double first_layer_height = print_config.option<ConfigOptionFloatOrPercent>("first_layer_height")->get_abs_value(nozzle_diameter);
|
||||||
|
|
||||||
|
std::string out;
|
||||||
|
|
||||||
|
Flow first_layer_flow = Flow::new_from_spacing(nozzle_diameter, nozzle_diameter, first_layer_height, false);
|
||||||
|
Flow layer_flow = Flow::new_from_spacing(nozzle_diameter, nozzle_diameter, layer_height, false);
|
||||||
|
|
||||||
|
out += _utf8(L("Ideally, the spacing between two extrusions shouldn't be lower than the nozzle diameter. Below are the extrusion widths for a spacing equal to the nozzle diameter.\n"));
|
||||||
|
out += (boost::format(_utf8(L("Recommended min extrusion width for the first layer (with a first layer height of %1%) is %2$.3f mm (or %3%%%)\n")))
|
||||||
|
% first_layer_height % first_layer_flow.width % int(first_layer_flow.width * 100. / nozzle_diameter)).str();
|
||||||
|
out += (boost::format(_utf8(L("Recommended min extrusion width for other layers (with a layer height of %1%) is %2$.3f mm (or %3%%%).\n")))
|
||||||
|
% layer_height % layer_flow.width % int(layer_flow.width * 100. / nozzle_diameter)).str();
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Produce a textual explanation of the combined effects of the top/bottom_solid_layers
|
// Produce a textual explanation of the combined effects of the top/bottom_solid_layers
|
||||||
// versus top/bottom_min_shell_thickness. Which of the two values wins depends
|
// versus top/bottom_min_shell_thickness. Which of the two values wins depends
|
||||||
|
@ -22,12 +22,16 @@ public:
|
|||||||
|
|
||||||
// Produce a textual description of a recommended thin wall thickness
|
// Produce a textual description of a recommended thin wall thickness
|
||||||
// from the provided number of perimeters and the external / internal perimeter width.
|
// from the provided number of perimeters and the external / internal perimeter width.
|
||||||
static std::string recommended_thin_wall_thickness(const PresetBundle &preset_bundle);
|
static std::string recommended_thin_wall_thickness(const PresetBundle& preset_bundle);
|
||||||
|
|
||||||
|
// Produce a textual description of a recommended extrusion width
|
||||||
|
// from the provided layer height
|
||||||
|
static std::string recommended_extrusion_width(const PresetBundle& preset_bundle);
|
||||||
|
|
||||||
// Produce a textual explanation of the combined effects of the top/bottom_solid_layers
|
// Produce a textual explanation of the combined effects of the top/bottom_solid_layers
|
||||||
// versus top/bottom_min_shell_thickness. Which of the two values wins depends
|
// versus top/bottom_min_shell_thickness. Which of the two values wins depends
|
||||||
// on the active layer height.
|
// on the active layer height.
|
||||||
static std::string top_bottom_shell_thickness_explanation(const PresetBundle &preset_bundle);
|
static std::string top_bottom_shell_thickness_explanation(const PresetBundle& preset_bundle);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Slic3r
|
} // namespace Slic3r
|
||||||
|
@ -1313,13 +1313,7 @@ bool Tab::create_pages(std::string setting_type_name, int idx_page)
|
|||||||
TabPrinter* tab = nullptr;
|
TabPrinter* tab = nullptr;
|
||||||
if ((tab = dynamic_cast<TabPrinter*>(this)) == nullptr) continue;
|
if ((tab = dynamic_cast<TabPrinter*>(this)) == nullptr) continue;
|
||||||
current_group->m_on_change = set_or_add(current_group->m_on_change, [this, tab](t_config_option_key opt_key, boost::any value) {
|
current_group->m_on_change = set_or_add(current_group->m_on_change, [this, tab](t_config_option_key opt_key, boost::any value) {
|
||||||
if (opt_key == "silent_mode") {
|
tab->update_fff(); //check for kinematic rebuild
|
||||||
bool val = boost::any_cast<bool>(value);
|
|
||||||
if (tab->m_use_silent_mode != val) {
|
|
||||||
tab->m_rebuild_kinematics_page = true;
|
|
||||||
tab->m_use_silent_mode = val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tab->build_unregular_pages();
|
tab->build_unregular_pages();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -1499,6 +1493,16 @@ bool Tab::create_pages(std::string setting_type_name, int idx_page)
|
|||||||
};
|
};
|
||||||
current_group->append_line(current_line);
|
current_group->append_line(current_line);
|
||||||
}
|
}
|
||||||
|
else if (boost::starts_with(full_line, "recommended_extrusion_width_description")) {
|
||||||
|
TabPrint* tab = nullptr;
|
||||||
|
if ((tab = dynamic_cast<TabPrint*>(this)) == nullptr) continue;
|
||||||
|
current_line = { "", "" };
|
||||||
|
current_line.full_width = 1;
|
||||||
|
current_line.widget = [this, tab](wxWindow* parent) {
|
||||||
|
return description_line_widget(parent, &(tab->m_recommended_extrusion_width_description_line));
|
||||||
|
};
|
||||||
|
current_group->append_line(current_line);
|
||||||
|
}
|
||||||
else if (boost::starts_with(full_line, "top_bottom_shell_thickness_explanation")) {
|
else if (boost::starts_with(full_line, "top_bottom_shell_thickness_explanation")) {
|
||||||
TabPrint* tab = nullptr;
|
TabPrint* tab = nullptr;
|
||||||
if ((tab = dynamic_cast<TabPrint*>(this)) == nullptr) continue;
|
if ((tab = dynamic_cast<TabPrint*>(this)) == nullptr) continue;
|
||||||
@ -1706,6 +1710,9 @@ void TabPrint::update()
|
|||||||
if (m_recommended_thin_wall_thickness_description_line)
|
if (m_recommended_thin_wall_thickness_description_line)
|
||||||
m_recommended_thin_wall_thickness_description_line->SetText(
|
m_recommended_thin_wall_thickness_description_line->SetText(
|
||||||
from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle)));
|
from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle)));
|
||||||
|
if (m_recommended_extrusion_width_description_line)
|
||||||
|
m_recommended_extrusion_width_description_line->SetText(
|
||||||
|
from_u8(PresetHints::recommended_extrusion_width(*m_preset_bundle)));
|
||||||
if(m_top_bottom_shell_thickness_explanation)
|
if(m_top_bottom_shell_thickness_explanation)
|
||||||
m_top_bottom_shell_thickness_explanation->SetText(
|
m_top_bottom_shell_thickness_explanation->SetText(
|
||||||
from_u8(PresetHints::top_bottom_shell_thickness_explanation(*m_preset_bundle)));
|
from_u8(PresetHints::top_bottom_shell_thickness_explanation(*m_preset_bundle)));
|
||||||
@ -1731,6 +1738,9 @@ void TabPrint::OnActivate()
|
|||||||
if (m_recommended_thin_wall_thickness_description_line)
|
if (m_recommended_thin_wall_thickness_description_line)
|
||||||
m_recommended_thin_wall_thickness_description_line->SetText(
|
m_recommended_thin_wall_thickness_description_line->SetText(
|
||||||
from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle)));
|
from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle)));
|
||||||
|
if (m_recommended_extrusion_width_description_line)
|
||||||
|
m_recommended_extrusion_width_description_line->SetText(
|
||||||
|
from_u8(PresetHints::recommended_extrusion_width(*m_preset_bundle)));
|
||||||
if(m_top_bottom_shell_thickness_explanation)
|
if(m_top_bottom_shell_thickness_explanation)
|
||||||
m_top_bottom_shell_thickness_explanation->SetText(
|
m_top_bottom_shell_thickness_explanation->SetText(
|
||||||
from_u8(PresetHints::top_bottom_shell_thickness_explanation(*m_preset_bundle)));
|
from_u8(PresetHints::top_bottom_shell_thickness_explanation(*m_preset_bundle)));
|
||||||
@ -2150,14 +2160,18 @@ void TabPrinter::milling_count_changed(size_t milling_count)
|
|||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabPrinter::append_option_line_kinematics(ConfigOptionsGroupShp optgroup, const std::string opt_key)
|
void TabPrinter::append_option_line_kinematics(ConfigOptionsGroupShp optgroup, const std::string opt_key, const std::string override_sidetext)
|
||||||
{
|
{
|
||||||
Option option = optgroup->get_option(opt_key, 0);
|
Option option = optgroup->get_option(opt_key, 0);
|
||||||
|
if (!override_sidetext.empty())
|
||||||
|
option.opt.sidetext = override_sidetext;
|
||||||
Line line = Line{ _(option.opt.full_label), "" };
|
Line line = Line{ _(option.opt.full_label), "" };
|
||||||
option.opt.width = 10;
|
option.opt.width = 10;
|
||||||
line.append_option(option);
|
line.append_option(option);
|
||||||
if (m_use_silent_mode) {
|
if (m_use_silent_mode) {
|
||||||
option = optgroup->get_option(opt_key, 1);
|
option = optgroup->get_option(opt_key, 1);
|
||||||
|
if (!override_sidetext.empty())
|
||||||
|
option.opt.sidetext = override_sidetext;
|
||||||
option.opt.width = 10;
|
option.opt.width = 10;
|
||||||
line.append_option(option);
|
line.append_option(option);
|
||||||
}
|
}
|
||||||
@ -2214,12 +2228,15 @@ PageShp TabPrinter::build_kinematics_page()
|
|||||||
|
|
||||||
std::vector<std::string> axes{ "x", "y", "z", "e" };
|
std::vector<std::string> axes{ "x", "y", "z", "e" };
|
||||||
optgroup = page->new_optgroup(_(L("Maximum feedrates")));
|
optgroup = page->new_optgroup(_(L("Maximum feedrates")));
|
||||||
for (const std::string &axis : axes) {
|
for (const std::string& axis : axes) {
|
||||||
|
if (m_config->option<ConfigOptionEnum<GCodeFlavor>>("gcode_flavor")->value == gcfRepRap)
|
||||||
|
append_option_line_kinematics(optgroup, "machine_max_feedrate_" + axis, "mm/min");
|
||||||
|
else
|
||||||
append_option_line_kinematics(optgroup, "machine_max_feedrate_" + axis);
|
append_option_line_kinematics(optgroup, "machine_max_feedrate_" + axis);
|
||||||
}
|
}
|
||||||
|
|
||||||
optgroup = page->new_optgroup(_(L("Maximum accelerations")));
|
optgroup = page->new_optgroup(_(L("Maximum accelerations")));
|
||||||
for (const std::string &axis : axes) {
|
for (const std::string& axis : axes) {
|
||||||
append_option_line_kinematics(optgroup, "machine_max_acceleration_" + axis);
|
append_option_line_kinematics(optgroup, "machine_max_acceleration_" + axis);
|
||||||
}
|
}
|
||||||
append_option_line_kinematics(optgroup, "machine_max_acceleration_extruding");
|
append_option_line_kinematics(optgroup, "machine_max_acceleration_extruding");
|
||||||
@ -2227,14 +2244,18 @@ PageShp TabPrinter::build_kinematics_page()
|
|||||||
append_option_line_kinematics(optgroup, "machine_max_acceleration_travel");
|
append_option_line_kinematics(optgroup, "machine_max_acceleration_travel");
|
||||||
|
|
||||||
optgroup = page->new_optgroup(_(L("Jerk limits")));
|
optgroup = page->new_optgroup(_(L("Jerk limits")));
|
||||||
for (const std::string &axis : axes) {
|
for (const std::string& axis : axes) {
|
||||||
append_option_line_kinematics(optgroup, "machine_max_jerk_" + axis);
|
append_option_line_kinematics(optgroup, "machine_max_jerk_" + axis);
|
||||||
}
|
}
|
||||||
|
|
||||||
optgroup = page->new_optgroup(_(L("Minimum feedrates")));
|
optgroup = page->new_optgroup(_(L("Minimum feedrates")));
|
||||||
|
if (m_config->option<ConfigOptionEnum<GCodeFlavor>>("gcode_flavor")->value == gcfRepRap){
|
||||||
|
append_option_line_kinematics(optgroup, "machine_min_extruding_rate", "mm/min");
|
||||||
|
append_option_line_kinematics(optgroup, "machine_min_travel_rate", "mm/min");
|
||||||
|
} else {
|
||||||
append_option_line_kinematics(optgroup, "machine_min_extruding_rate");
|
append_option_line_kinematics(optgroup, "machine_min_extruding_rate");
|
||||||
append_option_line_kinematics(optgroup, "machine_min_travel_rate");
|
append_option_line_kinematics(optgroup, "machine_min_travel_rate");
|
||||||
|
}
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2491,8 +2512,8 @@ void TabPrinter::update_fff()
|
|||||||
else
|
else
|
||||||
GCodeWriter::PausePrintCode = "M601";
|
GCodeWriter::PausePrintCode = "M601";
|
||||||
|
|
||||||
if (m_is_marlin != is_marlin_flavor) {
|
if (m_last_gcode_flavor != uint8_t(m_config->option<ConfigOptionEnum<GCodeFlavor>>("gcode_flavor")->value)) {
|
||||||
m_is_marlin = is_marlin_flavor;
|
m_last_gcode_flavor = uint8_t(m_config->option<ConfigOptionEnum<GCodeFlavor>>("gcode_flavor")->value);
|
||||||
m_rebuild_kinematics_page = true;
|
m_rebuild_kinematics_page = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,6 +338,7 @@ public:
|
|||||||
~TabPrint() {}
|
~TabPrint() {}
|
||||||
|
|
||||||
ogStaticText* m_recommended_thin_wall_thickness_description_line = nullptr;
|
ogStaticText* m_recommended_thin_wall_thickness_description_line = nullptr;
|
||||||
|
ogStaticText* m_recommended_extrusion_width_description_line = nullptr;
|
||||||
ogStaticText* m_top_bottom_shell_thickness_explanation = nullptr;
|
ogStaticText* m_top_bottom_shell_thickness_explanation = nullptr;
|
||||||
bool m_support_material_overhangs_queried = false;
|
bool m_support_material_overhangs_queried = false;
|
||||||
|
|
||||||
@ -383,9 +384,9 @@ public:
|
|||||||
void build_printhost(ConfigOptionsGroup *optgroup);
|
void build_printhost(ConfigOptionsGroup *optgroup);
|
||||||
|
|
||||||
bool m_has_single_extruder_MM_page = false;
|
bool m_has_single_extruder_MM_page = false;
|
||||||
bool m_is_marlin = false;
|
uint8_t m_last_gcode_flavor = uint8_t(255);
|
||||||
bool m_use_silent_mode = false;
|
bool m_use_silent_mode = false;
|
||||||
void append_option_line_kinematics(ConfigOptionsGroupShp optgroup, const std::string opt_key);
|
void append_option_line_kinematics(ConfigOptionsGroupShp optgroup, const std::string opt_key, const std::string override_units = "");
|
||||||
bool m_rebuild_kinematics_page = false;
|
bool m_rebuild_kinematics_page = false;
|
||||||
|
|
||||||
wxButton* m_serial_test_btn = nullptr;
|
wxButton* m_serial_test_btn = nullptr;
|
||||||
|
@ -174,7 +174,7 @@ void init_print(std::vector<TriangleMesh> &&meshes, Slic3r::Print &print, Slic3r
|
|||||||
}
|
}
|
||||||
|
|
||||||
print.apply(model, config);
|
print.apply(model, config);
|
||||||
model.arrange_objects(print);
|
model.arrange_objects(&print);
|
||||||
print.apply(model, config);
|
print.apply(model, config);
|
||||||
print.validate();
|
print.validate();
|
||||||
print.set_status_silent();
|
print.set_status_silent();
|
||||||
|
@ -42,7 +42,7 @@ SCENARIO("Model construction", "[Model]") {
|
|||||||
}
|
}
|
||||||
model_object->add_instance();
|
model_object->add_instance();
|
||||||
print.apply(model, config); // apply config for arrange_objects
|
print.apply(model, config); // apply config for arrange_objects
|
||||||
model.arrange_objects(print);
|
model.arrange_objects(&print);
|
||||||
model.center_instances_around_point(Slic3r::Vec2d(100, 100));
|
model.center_instances_around_point(Slic3r::Vec2d(100, 100));
|
||||||
model_object->ensure_on_bed();
|
model_object->ensure_on_bed();
|
||||||
print.auto_assign_extruders(model_object);
|
print.auto_assign_extruders(model_object);
|
||||||
|
@ -37,7 +37,7 @@ std::unique_ptr<Print> init_print_with_dist(DynamicPrintConfig &config, float di
|
|||||||
|
|
||||||
if (distance <= 0) {
|
if (distance <= 0) {
|
||||||
print->apply(model, config);
|
print->apply(model, config);
|
||||||
model.arrange_objects(*print);// print->config().min_object_distance(&print->config(), 999999));
|
model.arrange_objects(&*print);// print->config().min_object_distance(&print->config(), 999999));
|
||||||
model.center_instances_around_point(Slic3r::Vec2d(100, 100));
|
model.center_instances_around_point(Slic3r::Vec2d(100, 100));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ void init_print(Print& print, std::initializer_list<TestMesh> meshes, Slic3r::Mo
|
|||||||
}
|
}
|
||||||
|
|
||||||
print.apply(model, config); // apply config for the arrange_objects
|
print.apply(model, config); // apply config for the arrange_objects
|
||||||
model.arrange_objects(print);
|
model.arrange_objects(&print);
|
||||||
model.center_instances_around_point(Slic3r::Vec2d(100,100));
|
model.center_instances_around_point(Slic3r::Vec2d(100,100));
|
||||||
for (auto* mo : model.objects) {
|
for (auto* mo : model.objects) {
|
||||||
print.auto_assign_extruders(mo);
|
print.auto_assign_extruders(mo);
|
||||||
@ -323,7 +323,7 @@ void init_print(Print& print, std::vector<TriangleMesh> meshes, Slic3r::Model& m
|
|||||||
}
|
}
|
||||||
|
|
||||||
print.apply(model, config); // apply config for the arrange_objects
|
print.apply(model, config); // apply config for the arrange_objects
|
||||||
model.arrange_objects(print);
|
model.arrange_objects(&print);
|
||||||
model.center_instances_around_point(Slic3r::Vec2d(100,100));
|
model.center_instances_around_point(Slic3r::Vec2d(100,100));
|
||||||
print.apply(model, config);
|
print.apply(model, config);
|
||||||
for (ModelObject* mo : model.objects) {
|
for (ModelObject* mo : model.objects) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user