diff --git a/resources/images/ams_arrow.svg b/resources/images/ams_arrow.svg
new file mode 100644
index 000000000..2184cf740
--- /dev/null
+++ b/resources/images/ams_arrow.svg
@@ -0,0 +1,3 @@
+
diff --git a/resources/images/ams_item_examples.svg b/resources/images/ams_item_examples.svg
new file mode 100644
index 000000000..588290c0d
--- /dev/null
+++ b/resources/images/ams_item_examples.svg
@@ -0,0 +1,6 @@
+
diff --git a/resources/images/ams_mapping_examples.svg b/resources/images/ams_mapping_examples.svg
new file mode 100644
index 000000000..68bbc90fc
--- /dev/null
+++ b/resources/images/ams_mapping_examples.svg
@@ -0,0 +1,41 @@
+
diff --git a/src/slic3r/GUI/AmsMappingPopup.cpp b/src/slic3r/GUI/AmsMappingPopup.cpp
index 3723c6520..8ea623cc6 100644
--- a/src/slic3r/GUI/AmsMappingPopup.cpp
+++ b/src/slic3r/GUI/AmsMappingPopup.cpp
@@ -379,11 +379,12 @@ std::vector AmsMapingPopup::parse_ams_mapping(std::map tray_data)
{
auto sizer_mapping_list = new wxBoxSizer(wxHORIZONTAL);
+
for (auto i = 0; i < tray_data.size(); i++) {
wxBoxSizer *sizer_mapping_item = new wxBoxSizer(wxVERTICAL);
// set number
- auto number = new wxStaticText(this, wxID_ANY, wxString::Format("%02d",tray_data[i].id + 1), wxDefaultPosition, wxDefaultSize, 0);
+ auto number = new wxStaticText(this, wxID_ANY, wxGetApp().transition_tridid(tray_data[i].id), wxDefaultPosition, wxDefaultSize, 0);
number->SetFont(::Label::Body_13);
number->SetForegroundColour(wxColour(0X6B, 0X6B, 0X6B));
number->Wrap(-1);
@@ -476,9 +477,11 @@ void AmsMapingPopup::paintEvent(wxPaintEvent &evt)
void MappingItem::send_event(int fliament_id)
{
+ auto number = wxGetApp().transition_tridid(m_tray_data.id);
wxCommandEvent event(EVT_SET_FINISH_MAPPING);
event.SetInt(m_tray_data.id);
- wxString param = wxString::Format("%d|%d|%d|%02d|%d", m_coloul.Red(), m_coloul.Green(), m_coloul.Blue(), m_tray_data.id + 1, fliament_id);
+
+ wxString param = wxString::Format("%d|%d|%d|%s|%d", m_coloul.Red(), m_coloul.Green(), m_coloul.Blue(), number, fliament_id);
event.SetString(param);
event.SetEventObject(this->GetParent()->GetParent());
wxPostEvent(this->GetParent()->GetParent(), event);
@@ -655,4 +658,107 @@ void AmsMapingTipPopup::OnDismiss() {}
bool AmsMapingTipPopup::ProcessLeftDown(wxMouseEvent &event) {
return wxPopupTransientWindow::ProcessLeftDown(event); }
+AmsTutorialPopup::AmsTutorialPopup(wxWindow* parent)
+:wxPopupTransientWindow(parent, wxBORDER_NONE)
+{
+ Bind(wxEVT_PAINT, &AmsTutorialPopup::paintEvent, this);
+ SetBackgroundColour(*wxWHITE);
+
+ wxBoxSizer* sizer_main;
+ sizer_main = new wxBoxSizer(wxVERTICAL);
+
+ text_title = new Label(this, Label::Head_14, _L("Config which AMS slot should be used for a filament used in the print job"));
+ text_title->SetSize(wxSize(FromDIP(350), -1));
+ text_title->Wrap(FromDIP(350));
+ sizer_main->Add(text_title, 0, wxALIGN_CENTER | wxTOP, 18);
+
+
+ sizer_main->Add(0, 0, 0, wxTOP, 30);
+
+ wxBoxSizer* sizer_top;
+ sizer_top = new wxBoxSizer(wxHORIZONTAL);
+
+ img_top = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("ams_item_examples", this, 30), wxDefaultPosition, wxSize(FromDIP(50), FromDIP(30)), 0);
+ sizer_top->Add(img_top, 0, wxALIGN_CENTER, 0);
+
+
+ sizer_top->Add(0, 0, 0, wxLEFT, 10);
+
+ wxBoxSizer* sizer_top_tips = new wxBoxSizer(wxVERTICAL);
+ wxBoxSizer* sizer_tip_top = new wxBoxSizer(wxHORIZONTAL);
+
+ arrows_top = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("ams_arrow", this, 8), wxDefaultPosition, wxSize(FromDIP(24), FromDIP(8)), 0);
+ sizer_tip_top->Add(arrows_top, 0, wxALIGN_CENTER, 0);
+
+ tip_top = new wxStaticText(this, wxID_ANY, _L("Filament used in this print job"), wxDefaultPosition, wxDefaultSize, 0);
+ tip_top->SetForegroundColour(wxColour("#686868"));
+
+ sizer_tip_top->Add(tip_top, 0, wxALL, 0);
+
+
+ sizer_top_tips->Add(sizer_tip_top, 0, wxEXPAND, 0);
+
+
+ sizer_top_tips->Add(0, 0, 0, wxTOP, 6);
+
+ wxBoxSizer* sizer_tip_bottom = new wxBoxSizer(wxHORIZONTAL);
+
+ arrows_bottom = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("ams_arrow", this, 8), wxDefaultPosition, wxSize(FromDIP(24), FromDIP(8)), 0);
+ tip_bottom = new wxStaticText(this, wxID_ANY, _L("AMS slot used for this filament"), wxDefaultPosition, wxDefaultSize, 0);
+ tip_bottom->SetForegroundColour(wxColour("#686868"));
+
+
+ sizer_tip_bottom->Add(arrows_bottom, 0, wxALIGN_CENTER, 0);
+ sizer_tip_bottom->Add(tip_bottom, 0, wxALL, 0);
+
+
+ sizer_top_tips->Add(sizer_tip_bottom, 0, wxEXPAND, 0);
+
+
+ sizer_top->Add(sizer_top_tips, 0, wxALIGN_CENTER, 0);
+
+
+
+
+ wxBoxSizer* sizer_middle = new wxBoxSizer(wxHORIZONTAL);
+
+ img_middle= new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("ams_item_examples", this, 30), wxDefaultPosition, wxSize(FromDIP(50), FromDIP(30)), 0);
+ sizer_middle->Add(img_middle, 0, wxALIGN_CENTER, 0);
+
+ tip_middle = new wxStaticText(this, wxID_ANY, _L("Click to select AMS slot manually"), wxDefaultPosition, wxDefaultSize, 0);
+ tip_middle->SetForegroundColour(wxColour("#686868"));
+ sizer_middle->Add(0, 0, 0,wxLEFT, 15);
+ sizer_middle->Add(tip_middle, 0, wxALIGN_CENTER, 0);
+
+
+ sizer_main->Add(sizer_top, 0, wxLEFT, 40);
+ sizer_main->Add(0, 0, 0, wxTOP, 10);
+ sizer_main->Add(sizer_middle, 0, wxLEFT, 40);
+ sizer_main->Add(0, 0, 0, wxTOP, 10);
+
+
+ img_botton = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("ams_mapping_examples", this, 87), wxDefaultPosition, wxDefaultSize, 0);
+ sizer_main->Add(img_botton, 0, wxLEFT | wxRIGHT, 40);
+ sizer_main->Add(0, 0, 0, wxTOP, 12);
+
+ SetSizer(sizer_main);
+ Layout();
+ Fit();
+}
+
+void AmsTutorialPopup::paintEvent(wxPaintEvent& evt)
+{
+ wxPaintDC dc(this);
+ dc.SetPen(wxColour(0xAC, 0xAC, 0xAC));
+ dc.SetBrush(*wxTRANSPARENT_BRUSH);
+ dc.DrawRoundedRectangle(0, 0, GetSize().x, GetSize().y, 0);
+}
+
+void AmsTutorialPopup::OnDismiss() {}
+
+bool AmsTutorialPopup::ProcessLeftDown(wxMouseEvent& event) {
+ return wxPopupTransientWindow::ProcessLeftDown(event);
+}
+
+
}} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/AmsMappingPopup.hpp b/src/slic3r/GUI/AmsMappingPopup.hpp
index 143d22b8d..617d10392 100644
--- a/src/slic3r/GUI/AmsMappingPopup.hpp
+++ b/src/slic3r/GUI/AmsMappingPopup.hpp
@@ -158,6 +158,27 @@ public:
wxStaticText * m_tip_disable_ams;
};
+class AmsTutorialPopup : public wxPopupTransientWindow
+{
+public:
+ Label* text_title;
+ wxStaticBitmap* img_top;
+ wxStaticBitmap* arrows_top;
+ wxStaticText* tip_top;
+ wxStaticBitmap* arrows_bottom;
+ wxStaticText* tip_bottom;
+ wxStaticBitmap* img_middle;
+ wxStaticText* tip_middle;
+ wxStaticBitmap* img_botton;
+
+ AmsTutorialPopup(wxWindow* parent);
+ ~AmsTutorialPopup() {};
+
+ void paintEvent(wxPaintEvent& evt);
+ virtual void OnDismiss() wxOVERRIDE;
+ virtual bool ProcessLeftDown(wxMouseEvent& event) wxOVERRIDE;
+};
+
wxDECLARE_EVENT(EVT_SET_FINISH_MAPPING, wxCommandEvent);
diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp
index e7b100ab5..a5f5656e7 100644
--- a/src/slic3r/GUI/GUI_App.cpp
+++ b/src/slic3r/GUI/GUI_App.cpp
@@ -3129,6 +3129,14 @@ void GUI_App::load_gcode(wxWindow* parent, wxString& input_file) const
input_file = dialog.GetPath();
}
+wxString GUI_App::transition_tridid(int trid_id)
+{
+ wxString maping_dict[8] = { "A", "B", "C", "D", "E", "F", "G" };
+ int id_index = ceil(trid_id / 4);
+ int id_suffix = (trid_id + 1) % 4 == 0 ? 4 : (trid_id + 1) % 4;
+ return wxString::Format("%s%d", maping_dict[id_index], id_suffix);
+}
+
//BBS
void GUI_App::request_login(bool show_user_info)
{
diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp
index 7595e7e13..d26620ef6 100644
--- a/src/slic3r/GUI/GUI_App.hpp
+++ b/src/slic3r/GUI/GUI_App.hpp
@@ -364,6 +364,7 @@ public:
void import_model(wxWindow *parent, wxArrayString& input_files) const;
void load_gcode(wxWindow* parent, wxString& input_file) const;
+ wxString transition_tridid(int trid_id);
void ShowUserGuide();
void ShowDownNetPluginDlg();
void ShowUserLogin();
diff --git a/src/slic3r/GUI/Jobs/PrintJob.cpp b/src/slic3r/GUI/Jobs/PrintJob.cpp
index 846134c6e..678c3dd55 100644
--- a/src/slic3r/GUI/Jobs/PrintJob.cpp
+++ b/src/slic3r/GUI/Jobs/PrintJob.cpp
@@ -146,7 +146,8 @@ void PrintJob::process()
BBL::PrintParams params;
params.dev_id = m_dev_id;
- params.project_name = project_name;
+ //params.project_name = project_name;
+ params.project_name = m_project_name + ".gcode.3mf";
params.preset_name = wxGetApp().preset_bundle->prints.get_selected_preset_name();
params.filename = job_data._3mf_path.string();
params.config_filename = job_data._3mf_config_path.string();
@@ -339,4 +340,9 @@ void PrintJob::finalize() {
Job::finalize();
}
+void PrintJob::set_project_name(std::string name)
+{
+ m_project_name = name;
+}
+
}} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/Jobs/PrintJob.hpp b/src/slic3r/GUI/Jobs/PrintJob.hpp
index 449dba499..13c8d749a 100644
--- a/src/slic3r/GUI/Jobs/PrintJob.hpp
+++ b/src/slic3r/GUI/Jobs/PrintJob.hpp
@@ -37,7 +37,7 @@ protected:
public:
PrintJob(std::shared_ptr pri, Plater *plater, std::string dev_id = "");
-
+ std::string m_project_name;
std::string m_dev_ip;
std::string m_access_code;
std::string task_bed_type;
@@ -75,6 +75,7 @@ public:
wxString get_http_error_msg(unsigned int status, std::string body);
void process() override;
void finalize() override;
+ void set_project_name(std::string name);
};
}} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/Jobs/SendJob.cpp b/src/slic3r/GUI/Jobs/SendJob.cpp
index 3c04c9cb1..9359dc5c6 100644
--- a/src/slic3r/GUI/Jobs/SendJob.cpp
+++ b/src/slic3r/GUI/Jobs/SendJob.cpp
@@ -150,9 +150,7 @@ void SendJob::process()
BBL::PrintParams params;
params.dev_id = m_dev_id;
- //params.project_name = wxGetApp().plater()->get_project_name().ToUTF8().data();
- params.project_name = wxGetApp().plater()->get_project_name().utf8_string();
-
+ params.project_name = m_project_name + ".gcode.3mf";
params.preset_name = wxGetApp().preset_bundle->prints.get_selected_preset_name();
params.filename = job_data._3mf_path.string();
params.config_filename = job_data._3mf_config_path.string();
@@ -327,4 +325,9 @@ void SendJob::finalize() {
Job::finalize();
}
+void SendJob::set_project_name(std::string name)
+{
+ m_project_name = name;
+}
+
}} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/Jobs/SendJob.hpp b/src/slic3r/GUI/Jobs/SendJob.hpp
index 7411b2b1a..53f920325 100644
--- a/src/slic3r/GUI/Jobs/SendJob.hpp
+++ b/src/slic3r/GUI/Jobs/SendJob.hpp
@@ -30,7 +30,7 @@ protected:
public:
SendJob(std::shared_ptr pri, Plater *plater, std::string dev_id = "");
-
+ std::string m_project_name;
std::string m_dev_ip;
std::string m_access_code;
std::string task_bed_type;
@@ -53,6 +53,7 @@ public:
void process() override;
void on_success(std::function success);
void finalize() override;
+ void set_project_name(std::string name);
};
}}
diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp
index 85435666b..1360da728 100644
--- a/src/slic3r/GUI/SelectMachine.cpp
+++ b/src/slic3r/GUI/SelectMachine.cpp
@@ -922,6 +922,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
, m_plater(plater), m_export_3mf_cancel(false)
, m_mapping_popup(AmsMapingPopup(this))
, m_mapping_tip_popup(AmsMapingTipPopup(this))
+ , m_mapping_tutorial_popup(AmsTutorialPopup(this))
{
#ifdef __WINDOWS__
SetDoubleBuffered(true);
@@ -954,6 +955,73 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
m_scrollable_region = new wxPanel(m_scrollable_view, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
m_sizer_scrollable_region = new wxBoxSizer(wxVERTICAL);
+
+ //rename normal
+ m_rename_switch_panel = new wxSimplebook(m_scrollable_region);
+ m_rename_switch_panel->SetSize(wxSize(FromDIP(420), FromDIP(25)));
+ m_rename_switch_panel->SetMinSize(wxSize(FromDIP(420), FromDIP(25)));
+ m_rename_switch_panel->SetMaxSize(wxSize(FromDIP(420), FromDIP(25)));
+
+ m_rename_normal_panel = new wxPanel(m_rename_switch_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ m_rename_normal_panel->SetBackgroundColour(*wxWHITE);
+ rename_sizer_v = new wxBoxSizer(wxVERTICAL);
+ rename_sizer_h = new wxBoxSizer(wxHORIZONTAL);
+
+ m_rename_text = new wxStaticText(m_rename_normal_panel, wxID_ANY, wxT("MyLabel"), wxDefaultPosition, wxDefaultSize, 0);
+ m_rename_text->SetFont(::Label::Body_13);
+ m_rename_text->SetMaxSize(wxSize(FromDIP(390), -1));
+ m_rename_button = new Button(m_rename_normal_panel, "", "ams_editable", wxBORDER_NONE, FromDIP(10));
+ m_rename_button->SetBackgroundColor(*wxWHITE);
+ m_rename_button->SetBackgroundColour(*wxWHITE);
+
+ rename_sizer_h->Add(m_rename_text, 0, wxALIGN_CENTER, 0);
+ rename_sizer_h->Add(m_rename_button, 0, wxALIGN_CENTER, 0);
+ rename_sizer_v->Add(rename_sizer_h, 1, wxALIGN_CENTER, 0);
+ m_rename_normal_panel->SetSizer(rename_sizer_v);
+ m_rename_normal_panel->Layout();
+ rename_sizer_v->Fit(m_rename_normal_panel);
+
+ //rename edit
+ auto m_rename_edit_panel = new wxPanel(m_rename_switch_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ m_rename_edit_panel->SetBackgroundColour(*wxWHITE);
+ auto rename_edit_sizer_v = new wxBoxSizer(wxVERTICAL);
+
+ m_rename_input = new ::TextInput(m_rename_edit_panel, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER);
+ m_rename_input->GetTextCtrl()->SetFont(::Label::Body_13);
+ m_rename_input->SetSize(wxSize(FromDIP(380), FromDIP(24)));
+ m_rename_input->SetMinSize(wxSize(FromDIP(380), FromDIP(24)));
+ m_rename_input->SetMaxSize(wxSize(FromDIP(380), FromDIP(24)));
+ rename_edit_sizer_v->Add(m_rename_input, 1, wxALIGN_CENTER, 0);
+
+
+ m_rename_edit_panel->SetSizer(rename_edit_sizer_v);
+ m_rename_edit_panel->Layout();
+ rename_edit_sizer_v->Fit(m_rename_edit_panel);
+
+ m_rename_input->Bind(wxEVT_TEXT_ENTER, &SelectMachineDialog::on_rename_enter, this);
+ m_rename_button->Bind(wxEVT_BUTTON, &SelectMachineDialog::on_rename_click, this);
+
+
+ m_rename_switch_panel->AddPage(m_rename_normal_panel, wxEmptyString, true);
+ m_rename_switch_panel->AddPage(m_rename_edit_panel, wxEmptyString, false);
+
+ Bind(wxEVT_CHAR_HOOK, [this](wxKeyEvent& e) {
+ if (e.GetKeyCode() == WXK_ESCAPE) {
+ if (m_rename_switch_panel->GetSelection() == 0) {
+ e.Skip();
+ }
+ else {
+ m_rename_switch_panel->SetSelection(0);
+ m_rename_text->SetLabel(m_current_project_name);
+ m_rename_normal_panel->Layout();
+ }
+ }
+ else {
+ e.Skip();
+ }
+ });
+
+
m_panel_image = new wxPanel(m_scrollable_region, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
m_panel_image->SetBackgroundColour(m_colour_def_color);
@@ -983,7 +1051,38 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
m_sizer_basic_time->Add(m_stext_weight, 0, wxALL, FromDIP(5));
m_sizer_basic->Add(m_sizer_basic_time, 0, wxALIGN_CENTER, 0);
- m_sizer_material = new wxGridSizer(0, 4, 0, 0);
+ auto m_sizer_material_area = new wxBoxSizer(wxHORIZONTAL);
+
+ wxBoxSizer* m_sizer_material_tips = new wxBoxSizer(wxHORIZONTAL);
+
+
+ auto img_amsmapping_tip = new wxStaticBitmap(m_scrollable_region, wxID_ANY, create_scaled_bitmap("enable_ams", this, 16), wxDefaultPosition, wxSize(FromDIP(16), FromDIP(16)), 0);
+ m_sizer_material_tips->Add(img_amsmapping_tip, 0, wxALIGN_CENTER | wxLEFT, FromDIP(5));
+
+ img_amsmapping_tip->Bind(wxEVT_ENTER_WINDOW, [this, img_amsmapping_tip](auto& e) {
+ wxPoint img_pos = img_amsmapping_tip->ClientToScreen(wxPoint(0, 0));
+ wxPoint popup_pos(img_pos.x, img_pos.y + img_amsmapping_tip->GetRect().height);
+ m_mapping_tutorial_popup.Position(popup_pos, wxSize(0, 0));
+ m_mapping_tutorial_popup.Popup();
+
+ if (m_mapping_tutorial_popup.ClientToScreen(wxPoint(0, 0)).y < img_pos.y) {
+ m_mapping_tutorial_popup.Dismiss();
+ popup_pos = wxPoint(img_pos.x, img_pos.y - m_mapping_tutorial_popup.GetRect().height);
+ m_mapping_tutorial_popup.Position(popup_pos, wxSize(0, 0));
+ m_mapping_tutorial_popup.Popup();
+ }
+ });
+
+ img_amsmapping_tip->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) {
+ m_mapping_tutorial_popup.Dismiss();
+ });
+
+
+ m_sizer_material = new wxGridSizer(0, 4, 0, FromDIP(5));
+
+
+ m_sizer_material_area->Add(m_sizer_material_tips, 0, wxALIGN_CENTER|wxLEFT, FromDIP(8));
+ m_sizer_material_area->Add(m_sizer_material, 0, wxLEFT, FromDIP(15));
m_statictext_ams_msg = new wxStaticText(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL);
m_statictext_ams_msg->SetFont(::Label::Body_13);
@@ -1120,11 +1219,13 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater)
Bind(EVT_PRINT_JOB_CANCEL, &SelectMachineDialog::on_print_job_cancel, this);
Bind(EVT_SET_FINISH_MAPPING, &SelectMachineDialog::on_set_finish_mapping, this);
-
+ m_sizer_scrollable_region->Add(m_rename_switch_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0);
+ m_sizer_scrollable_region->Add(0, 0, 0, wxTOP, FromDIP(8));
m_sizer_scrollable_region->Add(m_panel_image, 0, wxALIGN_CENTER_HORIZONTAL, 0);
m_sizer_scrollable_region->Add(0, 0, 0, wxTOP, FromDIP(10));
m_sizer_scrollable_region->Add(m_sizer_basic, 0, wxALIGN_CENTER_HORIZONTAL, 0);
- m_sizer_scrollable_region->Add(m_sizer_material, 0, wxALIGN_CENTER_HORIZONTAL);
+ //m_sizer_scrollable_region->Add(m_sizer_material, 0, wxALIGN_CENTER_HORIZONTAL, 0);
+ m_sizer_scrollable_region->Add(m_sizer_material_area, 0, wxLEFT, FromDIP(10));
m_scrollable_region->SetSizer(m_sizer_scrollable_region);
m_scrollable_region->Layout();
@@ -1342,7 +1443,8 @@ void SelectMachineDialog::sync_ams_mapping_result(std::vector &res
wxColour ams_col;
if (f->tray_id >= 0) {
- ams_id = wxString::Format("%02d", f->tray_id + 1);
+ ams_id = wxGetApp().transition_tridid(f->tray_id);
+ //ams_id = wxString::Format("%02d", f->tray_id + 1);
} else {
ams_id = "-";
}
@@ -1936,6 +2038,8 @@ void SelectMachineDialog::on_ok()
m_print_job->m_dev_ip = obj_->dev_ip;
m_print_job->m_access_code = obj_->access_code;
m_print_job->connection_type = obj_->connection_type();
+ m_print_job->set_project_name(m_current_project_name.utf8_string());
+
if (obj_->is_support_ams_mapping()) {
m_print_job->task_ams_mapping = ams_mapping_array;
m_print_job->task_ams_mapping_info = ams_mapping_info;
@@ -2150,6 +2254,60 @@ void SelectMachineDialog::update_user_printer()
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "for send task, current printer id = " << m_printer_last_select << std::endl;
}
+void SelectMachineDialog::on_rename_click(wxCommandEvent& event)
+{
+ m_rename_input->GetTextCtrl()->SetValue(m_current_project_name);
+ m_rename_switch_panel->SetSelection(1);
+}
+
+void SelectMachineDialog::on_rename_enter(wxCommandEvent& event)
+{
+ auto new_file_name = m_rename_input->GetTextCtrl()->GetValue();
+ auto m_valid_type = Valid;
+ wxString info_line;
+
+ const char* unusable_symbols = "<>[]:/\\|?*\"";
+
+ const std::string unusable_suffix = PresetCollection::get_suffix_modified(); //"(modified)";
+ for (size_t i = 0; i < std::strlen(unusable_symbols); i++) {
+ if (new_file_name.find_first_of(unusable_symbols[i]) != std::string::npos) {
+ info_line = _L("Name is invalid;") + "\n" + _L("illegal characters:") + " " + unusable_symbols;
+ m_valid_type = NoValid;
+ break;
+ }
+ }
+
+ if (m_valid_type == Valid && new_file_name.find(unusable_suffix) != std::string::npos) {
+ info_line = _L("Name is invalid;") + "\n" + _L("illegal suffix:") + "\n\t" + from_u8(PresetCollection::get_suffix_modified());
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && new_file_name.empty()) {
+ info_line = _L("The name is not allowed to be empty.");
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && new_file_name.find_first_of(' ') == 0) {
+ info_line = _L("The name is not allowed to start with space character.");
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && new_file_name.find_last_of(' ') == new_file_name.length() - 1) {
+ info_line = _L("The name is not allowed to end with space character.");
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type != Valid) {
+ MessageDialog msg_wingow(nullptr, info_line, "", wxICON_WARNING | wxOK);
+ if (msg_wingow.ShowModal() == wxOK) { return; }
+ }
+
+ m_current_project_name = new_file_name;
+ m_rename_switch_panel->SetSelection(0);
+ m_rename_text->SetLabel(m_current_project_name);
+ m_rename_normal_panel->Layout();
+}
+
void SelectMachineDialog::update_printer_combobox(wxCommandEvent &event)
{
show_status(PrintDialogStatus::PrintStatusInit);
@@ -2454,6 +2612,20 @@ wxImage *SelectMachineDialog::LoadImageFromBlob(const unsigned char *data, int s
void SelectMachineDialog::set_default()
{
+ //project name
+ m_rename_switch_panel->SetSelection(0);
+ wxString filename = m_plater->get_export_gcode_filename("", false);
+
+ if (filename.empty()) {
+ filename = m_plater->get_export_gcode_filename("", true);
+ }
+
+ fs::path filename_path(filename.c_str());
+ m_current_project_name = wxString::FromUTF8(filename_path.filename().string());
+ m_rename_text->SetLabelText(m_current_project_name);
+ m_rename_normal_panel->Layout();
+
+
//clear combobox
m_list.clear();
m_comboBox_printer->Clear();
@@ -2520,8 +2692,6 @@ void SelectMachineDialog::set_default()
}
// material info
-
- //auto extruders1 = m_plater->get_partplate_list().get_curr_plate()->get_extruders();
auto extruders = wxGetApp().plater()->get_preview_canvas3D()->get_gcode_viewer().get_plater_extruder();
BitmapCache bmcache;
@@ -2536,7 +2706,6 @@ void SelectMachineDialog::set_default()
m_sizer_material->Clear();
m_materialList.clear();
-
m_filaments.clear();
for (auto i = 0; i < extruders.size(); i++) {
@@ -2548,6 +2717,16 @@ void SelectMachineDialog::set_default()
auto colour_rgb = wxColour((int) rgb[0], (int) rgb[1], (int) rgb[2]);
if (extruder >= materials.size() || extruder < 0 || extruder >= display_materials.size())
continue;
+
+ /* if (m_materialList.size() == 0) {
+ auto tips_panel = new wxPanel(m_scrollable_region, wxID_ANY);
+ tips_panel->SetSize(wxSize(60,40));
+ tips_panel->SetMinSize(wxSize(60,40));
+ tips_panel->SetMaxSize(wxSize(60,40));
+ tips_panel->SetBackgroundColour(*wxRED);
+ m_sizer_material->Add(tips_panel, 0, wxALL, FromDIP(4));
+ }*/
+
MaterialItem *item = new MaterialItem(m_scrollable_region, colour_rgb, _L(display_materials[extruder]));
m_sizer_material->Add(item, 0, wxALL, FromDIP(4));
diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp
index 1529ecb8b..6b0de816b 100644
--- a/src/slic3r/GUI/SelectMachine.hpp
+++ b/src/slic3r/GUI/SelectMachine.hpp
@@ -292,6 +292,14 @@ protected:
wxPanel * m_line_materia{nullptr};
wxStaticText *m_stext_printer_title{nullptr};
+ wxBoxSizer* rename_sizer_v{ nullptr };
+ wxBoxSizer* rename_sizer_h{ nullptr };
+ wxStaticText* m_rename_text{nullptr};
+ TextInput* m_rename_input{nullptr};
+ Button* m_rename_button{nullptr};
+ wxPanel* m_rename_normal_panel{nullptr};
+ wxSimplebook* m_rename_switch_panel{nullptr};
+
wxStaticText *m_statictext_ams_msg{nullptr};
wxStaticText * m_statictext_printer_msg{nullptr};
wxStaticBitmap* m_staticbitmap {nullptr};
@@ -380,7 +388,8 @@ protected:
wxButton * m_button_cancel{nullptr};
AmsMapingPopup m_mapping_popup{nullptr};
AmsMapingTipPopup m_mapping_tip_popup{nullptr};
-
+ AmsTutorialPopup m_mapping_tutorial_popup{nullptr};
+ wxString m_current_project_name;
std::string m_print_info;
int timeout_count = 0;
bool is_timeout();
@@ -395,6 +404,9 @@ protected:
std::shared_ptr m_print_job;
// Virtual event handlers, overide them in your derived class
+ void on_rename_click(wxCommandEvent &event);
+ void on_rename_enter(wxCommandEvent &event);
+
void update_printer_combobox(wxCommandEvent &event);
void on_cancel(wxCloseEvent &event);
void on_ok_btn(wxCommandEvent &event);
diff --git a/src/slic3r/GUI/SendToPrinter.cpp b/src/slic3r/GUI/SendToPrinter.cpp
index 8f619058c..f0d86fc0b 100644
--- a/src/slic3r/GUI/SendToPrinter.cpp
+++ b/src/slic3r/GUI/SendToPrinter.cpp
@@ -31,6 +31,7 @@ wxDEFINE_EVENT(EVT_UPDATE_USER_MACHINE_LIST, wxCommandEvent);
wxDEFINE_EVENT(EVT_PRINT_JOB_CANCEL, wxCommandEvent);
wxDEFINE_EVENT(EVT_SEND_JOB_SUCCESS, wxCommandEvent);
+
void SendToPrinterDialog::stripWhiteSpace(std::string& str)
{
if (str == "") { return; }
@@ -70,6 +71,72 @@ wxString SendToPrinterDialog::format_text(wxString &m_msg)
return out_txt;
}
+void SendToPrinterDialog::on_kill_focus(wxFocusEvent& event)
+{
+ if (m_rename_switch_panel->GetSelection() == 1) {
+ m_rename_switch_panel->SetSelection(0);
+ m_rename_text->SetLabel(m_current_project_name);
+ m_rename_normal_panel->Layout();
+
+ }
+ event.Skip();
+}
+
+void SendToPrinterDialog::on_rename_click(wxCommandEvent& event)
+{
+ m_rename_input->GetTextCtrl()->SetValue(m_current_project_name);
+ m_rename_switch_panel->SetSelection(1);
+ m_rename_input->GetTextCtrl()->SetFocus();
+}
+
+void SendToPrinterDialog::on_rename_enter(wxCommandEvent& event)
+{
+ auto new_file_name = m_rename_input->GetTextCtrl()->GetValue();
+ auto m_valid_type = Valid;
+ wxString info_line;
+
+ const char* unusable_symbols = "<>[]:/\\|?*\"";
+
+ const std::string unusable_suffix = PresetCollection::get_suffix_modified(); //"(modified)";
+ for (size_t i = 0; i < std::strlen(unusable_symbols); i++) {
+ if (new_file_name.find_first_of(unusable_symbols[i]) != std::string::npos) {
+ info_line = _L("Name is invalid;") + "\n" + _L("illegal characters:") + " " + unusable_symbols;
+ m_valid_type = NoValid;
+ break;
+ }
+ }
+
+ if (m_valid_type == Valid && new_file_name.find(unusable_suffix) != std::string::npos) {
+ info_line = _L("Name is invalid;") + "\n" + _L("illegal suffix:") + "\n\t" + from_u8(PresetCollection::get_suffix_modified());
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && new_file_name.empty()) {
+ info_line = _L("The name is not allowed to be empty.");
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && new_file_name.find_first_of(' ') == 0) {
+ info_line = _L("The name is not allowed to start with space character.");
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && new_file_name.find_last_of(' ') == new_file_name.length() - 1) {
+ info_line = _L("The name is not allowed to end with space character.");
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type != Valid) {
+ MessageDialog msg_wingow(nullptr, info_line, "", wxICON_WARNING | wxOK);
+ if (msg_wingow.ShowModal() == wxOK) { return; }
+ }
+
+ m_current_project_name = new_file_name;
+ m_rename_switch_panel->SetSelection(0);
+ m_rename_text->SetLabel(m_current_project_name);
+ m_rename_normal_panel->Layout();
+}
+
SendToPrinterDialog::SendToPrinterDialog(Plater *plater)
: DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, _L("Send to Printer"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX)
, m_plater(plater), m_export_3mf_cancel(false)
@@ -237,20 +304,86 @@ SendToPrinterDialog::SendToPrinterDialog(Plater *plater)
m_scrollable_region->SetSizer(m_sizer_scrollable_region);
m_scrollable_region->Layout();
+ //file name
+ //rename normal
+ m_rename_switch_panel = new wxSimplebook(this);
+ m_rename_switch_panel->SetSize(wxSize(FromDIP(420), FromDIP(25)));
+ m_rename_switch_panel->SetMinSize(wxSize(FromDIP(420), FromDIP(25)));
+ m_rename_switch_panel->SetMaxSize(wxSize(FromDIP(420), FromDIP(25)));
+
+ m_rename_normal_panel = new wxPanel(m_rename_switch_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ m_rename_normal_panel->SetBackgroundColour(*wxWHITE);
+ rename_sizer_v = new wxBoxSizer(wxVERTICAL);
+ rename_sizer_h = new wxBoxSizer(wxHORIZONTAL);
+
+ m_rename_text = new wxStaticText(m_rename_normal_panel, wxID_ANY, wxT("MyLabel"), wxDefaultPosition, wxDefaultSize, 0);
+ m_rename_text->SetFont(::Label::Body_13);
+ m_rename_text->SetMaxSize(wxSize(FromDIP(390), -1));
+ m_rename_button = new Button(m_rename_normal_panel, "", "ams_editable", wxBORDER_NONE, FromDIP(10));
+ m_rename_button->SetBackgroundColor(*wxWHITE);
+ m_rename_button->SetBackgroundColour(*wxWHITE);
+
+ rename_sizer_h->Add(m_rename_text, 0, wxALIGN_CENTER, 0);
+ rename_sizer_h->Add(m_rename_button, 0, wxALIGN_CENTER, 0);
+ rename_sizer_v->Add(rename_sizer_h, 1, wxALIGN_CENTER, 0);
+ m_rename_normal_panel->SetSizer(rename_sizer_v);
+ m_rename_normal_panel->Layout();
+ rename_sizer_v->Fit(m_rename_normal_panel);
+
+ //rename edit
+ auto m_rename_edit_panel = new wxPanel(m_rename_switch_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ m_rename_edit_panel->SetBackgroundColour(*wxWHITE);
+ auto rename_edit_sizer_v = new wxBoxSizer(wxVERTICAL);
+
+ m_rename_input = new ::TextInput(m_rename_edit_panel, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER);
+ m_rename_input->GetTextCtrl()->SetFont(::Label::Body_13);
+ m_rename_input->SetSize(wxSize(FromDIP(380), FromDIP(24)));
+ m_rename_input->SetMinSize(wxSize(FromDIP(380), FromDIP(24)));
+ m_rename_input->SetMaxSize(wxSize(FromDIP(380), FromDIP(24)));
+ rename_edit_sizer_v->Add(m_rename_input, 1, wxALIGN_CENTER, 0);
+
+
+ m_rename_edit_panel->SetSizer(rename_edit_sizer_v);
+ m_rename_edit_panel->Layout();
+ rename_edit_sizer_v->Fit(m_rename_edit_panel);
+
+ m_rename_input->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, &SendToPrinterDialog::on_kill_focus, this);
+ m_rename_input->Bind(wxEVT_TEXT_ENTER, &SendToPrinterDialog::on_rename_enter, this);
+ m_rename_button->Bind(wxEVT_BUTTON, &SendToPrinterDialog::on_rename_click, this);
+
+
+ m_rename_switch_panel->AddPage(m_rename_normal_panel, wxEmptyString, true);
+ m_rename_switch_panel->AddPage(m_rename_edit_panel, wxEmptyString, false);
+
+ Bind(wxEVT_CHAR_HOOK, [this](wxKeyEvent& e) {
+ if (e.GetKeyCode() == WXK_ESCAPE) {
+ if (m_rename_switch_panel->GetSelection() == 0) {
+ e.Skip();
+ }
+ else {
+ m_rename_switch_panel->SetSelection(0);
+ m_rename_text->SetLabel(m_current_project_name);
+ m_rename_normal_panel->Layout();
+ }
+ }
+ else {
+ e.Skip();
+ }
+ });
+
m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0);
m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(22));
m_sizer_main->Add(m_scrollable_region, 0, wxALIGN_CENTER_HORIZONTAL, 0);
m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(8));
+ m_sizer_main->Add(m_rename_switch_panel, 0, wxALIGN_CENTER_HORIZONTAL, 0);
m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(8));
m_sizer_main->Add(m_line_materia, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(30));
- m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14));
+ m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(15));
m_sizer_main->Add(m_sizer_printer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(30));
- m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(5));
- m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(8));
+ m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(13));
m_sizer_main->Add(m_statictext_printer_msg, 0, wxALIGN_CENTER_HORIZONTAL, 0);
- m_sizer_main->Add(0, 1, 0, wxTOP, FromDIP(20));
- m_sizer_main->Add(0, 1, 0, wxTOP, FromDIP(12));
+ m_sizer_main->Add(0, 1, 0, wxTOP, FromDIP(32));
m_sizer_main->Add(m_line_schedule, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(30));
m_sizer_main->Add(m_simplebook, 0, wxALIGN_CENTER_HORIZONTAL, 0);
m_sizer_main->Add(m_sizer_bottom, 0, wxALIGN_CENTER_HORIZONTAL);
@@ -485,6 +618,7 @@ void SendToPrinterDialog::on_ok(wxCommandEvent &event)
m_send_job->connection_type = obj_->connection_type();
m_send_job->cloud_print_only = true;
m_send_job->has_sdcard = obj_->has_sdcard();
+ m_send_job->set_project_name(m_current_project_name.utf8_string());
m_send_job->on_success([this]() {
@@ -896,6 +1030,19 @@ void SendToPrinterDialog::on_dpi_changed(const wxRect &suggested_rect)
void SendToPrinterDialog::set_default()
{
+ //project name
+ m_rename_switch_panel->SetSelection(0);
+ wxString filename = m_plater->get_export_gcode_filename("", false);
+
+ if (filename.empty()) {
+ filename = m_plater->get_export_gcode_filename("", true);
+ }
+
+ fs::path filename_path(filename.c_str());
+ m_current_project_name = wxString::FromUTF8(filename_path.filename().string());
+ m_rename_text->SetLabelText(m_current_project_name);
+ m_rename_normal_panel->Layout();
+
enable_prepare_mode = true;
prepare_mode();
diff --git a/src/slic3r/GUI/SendToPrinter.hpp b/src/slic3r/GUI/SendToPrinter.hpp
index 9490d025f..50371ed9d 100644
--- a/src/slic3r/GUI/SendToPrinter.hpp
+++ b/src/slic3r/GUI/SendToPrinter.hpp
@@ -60,6 +60,14 @@ private:
wxColour m_colour_bold_color{ wxColour(38, 46, 48) };
protected:
+ wxString m_current_project_name;
+ wxBoxSizer* rename_sizer_v{ nullptr };
+ wxBoxSizer* rename_sizer_h{ nullptr };
+ wxStaticText* m_rename_text{ nullptr };
+ TextInput* m_rename_input{ nullptr };
+ Button* m_rename_button{ nullptr };
+ wxPanel* m_rename_normal_panel{ nullptr };
+ wxSimplebook* m_rename_switch_panel{ nullptr };
Plater* m_plater{ nullptr };
wxPanel* m_line_top{ nullptr };
wxPanel* m_panel_image{ nullptr };
@@ -98,6 +106,9 @@ protected:
wxPanel* m_scrollable_region;
wxBoxSizer* m_sizer_scrollable_region;
+ void on_kill_focus(wxFocusEvent& event);
+ void on_rename_click(wxCommandEvent& event);
+ void on_rename_enter(wxCommandEvent& event);
void stripWhiteSpace(std::string& str);
wxString format_text(wxString& m_msg);