mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-05-16 18:12:10 +00:00
NEW: Add temperature-hold flag to machine_start_gcode
Description:By calculating the total area of the first layer (object, support, wipe tower), the flag is true when the area is greater than 200 and the height is less than 0.3 mm. machine_start_code placeholder: "hold_chamber_temp_for_flat_print" jira: STUDIO-13370 Change-Id: If5982da28afb57e9bbb8a0a1ba69bc45f5cc1c7c (cherry picked from commit eb942df30e6779acbdf1d330cae5c6ebe0010abf) (cherry picked from commit 47a242ecd639cc630f70d9b6cf4d1fd91fd511d4) (cherry picked from commit 87f4741d9caaf33699d647a2ce5b4f60d535f7b1)
This commit is contained in:
@@ -2785,6 +2785,46 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
|
||||
this->placeholder_parser().set("scan_first_layer", new ConfigOptionBool(false));
|
||||
}
|
||||
}
|
||||
{ // hold chamber temp for flat print: Flag
|
||||
double print_area_sum_threshold = 40000.0, pring_hight_threshold = 0.3; // thresholds in mm^2 and mm as units
|
||||
|
||||
double area_sum_temp = 0.0;
|
||||
coordf_t max_hight_temp = -1.0;
|
||||
for (ObjectID print_object_ID_t : print.print_object_ids()) {
|
||||
const PrintObject *print_object = print.get_object(print_object_ID_t);
|
||||
// object hight
|
||||
if (!print_object->layers().empty() && print_object->layers().back()->print_z > max_hight_temp) max_hight_temp = print_object->layers().back()->print_z;
|
||||
// object area
|
||||
if (!print_object->layers().empty() && print_object->layers().front()->print_z < print.config().initial_layer_print_height + EPSILON &&
|
||||
!print_object->layers().front()->lslices.empty()) {
|
||||
ExPolygons temp_Expolys = print_object->layers().front()->lslices;
|
||||
for (ExPolygon &temp_Expoly : temp_Expolys) { area_sum_temp += temp_Expoly.area(); }
|
||||
}
|
||||
// suport area
|
||||
if (!print_object->support_layers().empty() && print_object->support_layers().front()->print_z < print.config().initial_layer_print_height + EPSILON &&
|
||||
!print_object->support_layers().front()->support_islands.empty()) {
|
||||
ExPolygons temp_Expolys = print_object->support_layers().front()->support_islands;
|
||||
for (ExPolygon &temp_Expoly : temp_Expolys) { area_sum_temp += temp_Expoly.area(); }
|
||||
}
|
||||
// brim area
|
||||
if (print.m_brimMap.find(print_object_ID_t) != print.m_brimMap.end() && !print.m_brimMap.at(print_object_ID_t).entities.empty()) { // contain brim
|
||||
for (const ExtrusionEntity *entities_temp : print.m_brimMap.at(print_object_ID_t).entities) {
|
||||
Polygons temp_Expolys;
|
||||
entities_temp->polygons_covered_by_spacing(temp_Expolys, 0.0f);
|
||||
for (Polygon &temp_Expoly : temp_Expolys) { area_sum_temp += temp_Expoly.area(); }
|
||||
}
|
||||
}
|
||||
}
|
||||
// wipe tower area
|
||||
if (has_wipe_tower) {
|
||||
Polygon temp_Expoly = print.wipe_tower_data().wipe_tower_mesh_data->bottom;
|
||||
area_sum_temp += temp_Expoly.area();
|
||||
}
|
||||
bool hold_chamber_temp_for_flat_print = max_hight_temp > 0 && max_hight_temp < pring_hight_threshold && area_sum_temp > print_area_sum_threshold * 1.0e10;
|
||||
this->placeholder_parser().set("hold_chamber_temp_for_flat_print", new ConfigOptionBool(hold_chamber_temp_for_flat_print));
|
||||
}
|
||||
|
||||
|
||||
std::string machine_start_gcode = this->placeholder_parser_process("machine_start_gcode", print.config().machine_start_gcode.value, initial_extruder_id);
|
||||
if (print.config().gcode_flavor != gcfKlipper) {
|
||||
// Set bed temperature if the start G-code does not contain any bed temp control G-codes.
|
||||
|
||||
Reference in New Issue
Block a user