OrcaSlicer/src/slic3r/GUI/PrePrintChecker.cpp
Seref 4b7b81a0a2
Add setting to enable uploads to abnormal Storage; improve sd_card_state error reporting (#10981)
* Add option to allow upload to SD-Cards marked as abnormal, also add better error description

+ Adds the options under the Network Settings to allow upload to abnormal SD-Card.
+ If not enabled user will now see why the upload is stuck at 10% depending on the sd_card_state (Readonly/Abnormal)

* Merging with current branch, and updateing "sd-card" to "storage"

* Generate localization and also change remaining sd_card_abnormal states to _storage_abnormal

* Fix issues from merge, and other bugfixes.

* Regenerate localization files.

* Improve Missing Storage Message, Add skip for abnormal storage in printer select dialog
2025-10-29 20:32:38 +08:00

242 lines
10 KiB
C++

#include "PrePrintChecker.hpp"
#include "GUI_Utils.hpp"
#include "I18N.hpp"
#include <set>
namespace Slic3r { namespace GUI {
std::string PrePrintChecker::get_print_status_info(PrintDialogStatus status)
{
switch (status) {
case PrintStatusInit: return "PrintStatusInit";
case PrintStatusNoUserLogin: return "PrintStatusNoUserLogin";
case PrintStatusInvalidPrinter: return "PrintStatusInvalidPrinter";
case PrintStatusConnectingServer: return "PrintStatusConnectingServer";
case PrintStatusReadingTimeout: return "PrintStatusReadingTimeout";
case PrintStatusReading: return "PrintStatusReading";
case PrintStatusInUpgrading: return "PrintStatusInUpgrading";
case PrintStatusModeNotFDM: return "PrintStatusModeNotFDM";
case PrintStatusInSystemPrinting: return "PrintStatusInSystemPrinting";
case PrintStatusInPrinting: return "PrintStatusInPrinting";
case PrintStatusNozzleMatchInvalid: return "PrintStatusNozzleMatchInvalid";
case PrintStatusNozzleDataInvalid: return "PrintStatusNozzleDataInvalid";
case PrintStatusNozzleDiameterMismatch: return "PrintStatusNozzleDiameterMismatch";
case PrintStatusNozzleTypeMismatch: return "PrintStatusNozzleTypeMismatch";
case PrintStatusRefreshingMachineList: return "PrintStatusRefreshingMachineList";
case PrintStatusSending: return "PrintStatusSending";
case PrintStatusLanModeNoSdcard: return "PrintStatusLanModeNoSdcard";
case PrintStatusNoSdcard: return "PrintStatusNoSdcard";
case PrintStatusLanModeSDcardNotAvailable: return "PrintStatusLanModeSDcardNotAvailable";
case PrintStatusNeedForceUpgrading: return "PrintStatusNeedForceUpgrading";
case PrintStatusNeedConsistencyUpgrading: return "PrintStatusNeedConsistencyUpgrading";
case PrintStatusNotSupportedPrintAll: return "PrintStatusNotSupportedPrintAll";
case PrintStatusBlankPlate: return "PrintStatusBlankPlate";
case PrintStatusUnsupportedPrinter: return "PrintStatusUnsupportedPrinter";
case PrintStatusInvalidMapping: return "PrintStatusInvalidMapping";
// Handle filament errors
case PrintStatusAmsOnSettingup: return "PrintStatusAmsOnSettingup";
case PrintStatusAmsMappingInvalid: return "PrintStatusAmsMappingInvalid";
case PrintStatusAmsMappingU0Invalid: return "PrintStatusAmsMappingU0Invalid";
case PrintStatusAmsMappingMixInvalid: return "PrintStatusAmsMappingMixInvalid";
case PrintStatusTPUUnsupportAutoCali: return "PrintStatusTPUUnsupportAutoCali";
// Handle warnings
case PrintStatusTimelapseNoSdcard: return "PrintStatusTimelapseNoSdcard";
case PrintStatusTimelapseWarning: return "PrintStatusTimelapseWarning";
case PrintStatusMixAmsAndVtSlotWarning: return "PrintStatusMixAmsAndVtSlotWarning";
// Handle success statuses
case PrintStatusReadingFinished: return "PrintStatusReadingFinished";
case PrintStatusSendingCanceled: return "PrintStatusSendingCanceled";
case PrintStatusAmsMappingSuccess: return "PrintStatusAmsMappingSuccess";
case PrintStatusNotOnTheSameLAN: return "PrintStatusNotOnTheSameLAN";
case PrintStatusNotSupportedSendToSDCard: return "PrintStatusNotSupportedSendToSDCard";
case PrintStatusPublicInitFailed: return "PrintStatusPublicInitFailed";
case PrintStatusPublicUploadFiled: return "PrintStatusPublicUploadFiled";
case PrintStatusReadyToGo: return "PrintStatusReadyToGo";
default: return "Unknown status";
}
}
wxString PrePrintChecker::get_pre_state_msg(PrintDialogStatus status)
{
switch (status) {
case PrintStatusNoUserLogin: return _L("No login account, only printers in LAN mode are displayed");
case PrintStatusConnectingServer: return _L("Connecting to server");
case PrintStatusReading: return _L("Synchronizing device information");
case PrintStatusReadingTimeout: return _L("Synchronizing device information time out");
case PrintStatusModeNotFDM: return _L("Cannot send the print job when the printer is not at FDM mode");
case PrintStatusInUpgrading: return _L("Cannot send the print job when the printer is updating firmware");
case PrintStatusInSystemPrinting: return _L("The printer is executing instructions. Please restart printing after it ends");
case PrintStatusInPrinting: return _L("The printer is busy on other print job");
case PrintStatusAmsOnSettingup: return _L("AMS is setting up. Please try again later.");
case PrintStatusAmsMappingMixInvalid: return _L("Please do not mix-use the Ext with AMS");
case PrintStatusNozzleDataInvalid: return _L("Invalid nozzle information, please refresh or manually set nozzle information.");
case PrintStatusLanModeNoSdcard: return _L("Storage needs to be inserted before printing via LAN.");
case PrintStatusLanModeSDcardNotAvailable: return _L("Storage is in abnormal state or is in read-only mode.");
case PrintStatusNoSdcard: return _L("Storage needs to be inserted before printing.");
case PrintStatusNeedForceUpgrading: return _L("Cannot send the print job to a printer whose firmware is required to get updated.");
case PrintStatusNeedConsistencyUpgrading: return _L("Cannot send the print job to a printer whose firmware is required to get updated.");
case PrintStatusBlankPlate: return _L("Cannot send the print job for empty plate");
case PrintStatusTimelapseNoSdcard: return _L("Storage needs to be inserted to record timelapse.");
case PrintStatusMixAmsAndVtSlotWarning: return _L("You have selected both external and AMS filaments for an extruder. You will need to manually switch the external filament during printing.");
case PrintStatusTPUUnsupportAutoCali: return _L("TPU 90A/TPU 85A is too soft and does not support automatic Flow Dynamics calibration.");
case PrintStatusWarningKvalueNotUsed: return _L("Set dynamic flow calibration to 'OFF' to enable custom dynamic flow value.");
case PrintStatusNotSupportedPrintAll: return _L("This printer does not support printing all plates");
case PrintStatusWarningTpuRightColdPulling: return _L("Please cold pull before printing TPU to avoid clogging. You may use cold pull maintenance on the printer.");
case PrintStatusFilamentWarningHighChamberTempCloseDoor: return _L("High chamber temperature is required. Please close the door.");
}
return wxEmptyString;
}
void PrePrintChecker::clear()
{
printerList.clear();
filamentList.clear();
}
void PrePrintChecker::add(PrintDialogStatus state, wxString msg, wxString tip, const wxString& wiki_url)
{
prePrintInfo info;
if (is_error(state)) {
info.level = prePrintInfoLevel::Error;
} else if (is_warning(state)) {
info.level = prePrintInfoLevel::Warning;
} else {
info.level = prePrintInfoLevel::Normal;
}
if (is_error_printer(state)) {
info.type = prePrintInfoType::Printer;
} else if (is_error_filament(state)) {
info.type = prePrintInfoType::Filament;
} else if (is_warning_printer(state)) {
info.type = prePrintInfoType::Printer;
} else if (is_warning_filament(state)) {
info.type = prePrintInfoType::Filament;
}
if (!msg.IsEmpty()) {
info.msg = msg;
info.tips = tip;
} else {
info.msg = get_pre_state_msg(state);
info.tips = wxEmptyString;
}
info.wiki_url = wiki_url;
switch (info.type) {
case prePrintInfoType::Filament:
if (std::find(filamentList.begin(), filamentList.end(), info) == filamentList.end()) {
filamentList.push_back(info);
}
break;
case prePrintInfoType::Printer:
if (std::find(printerList.begin(), printerList.end(), info) == printerList.end()) {
printerList.push_back(info);
}
break;
default: break;
}
}
//void PrePrintMsgBoard::add(const wxString &msg, const wxString &tips, bool is_error)
//{
// if (msg.IsEmpty()) { return; }
//
// /*message*/
// // create label
// if (!m_sizer->IsEmpty()) { m_sizer->AddSpacer(FromDIP(10)); }
// Label *msg_label = new Label(this, wxEmptyString);
// m_sizer->Add(msg_label, 0, wxLEFT, 0);
//
// // set message
// msg_label->SetLabel(msg);
// msg_label->SetMinSize(wxSize(FromDIP(420), -1));
// msg_label->SetMaxSize(wxSize(FromDIP(420), -1));
// msg_label->Wrap(FromDIP(420));
//
// // font color
// auto colour = is_error ? wxColour("#D01B1B") : wxColour(0xFF, 0x6F, 0x00);
// msg_label->SetForegroundColour(colour);
//
// /*tips*/
// if (!tips.IsEmpty()) { /*Not supported yet*/
// }
//
// Layout();
// Fit();
//}
PrinterMsgPanel::PrinterMsgPanel(wxWindow *parent)
: wxPanel(parent)
{
m_sizer = new wxBoxSizer(wxVERTICAL);
this->SetSizer(m_sizer);
}
static wxColour _GetLabelColour(const prePrintInfo& info)
{
if (info.level == Error)
{
return wxColour("#D01B1B");
}
else if (info.level == Warning)
{
return wxColour("#FF6F00");
}
return *wxBLACK; // Default colour for normal messages
}
bool PrinterMsgPanel::UpdateInfos(const std::vector<prePrintInfo>& infos)
{
if (m_infos == infos)
{
return false;
}
m_infos = infos;
m_sizer->Clear(true);
for (const prePrintInfo& info : infos)
{
if (!info.msg.empty())
{
Label* label = new Label(this);
label->SetFont(::Label::Body_13);
label->SetForegroundColour(_GetLabelColour(info));
if (info.wiki_url.empty())
{
label->SetLabel(info.msg);
}
else
{
label->SetLabel(info.msg + " " + _L("Please refer to Wiki before use->"));
label->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { SetCursor(wxCURSOR_HAND); });
label->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) { SetCursor(wxCURSOR_ARROW); });
label->Bind(wxEVT_LEFT_DOWN, [info](wxMouseEvent& event) { wxLaunchDefaultBrowser(info.wiki_url); });
}
label->Wrap(this->GetMinSize().GetWidth());
label->Show();
m_sizer->Add(label, 0, wxBOTTOM, FromDIP(4));
}
}
this->Show();
this->Layout();
Fit();
return true;
}
}
};