OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::GUI::MultiNozzleSyncDialog Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/Widgets/MultiNozzleSync.hpp>

Inheritance diagram for Slic3r::GUI::MultiNozzleSyncDialog:
Collaboration diagram for Slic3r::GUI::MultiNozzleSyncDialog:

Public Member Functions

 MultiNozzleSyncDialog (wxWindow *parent, std::weak_ptr< DevNozzleRack > rack)
virtual void on_dpi_changed (const wxRect &suggested_rect) override
std::vector< NozzleOption > GetNozzleOptions (const std::vector< MultiNozzleUtils::NozzleGroupInfo > &group_infos)
std::optional< NozzleOption > GetSelectedOption ()
int ShowModal () override
 ~MultiNozzleSyncDialog () override
void EndModal (int retCode) override
float scale_factor () const
float prev_scale_factor () const
void set_scale_factor (float v)
void set_prev_scale_factor (float v)
void set_em_unit (int v)
bool force_rescale () const
int em_unit () const
const wxFont & normal_font () const
void enable_force_rescale ()

Protected Member Functions

virtual void on_sys_color_changed ()

Private Member Functions

void UpdateRackInfo (std::weak_ptr< DevNozzleRack > rack)
bool hasMultiDiameters (const std::vector< MultiNozzleUtils::NozzleGroupInfo > &group_infos)
void OnSelectRadio (int select_idx)
bool UpdateUi (std::weak_ptr< DevNozzleRack > rack, bool ignore_unknown=false, bool ignore_unreliable=false)
bool UpdateOptionList (std::weak_ptr< DevNozzleRack > rack, bool ignore_unknown, bool ignore_unreliable)
void UpdateTip (std::weak_ptr< DevNozzleRack > rack, bool ignore_unknown, bool ignore_unreliable)
void UpdateButton (std::weak_ptr< DevNozzleRack > rack, bool ignore_unknown, bool ignore_unreliable)
void OnRackStatusReadingFinished (wxEvent &evt)
void OnRefreshTimer (wxTimerEvent &event)
void update_em_unit ()
bool is_new_scale_factor () const
void rescale (const wxRect &suggested_rect)

Private Attributes

MultiNozzleStatusTable * m_nozzle_table
NozzleListTable * m_list_table
std::vector< NozzleOption > m_nozzle_option_values
int m_nozzle_option_idx { -1 }
bool m_refreshing { false }
std::weak_ptr< DevNozzleRack > m_nozzle_rack
Label * m_tips
Label * m_caution
wxTimer * m_refresh_timer {nullptr}
Button * m_cancel_btn
Button * m_confirm_btn
float m_scale_factor
int m_em_unit
wxFont m_normal_font
float m_prev_scale_factor
bool m_can_rescale
bool m_force_rescale
int m_new_font_point_size

Detailed Description

Constructor & Destructor Documentation

◆ MultiNozzleSyncDialog()

