mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-20 07:11:12 -06:00 
			
		
		
		
	NEW: add more print option
1. add option of ai monitor 2. add option marker detection of buildplate 3. add auto recovery step loss Change-Id: I8483105fed9699d1072b5ef0f08aeff30e6f610a Signed-off-by: Stone Li <stone.li@bambulab.com>
This commit is contained in:
		
							parent
							
								
									f3c7953bdc
								
							
						
					
					
						commit
						22211f1b54
					
				
					 5 changed files with 440 additions and 86 deletions
				
			
		|  | @ -6,6 +6,7 @@ | |||
| #define DLG_SIZE  (wxSize(FromDIP(360), FromDIP(160))) | ||||
| 
 | ||||
| static const wxColour STATIC_BOX_LINE_COL = wxColour(238, 238, 238); | ||||
| static const wxColour STATIC_TEXT_CAPTION_COL = wxColour(100, 100, 100); | ||||
| 
 | ||||
| namespace Slic3r { namespace GUI { | ||||
| 
 | ||||
|  | @ -27,6 +28,18 @@ PrintOptionsDialog::PrintOptionsDialog(wxWindow* parent) | |||
|     m_options_sizer->Fit(this); | ||||
|     this->Fit(); | ||||
| 
 | ||||
|     m_cb_ai_monitoring->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& evt) { | ||||
|         if (obj) { | ||||
|             int         level = ai_monitoring_level_list->GetSelection(); | ||||
|             std::string lvl   = sensitivity_level_to_msg_string((AiMonitorSensitivityLevel) level); | ||||
|             if (!lvl.empty()) | ||||
|                 obj->command_xcam_control_ai_monitoring(m_cb_ai_monitoring->GetValue(), lvl); | ||||
|             else | ||||
|                 BOOST_LOG_TRIVIAL(warning) << "print_option: lvl = " << lvl; | ||||
|         } | ||||
|         evt.Skip(); | ||||
|     }); | ||||
| 
 | ||||
|     m_cb_first_layer->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& evt) { | ||||
|         if (obj) { | ||||
|             obj->command_xcam_control_first_layer_inspector(m_cb_first_layer->GetValue(), false); | ||||
|  | @ -34,102 +47,185 @@ PrintOptionsDialog::PrintOptionsDialog(wxWindow* parent) | |||
|         evt.Skip(); | ||||
|     }); | ||||
| 
 | ||||
|     m_cb_spaghetti->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& evt) { | ||||
|         update_spaghetti(); | ||||
| 
 | ||||
|     m_cb_auto_recovery->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& evt) { | ||||
|         if (obj) { | ||||
|             obj->command_xcam_control_spaghetti_detector(m_cb_spaghetti->GetValue(), m_cb_spaghetti_print_halt->GetValue()); | ||||
|             obj->command_xcam_control_auto_recovery_step_loss(m_cb_auto_recovery->GetValue()); | ||||
|         } | ||||
|         evt.Skip(); | ||||
|     }); | ||||
| 
 | ||||
