ENH: update extruder unprintable tip before slice
jira:none Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I3a47e1505c3410e1ba41e4d12903ccf4db486240
This commit is contained in:
parent
a1091f9a37
commit
086e977d89
|
@ -139,6 +139,17 @@ std::string& get_object_clashed_text() {
|
||||||
return object_clashed_text;
|
return object_clashed_text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string& get_left_extruder_unprintable_text() {
|
||||||
|
static std::string left_unprintable_text;
|
||||||
|
return left_unprintable_text;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string& get_right_extruder_unprintable_text() {
|
||||||
|
static std::string right_unprintable_text;
|
||||||
|
return right_unprintable_text;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
wxString filament_printable_error_msg;
|
wxString filament_printable_error_msg;
|
||||||
|
|
||||||
GLCanvas3D::LayersEditing::~LayersEditing()
|
GLCanvas3D::LayersEditing::~LayersEditing()
|
||||||
|
@ -1419,69 +1430,74 @@ void GLCanvas3D::construct_error_string(ObjectFilamentResults& object_result, st
|
||||||
error_string += _u8L("Please solve the problem by moving it totally on or off the plate, and confirming that the height is within the build volume.\n");
|
error_string += _u8L("Please solve the problem by moving it totally on or off the plate, and confirming that the height is within the build volume.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!object_result.filaments.empty()) {
|
}
|
||||||
std::vector<ObjectFilamentInfo> left_unprintable_objects;
|
|
||||||
std::vector<ObjectFilamentInfo> right_unprintable_objects;
|
|
||||||
|
|
||||||
std::vector<int> conflicted_filaments = object_result.filaments;
|
static std::pair<bool, bool> construct_extruder_unprintable_error(ObjectFilamentResults& object_result, std::string& left_extruder_unprintable_text, std::string& right_extruder_unprintable_text)
|
||||||
|
{
|
||||||
|
if (object_result.filaments.empty())
|
||||||
|
return {false,false};
|
||||||
|
|
||||||
auto mode = object_result.mode;
|
static const std::vector<std::string> nozzle_name_list = { _u8L("left nozzle"), _u8L("right nozzle") };
|
||||||
|
|
||||||
for (auto& obj_filament : object_result.object_filaments) {
|
std::vector<ObjectFilamentInfo> left_unprintable_objects;
|
||||||
if (mode == FilamentMapMode::fmmManual) {
|
std::vector<ObjectFilamentInfo> right_unprintable_objects;
|
||||||
for (auto& elem : obj_filament.manual_filaments) {
|
|
||||||
bool found_left = false, found_right = false;
|
std::vector<int> conflicted_filaments = object_result.filaments;
|
||||||
int filamnet_id = elem.first;
|
|
||||||
int extruder_id = elem.second;
|
auto mode = object_result.mode;
|
||||||
if (extruder_id == 1 && !found_left) {
|
|
||||||
found_left = true;
|
for (auto& obj_filament : object_result.object_filaments) {
|
||||||
left_unprintable_objects.emplace_back(obj_filament);
|
if (mode == FilamentMapMode::fmmManual) {
|
||||||
}
|
for (auto& elem : obj_filament.manual_filaments) {
|
||||||
if (extruder_id == 2 && !found_right) {
|
bool found_left = false, found_right = false;
|
||||||
found_right = true;
|
int filamnet_id = elem.first;
|
||||||
right_unprintable_objects.emplace_back(obj_filament);
|
int extruder_id = elem.second;
|
||||||
}
|
if (extruder_id == 1 && !found_left) {
|
||||||
}
|
found_left = true;
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (!obj_filament.auto_filaments.empty()) {
|
|
||||||
left_unprintable_objects.emplace_back(obj_filament);
|
left_unprintable_objects.emplace_back(obj_filament);
|
||||||
|
}
|
||||||
|
if (extruder_id == 2 && !found_right) {
|
||||||
|
found_right = true;
|
||||||
right_unprintable_objects.emplace_back(obj_filament);
|
right_unprintable_objects.emplace_back(obj_filament);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
std::vector<std::string> tips(2);
|
if (!obj_filament.auto_filaments.empty()) {
|
||||||
for (size_t idx = 0; idx < tips.size(); ++idx) {
|
left_unprintable_objects.emplace_back(obj_filament);
|
||||||
const auto& unprintable_objs = idx == 0 ? left_unprintable_objects : right_unprintable_objects;
|
right_unprintable_objects.emplace_back(obj_filament);
|
||||||
if (unprintable_objs.empty())
|
|
||||||
continue;
|
|
||||||
std::string nozzle_name = idx == 0 ? _u8L("left nozzle") : _u8L("right nozzle");
|
|
||||||
std::string opposite_nozzle_name = idx == 0 ? _u8L("right nozzle") : _u8L("left nozzle");
|
|
||||||
std::string model_prefix;
|
|
||||||
if (object_result.object_filaments.size() > 1)
|
|
||||||
model_prefix = _u8L("Some models are");
|
|
||||||
else
|
|
||||||
model_prefix = (boost::format(_u8L("The model %s is"))%object_result.object_filaments.front().object->name).str();
|
|
||||||
tips[idx] += model_prefix;
|
|
||||||
tips[idx] += (boost::format(_u8L(" located within the %s only area, making it impossible to print with the filaments assigned to %s.\n"
|
|
||||||
"Please move the model out of the %s only area or adjust the filament assignment\n")) % opposite_nozzle_name% nozzle_name % opposite_nozzle_name).str();
|
|
||||||
|
|
||||||
if (object_result.object_filaments.size() > 1) {
|
|
||||||
for (ObjectFilamentInfo& object_filament : left_unprintable_objects)
|
|
||||||
{
|
|
||||||
tips[idx] += object_filament.object->name;
|
|
||||||
tips[idx] += "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t idx = 0; idx < tips.size(); ++idx) {
|
|
||||||
if (!tips[idx].empty()) {
|
|
||||||
error_string = tips[idx];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> tips(2);
|
||||||
|
for (size_t idx = 0; idx < tips.size(); ++idx) {
|
||||||
|
const auto& unprintable_objs = idx == 0 ? left_unprintable_objects : right_unprintable_objects;
|
||||||
|
auto& output_text = idx == 0 ? left_extruder_unprintable_text : right_extruder_unprintable_text;
|
||||||
|
if (unprintable_objs.empty())
|
||||||
|
continue;
|
||||||
|
std::string nozzle_name = nozzle_name_list[0];
|
||||||
|
std::string opposite_nozzle_name = idx == 0 ? nozzle_name_list[1] : nozzle_name_list[0];
|
||||||
|
std::string model_prefix;
|
||||||
|
if (object_result.object_filaments.size() > 1)
|
||||||
|
model_prefix = _u8L("Some models are");
|
||||||
|
else
|
||||||
|
model_prefix = (boost::format(_u8L("The model %s is")) % object_result.object_filaments.front().object->name).str();
|
||||||
|
tips[idx] += model_prefix;
|
||||||
|
tips[idx] += (boost::format(_u8L(" located within the %s only area, making it impossible to print with the filaments assigned to %s.\n"
|
||||||
|
"Please move the model out of the %s only area or adjust the filament assignment\n")) % opposite_nozzle_name % nozzle_name % opposite_nozzle_name).str();
|
||||||
|
|
||||||
|
if (object_result.object_filaments.size() > 1) {
|
||||||
|
for (ObjectFilamentInfo& object_filament : left_unprintable_objects)
|
||||||
|
{
|
||||||
|
tips[idx] += object_filament.object->name;
|
||||||
|
tips[idx] += "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output_text = tips[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
return { !left_unprintable_objects.empty(),!right_unprintable_objects.empty() };
|
||||||
}
|
}
|
||||||
|
|
||||||
ModelInstanceEPrintVolumeState GLCanvas3D::check_volumes_outside_state(ObjectFilamentResults* object_results) const
|
ModelInstanceEPrintVolumeState GLCanvas3D::check_volumes_outside_state(ObjectFilamentResults* object_results) const
|
||||||
|
@ -1496,6 +1512,7 @@ ModelInstanceEPrintVolumeState GLCanvas3D::check_volumes_outside_state(ObjectFil
|
||||||
m_volumes.check_outside_state(m_bed.build_volume(), &state, object_results);
|
m_volumes.check_outside_state(m_bed.build_volume(), &state, object_results);
|
||||||
|
|
||||||
construct_error_string(*object_results, get_object_clashed_text());
|
construct_error_string(*object_results, get_object_clashed_text());
|
||||||
|
construct_extruder_unprintable_error(*object_results, get_left_extruder_unprintable_text(), get_right_extruder_unprintable_text());
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2992,8 +3009,11 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
|
||||||
const bool objectLimited = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Limited);
|
const bool objectLimited = (state == ModelInstanceEPrintVolumeState::ModelInstancePVS_Limited);
|
||||||
|
|
||||||
construct_error_string(object_results, get_object_clashed_text());
|
construct_error_string(object_results, get_object_clashed_text());
|
||||||
|
auto unprintable_flag= construct_extruder_unprintable_error(object_results, get_left_extruder_unprintable_text(), get_right_extruder_unprintable_text());
|
||||||
|
|
||||||
_set_warning_notification(EWarning::ObjectClashed, partlyOut || !object_results.filaments.empty());
|
_set_warning_notification(EWarning::ObjectClashed, partlyOut);
|
||||||
|
_set_warning_notification(EWarning::LeftExtruderPrintableError, unprintable_flag.first);
|
||||||
|
_set_warning_notification(EWarning::RightExtruderPrintableError, unprintable_flag.second);
|
||||||
_set_warning_notification(EWarning::ObjectLimited, objectLimited);
|
_set_warning_notification(EWarning::ObjectLimited, objectLimited);
|
||||||
//BBS: turn off the warning when fully outside
|
//BBS: turn off the warning when fully outside
|
||||||
//_set_warning_notification(EWarning::ObjectOutside, fullyOut);
|
//_set_warning_notification(EWarning::ObjectOutside, fullyOut);
|
||||||
|
@ -3017,6 +3037,8 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
|
||||||
else {
|
else {
|
||||||
_set_warning_notification(EWarning::ObjectOutside, false);
|
_set_warning_notification(EWarning::ObjectOutside, false);
|
||||||
_set_warning_notification(EWarning::ObjectClashed, false);
|
_set_warning_notification(EWarning::ObjectClashed, false);
|
||||||
|
_set_warning_notification(EWarning::LeftExtruderPrintableError, false);
|
||||||
|
_set_warning_notification(EWarning::RightExtruderPrintableError, false);
|
||||||
_set_warning_notification(EWarning::ObjectLimited, false);
|
_set_warning_notification(EWarning::ObjectLimited, false);
|
||||||
//_set_warning_notification(EWarning::SlaSupportsOutside, false);
|
//_set_warning_notification(EWarning::SlaSupportsOutside, false);
|
||||||
_set_warning_notification(EWarning::TPUPrintableError, false);
|
_set_warning_notification(EWarning::TPUPrintableError, false);
|
||||||
|
@ -9990,6 +10012,7 @@ void GLCanvas3D::_render_silhouette_effect()
|
||||||
|
|
||||||
void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
|
void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
|
||||||
{
|
{
|
||||||
|
using NotificationLevel = NotificationManager::NotificationLevel;
|
||||||
enum ErrorType{
|
enum ErrorType{
|
||||||
PLATER_WARNING,
|
PLATER_WARNING,
|
||||||
PLATER_ERROR,
|
PLATER_ERROR,
|
||||||
|
@ -10037,6 +10060,11 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
|
||||||
error = ErrorType::SLICING_ERROR;
|
error = ErrorType::SLICING_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case EWarning::LeftExtruderPrintableError:
|
||||||
|
case EWarning::RightExtruderPrintableError: {
|
||||||
|
error = ErrorType::PLATER_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case EWarning::MultiExtruderPrintableError: {
|
case EWarning::MultiExtruderPrintableError: {
|
||||||
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) {
|
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()) {
|
if (error_iter != m_gcode_viewer.m_gcode_check_result.print_area_error_infos.begin()) {
|
||||||
|
@ -10184,10 +10212,30 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
|
||||||
notification_manager.close_plater_warning_notification(text);
|
notification_manager.close_plater_warning_notification(text);
|
||||||
break;
|
break;
|
||||||
case PLATER_ERROR:
|
case PLATER_ERROR:
|
||||||
if (state)
|
if (warning == EWarning::LeftExtruderPrintableError) {
|
||||||
notification_manager.push_plater_error_notification(text);
|
if (state) {
|
||||||
else
|
if (auto left_str = get_left_extruder_unprintable_text();!left_str.empty())
|
||||||
notification_manager.close_plater_error_notification(text);
|
notification_manager.push_slicing_customize_error_notification(NotificationType::LeftExtruderUnprintableError, NotificationLevel::ErrorNotificationLevel, left_str);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
notification_manager.close_slicing_customize_error_notification(NotificationType::LeftExtruderUnprintableError, NotificationLevel::ErrorNotificationLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (warning == EWarning::RightExtruderPrintableError) {
|
||||||
|
if (state) {
|
||||||
|
if (auto right_str = get_right_extruder_unprintable_text(); !right_str.empty())
|
||||||
|
notification_manager.push_slicing_customize_error_notification(NotificationType::RightExtruderUnprintableError, NotificationLevel::ErrorNotificationLevel, right_str);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
notification_manager.close_slicing_customize_error_notification(NotificationType::RightExtruderUnprintableError, NotificationLevel::ErrorNotificationLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (state)
|
||||||
|
notification_manager.push_plater_error_notification(text);
|
||||||
|
else
|
||||||
|
notification_manager.close_plater_error_notification(text);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SLICING_SERIOUS_WARNING:
|
case SLICING_SERIOUS_WARNING:
|
||||||
if (state)
|
if (state)
|
||||||
|
@ -10206,9 +10254,9 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
|
||||||
}
|
}
|
||||||
if (warning == EWarning::FilamentPrintableError) {
|
if (warning == EWarning::FilamentPrintableError) {
|
||||||
if (state)
|
if (state)
|
||||||
notification_manager.push_slicing_customize_error_notification(NotificationType::BBLFilamentPrintableError, NotificationManager::NotificationLevel::ErrorNotificationLevel, text);
|
notification_manager.push_slicing_customize_error_notification(NotificationType::BBLFilamentPrintableError, NotificationLevel::ErrorNotificationLevel, text);
|
||||||
else
|
else
|
||||||
notification_manager.close_slicing_customize_error_notification(NotificationType::BBLFilamentPrintableError, NotificationManager::NotificationLevel::ErrorNotificationLevel);
|
notification_manager.close_slicing_customize_error_notification(NotificationType::BBLFilamentPrintableError, NotificationLevel::ErrorNotificationLevel);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (state)
|
if (state)
|
||||||
|
@ -10219,15 +10267,15 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state)
|
||||||
break;
|
break;
|
||||||
case SLICING_LIMIT_ERROR:
|
case SLICING_LIMIT_ERROR:
|
||||||
if (state)
|
if (state)
|
||||||
notification_manager.push_slicing_customize_error_notification(NotificationType::BBLSliceLimitError, NotificationManager::NotificationLevel::ErrorNotificationLevel, text);
|
notification_manager.push_slicing_customize_error_notification(NotificationType::BBLSliceLimitError, NotificationLevel::ErrorNotificationLevel, text);
|
||||||
else
|
else
|
||||||
notification_manager.close_slicing_customize_error_notification(NotificationType::BBLSliceLimitError, NotificationManager::NotificationLevel::ErrorNotificationLevel);
|
notification_manager.close_slicing_customize_error_notification(NotificationType::BBLSliceLimitError, NotificationLevel::ErrorNotificationLevel);
|
||||||
break;
|
break;
|
||||||
case SLICING_HEIGHT_OUTSIDE:
|
case SLICING_HEIGHT_OUTSIDE:
|
||||||
if (state)
|
if (state)
|
||||||
notification_manager.push_slicing_customize_error_notification(NotificationType::BBLSliceMultiExtruderHeightOutside, NotificationManager::NotificationLevel::ErrorNotificationLevel, text);
|
notification_manager.push_slicing_customize_error_notification(NotificationType::BBLSliceMultiExtruderHeightOutside, NotificationLevel::ErrorNotificationLevel, text);
|
||||||
else
|
else
|
||||||
notification_manager.close_slicing_customize_error_notification(NotificationType::BBLSliceMultiExtruderHeightOutside, NotificationManager::NotificationLevel::ErrorNotificationLevel);
|
notification_manager.close_slicing_customize_error_notification(NotificationType::BBLSliceMultiExtruderHeightOutside, NotificationLevel::ErrorNotificationLevel);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -383,6 +383,8 @@ class GLCanvas3D
|
||||||
ToolHeightOutside,
|
ToolHeightOutside,
|
||||||
TPUPrintableError,
|
TPUPrintableError,
|
||||||
FilamentPrintableError,
|
FilamentPrintableError,
|
||||||
|
LeftExtruderPrintableError, // before slice
|
||||||
|
RightExtruderPrintableError, // before slice
|
||||||
MultiExtruderPrintableError, // after slice
|
MultiExtruderPrintableError, // after slice
|
||||||
MultiExtruderHeightOutside, // after slice
|
MultiExtruderHeightOutside, // after slice
|
||||||
FilamentUnPrintableOnFirstLayer,
|
FilamentUnPrintableOnFirstLayer,
|
||||||
|
|
|
@ -1789,6 +1789,8 @@ void NotificationManager::close_plater_warning_notification(const std::string& t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void NotificationManager::set_all_slicing_errors_gray(bool g)
|
void NotificationManager::set_all_slicing_errors_gray(bool g)
|
||||||
{
|
{
|
||||||
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
for (std::unique_ptr<PopNotification> ¬ification : m_pop_notifications) {
|
||||||
|
|
|
@ -84,6 +84,8 @@ enum class NotificationType
|
||||||
BBLGeneralError,
|
BBLGeneralError,
|
||||||
// Object partially outside the print volume. Cannot slice.
|
// Object partially outside the print volume. Cannot slice.
|
||||||
PlaterError,
|
PlaterError,
|
||||||
|
LeftExtruderUnprintableError,
|
||||||
|
RightExtruderUnprintableError,
|
||||||
// Object fully outside the print volume, or extrusion outside the print volume. Slicing is not disabled.
|
// Object fully outside the print volume, or extrusion outside the print volume. Slicing is not disabled.
|
||||||
PlaterWarning,
|
PlaterWarning,
|
||||||
// Progress bar instead of text.
|
// Progress bar instead of text.
|
||||||
|
@ -233,7 +235,6 @@ public:
|
||||||
// Closes error or warning of the same text
|
// Closes error or warning of the same text
|
||||||
void close_plater_error_notification(const std::string& text);
|
void close_plater_error_notification(const std::string& text);
|
||||||
void close_plater_warning_notification(const std::string& text);
|
void close_plater_warning_notification(const std::string& text);
|
||||||
|
|
||||||
// GCode exceeds the printing range of the extruder
|
// GCode exceeds the printing range of the extruder
|
||||||
void push_slicing_customize_error_notification(NotificationType type, NotificationLevel level, 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);
|
void close_slicing_customize_error_notification(NotificationType type, NotificationLevel level);
|
||||||
|
|
Loading…
Reference in New Issue