mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-30 22:32:07 +00:00
feat(gui): warn when the hotend rack inventory falls short of the sliced plate
Follow-up to the rack-aware pre-print checks: after the blocking checks pass, warn (without disabling Send) when the plate needs more matching hotends than the rack printer currently holds - suggesting rack setup, a nozzle info refresh, or a re-slice to avoid filament waste - or when the only matches rely on unreliable nozzle information. Text-only warning rows; this message board has no refresh or don't-show-again buttons.
This commit is contained in:
@@ -18786,3 +18786,12 @@ msgstr ""
|
|||||||
#, possible-c-format, possible-boost-format
|
#, possible-c-format, possible-boost-format
|
||||||
msgid "The hardness of current material (%s) exceeds the hardness of %s(%s). It may cause nozzle wear, leading to material leakage and unstable flow. Please exercise caution when using it."
|
msgid "The hardness of current material (%s) exceeds the hardness of %s(%s). It may cause nozzle wear, leading to material leakage and unstable flow. Please exercise caution when using it."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "There are not enough available hotends currently."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Please re-slice to avoid filament waste."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "The reported hotend information may be unreliable."
|
||||||
|
msgstr ""
|
||||||
|
|||||||
@@ -61,6 +61,8 @@ std::string PrePrintChecker::get_print_status_info(PrintDialogStatus status)
|
|||||||
case PrintStatusNozzleNoMatchedHotends: return "PrintStatusNozzleNoMatchedHotends";
|
case PrintStatusNozzleNoMatchedHotends: return "PrintStatusNozzleNoMatchedHotends";
|
||||||
case PrintStatusNozzleRackMaximumInstalled: return "PrintStatusNozzleRackMaximumInstalled";
|
case PrintStatusNozzleRackMaximumInstalled: return "PrintStatusNozzleRackMaximumInstalled";
|
||||||
case PrintStatusRackReading: return "PrintStatusRackReading";
|
case PrintStatusRackReading: return "PrintStatusRackReading";
|
||||||
|
case PrintStatusRackNozzleNumUnmeetWarning: return "PrintStatusRackNozzleNumUnmeetWarning";
|
||||||
|
case PrintStatusHasUnreliableNozzleWarning: return "PrintStatusHasUnreliableNozzleWarning";
|
||||||
case PrintStatusWarningExtFilamentNotMatch: return "PrintStatusWarningExtFilamentNotMatch";
|
case PrintStatusWarningExtFilamentNotMatch: return "PrintStatusWarningExtFilamentNotMatch";
|
||||||
case PrintStatusFilamentWarningNozzleHRC: return "PrintStatusFilamentWarningNozzleHRC";
|
case PrintStatusFilamentWarningNozzleHRC: return "PrintStatusFilamentWarningNozzleHRC";
|
||||||
case PrintStatusReadingFinished: return "PrintStatusReadingFinished";
|
case PrintStatusReadingFinished: return "PrintStatusReadingFinished";
|
||||||
|
|||||||
@@ -97,6 +97,8 @@ enum PrintDialogStatus : unsigned int {
|
|||||||
PrintStatusToolHeadCoolingFanWarning,
|
PrintStatusToolHeadCoolingFanWarning,
|
||||||
PrintStatusRackNozzleMappingWarning,
|
PrintStatusRackNozzleMappingWarning,
|
||||||
PrintStatusFilaSwitcherSlicingNotMatch,
|
PrintStatusFilaSwitcherSlicingNotMatch,
|
||||||
|
PrintStatusRackNozzleNumUnmeetWarning,
|
||||||
|
PrintStatusHasUnreliableNozzleWarning,
|
||||||
PrintStatusPrinterWarningEnd,
|
PrintStatusPrinterWarningEnd,
|
||||||
|
|
||||||
// Warnings for filament
|
// Warnings for filament
|
||||||
|
|||||||
@@ -2008,6 +2008,11 @@ void SelectMachineDialog::show_status(PrintDialogStatus status, std::vector<wxSt
|
|||||||
// Rack hotend info is being read: block Send until it finishes.
|
// Rack hotend info is being read: block Send until it finishes.
|
||||||
Enable_Refresh_Button(true);
|
Enable_Refresh_Button(true);
|
||||||
Enable_Send_Button(false);
|
Enable_Send_Button(false);
|
||||||
|
} else if (status == PrintDialogStatus::PrintStatusRackNozzleNumUnmeetWarning ||
|
||||||
|
status == PrintDialogStatus::PrintStatusHasUnreliableNozzleWarning) {
|
||||||
|
// Advisory rack inventory shortfalls: allow Send.
|
||||||
|
Enable_Refresh_Button(true);
|
||||||
|
Enable_Send_Button(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*enter perpare mode*/
|
/*enter perpare mode*/
|
||||||
@@ -3571,6 +3576,81 @@ bool SelectMachineDialog::CheckErrorRackStatus(MachineObject* obj_)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SelectMachineDialog::CheckWarningRackStatus(MachineObject* obj_)
|
||||||
|
{
|
||||||
|
if (!obj_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto& nozzle_sys = obj_->GetNozzleSystem();
|
||||||
|
const auto& rack = nozzle_sys->GetNozzleRack();
|
||||||
|
if (!rack->IsSupported()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto nozzle_group_res = DevUtilBackend::GetNozzleGroupResult(m_plater);
|
||||||
|
if (!nozzle_group_res) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_print_type != FROM_NORMAL) {
|
||||||
|
return;// there are no slicing data when print from sdcard
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto& nozzle_vec = nozzle_group_res->get_used_nozzles_in_extruder(LOGIC_R_EXTRUDER_ID);
|
||||||
|
if (nozzle_vec.empty()) {
|
||||||
|
return;// no need to check if no right nozzles used in slicing
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unordered_map<NozzleDef, int> need_nozzle_map;
|
||||||
|
for (const auto& slicing_nozzle : nozzle_vec) {
|
||||||
|
try {
|
||||||
|
NozzleDef data;
|
||||||
|
data.nozzle_diameter = std::stof(slicing_nozzle.diameter);
|
||||||
|
data.nozzle_flow_type = DevNozzle::ToNozzleFlowType(slicing_nozzle.volume_type);
|
||||||
|
need_nozzle_map[data]++;
|
||||||
|
} catch (const std::exception& e) {
|
||||||
|
assert(0);
|
||||||
|
BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "exception: " << e.what();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto& need_nozzle : need_nozzle_map) {
|
||||||
|
const auto& nozzle_info = need_nozzle.first;
|
||||||
|
const auto& installed_nozzles = nozzle_sys->CollectNozzles(MAIN_EXTRUDER_ID, nozzle_info.nozzle_flow_type, nozzle_info.nozzle_diameter);
|
||||||
|
int installed_count = installed_nozzles.size();
|
||||||
|
int installed_reliable_count = 0;
|
||||||
|
for (const auto& nozzle : installed_nozzles) {
|
||||||
|
if (nozzle.IsInfoReliable()) {
|
||||||
|
installed_reliable_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if enough nozzles installed
|
||||||
|
if (need_nozzle.second > installed_count) {
|
||||||
|
wxString msg = _L("There are not enough available hotends currently.");
|
||||||
|
msg += " ";
|
||||||
|
if (rack->GetCaliStatus() != DevNozzleRack::Rack_CALI_OK) {
|
||||||
|
msg += _L("Please complete the hotend rack setup and try again.");
|
||||||
|
} else if (nozzle_sys->HasUnknownNozzles()) {
|
||||||
|
msg += _L("Please refresh the nozzle information and try again.");
|
||||||
|
} else {
|
||||||
|
msg += _L("Please re-slice to avoid filament waste.");
|
||||||
|
}
|
||||||
|
|
||||||
|
show_status(PrintDialogStatus::PrintStatusRackNozzleNumUnmeetWarning, { msg });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if unreliable nozzle maybe used
|
||||||
|
if (need_nozzle.second > installed_reliable_count && nozzle_sys->HasUnreliableNozzles()) {
|
||||||
|
// Orca: text-only warning; this message board has no refresh / don't-show-again buttons.
|
||||||
|
show_status(PrintDialogStatus::PrintStatusHasUnreliableNozzleWarning,
|
||||||
|
{ _L("The reported hotend information may be unreliable.") + " " + _L("Please refresh the nozzle information and try again.") });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Compare the extruder nozzle info between slicing file and installed on printer
|
// Compare the extruder nozzle info between slicing file and installed on printer
|
||||||
bool SelectMachineDialog::CheckErrorExtruderNozzleWithSlicing(MachineObject* obj_)
|
bool SelectMachineDialog::CheckErrorExtruderNozzleWithSlicing(MachineObject* obj_)
|
||||||
{
|
{
|
||||||
@@ -4156,6 +4236,9 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_)
|
|||||||
// check extension tool warning
|
// check extension tool warning
|
||||||
UpdateStatusCheckWarning_ExtensionTool(obj_);
|
UpdateStatusCheckWarning_ExtensionTool(obj_);
|
||||||
|
|
||||||
|
// check rack nozzle warning
|
||||||
|
CheckWarningRackStatus(obj_);
|
||||||
|
|
||||||
/** normal check **/
|
/** normal check **/
|
||||||
show_status(PrintDialogStatus::PrintStatusReadyToGo);
|
show_status(PrintDialogStatus::PrintStatusReadyToGo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -521,6 +521,9 @@ public:
|
|||||||
|
|
||||||
// Block Send while a rack printer is still reading its hotend information.
|
// Block Send while a rack printer is still reading its hotend information.
|
||||||
bool CheckErrorRackStatus(MachineObject* obj_);
|
bool CheckErrorRackStatus(MachineObject* obj_);
|
||||||
|
// Warn (without blocking) when the rack inventory looks insufficient for the sliced plate:
|
||||||
|
// fewer matching hotends than the plate needs, or matches relying on unreliable nozzle info.
|
||||||
|
void CheckWarningRackStatus(MachineObject* obj_);
|
||||||
// Compare the slicing file's nozzle requirements (validity, flow, diameter) against the
|
// Compare the slicing file's nozzle requirements (validity, flow, diameter) against the
|
||||||
// printer; the rack extruder is checked against its whole inventory (mounted + rack).
|
// printer; the rack extruder is checked against its whole inventory (mounted + rack).
|
||||||
bool CheckErrorExtruderNozzleWithSlicing(MachineObject* obj_);//return true if no errors
|
bool CheckErrorExtruderNozzleWithSlicing(MachineObject* obj_);//return true if no errors
|
||||||
|
|||||||
Reference in New Issue
Block a user