ENH: Add extruder_printable_height

to support different printable height of multi_extruder
jira:none

Change-Id: I265c65e15fc8f598c3456556557bb6977b5de820
(cherry picked from commit 933adbaaf0eaf361e39f131dd5536dca91214d43)
This commit is contained in:
zhimin.zeng
2024-11-16 19:48:31 +08:00
committed by Noisyfox
parent 55d8d77430
commit 5935b75fe5
13 changed files with 163 additions and 37 deletions

View File

@@ -2964,6 +2964,7 @@ void GLCanvas3D::load_gcode_preview(const GCodeProcessorResult& gcode_result, co
_set_warning_notification_if_needed(EWarning::ToolpathOutside);
_set_warning_notification_if_needed(EWarning::GCodeConflict);
_set_warning_notification_if_needed(EWarning::MultiExtruderPrintableError);
_set_warning_notification_if_needed(EWarning::MultiExtruderHeightOutside);
_set_warning_notification_if_needed(EWarning::FilamentUnPrintableOnFirstLayer);
}
@@ -9706,7 +9707,9 @@ void GLCanvas3D::_set_warning_notification_if_needed(EWarning warning)
else if (warning == EWarning::GCodeConflict)
show = m_gcode_viewer.has_data() && m_gcode_viewer.is_contained_in_bed() && m_gcode_viewer.m_conflict_result.has_value();
else if (warning == EWarning::MultiExtruderPrintableError)
show = m_gcode_viewer.has_data() && m_gcode_viewer.m_gcode_check_result.error_code != 0;
show = m_gcode_viewer.has_data() && (m_gcode_viewer.m_gcode_check_result.error_code & 1);
else if (warning == EWarning::MultiExtruderHeightOutside)
show = m_gcode_viewer.has_data() && (m_gcode_viewer.m_gcode_check_result.error_code & (1 << 1));
else if (warning == EWarning::FilamentUnPrintableOnFirstLayer)
show = m_gcode_viewer.has_data() && m_gcode_viewer.filament_printable_reuslt.has_value();
}
@@ -9723,7 +9726,8 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
PLATER_ERROR,
SLICING_SERIOUS_WARNING,
SLICING_ERROR,
SLICING_LIMIT_ERROR
SLICING_LIMIT_ERROR,
SLICING_HEIGHT_OUTSIDE
};
std::string text;
ErrorType error = ErrorType::PLATER_WARNING;
@@ -9759,8 +9763,8 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
break;
}
case EWarning::MultiExtruderPrintableError: {
for (auto error_iter = m_gcode_viewer.m_gcode_check_result.error_infos.begin(); error_iter != m_gcode_viewer.m_gcode_check_result.error_infos.end(); ++error_iter) {
if (error_iter != m_gcode_viewer.m_gcode_check_result.error_infos.begin()) {
for (auto error_iter = m_gcode_viewer.m_gcode_check_result.print_area_error_infos.begin(); error_iter != m_gcode_viewer.m_gcode_check_result.print_area_error_infos.end(); ++error_iter) {
if (error_iter != m_gcode_viewer.m_gcode_check_result.print_area_error_infos.begin()) {
text += "\n";
}
int extruder_id = error_iter->first + 1; // change extruder id to 1 based
@@ -9773,7 +9777,6 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
int filament_id = error_iter->second[i].first + 1; // change filament id to 1 based
int object_label_id = error_iter->second[i].second;
//ModelObject* object->instances[0]->get_labeled_id();
filaments += std::to_string(filament_id);
for (int object_idx = 0; object_idx < (int) m_model->objects.size(); ++object_idx) {
const ModelObject *model_object = m_model->objects[object_idx];
@@ -9809,6 +9812,63 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
error = ErrorType::SLICING_LIMIT_ERROR;
break;
}
case EWarning::MultiExtruderHeightOutside: {
for (auto error_iter = m_gcode_viewer.m_gcode_check_result.print_height_error_infos.begin(); error_iter != m_gcode_viewer.m_gcode_check_result.print_height_error_infos.end(); ++error_iter) {
if (error_iter != m_gcode_viewer.m_gcode_check_result.print_height_error_infos.begin()) {
text += "\n";
}
int extruder_id = error_iter->first + 1; // change extruder id to 1 based
std::set<int> filament_ids;
std::vector<int> slice_error_object_idxs;
for (size_t i = 0; i < error_iter->second.size(); ++i) {
int filament_id = error_iter->second[i].first + 1; // change filament id to 1 based
int object_label_id = error_iter->second[i].second;
filament_ids.insert(filament_id);
for (int object_idx = 0; object_idx < (int) m_model->objects.size(); ++object_idx) {
const ModelObject *model_object = m_model->objects[object_idx];
for (int instance_idx = 0; instance_idx < (int) model_object->instances.size(); ++instance_idx) {
const ModelInstance *model_instance = model_object->instances[instance_idx];
auto expect_id = model_instance->get_labeled_id();
if (object_label_id == expect_id) {
slice_error_object_idxs.emplace_back(object_idx);
}
}
}
}
std::string filaments;
int index = 0;
for (auto filament_id : filament_ids) {
if (index == 0) {
filaments += ", ";
}
filaments += std::to_string(filament_id);
++index;
}
for (GLVolume *volume : m_gcode_viewer.m_shells.volumes.volumes) {
for (auto obj_idx : slice_error_object_idxs) {
if (volume->object_idx() == obj_idx) {
volume->slice_error = true;
volume->selected = true;
}
}
}
std::string extruder_name = extruder_id == 1 ? "Left extruder" : "Right extruder";
if (error_iter->second.size() == 1) {
text += (boost::format(_u8L("Filament %d is placed in the %s, but the generated G-code path exceeds the printable height of the %s.")) % filaments % extruder_name % extruder_name).str();
} else {
text += (boost::format(_u8L("Filaments %d is placed in the %s, but the generated G-code path exceeds the printable height of the %s.")) % filaments % extruder_name % extruder_name).str();
}
}
if (!text.empty()) {
text += "\n";
text += _u8L("Open wiki for more information.");
}
error = ErrorType::SLICING_LIMIT_ERROR;
break;
}
// BBS: remove _u8L() for SLA
case EWarning::SlaSupportsOutside: text = ("SLA supports outside the print area were detected."); error = ErrorType::PLATER_ERROR; break;
case EWarning::SomethingNotShown: text = _u8L("Only the object being edited is visible."); break;
@@ -9865,9 +9925,15 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
break;
case SLICING_LIMIT_ERROR:
if (state)
notification_manager.push_slicing_limit_error_notification(text);
notification_manager.push_slicing_customize_error_notification(NotificationType::BBLSliceLimitError, NotificationManager::NotificationLevel::ErrorNotificationLevel, text);
else
notification_manager.close_slicing_limit_error_notification(text);
notification_manager.close_slicing_customize_error_notification(NotificationType::BBLSliceLimitError, NotificationManager::NotificationLevel::ErrorNotificationLevel);
break;
case SLICING_HEIGHT_OUTSIDE:
if (state)
notification_manager.push_slicing_customize_error_notification(NotificationType::BBLSliceMultiExtruderHeightOutside, NotificationManager::NotificationLevel::ErrorNotificationLevel, text);
else
notification_manager.close_slicing_customize_error_notification(NotificationType::BBLSliceMultiExtruderHeightOutside, NotificationManager::NotificationLevel::ErrorNotificationLevel);
break;
default:
break;

View File

@@ -385,6 +385,7 @@ class GLCanvas3D
ToolHeightOutside,
TPUPrintableError,
MultiExtruderPrintableError, // after slice
MultiExtruderHeightOutside, // after slice
FilamentUnPrintableOnFirstLayer
};

View File

@@ -1956,17 +1956,17 @@ void NotificationManager::close_general_error_notification(const std::string& te
}
}
void NotificationManager::push_slicing_limit_error_notification(const std::string &text)
void NotificationManager::push_slicing_customize_error_notification(NotificationType type, NotificationLevel level, const std::string &text)
{
set_all_slicing_errors_gray(false);
push_notification_data({NotificationType::BBLSliceLimitError, NotificationLevel::ErrorNotificationLevel, 0, _u8L("Error:") + "\n" + text}, 0);
push_notification_data({type, level, 0, _u8L("Error:") + "\n" + text}, 0);
set_slicing_progress_hidden();
}
void NotificationManager::close_slicing_limit_error_notification(const std::string &text)
void NotificationManager::close_slicing_customize_error_notification(NotificationType type, NotificationLevel level)
{
for (std::unique_ptr<PopNotification> &notification : m_pop_notifications) {
if (notification->get_type() == NotificationType::BBLSliceLimitError) {
if (notification->get_type() == type && notification->get_data().level == level) {
notification->close();
}
}

View File

@@ -153,6 +153,7 @@ enum class NotificationType
BBLPrinterConfigUpdateAvailable,
BBLUserPresetExceedLimit,
BBLSliceLimitError,
BBLSliceMultiExtruderHeightOutside,
NotificationTypeCount
};
@@ -238,8 +239,8 @@ public:
void close_plater_warning_notification(const std::string& text);
// GCode exceeds the printing range of the extruder
void push_slicing_limit_error_notification(const std::string &text);
void close_slicing_limit_error_notification(const std::string &text);
void push_slicing_customize_error_notification(NotificationType type, NotificationLevel level, const std::string &text);
void close_slicing_customize_error_notification(NotificationType type, NotificationLevel level);
// Object warning with ObjectID, closes when object is deleted. ID used is of object not print like in slicing warning.
void push_simplify_suggestion_notification(const std::string& text, ObjectID object_id, const std::string& hypertext = "",

View File

@@ -3113,7 +3113,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
"nozzle_height", "skirt_type", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_start_angle",
"brim_width", "brim_object_gap", "brim_type", "nozzle_diameter", "single_extruder_multi_material", "preferred_orientation",
"enable_prime_tower", "wipe_tower_x", "wipe_tower_y", "prime_tower_width", "prime_tower_brim_width", "prime_volume",
"extruder_colour", "filament_colour", "material_colour", "printable_height", "printer_model", "printer_technology",
"extruder_colour", "filament_colour", "material_colour", "printable_height", "extruder_printable_height", "printer_model", "printer_technology",
// These values are necessary to construct SlicingParameters by the Canvas3D variable layer height editor.
"layer_height", "initial_layer_print_height", "min_layer_height", "max_layer_height",
"brim_width", "wall_loops", "wall_filament", "sparse_infill_density", "sparse_infill_filament", "top_shell_layers",