Slic3r::GUI::MultiNozzleSyncDialog::MultiNozzleSyncDialog ( wxWindow * parent,
std::weak_ptr< DevNozzleRack > rack )
883 : DPIDialog(parent, wxID_ANY, _L("Sync Nozzle status"),wxDefaultPosition, wxDefaultSize,wxDEFAULT_DIALOG_STYLE)
884{
885 m_nozzle_rack = rack;
886 wxSizer* main_sizer = new wxBoxSizer(wxVERTICAL);
887 SetBackgroundColour(*wxWHITE);
888
889 m_tips = new Label(this, "");
890 wxBoxSizer* label_sizer = new wxBoxSizer(wxHORIZONTAL);
891 label_sizer->Add(m_tips, 0, wxLEFT | wxRIGHT, FromDIP(25));
892 main_sizer->Add(label_sizer, 0, wxTOP | wxBOTTOM, FromDIP(15));
893
894 m_list_table = new NozzleListTable(this);
895
896 m_list_table->Bind(EVT_NOZZLE_SELECTED, [this](wxCommandEvent& evt) {
897 int idx = evt.GetInt();
898 this->OnSelectRadio(idx);
899 });
900
901 main_sizer->Add(m_list_table, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(25));
902
903 m_nozzle_table = new MultiNozzleStatusTable(this);
904 wxBoxSizer* table_sizer = new wxBoxSizer(wxHORIZONTAL);
905 table_sizer->Add(m_nozzle_table, 0, wxLEFT | wxRIGHT, FromDIP(25));
906 main_sizer->Add(table_sizer, 0, wxTOP | wxBOTTOM, FromDIP(15));
907
908 wxBoxSizer* button_sizer = new wxBoxSizer(wxHORIZONTAL);
909
910 m_cancel_btn = new Button(this, _L("Cancel"), "", 0, 0, wxID_OK);
911 m_confirm_btn = new Button(this, _L("Confirm"), "", 0, 0, wxID_CANCEL);
912
913 m_caution = new Label(this, _L("Caution: Mixing nozzle diameters in one print is not supported. If the selected size is only on one extruder, single-extruder printing will be enforced."));
914 m_caution->SetForegroundColour("#909090");
915 main_sizer->Add(m_caution, 0, wxLEFT | wxRIGHT, FromDIP(25));
916
917 StateColor btn_bg_green(
918 std::pair<wxColour, int>(wxColour(144, 144, 144), StateColor::Disabled),
919 std::pair<wxColour, int>(wxColour(0, 137, 123), StateColor::Pressed),
920 std::pair<wxColour, int>(wxColour(38, 166, 154), StateColor::Hovered),
921 std::pair<wxColour, int>(wxColour(0, 150, 136), StateColor::Normal)
922 );
923
924 StateColor btn_text_green(
925 std::pair<wxColour, int>(wxColour(255, 255, 254), StateColor::Normal)
926 );
927
928
929 m_confirm_btn->SetBackgroundColor(btn_bg_green);
930 m_confirm_btn->SetMinSize(wxSize(FromDIP(55), FromDIP(24)));
931 m_confirm_btn->SetCornerRadius(FromDIP(12));
932 m_confirm_btn->SetBackgroundColor(btn_bg_green);
933 m_confirm_btn->SetTextColor(btn_text_green);
934 m_confirm_btn->SetFocus();
935
936 m_cancel_btn->SetMinSize(wxSize(FromDIP(55), FromDIP(24)));
937 m_cancel_btn->SetCornerRadius(FromDIP(12));
938
939 button_sizer->AddStretchSpacer();
940 button_sizer->Add(m_cancel_btn, 0, wxALL, FromDIP(10));
941 button_sizer->Add(m_confirm_btn, 0, wxALL, FromDIP(10));
942
943 main_sizer->Add(button_sizer, 0, wxEXPAND | wxALL, FromDIP(10));
944
945 SetSizer(main_sizer);
946
947 //main_sizer->SetSizeHints(this);
948 main_sizer->Fit(this);
949
950 int table_width = m_nozzle_table->GetBestSize().GetWidth();
951 m_tips->Wrap(table_width);
952 m_tips->SetMaxSize(wxSize(table_width, -1));
953
954 m_caution->Wrap(table_width);
955 m_caution->SetMaxSize(wxSize(table_width, -1));
956
957 Layout();
958
959 m_refresh_timer = new wxTimer(this);
960 Bind(wxEVT_TIMER, &MultiNozzleSyncDialog::OnRefreshTimer, this);
961 CenterOnParent();
962 wxGetApp().UpdateDlgDarkUI(this);
963}
#define _L(s)
Definition OBJ.cpp:34
Label * m_tips
Definition MultiNozzleSync.hpp:209
MultiNozzleStatusTable * m_nozzle_table
Definition MultiNozzleSync.hpp:202
void OnRefreshTimer(wxTimerEvent &event)
Definition MultiNozzleSync.cpp:984
NozzleListTable * m_list_table
Definition MultiNozzleSync.hpp:203
Button * m_confirm_btn
Definition MultiNozzleSync.hpp:214
void OnSelectRadio(int select_idx)
Definition MultiNozzleSync.cpp:1010
wxTimer * m_refresh_timer
Definition MultiNozzleSync.hpp:212
Label * m_caution
Definition MultiNozzleSync.hpp:210
std::weak_ptr< DevNozzleRack > m_nozzle_rack
Definition MultiNozzleSync.hpp:208
Button * m_cancel_btn
Definition MultiNozzleSync.hpp:213
@ Hovered
Definition StateColor.hpp:20
@ Normal
Definition StateColor.hpp:16
@ Disabled
Definition StateColor.hpp:22
@ Pressed
Definition StateColor.hpp:21
static StateColor btn_bg_green(std::pair< wxColour, int >(wxColour(206, 206, 206), StateColor::Disabled), std::pair< wxColour, int >(wxColour(0, 137, 123), StateColor::Pressed), std::pair< wxColour, int >(wxColour(38, 166, 154), StateColor::Hovered), std::pair< wxColour, int >(wxColour(0, 150, 136), StateColor::Normal))

References _L, Slic3r::GUI::btn_bg_green, StateColor::Disabled, StateColor::Hovered, m_cancel_btn, m_caution, m_confirm_btn, m_list_table, m_nozzle_rack, m_nozzle_table, m_refresh_timer, m_tips, StateColor::Normal, OnRefreshTimer(), OnSelectRadio(), and StateColor::Pressed.

Here is the call graph for this function:

◆ ~MultiNozzleSyncDialog()

Slic3r::GUI::MultiNozzleSyncDialog::~MultiNozzleSyncDialog ( )
override
1169{
1170 if (auto rack = m_nozzle_rack.lock()) {
1171 rack->Unbind(DEV_RACK_EVENT_READING_FINISHED, &MultiNozzleSyncDialog::OnRackStatusReadingFinished, this);
1172 }
1173 if (m_refresh_timer)
1174 m_refresh_timer->Stop();
1175}
void OnRackStatusReadingFinished(wxEvent &evt)
Definition MultiNozzleSync.cpp:966

References ~MultiNozzleSyncDialog(), m_nozzle_rack, m_refresh_timer, and OnRackStatusReadingFinished().

Referenced by ~MultiNozzleSyncDialog().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Function Documentation

◆ em_unit()

int Slic3r::GUI::DPIAware< wxDialog >::em_unit ( ) const
inlineinherited
203{ return m_em_unit; }
Definition GUI_Utils.hpp:107