|     m_cb_spaghetti_print_halt->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent&evt) { | ||||
|     m_cb_plate_mark->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent& evt) { | ||||
|         if (obj) { | ||||
|             obj->command_xcam_control_spaghetti_detector(m_cb_spaghetti->GetValue(), m_cb_spaghetti_print_halt->GetValue()); | ||||
|             obj->command_xcam_control_buildplate_marker_detector(m_cb_plate_mark->GetValue()); | ||||
|         } | ||||
|         evt.Skip(); | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| PrintOptionsDialog::~PrintOptionsDialog() {} | ||||
| PrintOptionsDialog::~PrintOptionsDialog() | ||||
| { | ||||
|     ai_monitoring_level_list->Disconnect( wxEVT_COMBOBOX, wxCommandEventHandler(PrintOptionsDialog::set_ai_monitor_sensitivity), NULL, this ); | ||||
| } | ||||
| 
 | ||||
| void PrintOptionsDialog::on_dpi_changed(const wxRect &suggested_rect) | ||||
| void PrintOptionsDialog::on_dpi_changed(const wxRect& suggested_rect) | ||||
| { | ||||
|     this->SetMinSize(DLG_SIZE); | ||||
|     this->SetSize(DLG_SIZE); | ||||
|     Fit(); | ||||
| } | ||||
| 
 | ||||
| void PrintOptionsDialog::update_spaghetti() | ||||
| void PrintOptionsDialog::update_ai_monitor_status() | ||||
| { | ||||
|     if (m_cb_spaghetti->GetValue()) { | ||||
|         m_cb_spaghetti_print_halt->Enable(); | ||||
|         text_spaghetti_print_halt->Enable(); | ||||
|     if (m_cb_ai_monitoring->GetValue()) { | ||||
|         ai_monitoring_level_list->Enable(); | ||||
|     } | ||||
|     else { | ||||
|         m_cb_spaghetti_print_halt->Disable(); | ||||
|         text_spaghetti_print_halt->Disable(); | ||||
|         ai_monitoring_level_list->Disable(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void PrintOptionsDialog::update_options(MachineObject *obj_) | ||||
| void PrintOptionsDialog::update_options(MachineObject* obj_) | ||||
| { | ||||
|     if (!obj_) return; | ||||
|     if (obj_->is_function_supported(PrinterFunction::FUNC_AI_MONITORING)) { | ||||
|         text_ai_monitoring->Show(); | ||||
|         m_cb_ai_monitoring->Show(); | ||||
|         text_ai_monitoring_caption->Show(); | ||||
|         ai_monitoring_level_list->Show(); | ||||
|         line1->Show(); | ||||
|     } | ||||
|     else { | ||||
|         text_ai_monitoring->Hide(); | ||||
|         m_cb_ai_monitoring->Hide(); | ||||
|         text_ai_monitoring_caption->Hide(); | ||||
|         ai_monitoring_level_list->Hide(); | ||||
|         line1->Hide(); | ||||
|     } | ||||
| 
 | ||||
|     if (obj_->is_function_supported(PrinterFunction::FUNC_BUILDPLATE_MARKER_DETECT)) { | ||||
|         text_plate_mark->Show(); | ||||
|         m_cb_plate_mark->Show(); | ||||
|         text_plate_mark_caption->Show(); | ||||
|         line2->Show(); | ||||
|     } | ||||
|     else { | ||||
|         text_plate_mark->Hide(); | ||||
|         m_cb_plate_mark->Hide(); | ||||
|         text_plate_mark_caption->Hide(); | ||||
|         line2->Hide(); | ||||
|     } | ||||
| 
 | ||||
|     if (obj_->is_function_supported(PrinterFunction::FUNC_FIRSTLAYER_INSPECT)) { | ||||
|         text_first_layer->Show(); | ||||
|         m_cb_first_layer->Show(); | ||||
|     } else { | ||||
|         line3->Show(); | ||||
|     } | ||||
|     else { | ||||
|         text_first_layer->Hide(); | ||||
|         m_cb_first_layer->Hide(); | ||||
|         line3->Hide(); | ||||
|     } | ||||
| 
 | ||||
|     if (obj_->is_function_supported(PrinterFunction::FUNC_SPAGHETTI)) { | ||||
|         text_spaghetti->Show(); | ||||
|         m_cb_spaghetti->Show(); | ||||
|         m_cb_spaghetti_print_halt->Show(); | ||||
|         text_spaghetti_print_halt->Show(); | ||||
|     }else { | ||||
|         text_spaghetti->Hide(); | ||||
|         m_cb_spaghetti->Hide(); | ||||
|         m_cb_spaghetti_print_halt->Hide(); | ||||
|         text_spaghetti_print_halt->Hide(); | ||||
|     if (obj_->is_function_supported(PrinterFunction::FUNC_AUTO_RECOVERY_STEP_LOSS)) { | ||||
|         text_auto_recovery->Show(); | ||||
|         m_cb_auto_recovery->Show(); | ||||
|         line4->Show(); | ||||
|     } | ||||
|     else { | ||||
|         text_auto_recovery->Hide(); | ||||
|         m_cb_auto_recovery->Hide(); | ||||
|         line4->Hide(); | ||||
|     } | ||||
| 
 | ||||
|     this->Freeze(); | ||||
|     m_cb_spaghetti->SetValue(obj_->xcam_spaghetti_detector); | ||||
|     m_cb_spaghetti_print_halt->SetValue(obj_->xcam_spaghetti_print_halt); | ||||
| 
 | ||||
|     auto test1 = obj_->xcam_first_layer_inspector; | ||||
|     auto test2 = obj_->xcam_buildplate_marker_detector; | ||||
|     auto test3 = obj_->xcam_auto_recovery_step_loss; | ||||
|     m_cb_first_layer->SetValue(obj_->xcam_first_layer_inspector); | ||||
|     update_spaghetti(); | ||||
|     m_cb_plate_mark->SetValue(obj_->xcam_buildplate_marker_detector); | ||||
|     m_cb_auto_recovery->SetValue(obj_->xcam_auto_recovery_step_loss); | ||||
| 
 | ||||
|     m_cb_ai_monitoring->SetValue(obj_->xcam_ai_monitoring); | ||||
|     for (auto i = AiMonitorSensitivityLevel::LOW; i < LEVELS_NUM; i = (AiMonitorSensitivityLevel) (i + 1)) { | ||||
|         if (sensitivity_level_to_msg_string(i) == obj_->xcam_ai_monitoring_sensitivity) { | ||||
|             ai_monitoring_level_list->SetSelection((int)i); | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     update_ai_monitor_status(); | ||||
|     this->Thaw(); | ||||
| } | ||||
| 
 | ||||
| wxBoxSizer* PrintOptionsDialog::create_settings_group(wxWindow* parent) | ||||
| { | ||||
|     auto sizer = new wxBoxSizer(wxVERTICAL); | ||||
|     auto line_sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|     m_cb_spaghetti = new CheckBox(parent); | ||||
|     text_spaghetti = new wxStaticText(parent, wxID_ANY, _L("Spaghetti and Excess Chute Pileup Detection")); | ||||
|     text_spaghetti->SetFont(Label::Body_14); | ||||
|     wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); | ||||
|     wxBoxSizer* line_sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
| 
 | ||||
|     // ai monitoring with levels
 | ||||
|     line_sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|     m_cb_ai_monitoring = new CheckBox(parent); | ||||
|     text_ai_monitoring = new wxStaticText(parent, wxID_ANY, _L("Enable AI monitoring of printing")); | ||||
|     text_ai_monitoring->SetFont(Label::Body_14); | ||||
|     line_sizer->Add(FromDIP(5), 0, 0, 0); | ||||
|     line_sizer->Add(m_cb_spaghetti, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|     line_sizer->Add(text_spaghetti, 1, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|     line_sizer->Add(m_cb_ai_monitoring, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|     line_sizer->Add(text_ai_monitoring, 1, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|     sizer->Add(line_sizer, 0, wxEXPAND | wxALL, FromDIP(5)); | ||||
|     line_sizer->Add(FromDIP(5), 0, 0, 0); | ||||
| 
 | ||||
|     line_sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|     m_cb_spaghetti_print_halt = new CheckBox(parent); | ||||
|     text_spaghetti_print_halt = new wxStaticText(parent, wxID_ANY, _L("Stop printing when Spaghetti or Excess Chute Pileup is detected")); | ||||
|     text_spaghetti_print_halt->SetFont(Label::Body_14); | ||||
|     text_ai_monitoring_caption = new wxStaticText(parent, wxID_ANY, _L("Sensitivity of pausing is")); | ||||
|     text_ai_monitoring_caption->SetFont(Label::Body_14); | ||||
|     text_ai_monitoring_caption->SetForegroundColour(STATIC_TEXT_CAPTION_COL); | ||||
|     text_ai_monitoring_caption->Wrap(-1); | ||||
| 
 | ||||
|     ai_monitoring_level_list = new ComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(120),-1), 0, NULL, wxCB_READONLY ); | ||||
|     for (auto i = AiMonitorSensitivityLevel::LOW; i < LEVELS_NUM; i = (AiMonitorSensitivityLevel) (i + 1)) { | ||||
|         wxString level_option = sensitivity_level_to_label_string(i); | ||||
|         ai_monitoring_level_list->Append(level_option); | ||||
|     } | ||||
| 
 | ||||
|     line_sizer->Add(FromDIP(30), 0, 0, 0); | ||||
|     line_sizer->Add(m_cb_spaghetti_print_halt, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|     line_sizer->Add(text_spaghetti_print_halt, 1, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|      | ||||
|     line_sizer->Add(text_ai_monitoring_caption, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|     line_sizer->Add( ai_monitoring_level_list, 0, wxEXPAND|wxALL, FromDIP(5) ); | ||||
|     sizer->Add(line_sizer, 0, wxEXPAND | wxALL , 0); | ||||
| 
 | ||||
|     sizer->Add(0, FromDIP(10), 0, 0); | ||||
|     StaticLine* line = new StaticLine(parent, false); | ||||
|     line->SetLineColour(STATIC_BOX_LINE_COL); | ||||
|     sizer->Add(line, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20)); | ||||
|     line1 = new StaticLine(parent, false); | ||||
|     line1->SetLineColour(STATIC_BOX_LINE_COL); | ||||
|     sizer->Add(line1, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20)); | ||||
| 
 | ||||
|     // detection of build plate position
 | ||||
|     line_sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|     m_cb_plate_mark = new CheckBox(parent); | ||||
|     text_plate_mark = new wxStaticText(parent, wxID_ANY, _L("Enable detection of build plate position")); | ||||
|     text_plate_mark->SetFont(Label::Body_14); | ||||
|     line_sizer->Add(FromDIP(5), 0, 0, 0); | ||||
|     line_sizer->Add(m_cb_plate_mark, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|     line_sizer->Add(text_plate_mark, 1, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|     sizer->Add(line_sizer, 0, wxEXPAND | wxALL, FromDIP(5)); | ||||
|     line_sizer->Add(FromDIP(5), 0, 0, 0); | ||||
| 
 | ||||
|     line_sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|     wxString caption_text = _L( | ||||
|         "The localization tag of build plate is detected, and printing is paused if the tag is not in predefined range." | ||||
|     ); | ||||
|     caption_text = format_text(text_plate_mark, caption_text, FromDIP(250)); | ||||
|     text_plate_mark_caption = new wxStaticText(parent, wxID_ANY, caption_text); | ||||
|     if (is_english_text(caption_text)) { | ||||
|        text_plate_mark_caption->Wrap(FromDIP(250)); | ||||
|     } | ||||
|     text_plate_mark_caption->SetFont(Label::Body_14); | ||||
|     text_plate_mark_caption->SetForegroundColour(STATIC_TEXT_CAPTION_COL); | ||||
|     line_sizer->Add(FromDIP(30), 0, 0, 0); | ||||
|     line_sizer->Add(text_plate_mark_caption, 1, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|     sizer->Add(line_sizer, 0, wxEXPAND | wxALL , FromDIP(5)); | ||||
| 
 | ||||
|     line2 = new StaticLine(parent, false); | ||||
|     line2->SetLineColour(STATIC_BOX_LINE_COL); | ||||
|     sizer->Add(line2, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20)); | ||||
| 
 | ||||
|     // detection of first layer
 | ||||
|     line_sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|     m_cb_first_layer = new CheckBox(parent); | ||||
|     text_first_layer = new wxStaticText(parent, wxID_ANY, _L("First Layer Inspection")); | ||||
|  | @ -137,12 +233,73 @@ wxBoxSizer* PrintOptionsDialog::create_settings_group(wxWindow* parent) | |||
|     line_sizer->Add(FromDIP(5), 0, 0, 0); | ||||
|     line_sizer->Add(m_cb_first_layer, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|     line_sizer->Add(text_first_layer, 1, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|     sizer->Add(line_sizer, 1, wxEXPAND | wxALL, FromDIP(5)); | ||||
|     sizer->Add(line_sizer, 0, wxEXPAND | wxALL, FromDIP(5)); | ||||
|     line_sizer->Add(FromDIP(5), 0, 0, 0); | ||||
| 
 | ||||
|     line3 = new StaticLine(parent, false); | ||||
|     line3->SetLineColour(STATIC_BOX_LINE_COL); | ||||
|     sizer->Add(line3, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20)); | ||||
| 
 | ||||
|     // auto-recovery from step loss
 | ||||
|     line_sizer = new wxBoxSizer(wxHORIZONTAL); | ||||
|     m_cb_auto_recovery = new CheckBox(parent); | ||||
|     text_auto_recovery = new wxStaticText(parent, wxID_ANY, _L("Auto-recovery from step loss")); | ||||
|     text_auto_recovery->SetFont(Label::Body_14); | ||||
|     line_sizer->Add(FromDIP(5), 0, 0, 0); | ||||
|     line_sizer->Add(m_cb_auto_recovery, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|     line_sizer->Add(text_auto_recovery, 1, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5)); | ||||
|     sizer->Add(line_sizer, 0, wxEXPAND | wxALL, FromDIP(5)); | ||||
|     line_sizer->Add(FromDIP(5), 0, 0, 0); | ||||
| 
 | ||||
|     line4 = new StaticLine(parent, false); | ||||
|     line4->SetLineColour(wxColour(255,255,255)); | ||||
|     sizer->Add(line4, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20)); | ||||
| 
 | ||||
|     ai_monitoring_level_list->Connect( wxEVT_COMBOBOX, wxCommandEventHandler(PrintOptionsDialog::set_ai_monitor_sensitivity), NULL, this ); | ||||
| 
 | ||||
|     return sizer; | ||||
| } | ||||
| 
 | ||||
| wxString PrintOptionsDialog::sensitivity_level_to_label_string(enum AiMonitorSensitivityLevel level) { | ||||
|     switch (level) { | ||||
|     case LOW: | ||||
|         return _L("Low"); | ||||
|     case MEDIUM: | ||||
|         return _L("Medium"); | ||||
|     case HIGH: | ||||
|         return _L("High"); | ||||
|     default: | ||||
|         return _L(""); | ||||
|     } | ||||
|     return ""; | ||||
| } | ||||
| 
 | ||||
| std::string PrintOptionsDialog::sensitivity_level_to_msg_string(enum AiMonitorSensitivityLevel level) { | ||||
|     switch (level) { | ||||
|     case LOW: | ||||
|         return "low"; | ||||
|     case MEDIUM: | ||||
|         return "medium"; | ||||
|     case HIGH: | ||||
|         return "high"; | ||||
|     default: | ||||
|         return ""; | ||||
|     } | ||||
|     return ""; | ||||
| } | ||||
| 
 | ||||
| void PrintOptionsDialog::set_ai_monitor_sensitivity(wxCommandEvent& evt) | ||||
| { | ||||
|     int level = ai_monitoring_level_list->GetSelection(); | ||||
|     std::string lvl = sensitivity_level_to_msg_string((AiMonitorSensitivityLevel)level); | ||||
| 
 | ||||
|     if (obj && !lvl.empty()) { | ||||
|         obj->command_xcam_control_ai_monitoring(m_cb_ai_monitoring->GetValue(), lvl); | ||||
|     } else { | ||||
|         BOOST_LOG_TRIVIAL(warning) << "print_option: obj is null or lvl = " << lvl; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void PrintOptionsDialog::update_machine_obj(MachineObject *obj_) | ||||
| { | ||||
|     obj = obj_; | ||||
|  | @ -154,4 +311,50 @@ bool PrintOptionsDialog::Show(bool show) | |||
|     return DPIDialog::Show(show); | ||||
| } | ||||
| 
 | ||||
| bool PrintOptionsDialog::is_english_text(wxString str) | ||||
| { | ||||
|     std::regex reg("^[0-9a-zA-Z]+$"); | ||||
|     std::smatch matchResult; | ||||
| 
 | ||||
|     std::string pattern_Special = "{}[]<>~!@#$%^&*(),.?/ :"; | ||||
|     for (auto i = 0; i < str.Length(); i++) { | ||||
|         std::string regex_str = wxString(str[i]).ToStdString(); | ||||
|         if(std::regex_match(regex_str, matchResult, reg)){ | ||||
|             continue; | ||||
|         } | ||||
|         else { | ||||
|             int result = pattern_Special.find(regex_str.c_str()); | ||||
|             if (result < 0 || result > pattern_Special.length()) { | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| wxString PrintOptionsDialog::format_text(wxStaticText* st, wxString str, int warp) | ||||
| { | ||||
|     if (is_english_text(str)) return str; | ||||
| 
 | ||||
|     wxString out_txt = str; | ||||
|     wxString count_txt = ""; | ||||
|     int      new_line_pos = 0; | ||||
| 
 | ||||
|     for (int i = 0; i < str.length(); i++) { | ||||
|         if (str[i] == '\n') { | ||||
|             count_txt = ""; | ||||
|             continue; | ||||
|         } | ||||
|         auto text_size = st->GetTextExtent(count_txt); | ||||
|         if (text_size.x < warp) { | ||||
|             count_txt += str[i]; | ||||
|         } | ||||
|         else { | ||||
|             out_txt.insert(i - 1, '\n'); | ||||
|             count_txt = ""; | ||||
|         } | ||||
|     } | ||||
|     return out_txt; | ||||
| } | ||||
| 
 | ||||
| }} // namespace Slic3r::GUI
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Stone Li
						Stone Li