mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-06-21 19:33:26 +00:00
NEW:[STUDIO-4063] auto calculate flushing volumes
jira: STUDIO-4063 Change-Id: If8db1375bc8c17d4c86307c1c93a717f6c0df05a
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
|
||||
#include <wx/sizer.h>
|
||||
|
||||
|
||||
using namespace Slic3r::GUI;
|
||||
|
||||
int scale(const int val) { return val * Slic3r::GUI::wxGetApp().em_unit() / 10; }
|
||||
@@ -31,9 +32,11 @@ static const wxColour g_text_color = wxColour(107, 107, 107, 255);
|
||||
#define ROW_END_PADDING FromDIP(21)
|
||||
#define BTN_SIZE wxSize(FromDIP(58), FromDIP(24))
|
||||
#define BTN_GAP FromDIP(20)
|
||||
#define TEXT_BEG_PADDING FromDIP(41)
|
||||
#define TEXT_BEG_PADDING FromDIP(30)
|
||||
#define MAX_FLUSH_VALUE 999
|
||||
#define MIN_WIPING_DIALOG_WIDTH FromDIP(400)
|
||||
#define MIN_WIPING_DIALOG_WIDTH FromDIP(300)
|
||||
#define TIP_MESSAGES_PADDING FromDIP(8)
|
||||
|
||||
|
||||
static void update_ui(wxWindow* window)
|
||||
{
|
||||
@@ -136,6 +139,36 @@ wxBoxSizer* WipingDialog::create_btn_sizer(long flags)
|
||||
return btn_sizer;
|
||||
|
||||
}
|
||||
|
||||
wxBoxSizer* WipingPanel::create_calc_btn_sizer(wxWindow* parent) {
|
||||
auto btn_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
StateColor calc_btn_bg(
|
||||
std::pair<wxColour, int>(wxColour(27, 136, 68), StateColor::Pressed),
|
||||
std::pair<wxColour, int>(wxColour(61, 203, 115), StateColor::Hovered),
|
||||
std::pair<wxColour, int>(wxColour(0, 174, 66), StateColor::Normal)
|
||||
);
|
||||
|
||||
StateColor calc_btn_bd(
|
||||
std::pair<wxColour, int>(wxColour(0, 174, 66), StateColor::Normal)
|
||||
);
|
||||
|
||||
StateColor calc_btn_text(
|
||||
std::pair<wxColour, int>(wxColour(255, 255, 254), StateColor::Normal)
|
||||
);
|
||||
|
||||
Button* calc_btn = new Button(parent, _L("Re-calculate"));
|
||||
calc_btn->SetFont(Label::Body_13);
|
||||
calc_btn->SetMinSize(wxSize(FromDIP(75), FromDIP(24)));
|
||||
calc_btn->SetCornerRadius(FromDIP(12));
|
||||
calc_btn->SetBackgroundColor(calc_btn_bg);
|
||||
calc_btn->SetBorderColor(calc_btn_bd);
|
||||
calc_btn->SetTextColor(calc_btn_text);
|
||||
calc_btn->SetFocus();
|
||||
btn_sizer->Add(calc_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, BTN_GAP);
|
||||
calc_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { calc_flushing_volumes(); });
|
||||
|
||||
return btn_sizer;
|
||||
}
|
||||
void WipingDialog::on_dpi_changed(const wxRect &suggested_rect)
|
||||
{
|
||||
for (auto button_item : m_button_list)
|
||||
@@ -168,21 +201,30 @@ WipingDialog::WipingDialog(wxWindow* parent, const std::vector<float>& matrix, c
|
||||
wxDefaultSize,
|
||||
wxDEFAULT_DIALOG_STYLE /* | wxRESIZE_BORDER*/)
|
||||
{
|
||||
std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % Slic3r::resources_dir()).str();
|
||||
SetIcon(wxIcon(Slic3r::encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO));
|
||||
|
||||
SetBackgroundColour(*wxWHITE);
|
||||
|
||||
auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1));
|
||||
m_line_top->SetBackgroundColour(wxColour(166, 169, 170));
|
||||
|
||||
this->SetBackgroundColour(*wxWHITE);
|
||||
this->SetMinSize(wxSize(MIN_WIPING_DIALOG_WIDTH, -1));
|
||||
|
||||
|
||||
m_panel_wiping = new WipingPanel(this, matrix, extruders, extruder_colours, nullptr, extra_flush_volume, flush_multiplier);
|
||||
|
||||
auto main_sizer = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
main_sizer->Add(m_line_top, 0, wxEXPAND, 0);
|
||||
|
||||
// set min sizer width according to extruders count
|
||||
auto sizer_width = (int)((sqrt(matrix.size()) + 2.8)*ITEM_WIDTH());
|
||||
sizer_width = sizer_width > MIN_WIPING_DIALOG_WIDTH ? sizer_width : MIN_WIPING_DIALOG_WIDTH;
|
||||
main_sizer->SetMinSize(wxSize(sizer_width, -1));
|
||||
|
||||
main_sizer->Add(m_panel_wiping, 1, wxEXPAND | wxALL, 0);
|
||||
|
||||
auto btn_sizer = create_btn_sizer(wxOK | wxCANCEL |wxRESET);
|
||||
auto btn_sizer = create_btn_sizer(wxOK | wxCANCEL);
|
||||
main_sizer->Add(btn_sizer, 0, wxBOTTOM | wxRIGHT | wxEXPAND, BTN_GAP);
|
||||
SetSizer(main_sizer);
|
||||
main_sizer->SetSizeHints(this);
|
||||
@@ -199,9 +241,13 @@ WipingDialog::WipingDialog(wxWindow* parent, const std::vector<float>& matrix, c
|
||||
this->FindWindowById(wxID_CANCEL, this)->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { EndModal(wxCANCEL); });
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
if (this->FindWindowById(wxID_RESET, this)) {
|
||||
this->FindWindowById(wxID_RESET, this)->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { m_panel_wiping->calc_flushing_volumes(); });
|
||||
}
|
||||
*/
|
||||
|
||||
this->Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& e) { EndModal(wxCANCEL); });
|
||||
this->Bind(wxEVT_CHAR_HOOK, [this](wxKeyEvent& e) {
|
||||
if (e.GetKeyCode() == WXK_ESCAPE) {
|
||||
@@ -236,6 +282,7 @@ void WipingPanel::create_panels(wxWindow* parent, const int num) {
|
||||
for (unsigned int j = 0; j < num; ++j) {
|
||||
edit_boxes[j][i]->Reparent(panel);
|
||||
edit_boxes[j][i]->SetBackgroundColour(panel->GetBackgroundColour());
|
||||
edit_boxes[j][i]->SetFont(::Label::Body_14);
|
||||
sizer->AddSpacer(EDIT_BOXES_GAP);
|
||||
sizer->Add(edit_boxes[j][i], 0, wxALIGN_CENTER_VERTICAL, 0);
|
||||
}
|
||||
@@ -259,7 +306,8 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector<float>& matrix, con
|
||||
//Slic3r::GUI::BitmapCache::parse_color(color, rgb);
|
||||
m_colours.push_back(wxColor(color));
|
||||
}
|
||||
|
||||
auto sizer_width = (int)((sqrt(matrix.size())) * ITEM_WIDTH() + (sqrt(matrix.size()) + 1) * HEADER_BEG_PADDING);
|
||||
sizer_width = sizer_width > MIN_WIPING_DIALOG_WIDTH ? sizer_width : MIN_WIPING_DIALOG_WIDTH;
|
||||
// Create two switched panels with their own sizers
|
||||
m_sizer_simple = new wxBoxSizer(wxVERTICAL);
|
||||
m_sizer_advanced = new wxBoxSizer(wxVERTICAL);
|
||||
@@ -319,6 +367,31 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector<float>& matrix, con
|
||||
}
|
||||
|
||||
// BBS
|
||||
m_sizer_advanced->AddSpacer(FromDIP(10));
|
||||
tip_message_panel = new wxPanel(m_page_advanced, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
||||
tip_message_panel->SetBackgroundColour(wxColour(238, 238, 238));
|
||||
auto message_sizer = new wxBoxSizer(wxVERTICAL);
|
||||
auto hyperlink_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
tip_message_panel->SetSizer(message_sizer);
|
||||
{
|
||||
wxString message = _L("Studio would re-calculate your flushing volumes everytime the filaments color changed. You could disable the auto-calculate in Bambu Studio > Preferences");
|
||||
m_tip_message_label = new Label(tip_message_panel, wxEmptyString);
|
||||
wxClientDC dc(tip_message_panel);
|
||||
wxString multiline_message;
|
||||
m_tip_message_label->split_lines(dc, sizer_width, message, multiline_message);
|
||||
m_tip_message_label->SetLabel(multiline_message);
|
||||
m_tip_message_label->SetFont(Label::Body_13);
|
||||
message_sizer->Add(m_tip_message_label, 0, wxEXPAND | wxALL, TIP_MESSAGES_PADDING);
|
||||
}
|
||||
m_sizer_advanced->Add(tip_message_panel, 0, wxEXPAND | wxRIGHT | wxLEFT, TABLE_BORDER);
|
||||
bool is_show = wxGetApp().app_config->get("auto_calculate") == "true";
|
||||
tip_message_panel->Show(is_show);
|
||||
m_sizer_advanced->AddSpacer(FromDIP(10));
|
||||
auto calc_btn_sizer = create_calc_btn_sizer(m_page_advanced);
|
||||
m_sizer_advanced->Add(calc_btn_sizer, 0, wxEXPAND | wxLEFT, FromDIP(30));
|
||||
|
||||
//m_sizer_advanced->AddSpacer(FromDIP(10));
|
||||
m_sizer_advanced->AddSpacer(FromDIP(5));
|
||||
header_line_panel = new wxPanel(m_page_advanced, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
||||
header_line_panel->SetBackgroundColour(wxColour(238, 238, 238));
|
||||
auto header_line_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
@@ -335,28 +408,15 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector<float>& matrix, con
|
||||
header_line_sizer->Add(icon, 0, wxALIGN_CENTER_VERTICAL | wxTOP | wxBOTTOM, HEADER_VERT_PADDING);
|
||||
}
|
||||
header_line_sizer->AddSpacer(HEADER_END_PADDING);
|
||||
|
||||
m_sizer_advanced->Add(header_line_panel, 0, wxEXPAND | wxTOP | wxRIGHT | wxLEFT, TABLE_BORDER);
|
||||
|
||||
|
||||
m_sizer_advanced->Add(header_line_panel, 0, wxEXPAND | wxRIGHT | wxLEFT, TABLE_BORDER);
|
||||
|
||||
create_panels(m_page_advanced, m_number_of_extruders);
|
||||
|
||||
m_sizer_advanced->AddSpacer(BTN_SIZE.y);
|
||||
//m_sizer_advanced->AddSpacer(BTN_SIZE.y);
|
||||
|
||||
// BBS: for tunning flush volumes
|
||||
{
|
||||
wxBoxSizer* param_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
wxStaticText* flush_multiplier_title = new wxStaticText(m_page_advanced, wxID_ANY, _L("Multiplier"));
|
||||
param_sizer->Add(flush_multiplier_title);
|
||||
param_sizer->AddSpacer(FromDIP(5));
|
||||
m_flush_multiplier_ebox = new wxTextCtrl(m_page_advanced, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(50), -1), wxTE_PROCESS_ENTER);
|
||||
char flush_multi_str[32] = { 0 };
|
||||
snprintf(flush_multi_str, sizeof(flush_multi_str), "%.2f", flush_multiplier);
|
||||
m_flush_multiplier_ebox->SetValue(flush_multi_str);
|
||||
param_sizer->Add(m_flush_multiplier_ebox);
|
||||
param_sizer->AddStretchSpacer(1);
|
||||
m_sizer_advanced->Add(param_sizer, 0, wxEXPAND | wxLEFT, TEXT_BEG_PADDING);
|
||||
|
||||
auto multi_desc_label = new wxStaticText(m_page_advanced, wxID_ANY, _(L("Flushing volume (mm³) for each filament pair.")), wxDefaultPosition, wxDefaultSize, 0);
|
||||
multi_desc_label->SetForegroundColour(g_text_color);
|
||||
m_sizer_advanced->Add(multi_desc_label, 0, wxEXPAND | wxLEFT, TEXT_BEG_PADDING);
|
||||
@@ -386,10 +446,23 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector<float>& matrix, con
|
||||
this->update_warning_texts();
|
||||
e.Skip();
|
||||
};
|
||||
m_flush_multiplier_ebox->Bind(wxEVT_TEXT_ENTER, on_apply_text_modify);
|
||||
m_flush_multiplier_ebox->Bind(wxEVT_KILL_FOCUS, on_apply_text_modify);
|
||||
|
||||
m_sizer_advanced->AddSpacer(10);
|
||||
|
||||
wxBoxSizer* param_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
wxStaticText* flush_multiplier_title = new wxStaticText(m_page_advanced, wxID_ANY, _L("Multiplier"));
|
||||
param_sizer->Add(flush_multiplier_title, 0, wxALIGN_CENTER | wxALL, 0);
|
||||
param_sizer->AddSpacer(FromDIP(5));
|
||||
m_flush_multiplier_ebox = new wxTextCtrl(m_page_advanced, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(50), -1), wxTE_PROCESS_ENTER);
|
||||
char flush_multi_str[32] = { 0 };
|
||||
snprintf(flush_multi_str, sizeof(flush_multi_str), "%.2f", flush_multiplier);
|
||||
m_flush_multiplier_ebox->SetValue(flush_multi_str);
|
||||
param_sizer->Add(m_flush_multiplier_ebox, 0, wxALIGN_CENTER | wxALL, 0);
|
||||
param_sizer->AddStretchSpacer(1);
|
||||
m_sizer_advanced->Add(param_sizer, 0, wxEXPAND | wxLEFT, TEXT_BEG_PADDING);
|
||||
|
||||
m_flush_multiplier_ebox->Bind(wxEVT_TEXT_ENTER, on_apply_text_modify);
|
||||
m_flush_multiplier_ebox->Bind(wxEVT_KILL_FOCUS, on_apply_text_modify);
|
||||
}
|
||||
this->update_warning_texts();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user