Referenced by Slic3r::GUI::AuxiliaryDialog::AuxiliaryDialog(), Slic3r::GUI::CopyrightsDialog::CopyrightsDialog(), Slic3r::GUI::DesignTextDialog::DesignTextDialog(), Slic3r::GUI::EditGCodeDialog::EditGCodeDialog(), Slic3r::GUI::FileArchiveDialog::FileArchiveDialog(), Slic3r::GUI::MsgNoUpdates::MsgNoUpdates(), Slic3r::GUI::MsgUpdateForced::MsgUpdateForced(), Slic3r::GUI::OAuthDialog::OAuthDialog(), Slic3r::GUI::ParamsDialog::ParamsDialog(), Slic3r::GUI::PhysicalPrinterDialog::PhysicalPrinterDialog(), Slic3r::GUI::SettingsDialog::SettingsDialog(), anonymous_namespace{3DPrinterOS.cpp}::TokenAuthDialog::TokenAuthDialog(), anonymous_namespace{3DPrinterOS.cpp}::UploadOptionsDialog::UploadOptionsDialog(), Slic3r::GUI::PublishSettingsDialog::add_row_ui(), Slic3r::GUI::DiffPresetDialog::complete_dialog_creation(), Slic3r::GUI::DiffPresetDialog::create_edit_sizer(), Slic3r::GUI::DiffPresetDialog::create_presets_sizer(), Slic3r::GUI::DiffPresetDialog::create_tree(), Slic3r::GUI::ElegooPrintHostSendDialog::init(), Slic3r::GUI::FlashforgePrintHostSendDialog::init(), Slic3r::GUI::PrintHostSendDialog::init(), Slic3r::GUI::AboutDialog::on_dpi_changed(), Slic3r::GUI::AuxiliaryDialog::on_dpi_changed(), Slic3r::GUI::BedShapeDialog::on_dpi_changed(), Slic3r::GUI::ConfigWizard::on_dpi_changed(), Slic3r::GUI::CopyrightsDialog::on_dpi_changed(), Slic3r::GUI::DiffPresetDialog::on_dpi_changed(), Slic3r::GUI::EditGCodeDialog::on_dpi_changed(), Slic3r::GUI::FileArchiveDialog::on_dpi_changed(), Slic3r::GUI::OAuthDialog::on_dpi_changed(), Slic3r::GUI::ObjectTableDialog::on_dpi_changed(), Slic3r::GUI::ParamsDialog::on_dpi_changed(), Slic3r::GUI::PhysicalPrinterDialog::on_dpi_changed(), Slic3r::GUI::PrintHostQueueDialog::on_dpi_changed(), Slic3r::GUI::PurgeModeDialog::on_dpi_changed(), Slic3r::GUI::SavePresetDialog::on_dpi_changed(), Slic3r::GUI::SendSystemInfoDialog::on_dpi_changed(), Slic3r::GUI::SettingsDialog::on_dpi_changed(), and Slic3r::GUI::UnsavedChangesDialog::on_dpi_changed().

Here is the caller graph for this function:

◆ enable_force_rescale()

void Slic3r::GUI::DPIAware< wxDialog >::enable_force_rescale ( )
inlineinherited
206{ m_force_rescale = true; }

◆ EndModal()

void Slic3r::GUI::DPIDialog::EndModal ( int retCode)
inlineoverrideinherited
306 {
307 if (!dialogStack.empty() && dialogStack.front() != this) {
308 // This is a bug in wxWidgets
309 // when the dialog is not top modal dialog, EndModal() just hide dialog without quit
310 // the modal event loop. And the modal event loop blocks us from bottom widgets.
311 // Solution: let user click it manually or close outside. FIXME
312 BOOST_LOG_TRIVIAL(warning) << "DPIAware::EndModal Error: dialogStack is not empty, but top dialog is not this one. retCode=" << retCode;
313 return;
314 }
315
316 return wxDialog::EndModal(retCode);
317 }
std::deque< wxDialog * > dialogStack
Definition GUI_Utils.cpp:549

References Slic3r::GUI::dialogStack.

Referenced by Slic3r::GUI::CloneDialog::CloneDialog(), Slic3r::GUI::ConfigWizard::ConfigWizard(), Slic3r::GUI::CreatePresetSuccessfulDialog::CreatePresetSuccessfulDialog(), Slic3r::GUI::DeleteConfirmDialog::DeleteConfirmDialog(), Slic3r::GUI::DesignVariableDialog::DesignVariableDialog(), Slic3r::GUI::anonymous_namespace{PrintHostDialogs.cpp}::FlashforgeSlotDialog::FlashforgeSlotDialog(), Slic3r::GUI::GuideFrame::GuideFrame(), Slic3r::GUI::InputIpAddressDialog::InputIpAddressDialog(), Slic3r::GUI::ManualNozzleCountDialog::ManualNozzleCountDialog(), Slic3r::GUI::MsgUpdateConfig::MsgUpdateConfig(), Slic3r::GUI::MsgUpdateForced::MsgUpdateForced(), Slic3r::GUI::MultiChoiceDialog::MultiChoiceDialog(), Slic3r::GUI::NetworkErrorDialog::NetworkErrorDialog(), Slic3r::GUI::NetworkPluginRestartDialog::NetworkPluginRestartDialog(), Slic3r::GUI::PartSkipConfirmDialog::PartSkipConfirmDialog(), Slic3r::GUI::PhysicalPrinterDialog::PhysicalPrinterDialog(), Slic3r::GUI::PlateNameEditDialog::PlateNameEditDialog(), Slic3r::GUI::PlateSettingsDialog::PlateSettingsDialog(), Slic3r::GUI::PublishSettingsDialog::PublishSettingsDialog(), Slic3r::GUI::SelectMachineDialog::SelectMachineDialog(), Slic3r::GUI::SendFailedConfirm::SendFailedConfirm(), Slic3r::GUI::SendSystemInfoDialog::SendSystemInfoDialog(), Slic3r::GUI::ShortcutCaptureDialog::ShortcutCaptureDialog(), Slic3r::GUI::SingleChoiceDialog::SingleChoiceDialog(), StepMeshDialog::StepMeshDialog(), Slic3r::GUI::SyncAmsInfoDialog::SyncAmsInfoDialog(), anonymous_namespace{3DPrinterOS.cpp}::TokenAuthDialog::TokenAuthDialog(), Slic3r::GUI::UpdatePluginDialog::UpdatePluginDialog(), Slic3r::GUI::UpdateVersionDialog::UpdateVersionDialog(), Slic3r::GUI::wgtDeviceNozzleRackUpgradeDlg::wgtDeviceNozzleRackUpgradeDlg(), Slic3r::GUI::SavePresetDialog::accept(), Slic3r::GUI::MsgDialog::add_button(), Slic3r::GUI::TipsDialog::add_button(), Slic3r::GUI::FilamentPickerDialog::BindEvents(), Slic3r::GUI::PluginPickerDialog::build_capability_ui(), Slic3r::GUI::BedShapeDialog::build_dialog(), Slic3r::GUI::PluginPickerDialog::build_ui(), Slic3r::GUI::UnsavedChangesDialog::close(), Slic3r::GUI::FileArchiveDialog::create_btn_sizer(), Slic3r::GUI::ColorDecomposeDialog::create_button_panel(), Slic3r::GUI::MixedFilamentDialog::create_button_panel(), Slic3r::GUI::CreateFilamentPresetDialog::create_dialog_buttons(), Slic3r::GUI::CreatePresetForPrinterDialog::create_dialog_buttons(), Slic3r::GUI::EditFilamentPresetDialog::create_dialog_buttons(), Slic3r::GUI::ExportConfigsDialog::create_dialog_buttons(), Slic3r::GUI::PreferencesDialog::create_item_language_combobox(), Slic3r::GUI::PreferencesDialog::create_item_region_combobox(), Slic3r::GUI::PreferencesDialog::create_items(), Slic3r::GUI::CreatePrinterPresetDialog::create_page1_dialog_buttons(), Slic3r::GUI::CreatePrinterPresetDialog::create_page2_dialog_buttons(), Slic3r::GUI::ExportConfigsDialog::data_init(), Slic3r::GUI::WebDialog::destroy_silently(), Slic3r::GUI::EditFilamentPresetDialog::edit_preset(), Slic3r::GUI::ConnectPrinterDialog::end_modal(), Slic3r::GUI::PrintHostSendDialog::EndModal(), Slic3r::GUI::ColorPickerDialog::finish(), Slic3r::GUI::WebDialog::finish(), Slic3r::GUI::Newer3mfVersionDialog::get_btn_sizer(), Slic3r::GUI::ScoreDialog::get_button_sizer(), Slic3r::GUI::WebViewHostDialog::handle_common_script_command(), Slic3r::GUI::ExportPresetBundleDialog::InitExportData(), Slic3r::GUI::SelectMachineDialog::navigate_to_timelapse_page(), Slic3r::GUI::BindMachineDialog::on_bind_success(), Slic3r::GUI::ConnectPrinterDialog::on_button_confirm(), Slic3r::GUI::RecenterDialog::on_button_confirm(), Slic3r::GUI::BindMachineDialog::on_cancel(), Slic3r::GUI::EditCalibrationHistoryDialog::on_cancel(), Slic3r::GUI::InputIpAddressDialog::on_cancel(), Slic3r::GUI::NewCalibrationHistoryDialog::on_cancel(), Slic3r::GUI::OAuthDialog::on_cancel(), Slic3r::GUI::PingCodeBindDialog::on_cancel(), Slic3r::GUI::SelectMachineDialog::on_cancel(), Slic3r::GUI::SendToPrinterDialog::on_cancel(), Slic3r::GUI::SyncAmsInfoDialog::on_cancel(), Slic3r::GUI::UnBindMachineDialog::on_cancel(), Slic3r::GUI::WebDialog::on_close_window(), Slic3r::GUI::NetworkPluginDownloadDialog::on_dont_ask(), Slic3r::GUI::NetworkPluginDownloadDialog::on_download(), Slic3r::GUI::EditDevNameDialog::on_edit_name(), Slic3r::GUI::ConfirmBeforeSendDialog::on_hide(), Slic3r::GUI::PrivacyUpdateDialog::on_hide(), Slic3r::GUI::ShortcutCaptureDialog::on_key(), Slic3r::GUI::TextureImportDialog::on_ok_clicked(), Slic3r::GUI::FileArchiveDialog::on_open_button(), Slic3r::GUI::NetworkPluginDownloadDialog::on_remind_later(), Slic3r::GUI::ProjectDropDialog::on_select_cancel(), Slic3r::GUI::SavePresetDialog::on_select_cancel(), Slic3r::GUI::ProjectDropDialog::on_select_ok(), Slic3r::GUI::SendMultiMachinePage::on_send(), Slic3r::GUI::NetworkPluginDownloadDialog::on_skip(), Slic3r::GUI::TextureImportDialog::on_skip_clicked(), Slic3r::GUI::NetworkPluginDownloadDialog::on_skip_version(), Slic3r::GUI::Cornering_Test_Dlg::on_start(), Slic3r::GUI::FlowRateCalibrationDialog::on_start(), Slic3r::GUI::Input_Shaping_Damp_Test_Dlg::on_start(), Slic3r::GUI::Input_Shaping_Freq_Test_Dlg::on_start(), Slic3r::GUI::MaxVolumetricSpeed_Test_Dlg::on_start(), Slic3r::GUI::PA_Calibration_Dlg::on_start(), Slic3r::GUI::Retraction_Test_Dlg::on_start(), Slic3r::GUI::Temp_Calibration_Dlg::on_start(), Slic3r::GUI::VFA_Test_Dlg::on_start(), Slic3r::GUI::CalibrationDialog::on_start_calibration(), Slic3r::GUI::UnBindMachineDialog::on_unbind_printer(), Slic3r::GUI::PartSkipDialog::OnApplyDialog(), anonymous_namespace{3DPrinterOS.cpp}::TokenAuthDialog::OnCancel(), Slic3r::GUI::AboutDialog::onCloseDialog(), Slic3r::GUI::CopyrightsDialog::onCloseDialog(), Slic3r::GUI::MultiNozzleSyncDialog::OnRackStatusReadingFinished(), Slic3r::GUI::GuideFrame::OnScriptMessage(), Slic3r::GUI::InputIpAddressDialog::OnTimer(), Slic3r::GUI::KBShortcutsDialog::open_mouse_preferences(), Slic3r::GUI::TroubleshootDialog::PackAll(), Slic3r::GUI::TroubleshootDialog::RebuildSystemProfiles(), Slic3r::GUI::SpeedDialWebDialog::run_action(), Slic3r::GUI::OAuthDialog::Show(), Slic3r::GUI::MultiNozzleSyncDialog::UpdateButton(), and Slic3r::GUI::CreatePrinterPresetDialog::validate_input_valid().

◆ force_rescale()

bool Slic3r::GUI::DPIAware< wxDialog >::force_rescale ( ) const
inlineinherited
201{ return m_force_rescale; }

◆ GetNozzleOptions()

std::vector< NozzleOption > Slic3r::GUI::MultiNozzleSyncDialog::GetNozzleOptions ( const std::vector< MultiNozzleUtils::NozzleGroupInfo > & group_infos)
1027{
1028 std::vector<NozzleOption> options;
1029
1030 std::set<std::string> diameters;
1031 std::multimap<std::string, MultiNozzleUtils::NozzleGroupInfo> groups_mapped_for_diameter;
1032 for (auto& nozzle_group : nozzle_groups) {
1033 groups_mapped_for_diameter.insert({ nozzle_group.diameter,nozzle_group });
1034 }
1035
1036#if ENABLE_MIX_FLOW_PRINT
1037 for (auto it = groups_mapped_for_diameter.begin(); it != groups_mapped_for_diameter.end(); ) {
1038 NozzleOption option;
1039 const auto& diameter = it->first;
1040 auto range = groups_mapped_for_diameter.equal_range(diameter);
1041
1042 option.diameter = diameter;
1043 for (auto val_it = range.first; val_it != range.second; ++val_it) {
1044 const auto& elem = val_it->second;
1045 option.extruder_nozzle_stats[elem.extruder_id][elem.volume_type] += elem.nozzle_count;
1046 }
1047 options.emplace_back(std::move(option));
1048 it = range.second;
1049 }
1050#else
1051 for (auto it = groups_mapped_for_diameter.begin(); it != groups_mapped_for_diameter.end(); ) {
1052 const auto& diameter = it->first;
1053 auto range = groups_mapped_for_diameter.equal_range(diameter);
1054
1055 std::vector<std::pair<NozzleVolumeType, int>> left_nozzles;
1056 std::vector<std::pair<NozzleVolumeType, int>> right_nozzles;
1057
1058 for (auto val_it = range.first; val_it != range.second; ++val_it) {
1059 const auto& elem = val_it->second;
1060 if (elem.extruder_id == 0)
1061 left_nozzles.emplace_back(elem.volume_type, elem.nozzle_count);
1062 else
1063 right_nozzles.emplace_back(elem.volume_type, elem.nozzle_count);
1064 }
1065
1066 for (const auto& left_nozzle : left_nozzles.empty() ? std::vector<std::pair<NozzleVolumeType, int>>{{}} : left_nozzles) {
1067 for (const auto& right_nozzle : right_nozzles.empty() ? std::vector<std::pair<NozzleVolumeType, int>>{{}} : right_nozzles) {
1068 NozzleOption option;
1069 option.diameter = diameter;
1070
1071 if (!left_nozzles.empty()) {
1072 option.extruder_nozzle_stats[0] = { left_nozzle.first, left_nozzle.second };
1073 }
1074
1075 if (!right_nozzles.empty()) {
1076 option.extruder_nozzle_stats[1] = { right_nozzle.first, right_nozzle.second };
1077 }
1078
1079 options.emplace_back(std::move(option));
1080 }
1081 }
1082
1083 it = range.second;
1084 }
1085#endif
1086 return options;
1087}
auto range(Cont &&cont)
Definition libslic3r.h:405

References Slic3r::GUI::NozzleOption::diameter, Slic3r::GUI::NozzleOption::extruder_nozzle_stats, and Slic3r::range().

Referenced by UpdateOptionList().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetSelectedOption()

std::optional< NozzleOption > Slic3r::GUI::MultiNozzleSyncDialog::GetSelectedOption ( )
inline
179 {
181 return std::nullopt;
183 }
int m_nozzle_option_idx
Definition MultiNozzleSync.hpp:205
std::vector< NozzleOption > m_nozzle_option_values
Definition MultiNozzleSync.hpp:204

References m_nozzle_option_idx, and m_nozzle_option_values.

Referenced by Slic3r::GUI::tryPopUpMultiNozzleDialog().

Here is the caller graph for this function:

◆ hasMultiDiameters()

bool Slic3r::GUI::MultiNozzleSyncDialog::hasMultiDiameters ( const std::vector< MultiNozzleUtils::NozzleGroupInfo > & group_infos)
private
1019{
1020 if (group_infos.empty())
1021 return false;
1022 return !std::all_of(group_infos.begin(), group_infos.end(), [val = group_infos.front()](auto& elem) {return val.diameter == elem.diameter; });
1023}

◆ is_new_scale_factor()

bool Slic3r::GUI::DPIAware< wxDialog >::is_new_scale_factor ( ) const
inlineprivateinherited
262{ return fabs(m_scale_factor - m_prev_scale_factor) > 0.001; }

◆ normal_font()

◆ on_dpi_changed()

virtual void Slic3r::GUI::MultiNozzleSyncDialog::on_dpi_changed ( const wxRect & suggested_rect)
inlineoverridevirtual

◆ on_sys_color_changed()

◆ OnRackStatusReadingFinished()

void Slic3r::GUI::MultiNozzleSyncDialog::OnRackStatusReadingFinished ( wxEvent & evt)
private
966 {
967 if (!IsShown()) return;
968
969 m_refreshing = false;
970 if (m_refresh_timer)
971 m_refresh_timer->Stop();
972#if 1
974 EndModal(wxID_OK);
975#else
976 if(!UpdateUoi(m_nozzle_rack)){
977 CallAfter([this]() {
978 EndModal(wxID_OK);
979 });
980 }
981#endif
982}
void EndModal(int retCode) override
Definition GUI_Utils.hpp:305
bool UpdateUi(std::weak_ptr< DevNozzleRack > rack, bool ignore_unknown=false, bool ignore_unreliable=false)
Definition MultiNozzleSync.cpp:1256
bool m_refreshing
Definition MultiNozzleSync.hpp:206

References Slic3r::GUI::DPIDialog::EndModal(), m_nozzle_rack, m_refresh_timer, m_refreshing, and UpdateUi().

Referenced by ~MultiNozzleSyncDialog(), and UpdateButton().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ OnRefreshTimer()

void Slic3r::GUI::MultiNozzleSyncDialog::OnRefreshTimer ( wxTimerEvent & event)
private
984 {
985 if(!m_refreshing)
986 return;
987 auto nozzle_rack = m_nozzle_rack.lock();
988 if(!nozzle_rack)
989 return;
990
991 int reading_count = nozzle_rack->GetReadingCount();
992 int reading_idx = nozzle_rack->GetReadingIdx();
993
994 wxString tip = wxString::Format(_L("Refresh %d/%d..."), reading_idx, reading_count);
995 m_confirm_btn->SetLabel(tip);
996 m_confirm_btn->Fit();
997 if (m_confirm_btn->GetParent())
998 m_confirm_btn->GetParent()->Layout();
999
1000 m_confirm_btn->Disable();
1001 m_cancel_btn->Disable();
1002}

References _L, m_cancel_btn, m_confirm_btn, m_nozzle_rack, and m_refreshing.

Referenced by MultiNozzleSyncDialog().

Here is the caller graph for this function:

◆ OnSelectRadio()

void Slic3r::GUI::MultiNozzleSyncDialog::OnSelectRadio ( int select_idx)
private
1011{
1012 if (m_nozzle_option_idx != -1)
1014 m_nozzle_option_idx = select_idx;
1016}

References m_nozzle_option_idx, m_nozzle_option_values, and m_nozzle_table.

Referenced by MultiNozzleSyncDialog().

Here is the caller graph for this function:

◆ prev_scale_factor()

float Slic3r::GUI::DPIAware< wxDialog >::prev_scale_factor ( ) const
inlineinherited
196{ return m_prev_scale_factor; }

◆ rescale()

void Slic3r::GUI::DPIAware< wxDialog >::rescale ( const wxRect & suggested_rect)
inlineprivateinherited
265 {
266 this->Freeze();
267
268 m_force_rescale = false;
269
270 // set normal application font as a current window font
271 m_normal_font = this->GetFont();
272
274
275 // rescale missed controls sizes and images
277
278 this->Layout();
279 this->Thaw();
280
281 // reset previous scale factor from current scale factor value
283 }
virtual void on_dpi_changed(const wxRect &suggested_rect)=0
void update_em_unit()
Definition GUI_Utils.hpp:249

◆ scale_factor()

float Slic3r::GUI::DPIAware< wxDialog >::scale_factor ( ) const
inlineinherited
195{ return m_scale_factor; }

◆ set_em_unit()

void Slic3r::GUI::DPIAware< wxDialog >::set_em_unit ( int v)
inlineinherited
200{ m_em_unit = v; }

◆ set_prev_scale_factor()

void Slic3r::GUI::DPIAware< wxDialog >::set_prev_scale_factor ( float v)
inlineinherited

◆ set_scale_factor()

void Slic3r::GUI::DPIAware< wxDialog >::set_scale_factor ( float v)
inlineinherited
198{ m_scale_factor = v; }

◆ ShowModal()

int Slic3r::GUI::MultiNozzleSyncDialog::ShowModal ( )
override
1159{
1160 bool res = UpdateUi(m_nozzle_rack);
1161 if (!res)
1162 return wxID_OK;
1163
1164 return DPIDialog::ShowModal();
1165
1166}
int ShowModal()
Definition GUI_Utils.hpp:216

References m_nozzle_rack, Slic3r::GUI::DPIAware< wxDialog >::ShowModal(), ShowModal(), and UpdateUi().

Referenced by ShowModal(), and Slic3r::GUI::tryPopUpMultiNozzleDialog().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_em_unit()

void Slic3r::GUI::DPIAware< wxDialog >::update_em_unit ( )
inlineprivateinherited
250 {
251 // Linux specific issue : get_dpi_for_window(this) still doesn't responce to the Display's scale in new wxWidgets(3.1.3).
252 // So, calculate the m_em_unit value from the font size, as before
253#if !defined(__WXGTK__)
255#else
256 // initialize default width_unit according to the width of the one symbol ("m") of the currently active font of this window.
257 m_em_unit = std::max<size_t>(10, this->GetTextExtent("m").x - 1);
258#endif // __WXGTK__
259 }

◆ UpdateButton()

void Slic3r::GUI::MultiNozzleSyncDialog::UpdateButton ( std::weak_ptr< DevNozzleRack > rack,
bool ignore_unknown,
bool ignore_unreliable )
private
1178{
1179 const auto& nozzle_rack = rack.lock();
1180 if (!nozzle_rack)
1181 return;
1182
1183 if (m_refreshing)
1184 return;
1185
1186 bool has_unknown = nozzle_rack->HasUnknownNozzles() && !ignore_unknown;
1187 bool has_unreliable = nozzle_rack->HasUnreliableNozzles() && !ignore_unreliable;
1188
1189 auto refresh_cmd = [rack, this]() {
1190 auto nozzle_rack = m_nozzle_rack.lock();
1191 if (!nozzle_rack)
1192 return;
1193 nozzle_rack->CtrlRackReadAll();
1194 m_refreshing = true;
1195 if (m_refresh_timer)
1196 m_refresh_timer->Start(500);
1197 nozzle_rack->Bind(DEV_RACK_EVENT_READING_FINISHED, &MultiNozzleSyncDialog::OnRackStatusReadingFinished, this);
1198 };
1199
1200 auto trust_cmd = [rack, this]() {
1201 auto nozzle_rack = rack.lock();
1202 if (!nozzle_rack)
1203 return;
1204 nozzle_rack->CtrlRackConfirmAll();
1205 UpdateUi(rack, true, false);
1206 };
1207
1208 auto ignore_opt = [rack,this]() {
1209 if (!UpdateUi(rack, true, true))
1210 EndModal(wxID_OK);
1211 };
1212
1213 m_cancel_btn->Enable();
1214 m_confirm_btn->Enable();
1215
1216 if (has_unknown && has_unreliable) {
1217 m_cancel_btn->Show();
1218 m_confirm_btn->Show();
1219
1220 m_cancel_btn->SetLabel(_L("Ignore"));
1221 m_confirm_btn->SetLabel(_L("Refresh"));
1222
1223 m_cancel_btn->Bind(wxEVT_LEFT_DOWN, [rack, ignore_opt](auto& e) {ignore_opt(); });
1224 m_confirm_btn->Bind(wxEVT_LEFT_DOWN, [rack, refresh_cmd](auto& e) {refresh_cmd(); });
1225 }
1226 else if (has_unknown) {
1227 m_cancel_btn->Show();
1228 m_confirm_btn->Show();
1229
1230 m_cancel_btn->SetLabel(_L("Ignore"));
1231 m_confirm_btn->SetLabel(_L("Refresh"));
1232
1233 m_cancel_btn->Bind(wxEVT_LEFT_DOWN, [rack, ignore_opt](auto& e) {ignore_opt(); });
1234 m_confirm_btn->Bind(wxEVT_LEFT_DOWN, [rack, refresh_cmd](auto& e) {refresh_cmd(); });
1235 }
1236 else if (has_unreliable) {
1237 m_cancel_btn->Show();
1238 m_confirm_btn->Show();
1239
1240 m_cancel_btn->SetLabel(_L("Refresh"));
1241 m_confirm_btn->SetLabel(_L("Confirm"));
1242
1243 m_cancel_btn->Bind(wxEVT_LEFT_DOWN, [rack, refresh_cmd](auto& e) {refresh_cmd(); });
1244 m_confirm_btn->Bind(wxEVT_LEFT_DOWN, [rack, trust_cmd](auto& e) {trust_cmd(); });
1245
1246 }
1247 else {
1248 m_cancel_btn->Hide();
1249 m_confirm_btn->Show();
1250 m_confirm_btn->SetLabel(_L("OK"));
1251 m_confirm_btn->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {EndModal(wxID_OK); });
1252 }
1253
1254}

References _L, Slic3r::GUI::DPIDialog::EndModal(), m_cancel_btn, m_confirm_btn, m_nozzle_rack, m_refresh_timer, m_refreshing, OnRackStatusReadingFinished(), UpdateButton(), and UpdateUi().

Referenced by UpdateButton(), and UpdateUi().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdateOptionList()

bool Slic3r::GUI::MultiNozzleSyncDialog::UpdateOptionList ( std::weak_ptr< DevNozzleRack > rack,
bool ignore_unknown,
bool ignore_unreliable )
private
1090{
1091 const auto& nozzle_rack = rack.lock();
1092 if (!nozzle_rack)
1093 return true;
1094 bool has_unknown = nozzle_rack->HasUnknownNozzles() && !ignore_unknown;
1095 bool has_unreliable = nozzle_rack->HasUnreliableNozzles() && !ignore_unreliable;
1096
1097 if (has_unknown || has_unreliable) {
1098 m_list_table->Hide();
1099 return true;
1100 }
1101
1102 m_list_table->Show();
1103
1104 m_nozzle_option_values.clear();
1105
1106 auto options = GetNozzleOptions(nozzle_rack->GetNozzleSystem()->GetNozzleGroups());
1107
1108 int recommend_idx = std::max_element(options.begin(), options.end(), [](const NozzleOption& opt1, const NozzleOption& opt2) {
1109 int count1 = 0, count2 = 0;
1110 for (auto elem : opt1.extruder_nozzle_stats) {
1111 for (auto& stats : elem.second)
1112 count1 += stats.second;
1113 }
1114 for (auto elem : opt2.extruder_nozzle_stats) {
1115 for (auto& stats : elem.second)
1116 count2 += stats.second;
1117 }
1118 return count1 < count2;
1119 }) - options.begin();
1120
1121 m_nozzle_option_values = options;
1122 OnSelectRadio(recommend_idx);
1123 m_list_table->SetOptions(options,recommend_idx);
1124
1125 if (!has_unknown && !has_unreliable && options.size() == 1) {
1126 return false;
1127 }
1128 return true;
1129}
std::vector< NozzleOption > GetNozzleOptions(const std::vector< MultiNozzleUtils::NozzleGroupInfo > &group_infos)
Definition MultiNozzleSync.cpp:1026

References Slic3r::GUI::NozzleOption::extruder_nozzle_stats, GetNozzleOptions(), m_list_table, m_nozzle_option_values, and UpdateOptionList().

Referenced by UpdateOptionList(), and UpdateUi().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdateRackInfo()

void Slic3r::GUI::MultiNozzleSyncDialog::UpdateRackInfo ( std::weak_ptr< DevNozzleRack > rack)
private
1005{
1006 m_nozzle_rack = rack;
1007 UpdateUi(rack);
1008}

References m_nozzle_rack, and UpdateUi().

Here is the call graph for this function:

◆ UpdateTip()

void Slic3r::GUI::MultiNozzleSyncDialog::UpdateTip ( std::weak_ptr< DevNozzleRack > rack,
bool ignore_unknown,
bool ignore_unreliable )
private
1132{
1133 const auto& nozzle_rack = rack.lock();
1134 if (!nozzle_rack)
1135 return;
1136
1137 bool has_unknown = nozzle_rack->HasUnknownNozzles() && !ignore_unknown;
1138 bool has_unreliable = nozzle_rack->HasUnreliableNozzles() && !ignore_unreliable;
1139
1140 if (has_unknown && has_unreliable) {
1141 m_tips->SetLabel(_L("Unknown nozzle detected. Refresh to update info (unrefreshed nozzles will be excluded during slicing). Verify nozzle diameter & flow rate against displayed values."));
1142 m_caution->Hide();
1143 }
1144 else if (has_unknown) {
1145 m_tips->SetLabel(_L("Unknown nozzle detected. Refresh to update (unrefreshed nozzles will be skipped in slicing)."));
1146 m_caution->Hide();
1147 }
1148 else if (has_unreliable) {
1149 m_tips->SetLabel(_L("Please confirm whether the required nozzle diameter and flow rate match the currently displayed values."));
1150 m_caution->Hide();
1151 }
1152 else {
1153 m_tips->SetLabel(_L("Your printer has different nozzles installed. Please select a nozzle for this print."));
1154 m_caution->Show();
1155 }
1156}

References _L, m_caution, m_tips, and UpdateTip().

Referenced by UpdateTip(), and UpdateUi().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UpdateUi()

bool Slic3r::GUI::MultiNozzleSyncDialog::UpdateUi ( std::weak_ptr< DevNozzleRack > rack,
bool ignore_unknown = false,
bool ignore_unreliable = false )
private
1257{
1258 m_nozzle_table->UpdateRackInfo(rack);
1259 bool res = UpdateOptionList(rack, ignore_unknown, ignore_unreliable);
1260 if (!res)
1261 return false;
1262
1263 UpdateTip(rack, ignore_unknown, ignore_unreliable);
1264 UpdateButton(rack, ignore_unknown, ignore_unreliable);
1265
1266 Layout();
1267
1268 int table_width = m_nozzle_table->GetBestSize().GetWidth();
1269 m_tips->Wrap(table_width);
1270 m_tips->SetMaxSize(wxSize(table_width, -1));
1271 m_caution->Wrap(table_width);
1272 m_caution->SetMaxSize(wxSize(table_width, -1));
1273 Fit();
1274 return true;
1275}
void UpdateTip(std::weak_ptr< DevNozzleRack > rack, bool ignore_unknown, bool ignore_unreliable)
Definition MultiNozzleSync.cpp:1131
bool UpdateOptionList(std::weak_ptr< DevNozzleRack > rack, bool ignore_unknown, bool ignore_unreliable)
Definition MultiNozzleSync.cpp:1089
void UpdateButton(std::weak_ptr< DevNozzleRack > rack, bool ignore_unknown, bool ignore_unreliable)
Definition MultiNozzleSync.cpp:1177

References m_caution, m_nozzle_table, m_tips, UpdateButton(), UpdateOptionList(), UpdateTip(), and UpdateUi().

Referenced by OnRackStatusReadingFinished(), ShowModal(), UpdateButton(), UpdateRackInfo(), and UpdateUi().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ m_can_rescale

bool Slic3r::GUI::DPIAware< wxDialog >::m_can_rescale
privateinherited
235{ true };

◆ m_cancel_btn

Button* Slic3r::GUI::MultiNozzleSyncDialog::m_cancel_btn
private

◆ m_caution

Label* Slic3r::GUI::MultiNozzleSyncDialog::m_caution
private

◆ m_confirm_btn

Button* Slic3r::GUI::MultiNozzleSyncDialog::m_confirm_btn
private

◆ m_em_unit

int Slic3r::GUI::DPIAware< wxDialog >::m_em_unit
privateinherited

◆ m_force_rescale

bool Slic3r::GUI::DPIAware< wxDialog >::m_force_rescale
privateinherited
236{ false };

◆ m_list_table

NozzleListTable* Slic3r::GUI::MultiNozzleSyncDialog::m_list_table
private

◆ m_new_font_point_size

int Slic3r::GUI::DPIAware< wxDialog >::m_new_font_point_size
privateinherited

◆ m_normal_font

wxFont Slic3r::GUI::DPIAware< wxDialog >::m_normal_font
privateinherited

◆ m_nozzle_option_idx

int Slic3r::GUI::MultiNozzleSyncDialog::m_nozzle_option_idx { -1 }
private
205{ -1 };

Referenced by GetSelectedOption(), and OnSelectRadio().

◆ m_nozzle_option_values

std::vector<NozzleOption> Slic3r::GUI::MultiNozzleSyncDialog::m_nozzle_option_values
private

◆ m_nozzle_rack

std::weak_ptr<DevNozzleRack> Slic3r::GUI::MultiNozzleSyncDialog::m_nozzle_rack
private

◆ m_nozzle_table

MultiNozzleStatusTable* Slic3r::GUI::MultiNozzleSyncDialog::m_nozzle_table
private

◆ m_prev_scale_factor

float Slic3r::GUI::DPIAware< wxDialog >::m_prev_scale_factor
privateinherited

◆ m_refresh_timer

wxTimer* Slic3r::GUI::MultiNozzleSyncDialog::m_refresh_timer {nullptr}
private

◆ m_refreshing

bool Slic3r::GUI::MultiNozzleSyncDialog::m_refreshing { false }
private

◆ m_scale_factor

float Slic3r::GUI::DPIAware< wxDialog >::m_scale_factor
privateinherited

◆ m_tips

Label* Slic3r::GUI::MultiNozzleSyncDialog::m_tips
private

The documentation for this class was generated from the following files: