mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-07 23:17:35 -06:00

* fixed logic error in PLA jamming gcode for P1S * Fix use after free bug in LinesBucketQueue::emplace_back_bucket I found a use after free bug in LinesBucketQueue::emplace_back_bucket. This was found by enabling address sanitizer. The LinesBucketQueue class has two related members: std::vector<LinesBucket> line_buckets; std::priority_queue<LinesBucket *, std::vector<LinesBucket *>, LinesBucketPtrComp> line_bucket_ptr_queue; line_bucket_ptr_queue holds pointers into line_buckets. However, since items are inserted into line_buckets one at a time, existing pointers that were stored inside line_bucket_ptr_queue become invalid. Specifically: void LinesBucketQueue::emplace_back_bucket(ExtrusionLayers &&els, const void *objPtr, Point offset) { auto oldSize = line_buckets.capacity(); line_buckets.emplace_back(std::move(els), objPtr, offset); <--- Causes a reallocation, making previous pointers invalid line_bucket_ptr_queue.push(&line_buckets.back()); <-- priority queue compares against old, now invalid pointers ... The proposed fix is to calculate the required number of entries in ConflictChecker::find_inter_of_lines_in_diff_objs, and then calling line_buckets.reserve(count). This ensures that sufficient buffer is allocated up front and the pointers are stable as items are added. * Updated to fix the handling of the capacity change, and removed the code I previously added to reserve upfront since it is not really needed * Remove accidentally added whitespace * Removed unused method * ENH:add mz_zip_reader_extract_to_file_w api to solove plugin install failed problem by special wide char jira: none Change-Id: Ic7d3efe3fdf852387650abf9df65803da9e46a60 (cherry picked from commit b68ad03717a63675fef2f3ef73d4058bf311adea) * FIX: PrinterFileSystem report real connect error Change-Id: I99d6ff7f6dcb1f53ccf59854f5f19d0bd39fa9fc Jira: none * rename preference name * FIX:Relax restrictions on importing obj files jira: none Change-Id: I61a0156a8424a5f59922956918d37d38e2c3306a * FIX: [6469] popup dialog too mach when reload object Jira: 6469 Change-Id: I4097e3a3b018c7a676fea93bf63f8f778bb3148b * FIX:fixed incorrect display of printer options page on Linux jira:[STUDIO-6220] Change-Id: Id1f084658b0b340b7f17ab97ba82c0fd3ae83fae * FIX: handle exception of dividing by zero in arranging jira: none Change-Id: I0d20464dbe81a80293539100f06d72dee456a27b (cherry picked from commit 94746ae9bf7f467243849570450567b4fdc78e3a) * ENH:delete no use code jira: none Change-Id: I40e7ffa7ea47bb3cd4039eef9f6c28c604eb3abc * FIX: PrinterFileSystem::FileRemoved Change-Id: I891aaa8d58ff379dc1ebd8581064865a33388f74 * FIX: resend ttcode to printer on -90 error Change-Id: I96dc45102a2759a9f1a0002f42c3a91b2c6b2d75 Jira: STUDIO-5947 (cherry picked from commit 97d687b7c88f8cd51b8eddd39120349d8eac42b1) * FIX: fix some issue in multi machine JIRA: STUDIO-6934 STUDIO-6888 1. Fix the issue of incomplete display caused by excessively long file names 2. Fix the issue of icon display being too large 3. Fix the issue of garbled Chinese characters in the task list Change-Id: I36bc10bf2067f44aaa7e3651b58e526ea323c8ad * FIX: Incorrect multiplier, when the multiplier is set to below 1 github: #3987 #3805 1. In some languages that use commas as decimal points, setting multiplier below 1 will resolve to 0 2. Unable to save multiplier correctly Change-Id: I62bc55e270929ebb5e910eb79c6f97106e842b93 * Arrange * FIX: wrong wipe tower when open 3mf file 1.wipe tower pos in 3mf was overwritten by default pos when opening 3mf with a different printer profile.This patch fix it jira: STUDIO-5890 Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I12e5d4b80a0ad86194db0682c1763ba4a9492521 * ENH: update A1 machine gcode 1.Adjust the y position of the A1 extrusion compensation line jira:NEW Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Iea690a0184ae10a47f53e1532272c31fc0a04cfa * FIX: minor spelling mistake in gcode github:#3477 Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: Id3201bf8b8125ce060e2cac102ab2525877e27c1 * FIX: slice crash with height_range github: 3917 Change-Id: Icdf83013213b47935b7a795ed75cc3d49057665d * FIX: ERROR_RES_BUSY text Change-Id: Ifde1a7b0c6ab915eb226c2072c46edd40f60cf9a Jira: STUDIO-6436 * ENH:Unable to send printing without selecting a device jira:[STUDIO-6850] Change-Id: Ic537579727fd1618af364db93fce8fbbe4cd635a * FIX:add exit_gizmo before slice model jira: STUDIO-5531 Change-Id: Icddc9d73b3d91bb68e9768d13e48cbae0680e58e * FIX: PrinterFileSystem report real connect error Change-Id: Id6750cfa2a98fe8325ba677dabb606a0a701b495 * FIX: add can slice judgement in slice all plates processing jira: STUDIO-6325 Change-Id: Ic7fb8cef000c03210bb77289a570ee6b60b6083e * FIX:Fixed error in displaying the name of Bambu filaments Change-Id: Ib42194c07b6eefe793eec81a588debc9d622d951 * FIX: text hidden in calibration tab jira: STUDIO-6264 Change-Id: I24fbc590638a3213d948a973422e010486113923 * FIX: logic error in PLA fan control github PR: #3948 Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I28e4a673e590e83d151e92cc82caab45012aeabe * FIX:upgrade cluster algorithm to remove duplicate labels jira: none Change-Id: I4d68d8cd8e080932c7c308bc8f69e27546ffe309 * FIX: can not parse json float in ES on macOS jira: STUDIO-5889 Change-Id: I622f4b474c378d77b0e43d67a320f023be2d5811 * ENH:Clear the value of the previous nozzle type jira:[for nozzle check] Change-Id: I9a932b833fb07de6cb0a91abe6372b0e91f273f1 * ENH: update A1 gcode 1.Modify the width of extrusion compensation line jira:NEW Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I90543758c866d74f2154e3135d7569109def84b8 * FIX: the height range is not valid in assemble object github: 3876 Change-Id: Id38672bbf0c01bc9b9f0a3e2bf1052d945b45131 * FIX: calibration page text hidden in linux jira: STUDIO-6264 Change-Id: If210abf64057eb2e9c2c5b11d41fa33f18684c72 * ENH:clear nozzle information jira:[STUDIO-7050] Change-Id: I15ca4973d09132ddb5cb5a56bedd795ba6976b27 * update plugin version --------- Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Co-authored-by: afriede <me@afriede.dev> Co-authored-by: Momin Al-Ghosien <momin@sanestudios.com> Co-authored-by: zhou.xu <zhou.xu@bambulab.com> Co-authored-by: chunmao.guo <chunmao.guo@bambulab.com> Co-authored-by: maosheng.wei <maosheng.wei@bambulab.com> Co-authored-by: tao wang <tao.wang@bambulab.com> Co-authored-by: Arthur <arthur.tang@bambulab.com> Co-authored-by: Kunlong Ma <kunlong.ma@bambulab.com> Co-authored-by: xun.zhang <xun.zhang@bambulab.com> Co-authored-by: zhimin.zeng <zhimin.zeng@bambulab.com> Co-authored-by: liz.li <liz.li@bambulab.com>
1602 lines
63 KiB
C++
1602 lines
63 KiB
C++
#include "AMSMaterialsSetting.hpp"
|
|
#include "ExtrusionCalibration.hpp"
|
|
#include "MsgDialog.hpp"
|
|
#include "GUI_App.hpp"
|
|
#include "libslic3r/Preset.hpp"
|
|
#include "I18N.hpp"
|
|
#include <boost/log/trivial.hpp>
|
|
#include <wx/colordlg.h>
|
|
#include <wx/dcgraph.h>
|
|
#include "CalibUtils.hpp"
|
|
#include "../Utils/ColorSpaceConvert.hpp"
|
|
namespace Slic3r { namespace GUI {
|
|
|
|
wxDEFINE_EVENT(EVT_SELECTED_COLOR, wxCommandEvent);
|
|
|
|
static std::string float_to_string_with_precision(float value, int precision = 3)
|
|
{
|
|
std::stringstream stream;
|
|
stream << std::fixed << std::setprecision(precision) << value;
|
|
return stream.str();
|
|
}
|
|
|
|
AMSMaterialsSetting::AMSMaterialsSetting(wxWindow *parent, wxWindowID id)
|
|
: DPIDialog(parent, id, _L("AMS Materials Setting"), wxDefaultPosition, wxDefaultSize, wxBORDER_NONE)
|
|
, m_color_picker_popup(ColorPickerPopup(this))
|
|
{
|
|
create();
|
|
wxGetApp().UpdateDlgDarkUI(this);
|
|
}
|
|
|
|
void AMSMaterialsSetting::create()
|
|
{
|
|
SetBackgroundColour(*wxWHITE);
|
|
wxBoxSizer *m_sizer_main = new wxBoxSizer(wxVERTICAL);
|
|
|
|
m_panel_normal = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
|
create_panel_normal(m_panel_normal);
|
|
m_panel_kn = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
|
create_panel_kn(m_panel_kn);
|
|
|
|
wxBoxSizer *m_sizer_button = new wxBoxSizer(wxHORIZONTAL);
|
|
|
|
m_sizer_button->Add(0, 0, 1, wxEXPAND, 0);
|
|
|
|
m_button_confirm = new Button(this, _L("Confirm"));
|
|
m_btn_bg_green = StateColor(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));
|
|
m_button_confirm->SetBackgroundColor(m_btn_bg_green);
|
|
m_button_confirm->SetBorderColor(wxColour(0, 150, 136));
|
|
m_button_confirm->SetTextColor(wxColour("#FFFFFE"));
|
|
m_button_confirm->SetMinSize(AMS_MATERIALS_SETTING_BUTTON_SIZE);
|
|
m_button_confirm->SetCornerRadius(FromDIP(12));
|
|
m_button_confirm->Bind(wxEVT_BUTTON, &AMSMaterialsSetting::on_select_ok, this);
|
|
|
|
m_button_reset = new Button(this, _L("Reset"));
|
|
m_btn_bg_gray = StateColor(std::pair<wxColour, int>(wxColour(206, 206, 206), StateColor::Pressed), std::pair<wxColour, int>(*wxWHITE, StateColor::Focused),
|
|
std::pair<wxColour, int>(wxColour(238, 238, 238), StateColor::Hovered),
|
|
std::pair<wxColour, int>(*wxWHITE, StateColor::Normal));
|
|
m_button_reset->SetBackgroundColor(m_btn_bg_gray);
|
|
m_button_reset->SetBorderColor(AMS_MATERIALS_SETTING_GREY900);
|
|
m_button_reset->SetTextColor(AMS_MATERIALS_SETTING_GREY900);
|
|
m_button_reset->SetMinSize(AMS_MATERIALS_SETTING_BUTTON_SIZE);
|
|
m_button_reset->SetCornerRadius(FromDIP(12));
|
|
m_button_reset->Bind(wxEVT_BUTTON, &AMSMaterialsSetting::on_select_reset, this);
|
|
|
|
m_button_close = new Button(this, _L("Close"));
|
|
m_button_close->SetBackgroundColor(m_btn_bg_gray);
|
|
m_button_close->SetBorderColor(AMS_MATERIALS_SETTING_GREY900);
|
|
m_button_close->SetTextColor(AMS_MATERIALS_SETTING_GREY900);
|
|
m_button_close->SetMinSize(AMS_MATERIALS_SETTING_BUTTON_SIZE);
|
|
m_button_close->SetCornerRadius(FromDIP(12));
|
|
m_button_close->Bind(wxEVT_BUTTON, &AMSMaterialsSetting::on_select_close, this);
|
|
|
|
m_sizer_button->Add(m_button_confirm, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(20));
|
|
m_sizer_button->Add(m_button_reset, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(20));
|
|
m_sizer_button->Add(m_button_close, 0, wxALIGN_CENTER, 0);
|
|
|
|
m_sizer_main->Add(m_panel_normal, 0, wxALL, FromDIP(2));
|
|
|
|
m_sizer_main->Add(m_panel_kn, 0, wxALL, FromDIP(2));
|
|
|
|
m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(24));
|
|
m_sizer_main->Add(m_sizer_button, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(20));
|
|
m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(16));
|
|
|
|
SetSizer(m_sizer_main);
|
|
Layout();
|
|
Fit();
|
|
|
|
m_input_nozzle_min->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [this](wxFocusEvent& e) {
|
|
warning_text->Hide();
|
|
Layout();
|
|
Fit();
|
|
e.Skip();
|
|
});
|
|
m_input_nozzle_min->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent& e) {
|
|
input_min_finish();
|
|
e.Skip();
|
|
});
|
|
m_input_nozzle_min->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& e) {
|
|
input_min_finish();
|
|
e.Skip();
|
|
});
|
|
|
|
m_input_nozzle_max->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [this](wxFocusEvent& e) {
|
|
warning_text->Hide();
|
|
Layout();
|
|
Fit();
|
|
e.Skip();
|
|
});
|
|
m_input_nozzle_max->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent& e) {
|
|
input_max_finish();
|
|
e.Skip();
|
|
});
|
|
m_input_nozzle_max->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& e) {
|
|
input_max_finish();
|
|
e.Skip();
|
|
});
|
|
|
|
Bind(wxEVT_PAINT, &AMSMaterialsSetting::paintEvent, this);
|
|
Bind(EVT_SELECTED_COLOR, &AMSMaterialsSetting::on_picker_color, this);
|
|
m_comboBox_filament->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(AMSMaterialsSetting::on_select_filament), NULL, this);
|
|
|
|
m_comboBox_cali_result->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(AMSMaterialsSetting::on_select_cali_result), NULL, this);
|
|
}
|
|
|
|
void AMSMaterialsSetting::create_panel_normal(wxWindow* parent)
|
|
{
|
|
auto sizer = new wxBoxSizer(wxVERTICAL);
|
|
|
|
wxBoxSizer* m_sizer_filament = new wxBoxSizer(wxHORIZONTAL);
|
|
|
|
m_title_filament = new wxStaticText(parent, wxID_ANY, _L("Filament"), wxDefaultPosition, wxSize(AMS_MATERIALS_SETTING_LABEL_WIDTH, -1), 0);
|
|
m_title_filament->SetFont(::Label::Body_13);
|
|
m_title_filament->SetForegroundColour(AMS_MATERIALS_SETTING_GREY800);
|
|
m_title_filament->Wrap(-1);
|
|
m_sizer_filament->Add(m_title_filament, 0, wxALIGN_CENTER, 0);
|
|
|
|
m_sizer_filament->Add(0, 0, 0, wxEXPAND, 0);
|
|
|
|
#ifdef __APPLE__
|
|
m_comboBox_filament = new wxComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, AMS_MATERIALS_SETTING_COMBOX_WIDTH, 0, nullptr, wxCB_READONLY);
|
|
#else
|
|
m_comboBox_filament = new ::ComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, AMS_MATERIALS_SETTING_COMBOX_WIDTH, 0, nullptr, wxCB_READONLY);
|
|
#endif
|
|
|
|
m_sizer_filament->Add(m_comboBox_filament, 1, wxALIGN_CENTER, 0);
|
|
|
|
m_readonly_filament = new TextInput(parent, wxEmptyString, "", "", wxDefaultPosition, AMS_MATERIALS_SETTING_COMBOX_WIDTH, wxTE_READONLY | wxRIGHT);
|
|
m_readonly_filament->SetBorderColor(StateColor(std::make_pair(0xDBDBDB, (int)StateColor::Focused), std::make_pair(0x009688, (int)StateColor::Hovered),
|
|
std::make_pair(0xDBDBDB, (int)StateColor::Normal)));
|
|
m_readonly_filament->SetFont(::Label::Body_14);
|
|
m_readonly_filament->SetLabelColor(AMS_MATERIALS_SETTING_GREY800);
|
|
m_readonly_filament->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [](auto& e) {});
|
|
m_readonly_filament->GetTextCtrl()->Hide();
|
|
m_sizer_filament->Add(m_readonly_filament, 1, wxALIGN_CENTER, 0);
|
|
m_readonly_filament->Hide();
|
|
|
|
wxBoxSizer* m_sizer_colour = new wxBoxSizer(wxHORIZONTAL);
|
|
|
|
m_title_colour = new wxStaticText(parent, wxID_ANY, _L("Colour"), wxDefaultPosition, wxSize(AMS_MATERIALS_SETTING_LABEL_WIDTH, -1), 0);
|
|
m_title_colour->SetFont(::Label::Body_13);
|
|
m_title_colour->SetForegroundColour(AMS_MATERIALS_SETTING_GREY800);
|
|
m_title_colour->Wrap(-1);
|
|
m_sizer_colour->Add(m_title_colour, 0, wxALIGN_CENTER, 0);
|
|
|
|
m_sizer_colour->Add(0, 0, 0, wxEXPAND, 0);
|
|
|
|
m_clr_picker = new ColorPicker(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize);
|
|
m_clr_picker->set_show_full(true);
|
|
m_clr_picker->SetBackgroundColour(*wxWHITE);
|
|
|
|
|
|
m_clr_picker->Bind(wxEVT_LEFT_DOWN, &AMSMaterialsSetting::on_clr_picker, this);
|
|
m_sizer_colour->Add(m_clr_picker, 0, 0, 0);
|
|
|
|
wxBoxSizer* m_sizer_temperature = new wxBoxSizer(wxHORIZONTAL);
|
|
m_title_temperature = new wxStaticText(parent, wxID_ANY, _L("Nozzle\nTemperature"), wxDefaultPosition, wxSize(AMS_MATERIALS_SETTING_LABEL_WIDTH, -1), 0);
|
|
m_title_temperature->SetFont(::Label::Body_13);
|
|
m_title_temperature->SetForegroundColour(AMS_MATERIALS_SETTING_GREY800);
|
|
m_title_temperature->Wrap(-1);
|
|
m_sizer_temperature->Add(m_title_temperature, 0, wxALIGN_CENTER, 0);
|
|
|
|
m_sizer_temperature->Add(0, 0, 0, wxEXPAND, 0);
|
|
|
|
wxBoxSizer* sizer_other = new wxBoxSizer(wxVERTICAL);
|
|
wxBoxSizer* sizer_tempinput = new wxBoxSizer(wxHORIZONTAL);
|
|
|
|
m_input_nozzle_max = new ::TextInput(parent, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, AMS_MATERIALS_SETTING_INPUT_SIZE, wxTE_CENTRE | wxTE_PROCESS_ENTER);
|
|
m_input_nozzle_min = new ::TextInput(parent, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, AMS_MATERIALS_SETTING_INPUT_SIZE, wxTE_CENTRE | wxTE_PROCESS_ENTER);
|
|
m_input_nozzle_max->Enable(false);
|
|
m_input_nozzle_min->Enable(false);
|
|
|
|
m_input_nozzle_max->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
|
|
m_input_nozzle_max->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20)));
|
|
m_input_nozzle_min->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
|
|
m_input_nozzle_min->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20)));
|
|
|
|
degree = new ScalableBitmap(parent, "degree", 16);
|
|
bitmap_max_degree = new wxStaticBitmap(parent, -1, degree->bmp(), wxDefaultPosition, wxDefaultSize);
|
|
bitmap_min_degree = new wxStaticBitmap(parent, -1, degree->bmp(), wxDefaultPosition, wxDefaultSize);
|
|
|
|
sizer_tempinput->Add(m_input_nozzle_max, 1, wxALIGN_CENTER, 0);
|
|
sizer_tempinput->Add(bitmap_min_degree, 0, wxALIGN_CENTER, 0);
|
|
sizer_tempinput->Add(FromDIP(10), 0, 0, 0);
|
|
sizer_tempinput->Add(m_input_nozzle_min, 1, wxALIGN_CENTER, 0);
|
|
sizer_tempinput->Add(bitmap_max_degree, 0, wxALIGN_CENTER, 0);
|
|
|
|
wxBoxSizer* sizer_temp_txt = new wxBoxSizer(wxHORIZONTAL);
|
|
auto m_title_max = new wxStaticText(parent, wxID_ANY, _L("max"), wxDefaultPosition, AMS_MATERIALS_SETTING_INPUT_SIZE);
|
|
m_title_max->SetForegroundColour(AMS_MATERIALS_SETTING_GREY800);
|
|
m_title_max->SetFont(::Label::Body_13);
|
|
auto m_title_min = new wxStaticText(parent, wxID_ANY, _L("min"), wxDefaultPosition, AMS_MATERIALS_SETTING_INPUT_SIZE);
|
|
m_title_min->SetForegroundColour(AMS_MATERIALS_SETTING_GREY800);
|
|
m_title_min->SetFont(::Label::Body_13);
|
|
sizer_temp_txt->Add(m_title_max, 1, wxALIGN_CENTER, 0);
|
|
sizer_temp_txt->Add(FromDIP(10), 0, 0, 0);
|
|
sizer_temp_txt->Add(m_title_min, 1, wxALIGN_CENTER | wxRIGHT, FromDIP(16));
|
|
|
|
|
|
sizer_other->Add(sizer_temp_txt, 0, wxALIGN_CENTER, 0);
|
|
sizer_other->Add(sizer_tempinput, 0, wxALIGN_CENTER, 0);
|
|
|
|
m_sizer_temperature->Add(sizer_other, 0, wxALL | wxALIGN_CENTER, 0);
|
|
m_sizer_temperature->AddStretchSpacer();
|
|
|
|
wxString warning_string = wxString::FromUTF8(
|
|
(boost::format(_u8L("The input value should be greater than %1% and less than %2%")) % FILAMENT_MIN_TEMP % FILAMENT_MAX_TEMP).str());
|
|
warning_text = new wxStaticText(parent, wxID_ANY, warning_string, wxDefaultPosition, wxDefaultSize, 0);
|
|
warning_text->SetFont(::Label::Body_13);
|
|
warning_text->SetForegroundColour(wxColour(255, 111, 0));
|
|
|
|
warning_text->Wrap(AMS_MATERIALS_SETTING_BODY_WIDTH);
|
|
warning_text->SetMinSize(wxSize(AMS_MATERIALS_SETTING_BODY_WIDTH, -1));
|
|
warning_text->Hide();
|
|
|
|
m_panel_SN = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
|
wxBoxSizer* m_sizer_SN = new wxBoxSizer(wxVERTICAL);
|
|
m_sizer_SN->AddSpacer(FromDIP(16));
|
|
|
|
wxBoxSizer* m_sizer_SN_inside = new wxBoxSizer(wxHORIZONTAL);
|
|
|
|
auto m_title_SN = new wxStaticText(m_panel_SN, wxID_ANY, _L("SN"), wxDefaultPosition, wxSize(AMS_MATERIALS_SETTING_LABEL_WIDTH, -1), 0);
|
|
m_title_SN->SetFont(::Label::Body_13);
|
|
m_title_SN->SetForegroundColour(AMS_MATERIALS_SETTING_GREY800);
|
|
m_title_SN->Wrap(-1);
|
|
m_sizer_SN_inside->Add(m_title_SN, 0, wxALIGN_CENTER, 0);
|
|
|
|
m_sizer_SN_inside->Add(0, 0, 0, wxEXPAND, 0);
|
|
|
|
m_sn_number = new wxStaticText(m_panel_SN, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize);
|
|
m_sn_number->SetForegroundColour(*wxBLACK);
|
|
m_sizer_SN_inside->Add(m_sn_number, 0, wxALIGN_CENTER, 0);
|
|
m_sizer_SN->Add(m_sizer_SN_inside);
|
|
|
|
m_panel_SN->SetSizer(m_sizer_SN);
|
|
m_panel_SN->Layout();
|
|
m_panel_SN->Fit();
|
|
|
|
wxBoxSizer* m_tip_sizer = new wxBoxSizer(wxHORIZONTAL);
|
|
m_tip_readonly = new Label(parent, _L("Setting AMS slot information while printing is not supported"));
|
|
m_tip_readonly->SetForegroundColour(*wxBLACK);
|
|
m_tip_readonly->SetBackgroundColour(*wxWHITE);
|
|
m_tip_readonly->SetMinSize(wxSize(FromDIP(380), -1));
|
|
m_tip_readonly->SetMaxSize(wxSize(FromDIP(380), -1));
|
|
m_tip_readonly->Hide();
|
|
m_tip_sizer->Add(m_tip_readonly, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(20));
|
|
|
|
sizer->Add(0, 0, 0, wxTOP, FromDIP(16));
|
|
sizer->Add(m_sizer_filament, 0, wxLEFT | wxRIGHT, FromDIP(20));
|
|
sizer->Add(0, 0, 0, wxTOP, FromDIP(16));
|
|
sizer->Add(m_sizer_colour, 0, wxLEFT | wxRIGHT, FromDIP(20));
|
|
sizer->Add(0, 0, 0, wxTOP, FromDIP(16));
|
|
sizer->Add(m_sizer_temperature, 0, wxLEFT | wxRIGHT, FromDIP(20));
|
|
sizer->Add(0, 0, 0, wxTOP, FromDIP(5));
|
|
sizer->Add(warning_text, 0, wxLEFT | wxRIGHT, FromDIP(20));
|
|
sizer->Add(m_panel_SN, 0, wxLEFT, FromDIP(20));
|
|
sizer->Add(0, 0, 0, wxTOP, FromDIP(24));
|
|
sizer->Add(m_tip_sizer, 0, wxLEFT, FromDIP(20));
|
|
parent->SetSizer(sizer);
|
|
}
|
|
|
|
void AMSMaterialsSetting::create_panel_kn(wxWindow* parent)
|
|
{
|
|
auto sizer = new wxBoxSizer(wxVERTICAL);
|
|
// title
|
|
m_ratio_text = new wxStaticText(parent, wxID_ANY, _L("Factors of Flow Dynamics Calibration"));
|
|
m_ratio_text->SetForegroundColour(wxColour(50, 58, 61));
|
|
m_ratio_text->SetFont(Label::Head_14);
|
|
|
|
m_ratio_text->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); });
|
|
m_ratio_text->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); });
|
|
|
|
m_ratio_text->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {
|
|
wxLaunchDefaultBrowser(wxT("https://wiki.bambulab.com/en/software/bambu-studio/calibration_pa"));
|
|
});
|
|
|
|
|
|
wxBoxSizer *m_sizer_cali_resutl = new wxBoxSizer(wxHORIZONTAL);
|
|
// pa profile
|
|
m_title_pa_profile = new wxStaticText(parent, wxID_ANY, _L("PA Profile"), wxDefaultPosition, wxSize(AMS_MATERIALS_SETTING_LABEL_WIDTH, -1), 0);
|
|
m_title_pa_profile->SetMinSize(wxSize(FromDIP(80), -1));
|
|
m_title_pa_profile->SetMaxSize(wxSize(FromDIP(80), -1));
|
|
m_title_pa_profile->SetFont(::Label::Body_13);
|
|
m_title_pa_profile->SetForegroundColour(AMS_MATERIALS_SETTING_GREY800);
|
|
m_title_pa_profile->Wrap(-1);
|
|
m_sizer_cali_resutl->Add(m_title_pa_profile, 0, wxALIGN_CENTER, 0);
|
|
m_sizer_cali_resutl->Add(0, 0, 0, wxEXPAND, 0);
|
|
|
|
m_comboBox_cali_result = new ::ComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, AMS_MATERIALS_SETTING_COMBOX_WIDTH, 0, nullptr, wxCB_READONLY);
|
|
m_sizer_cali_resutl->Add(m_comboBox_cali_result, 1, wxALIGN_CENTER, 0);
|
|
|
|
auto kn_val_sizer = new wxFlexGridSizer(0, 2, 0, 0);
|
|
kn_val_sizer->SetFlexibleDirection(wxBOTH);
|
|
kn_val_sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
|
|
kn_val_sizer->AddGrowableCol(1);
|
|
|
|
// k params input
|
|
m_k_param = new wxStaticText(parent, wxID_ANY, _L("Factor K"), wxDefaultPosition, wxDefaultSize, 0);
|
|
m_k_param->SetMinSize(wxSize(FromDIP(80), -1));
|
|
m_k_param->SetMaxSize(wxSize(FromDIP(80), -1));
|
|
m_k_param->SetFont(::Label::Body_13);
|
|
m_k_param->SetForegroundColour(wxColour(50, 58, 61));
|
|
m_k_param->Wrap(-1);
|
|
kn_val_sizer->Add(m_k_param, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(0));
|
|
|
|
m_input_k_val = new TextInput(parent, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_CENTRE | wxTE_PROCESS_ENTER);
|
|
m_input_k_val->SetMinSize(wxSize(FromDIP(245), -1));
|
|
m_input_k_val->SetMaxSize(wxSize(FromDIP(245), -1));
|
|
m_input_k_val->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
|
|
kn_val_sizer->Add(m_input_k_val, 0, wxALL | wxEXPAND | wxALIGN_CENTER_VERTICAL, FromDIP(0));
|
|
|
|
// n params input
|
|
wxBoxSizer* n_sizer = new wxBoxSizer(wxHORIZONTAL);
|
|
m_n_param = new wxStaticText(parent, wxID_ANY, _L("Factor N"), wxDefaultPosition, wxDefaultSize, 0);
|
|
m_n_param->SetFont(::Label::Body_13);
|
|
m_n_param->SetForegroundColour(wxColour(50, 58, 61));
|
|
m_n_param->Wrap(-1);
|
|
kn_val_sizer->Add(m_n_param, 1, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(5));
|
|
m_input_n_val = new TextInput(parent, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_CENTRE | wxTE_PROCESS_ENTER);
|
|
m_input_n_val->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
|
|
kn_val_sizer->Add(m_input_n_val, 0, wxALL | wxEXPAND | wxALIGN_CENTER_VERTICAL, FromDIP(5));
|
|
m_n_param->Hide();
|
|
m_input_n_val->Hide();
|
|
|
|
sizer->Add(0, 0, 0, wxTOP, FromDIP(10));
|
|
sizer->Add(m_ratio_text, 0, wxLEFT | wxRIGHT | wxEXPAND, FromDIP(20));
|
|
sizer->Add(0, 0, 0, wxTOP, FromDIP(16));
|
|
sizer->Add(m_sizer_cali_resutl, 0, wxLEFT | wxRIGHT, FromDIP(20));
|
|
sizer->Add(0, 0, 0, wxTOP, FromDIP(10));
|
|
sizer->Add(kn_val_sizer, 0, wxLEFT | wxRIGHT | wxEXPAND, FromDIP(20));
|
|
sizer->Add(0, 0, 0, wxTOP, FromDIP(10));
|
|
parent->SetSizer(sizer);
|
|
}
|
|
|
|
void AMSMaterialsSetting::paintEvent(wxPaintEvent &evt)
|
|
{
|
|
auto size = GetSize();
|
|
wxPaintDC dc(this);
|
|
dc.SetPen(wxPen(StateColor::darkModeColorFor(wxColour("#000000")), 1, wxSOLID));
|
|
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
|
|
dc.DrawRectangle(0, 0, size.x, size.y);
|
|
}
|
|
|
|
AMSMaterialsSetting::~AMSMaterialsSetting()
|
|
{
|
|
m_comboBox_filament->Disconnect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(AMSMaterialsSetting::on_select_filament), NULL, this);
|
|
m_comboBox_cali_result->Disconnect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(AMSMaterialsSetting::on_select_cali_result), NULL, this);
|
|
}
|
|
|
|
void AMSMaterialsSetting::input_min_finish()
|
|
{
|
|
if (m_input_nozzle_min->GetTextCtrl()->GetValue().empty()) return;
|
|
|
|
auto val = std::atoi(m_input_nozzle_min->GetTextCtrl()->GetValue().c_str());
|
|
|
|
if (val < FILAMENT_MIN_TEMP || val > FILAMENT_MAX_TEMP) {
|
|
warning_text->Show();
|
|
} else {
|
|
warning_text->Hide();
|
|
}
|
|
Layout();
|
|
Fit();
|
|
}
|
|
|
|
void AMSMaterialsSetting::input_max_finish()
|
|
{
|
|
if (m_input_nozzle_max->GetTextCtrl()->GetValue().empty()) return;
|
|
|
|
auto val = std::atoi(m_input_nozzle_max->GetTextCtrl()->GetValue().c_str());
|
|
|
|
if (val < FILAMENT_MIN_TEMP || val > FILAMENT_MAX_TEMP) {
|
|
warning_text->Show();
|
|
}
|
|
else {
|
|
warning_text->Hide();
|
|
}
|
|
Layout();
|
|
Fit();
|
|
}
|
|
|
|
void AMSMaterialsSetting::update()
|
|
{
|
|
if (obj) {
|
|
update_widgets();
|
|
if (obj->is_in_printing() || obj->can_resume()) {
|
|
enable_confirm_button(false);
|
|
} else {
|
|
enable_confirm_button(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AMSMaterialsSetting::enable_confirm_button(bool en)
|
|
{
|
|
m_button_confirm->Show(en);
|
|
if (!m_is_third) {
|
|
m_tip_readonly->Hide();
|
|
}
|
|
else {
|
|
//m_comboBox_filament->Show(en);
|
|
//m_readonly_filament->Show(!en);
|
|
|
|
if ( !is_virtual_tray() ) {
|
|
m_tip_readonly->SetLabelText(_L("Setting AMS slot information while printing is not supported"));
|
|
}
|
|
else {
|
|
m_tip_readonly->SetLabelText(_L("Setting Virtual slot information while printing is not supported"));
|
|
}
|
|
m_tip_readonly->Wrap(FromDIP(380));
|
|
m_tip_readonly->Show(!en);
|
|
}
|
|
}
|
|
|
|
void AMSMaterialsSetting::on_select_reset(wxCommandEvent& event) {
|
|
MessageDialog msg_dlg(nullptr, _L("Are you sure you want to clear the filament information?"), wxEmptyString, wxICON_WARNING | wxOK | wxCANCEL);
|
|
auto result = msg_dlg.ShowModal();
|
|
if (result != wxID_OK)
|
|
return;
|
|
|
|
m_input_nozzle_min->GetTextCtrl()->SetValue("");
|
|
m_input_nozzle_max->GetTextCtrl()->SetValue("");
|
|
ams_filament_id = "";
|
|
ams_setting_id = "";
|
|
m_filament_selection = -1;
|
|
wxString k_text = "0.000";
|
|
wxString n_text = "0.000";
|
|
m_filament_type = "";
|
|
long nozzle_temp_min_int = 0;
|
|
long nozzle_temp_max_int = 0;
|
|
wxColour color = *wxWHITE;
|
|
char col_buf[10];
|
|
sprintf(col_buf, "%02X%02X%02XFF", (int)color.Red(), (int)color.Green(), (int)color.Blue());
|
|
|
|
if (obj) {
|
|
// set filament
|
|
if (is_virtual_tray()) {
|
|
obj->command_ams_filament_settings(255, VIRTUAL_TRAY_ID, ams_filament_id, ams_setting_id, std::string(col_buf), m_filament_type, nozzle_temp_min_int, nozzle_temp_max_int);
|
|
}
|
|
else if(m_is_third){
|
|
obj->command_ams_filament_settings(ams_id, tray_id, ams_filament_id, ams_setting_id, std::string(col_buf), m_filament_type, nozzle_temp_min_int, nozzle_temp_max_int);
|
|
}
|
|
|
|
// set k / n value
|
|
if (obj->cali_version <= -1 && obj->get_printer_series() == PrinterSeries::SERIES_P1P) {
|
|
// set extrusion cali ratio
|
|
int cali_tray_id = ams_id * 4 + tray_id;
|
|
|
|
double k = 0.0;
|
|
try {
|
|
k_text.ToDouble(&k);
|
|
}
|
|
catch (...) {
|
|
;
|
|
}
|
|
|
|
double n = 0.0;
|
|
try {
|
|
n_text.ToDouble(&n);
|
|
}
|
|
catch (...) {
|
|
;
|
|
}
|
|
obj->command_extrusion_cali_set(cali_tray_id, "", "", k, n);
|
|
}
|
|
else {
|
|
PACalibIndexInfo select_index_info;
|
|
select_index_info.tray_id = tray_id;
|
|
select_index_info.nozzle_diameter = obj->nozzle_diameter;
|
|
select_index_info.cali_idx = -1;
|
|
select_index_info.filament_id = ams_filament_id;
|
|
CalibUtils::select_PA_calib_result(select_index_info);
|
|
}
|
|
}
|
|
Close();
|
|
}
|
|
|
|
void AMSMaterialsSetting::on_select_ok(wxCommandEvent &event)
|
|
{
|
|
//get filament id
|
|
ams_filament_id = "";
|
|
ams_setting_id = "";
|
|
|
|
PresetBundle* preset_bundle = wxGetApp().preset_bundle;
|
|
if (preset_bundle) {
|
|
for (auto it = preset_bundle->filaments.begin(); it != preset_bundle->filaments.end(); it++) {
|
|
|
|
auto filament_item = map_filament_items[m_comboBox_filament->GetValue().ToStdString()];
|
|
std::string filament_id = filament_item.filament_id;
|
|
if (it->filament_id.compare(filament_id) == 0) {
|
|
|
|
|
|
//check is it in the filament blacklist
|
|
if (!is_virtual_tray() && wxGetApp().app_config->get("skip_ams_blacklist_check") != "true") {
|
|
bool in_blacklist = false;
|
|
std::string action;
|
|
std::string info;
|
|
std::string filamnt_type;
|
|
it->get_filament_type(filamnt_type);
|
|
|
|
auto vendor = dynamic_cast<ConfigOptionStrings*> (it->config.option("filament_vendor"));
|
|
if (vendor && (vendor->values.size() > 0)) {
|
|
std::string vendor_name = vendor->values[0];
|
|
DeviceManager::check_filaments_in_blacklist(vendor_name, filamnt_type, in_blacklist, action, info);
|
|
}
|
|
|
|
|
|
if (in_blacklist) {
|
|
if (action == "prohibition") {
|
|
MessageDialog msg_wingow(nullptr, wxString::FromUTF8(info), _L("Error"), wxICON_WARNING | wxOK);
|
|
msg_wingow.ShowModal();
|
|
//m_comboBox_filament->SetSelection(m_filament_selection);
|
|
return;
|
|
}
|
|
else if (action == "warning") {
|
|
MessageDialog msg_wingow(nullptr, wxString::FromUTF8(info), _L("Warning"), wxICON_INFORMATION | wxOK);
|
|
msg_wingow.ShowModal();
|
|
}
|
|
}
|
|
}
|
|
|
|
ams_filament_id = it->filament_id;
|
|
ams_setting_id = it->setting_id;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
wxString nozzle_temp_min = m_input_nozzle_min->GetTextCtrl()->GetValue();
|
|
auto filament = m_comboBox_filament->GetValue();
|
|
|
|
wxString nozzle_temp_max = m_input_nozzle_max->GetTextCtrl()->GetValue();
|
|
|
|
long nozzle_temp_min_int, nozzle_temp_max_int;
|
|
nozzle_temp_min.ToLong(&nozzle_temp_min_int);
|
|
nozzle_temp_max.ToLong(&nozzle_temp_max_int);
|
|
wxColour color = m_clr_picker->m_colour;
|
|
char col_buf[10];
|
|
sprintf(col_buf, "%02X%02X%02X%02X", (int)color.Red(), (int)color.Green(), (int)color.Blue(), (int)color.Alpha());
|
|
|
|
if (ams_filament_id.empty() || nozzle_temp_min.empty() || nozzle_temp_max.empty() || m_filament_type.empty()) {
|
|
BOOST_LOG_TRIVIAL(trace) << "Invalid Setting id";
|
|
MessageDialog msg_dlg(nullptr, _L("You need to select the material type and color first."), wxEmptyString, wxICON_WARNING | wxOK);
|
|
msg_dlg.ShowModal();
|
|
return;
|
|
}
|
|
|
|
|
|
// set filament
|
|
if (m_is_third) {
|
|
if (is_virtual_tray()) {
|
|
obj->command_ams_filament_settings(255, VIRTUAL_TRAY_ID, ams_filament_id, ams_setting_id, std::string(col_buf), m_filament_type, nozzle_temp_min_int, nozzle_temp_max_int);
|
|
}
|
|
else {
|
|
obj->command_ams_filament_settings(ams_id, tray_id, ams_filament_id, ams_setting_id, std::string(col_buf), m_filament_type, nozzle_temp_min_int, nozzle_temp_max_int);
|
|
}
|
|
}
|
|
|
|
//reset param
|
|
wxString k_text = m_input_k_val->GetTextCtrl()->GetValue();
|
|
wxString n_text = m_input_n_val->GetTextCtrl()->GetValue();
|
|
|
|
if (obj->cali_version <= -1 && (obj->get_printer_series() != PrinterSeries::SERIES_X1) && !ExtrusionCalibration::check_k_validation(k_text)) {
|
|
wxString k_tips = _L("Please input a valid value (K in 0~0.3)");
|
|
wxString kn_tips = _L("Please input a valid value (K in 0~0.3, N in 0.6~2.0)");
|
|
MessageDialog msg_dlg(nullptr, k_tips, wxEmptyString, wxICON_WARNING | wxOK);
|
|
msg_dlg.ShowModal();
|
|
return;
|
|
}
|
|
|
|
// set k / n value
|
|
if (is_virtual_tray()) {
|
|
double k = 0.0;
|
|
try {
|
|
k_text.ToDouble(&k);
|
|
}
|
|
catch (...) {
|
|
;
|
|
}
|
|
double n = 0.0;
|
|
try {
|
|
n_text.ToDouble(&n);
|
|
}
|
|
catch (...) {
|
|
;
|
|
}
|
|
|
|
if (obj->cali_version >= 0) {
|
|
PACalibIndexInfo select_index_info;
|
|
select_index_info.tray_id = tray_id;
|
|
select_index_info.nozzle_diameter = obj->nozzle_diameter;
|
|
|
|
auto cali_select_id = m_comboBox_cali_result->GetSelection();
|
|
if (m_pa_profile_items.size() > 0 && cali_select_id >= 0) {
|
|
select_index_info.cali_idx = m_pa_profile_items[cali_select_id].cali_idx;
|
|
select_index_info.filament_id = m_pa_profile_items[cali_select_id].filament_id;
|
|
}
|
|
else { // default item
|
|
select_index_info.cali_idx = -1;
|
|
select_index_info.filament_id = ams_filament_id;
|
|
}
|
|
|
|
CalibUtils::select_PA_calib_result(select_index_info);
|
|
}
|
|
else {
|
|
obj->command_extrusion_cali_set(VIRTUAL_TRAY_ID, "", "", k, n);
|
|
}
|
|
}
|
|
else {
|
|
int cali_tray_id = ams_id * 4 + tray_id;
|
|
double k = 0.0;
|
|
try {
|
|
k_text.ToDouble(&k);
|
|
}
|
|
catch (...) {
|
|
;
|
|
}
|
|
|
|
double n = 0.0;
|
|
try {
|
|
n_text.ToDouble(&n);
|
|
}
|
|
catch (...) {
|
|
;
|
|
}
|
|
|
|
if (obj->cali_version >= 0) {
|
|
PACalibIndexInfo select_index_info;
|
|
select_index_info.tray_id = cali_tray_id;
|
|
select_index_info.nozzle_diameter = obj->nozzle_diameter;
|
|
|
|
auto cali_select_id = m_comboBox_cali_result->GetSelection();
|
|
if (m_pa_profile_items.size() > 0 && cali_select_id >= 0) {
|
|
select_index_info.cali_idx = m_pa_profile_items[cali_select_id].cali_idx;
|
|
select_index_info.filament_id = m_pa_profile_items[cali_select_id].filament_id;
|
|
}
|
|
else { // default item
|
|
select_index_info.cali_idx = -1;
|
|
select_index_info.filament_id = ams_filament_id;
|
|
}
|
|
|
|
CalibUtils::select_PA_calib_result(select_index_info);
|
|
}
|
|
else {
|
|
obj->command_extrusion_cali_set(cali_tray_id, "", "", k, n);
|
|
}
|
|
}
|
|
Close();
|
|
}
|
|
|
|
void AMSMaterialsSetting::on_select_close(wxCommandEvent &event)
|
|
{
|
|
Close();
|
|
}
|
|
|
|
void AMSMaterialsSetting::set_color(wxColour color)
|
|
{
|
|
//m_clrData->SetColour(color);
|
|
m_clr_picker->is_empty(false);
|
|
m_clr_picker->set_color(color);
|
|
}
|
|
|
|
void AMSMaterialsSetting::set_empty_color(wxColour color)
|
|
{
|
|
m_clr_picker->is_empty(true);
|
|
m_clr_picker->set_color(color);
|
|
}
|
|
|
|
void AMSMaterialsSetting::set_colors(std::vector<wxColour> colors)
|
|
{
|
|
//m_clrData->SetColour(color);
|
|
m_clr_picker->set_colors(colors);
|
|
}
|
|
|
|
void AMSMaterialsSetting::set_ctype(int ctype)
|
|
{
|
|
m_clr_picker->ctype = ctype;
|
|
}
|
|
|
|
void AMSMaterialsSetting::on_picker_color(wxCommandEvent& event)
|
|
{
|
|
unsigned int color_num = event.GetInt();
|
|
set_color(wxColour(color_num>>24&0xFF, color_num>>16&0xFF, color_num>>8&0xFF, color_num&0xFF));
|
|
}
|
|
|
|
void AMSMaterialsSetting::on_clr_picker(wxMouseEvent &event)
|
|
{
|
|
if(!m_is_third || obj->is_in_printing() || obj->can_resume())
|
|
return;
|
|
|
|
|
|
std::vector<wxColour> ams_colors;
|
|
for (auto ams_it = obj->amsList.begin(); ams_it != obj->amsList.end(); ++ams_it) {
|
|
for (auto tray_id = ams_it->second->trayList.begin(); tray_id != ams_it->second->trayList.end(); ++tray_id) {
|
|
std::vector<wxColour>::iterator iter = find(ams_colors.begin(), ams_colors.end(), AmsTray::decode_color(tray_id->second->color));
|
|
if (iter == ams_colors.end()) {
|
|
ams_colors.push_back(AmsTray::decode_color(tray_id->second->color));
|
|
}
|
|
}
|
|
}
|
|
|
|
wxPoint img_pos = m_clr_picker->ClientToScreen(wxPoint(0, 0));
|
|
wxPoint popup_pos(img_pos.x - m_color_picker_popup.GetSize().x - FromDIP(95), img_pos.y - FromDIP(65));
|
|
m_color_picker_popup.Position(popup_pos, wxSize(0, 0));
|
|
m_color_picker_popup.set_ams_colours(ams_colors);
|
|
m_color_picker_popup.set_def_colour(m_clr_picker->m_colour);
|
|
m_color_picker_popup.Popup();
|
|
}
|
|
|
|
bool AMSMaterialsSetting::is_virtual_tray()
|
|
{
|
|
if (tray_id == VIRTUAL_TRAY_ID)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
void AMSMaterialsSetting::update_widgets()
|
|
{
|
|
if (obj && obj->get_printer_series() == PrinterSeries::SERIES_X1 && obj->cali_version <= -1) {
|
|
// Low version firmware does not display k value
|
|
m_panel_kn->Hide();
|
|
}
|
|
else if(is_virtual_tray()) // virtual tray
|
|
{
|
|
if (obj)
|
|
m_panel_normal->Show();
|
|
else
|
|
m_panel_normal->Hide();
|
|
m_panel_kn->Show();
|
|
} else if (obj && (obj->ams_support_virtual_tray || obj->cali_version >= 0)) {
|
|
m_panel_normal->Show();
|
|
m_panel_kn->Show();
|
|
} else {
|
|
m_panel_normal->Show();
|
|
m_panel_kn->Hide();
|
|
}
|
|
Layout();
|
|
}
|
|
|
|
bool AMSMaterialsSetting::Show(bool show)
|
|
{
|
|
if (show) {
|
|
m_button_confirm->SetMinSize(AMS_MATERIALS_SETTING_BUTTON_SIZE);
|
|
m_input_nozzle_max->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20)));
|
|
m_input_nozzle_min->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20)));
|
|
//m_clr_picker->set_color(m_clr_picker->GetParent()->GetBackgroundColour());
|
|
|
|
/*if (obj && (obj->is_function_supported(PrinterFunction::FUNC_EXTRUSION_CALI) || obj->is_high_printer_type())) {
|
|
m_ratio_text->Show();
|
|
m_k_param->Show();
|
|
m_input_k_val->Show();
|
|
}
|
|
else {
|
|
m_ratio_text->Hide();
|
|
m_k_param->Hide();
|
|
m_input_k_val->Hide();
|
|
}*/
|
|
m_ratio_text->Show();
|
|
m_k_param->Show();
|
|
m_input_k_val->Show();
|
|
Layout();
|
|
Fit();
|
|
wxGetApp().UpdateDarkUI(this);
|
|
}
|
|
return DPIDialog::Show(show);
|
|
}
|
|
|
|
void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_min, wxString temp_max, wxString k, wxString n)
|
|
{
|
|
if (!obj) return;
|
|
update_widgets();
|
|
// set default value
|
|
if (k.IsEmpty())
|
|
k = "0.000";
|
|
if (n.IsEmpty())
|
|
n = "0.000";
|
|
|
|
m_input_k_val->GetTextCtrl()->SetValue(k);
|
|
m_input_n_val->GetTextCtrl()->SetValue(n);
|
|
|
|
int selection_idx = -1, idx = 0;
|
|
wxArrayString filament_items;
|
|
wxString bambu_filament_name;
|
|
|
|
std::set<std::string> filament_id_set;
|
|
PresetBundle * preset_bundle = wxGetApp().preset_bundle;
|
|
std::ostringstream stream;
|
|
stream << std::fixed << std::setprecision(1) << obj->nozzle_diameter;
|
|
std::string nozzle_diameter_str = stream.str();
|
|
std::set<std::string> printer_names = preset_bundle->get_printer_names_by_printer_type_and_nozzle(MachineObject::get_preset_printer_model_name(obj->printer_type), nozzle_diameter_str);
|
|
|
|
if (preset_bundle) {
|
|
BOOST_LOG_TRIVIAL(trace) << "system_preset_bundle filament number=" << preset_bundle->filaments.size();
|
|
for (auto filament_it = preset_bundle->filaments.begin(); filament_it != preset_bundle->filaments.end(); filament_it++) {
|
|
//filter by system preset
|
|
Preset& preset = *filament_it;
|
|
/*The situation where the user preset is not displayed is as follows:
|
|
1. Not a root preset
|
|
2. Not system preset and the printer firmware does not support user preset */
|
|
if (preset_bundle->filaments.get_preset_base(*filament_it) != &preset || (!filament_it->is_system && !obj->is_support_user_preset)) {
|
|
continue;
|
|
}
|
|
|
|
ConfigOption * printer_opt = filament_it->config.option("compatible_printers");
|
|
ConfigOptionStrings *printer_strs = dynamic_cast<ConfigOptionStrings *>(printer_opt);
|
|
for (auto printer_str : printer_strs->values) {
|
|
if (printer_names.find(printer_str) != printer_names.end()) {
|
|
if (filament_id_set.find(filament_it->filament_id) != filament_id_set.end()) {
|
|
continue;
|
|
} else {
|
|
filament_id_set.insert(filament_it->filament_id);
|
|
// name matched
|
|
if (filament_it->is_system) {
|
|
filament_items.push_back(filament_it->alias);
|
|
FilamentInfos filament_infos;
|
|
filament_infos.filament_id = filament_it->filament_id;
|
|
filament_infos.setting_id = filament_it->setting_id;
|
|
map_filament_items[filament_it->alias] = filament_infos;
|
|
} else {
|
|
char target = '@';
|
|
size_t pos = filament_it->name.find(target);
|
|
if (pos != std::string::npos) {
|
|
std::string user_preset_alias = filament_it->name.substr(0, pos - 1);
|
|
wxString wx_user_preset_alias = wxString(user_preset_alias.c_str(), wxConvUTF8);
|
|
user_preset_alias = wx_user_preset_alias.ToStdString();
|
|
|
|
filament_items.push_back(user_preset_alias);
|
|
FilamentInfos filament_infos;
|
|
filament_infos.filament_id = filament_it->filament_id;
|
|
filament_infos.setting_id = filament_it->setting_id;
|
|
map_filament_items[user_preset_alias] = filament_infos;
|
|
}
|
|
}
|
|
|
|
if (filament_it->filament_id == ams_filament_id) {
|
|
selection_idx = idx;
|
|
bambu_filament_name = filament_it->alias;
|
|
|
|
|
|
// update if nozzle_temperature_range is found
|
|
ConfigOption *opt_min = filament_it->config.option("nozzle_temperature_range_low");
|
|
if (opt_min) {
|
|
ConfigOptionInts *opt_min_ints = dynamic_cast<ConfigOptionInts *>(opt_min);
|
|
if (opt_min_ints) {
|
|
wxString text_nozzle_temp_min = wxString::Format("%d", opt_min_ints->get_at(0));
|
|
m_input_nozzle_min->GetTextCtrl()->SetValue(text_nozzle_temp_min);
|
|
}
|
|
}
|
|
ConfigOption *opt_max = filament_it->config.option("nozzle_temperature_range_high");
|
|
if (opt_max) {
|
|
ConfigOptionInts *opt_max_ints = dynamic_cast<ConfigOptionInts *>(opt_max);
|
|
if (opt_max_ints) {
|
|
wxString text_nozzle_temp_max = wxString::Format("%d", opt_max_ints->get_at(0));
|
|
m_input_nozzle_max->GetTextCtrl()->SetValue(text_nozzle_temp_max);
|
|
}
|
|
}
|
|
}
|
|
idx++;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if (!sn.empty()) {
|
|
m_sn_number->SetLabel(sn);
|
|
m_panel_SN->Show();
|
|
}
|
|
else {
|
|
m_panel_SN->Hide();
|
|
}
|
|
|
|
if (obj) {
|
|
if (!m_is_third) {
|
|
m_comboBox_filament->Hide();
|
|
m_readonly_filament->Show();
|
|
if (bambu_filament_name.empty()) {
|
|
m_readonly_filament->SetLabel("Bambu " + filament);
|
|
}
|
|
else {
|
|
m_readonly_filament->SetLabel(bambu_filament_name);
|
|
}
|
|
|
|
m_input_nozzle_min->GetTextCtrl()->SetValue(temp_min);
|
|
m_input_nozzle_max->GetTextCtrl()->SetValue(temp_max);
|
|
}
|
|
else {
|
|
m_comboBox_filament->Show();
|
|
m_readonly_filament->Hide();
|
|
}
|
|
|
|
if (obj->cali_version >= 0) {
|
|
m_title_pa_profile->Show();
|
|
m_comboBox_cali_result->Show();
|
|
m_input_k_val->Disable();
|
|
}
|
|
else {
|
|
m_title_pa_profile->Hide();
|
|
m_comboBox_cali_result->Hide();
|
|
m_input_k_val->Enable();
|
|
}
|
|
|
|
m_button_reset->Show();
|
|
m_button_confirm->Show();
|
|
}
|
|
|
|
m_comboBox_filament->Set(filament_items);
|
|
m_comboBox_filament->SetSelection(selection_idx);
|
|
post_select_event(selection_idx);
|
|
|
|
if (selection_idx < 0) {
|
|
m_comboBox_filament->SetValue(wxEmptyString);
|
|
}
|
|
|
|
update();
|
|
Layout();
|
|
Fit();
|
|
ShowModal();
|
|
}
|
|
|
|
void AMSMaterialsSetting::post_select_event(int index) {
|
|
wxCommandEvent event(wxEVT_COMBOBOX);
|
|
event.SetInt(index);
|
|
event.SetEventObject(m_comboBox_filament);
|
|
wxPostEvent(m_comboBox_filament, event);
|
|
}
|
|
|
|
void AMSMaterialsSetting::msw_rescale()
|
|
{
|
|
m_clr_picker->msw_rescale();
|
|
}
|
|
|
|
void AMSMaterialsSetting::on_select_cali_result(wxCommandEvent &evt)
|
|
{
|
|
m_pa_cali_select_id = evt.GetSelection();
|
|
if (m_pa_cali_select_id >= 0) {
|
|
m_input_k_val->GetTextCtrl()->SetValue(float_to_string_with_precision(m_pa_profile_items[m_pa_cali_select_id].k_value));
|
|
m_input_n_val->GetTextCtrl()->SetValue(float_to_string_with_precision(m_pa_profile_items[m_pa_cali_select_id].n_coef));
|
|
}
|
|
else{
|
|
m_input_k_val->GetTextCtrl()->SetValue(std::to_string(0.00));
|
|
m_input_n_val->GetTextCtrl()->SetValue(std::to_string(0.00));
|
|
}
|
|
}
|
|
|
|
void AMSMaterialsSetting::on_select_filament(wxCommandEvent &evt)
|
|
{
|
|
m_filament_type = "";
|
|
PresetBundle* preset_bundle = wxGetApp().preset_bundle;
|
|
if (preset_bundle) {
|
|
std::ostringstream stream;
|
|
if (obj)
|
|
stream << std::fixed << std::setprecision(1) << obj->nozzle_diameter;
|
|
std::string nozzle_diameter_str = stream.str();
|
|
std::set<std::string> printer_names = preset_bundle->get_printer_names_by_printer_type_and_nozzle(MachineObject::get_preset_printer_model_name(obj->printer_type),
|
|
nozzle_diameter_str);
|
|
for (auto it = preset_bundle->filaments.begin(); it != preset_bundle->filaments.end(); it++) {
|
|
if (!m_comboBox_filament->GetValue().IsEmpty()) {
|
|
auto filament_item = map_filament_items[m_comboBox_filament->GetValue().ToStdString()];
|
|
std::string filament_id = filament_item.filament_id;
|
|
if (it->filament_id.compare(filament_id) == 0) {
|
|
bool has_compatible_printer = false;
|
|
std::string preset_name = it->name;
|
|
for (std::string printer_name : printer_names) {
|
|
if (preset_name.find(printer_name) != std::string::npos) {
|
|
has_compatible_printer = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!it->is_system && !has_compatible_printer) continue;
|
|
// ) if nozzle_temperature_range is found
|
|
ConfigOption* opt_min = it->config.option("nozzle_temperature_range_low");
|
|
if (opt_min) {
|
|
ConfigOptionInts* opt_min_ints = dynamic_cast<ConfigOptionInts*>(opt_min);
|
|
if (opt_min_ints) {
|
|
wxString text_nozzle_temp_min = wxString::Format("%d", opt_min_ints->get_at(0));
|
|
m_input_nozzle_min->GetTextCtrl()->SetValue(text_nozzle_temp_min);
|
|
}
|
|
}
|
|
ConfigOption* opt_max = it->config.option("nozzle_temperature_range_high");
|
|
if (opt_max) {
|
|
ConfigOptionInts* opt_max_ints = dynamic_cast<ConfigOptionInts*>(opt_max);
|
|
if (opt_max_ints) {
|
|
wxString text_nozzle_temp_max = wxString::Format("%d", opt_max_ints->get_at(0));
|
|
m_input_nozzle_max->GetTextCtrl()->SetValue(text_nozzle_temp_max);
|
|
}
|
|
}
|
|
ConfigOption* opt_type = it->config.option("filament_type");
|
|
bool found_filament_type = false;
|
|
if (opt_type) {
|
|
ConfigOptionStrings* opt_type_strs = dynamic_cast<ConfigOptionStrings*>(opt_type);
|
|
if (opt_type_strs) {
|
|
found_filament_type = true;
|
|
//m_filament_type = opt_type_strs->get_at(0);
|
|
std::string display_filament_type;
|
|
m_filament_type = it->config.get_filament_type(display_filament_type);
|
|
}
|
|
}
|
|
if (!found_filament_type)
|
|
m_filament_type = "";
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (m_input_nozzle_min->GetTextCtrl()->GetValue().IsEmpty()) {
|
|
m_input_nozzle_min->GetTextCtrl()->SetValue("0");
|
|
}
|
|
if (m_input_nozzle_max->GetTextCtrl()->GetValue().IsEmpty()) {
|
|
m_input_nozzle_max->GetTextCtrl()->SetValue("0");
|
|
}
|
|
|
|
m_filament_selection = evt.GetSelection();
|
|
|
|
//reset cali
|
|
int cali_select_idx;
|
|
|
|
if ( !this->obj || m_filament_selection < 0) {
|
|
m_input_k_val->Enable(false);
|
|
m_input_n_val->Enable(false);
|
|
m_button_confirm->Disable();
|
|
m_button_confirm->SetBackgroundColor(wxColour(0x90, 0x90, 0x90));
|
|
m_button_confirm->SetBorderColor(wxColour(0x90, 0x90, 0x90));
|
|
m_comboBox_cali_result->Clear();
|
|
m_comboBox_cali_result->SetValue(wxEmptyString);
|
|
m_input_k_val->GetTextCtrl()->SetValue(wxEmptyString);
|
|
m_input_n_val->GetTextCtrl()->SetValue(wxEmptyString);
|
|
return;
|
|
}
|
|
else {
|
|
m_button_confirm->SetBackgroundColor(m_btn_bg_green);
|
|
m_button_confirm->SetBorderColor(wxColour(0, 150, 136));
|
|
m_button_confirm->SetTextColor(wxColour("#FFFFFE"));
|
|
m_button_confirm->Enable(true);
|
|
}
|
|
|
|
//filament id
|
|
ams_filament_id = "";
|
|
ams_setting_id = "";
|
|
|
|
if (preset_bundle) {
|
|
for (auto it = preset_bundle->filaments.begin(); it != preset_bundle->filaments.end(); it++) {
|
|
auto itor = map_filament_items.find(m_comboBox_filament->GetValue().ToStdString());
|
|
if ( itor != map_filament_items.end()) {
|
|
ams_filament_id = itor->second.filament_id;
|
|
ams_setting_id = itor->second.setting_id;
|
|
break;
|
|
}
|
|
|
|
if (it->alias.compare(m_comboBox_filament->GetValue().ToStdString()) == 0) {
|
|
ams_filament_id = it->filament_id;
|
|
ams_setting_id = it->setting_id;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
wxArrayString items;
|
|
m_pa_profile_items.clear();
|
|
m_comboBox_cali_result->SetValue(wxEmptyString);
|
|
|
|
if (obj->cali_version >= 0) {
|
|
m_input_k_val->GetTextCtrl()->SetValue(wxEmptyString);
|
|
std::vector<PACalibResult> cali_history = this->obj->pa_calib_tab;
|
|
for (auto cali_item : cali_history) {
|
|
if (cali_item.filament_id == ams_filament_id) {
|
|
items.push_back(from_u8(cali_item.name));
|
|
m_pa_profile_items.push_back(cali_item);
|
|
}
|
|
}
|
|
|
|
m_comboBox_cali_result->Set(items);
|
|
if (tray_id == VIRTUAL_TRAY_ID) {
|
|
AmsTray selected_tray = this->obj->vt_tray;
|
|
cali_select_idx = CalibUtils::get_selected_calib_idx(m_pa_profile_items,selected_tray.cali_idx);
|
|
if (cali_select_idx >= 0) {
|
|
m_comboBox_cali_result->SetSelection(cali_select_idx);
|
|
}
|
|
}
|
|
else {
|
|
Ams* selected_ams = this->obj->amsList[std::to_string(ams_id)];
|
|
if(!selected_ams) return;
|
|
AmsTray* selected_tray = selected_ams->trayList[std::to_string(tray_id)];
|
|
if(!selected_tray) return;
|
|
cali_select_idx = CalibUtils::get_selected_calib_idx(m_pa_profile_items, selected_tray->cali_idx);
|
|
if (cali_select_idx >= 0) {
|
|
m_comboBox_cali_result->SetSelection(cali_select_idx);
|
|
}
|
|
}
|
|
|
|
if (cali_select_idx >= 0) {
|
|
m_input_k_val->GetTextCtrl()->SetValue(float_to_string_with_precision(m_pa_profile_items[cali_select_idx].k_value));
|
|
m_input_n_val->GetTextCtrl()->SetValue(float_to_string_with_precision(m_pa_profile_items[cali_select_idx].n_coef));
|
|
}
|
|
}
|
|
else {
|
|
if (!ams_filament_id.empty()) {
|
|
//m_input_k_val->GetTextCtrl()->SetValue("0.00");
|
|
m_input_k_val->Enable(true);
|
|
}
|
|
else {
|
|
//m_input_k_val->GetTextCtrl()->SetValue("0.00");
|
|
m_input_k_val->Disable();
|
|
}
|
|
}
|
|
}
|
|
|
|
void AMSMaterialsSetting::on_dpi_changed(const wxRect &suggested_rect)
|
|
{
|
|
m_input_nozzle_max->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20)));
|
|
m_input_nozzle_min->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20)));
|
|
//m_clr_picker->msw_rescale();
|
|
degree->msw_rescale();
|
|
bitmap_max_degree->SetBitmap(degree->bmp());
|
|
bitmap_min_degree->SetBitmap(degree->bmp());
|
|
m_button_reset->SetMinSize(AMS_MATERIALS_SETTING_BUTTON_SIZE);
|
|
m_button_reset->SetCornerRadius(FromDIP(12));
|
|
m_button_confirm->SetMinSize(AMS_MATERIALS_SETTING_BUTTON_SIZE);
|
|
m_button_confirm->SetCornerRadius(FromDIP(12));
|
|
m_button_close->SetMinSize(AMS_MATERIALS_SETTING_BUTTON_SIZE);
|
|
m_button_close->SetCornerRadius(FromDIP(12));
|
|
this->Refresh();
|
|
}
|
|
|
|
ColorPicker::ColorPicker(wxWindow* parent, wxWindowID id, const wxPoint& pos /*= wxDefaultPosition*/, const wxSize& size /*= wxDefaultSize*/)
|
|
{
|
|
wxWindow::Create(parent, id, pos, size);
|
|
|
|
SetSize(wxSize(FromDIP(25), FromDIP(25)));
|
|
SetMinSize(wxSize(FromDIP(25), FromDIP(25)));
|
|
SetMaxSize(wxSize(FromDIP(25), FromDIP(25)));
|
|
|
|
Bind(wxEVT_PAINT, &ColorPicker::paintEvent, this);
|
|
|
|
m_bitmap_border = create_scaled_bitmap("color_picker_border", nullptr, 25);
|
|
m_bitmap_border_dark = create_scaled_bitmap("color_picker_border_dark", nullptr, 25);
|
|
m_bitmap_transparent = create_scaled_bitmap("transparent_color_picker", nullptr, 25);
|
|
}
|
|
|
|
ColorPicker::~ColorPicker(){}
|
|
|
|
void ColorPicker::msw_rescale()
|
|
{
|
|
m_bitmap_border = create_scaled_bitmap("color_picker_border", nullptr, 25);
|
|
m_bitmap_border_dark = create_scaled_bitmap("color_picker_border_dark", nullptr, 25);
|
|
|
|
Refresh();
|
|
}
|
|
|
|
void ColorPicker::set_color(wxColour col)
|
|
{
|
|
if (m_colour != col && col.Alpha() != 0 && col.Alpha() != 255 && col.Alpha() != 254) {
|
|
transparent_changed = true;
|
|
}
|
|
m_colour = col;
|
|
Refresh();
|
|
}
|
|
|
|
void ColorPicker::set_colors(std::vector<wxColour> cols)
|
|
{
|
|
m_cols = cols;
|
|
Refresh();
|
|
}
|
|
|
|
void ColorPicker::paintEvent(wxPaintEvent& evt)
|
|
{
|
|
wxPaintDC dc(this);
|
|
render(dc);
|
|
}
|
|
|
|
void ColorPicker::render(wxDC& dc)
|
|
{
|
|
#ifdef __WXMSW__
|
|
wxSize size = GetSize();
|
|
wxMemoryDC memdc;
|
|
wxBitmap bmp(size.x, size.y);
|
|
memdc.SelectObject(bmp);
|
|
memdc.Blit({ 0, 0 }, size, &dc, { 0, 0 });
|
|
|
|
{
|
|
wxGCDC dc2(memdc);
|
|
doRender(dc2);
|
|
}
|
|
|
|
memdc.SelectObject(wxNullBitmap);
|
|
dc.DrawBitmap(bmp, 0, 0);
|
|
#else
|
|
doRender(dc);
|
|
#endif
|
|
}
|
|
|
|
void ColorPicker::doRender(wxDC& dc)
|
|
{
|
|
wxSize size = GetSize();
|
|
auto alpha = m_colour.Alpha();
|
|
auto radius = m_show_full ? size.x / 2 - FromDIP(1) : size.x / 2;
|
|
if (m_selected) radius -= FromDIP(1);
|
|
|
|
if (alpha == 0) {
|
|
dc.DrawBitmap(m_bitmap_transparent, 0, 0);
|
|
}
|
|
else if (alpha != 254 && alpha != 255) {
|
|
if (transparent_changed) {
|
|
std::string rgb = (m_colour.GetAsString(wxC2S_HTML_SYNTAX)).ToStdString();
|
|
if (rgb.size() == 8) {
|
|
//delete alpha value
|
|
rgb = rgb.substr(0, rgb.size() - 2);
|
|
}
|
|
float alpha_f = 0.7 * m_colour.Alpha() / 255.0;
|
|
std::vector<std::string> replace;
|
|
replace.push_back(rgb);
|
|
std::string fill_replace = "fill-opacity=\"" + std::to_string(alpha_f);
|
|
replace.push_back(fill_replace);
|
|
m_bitmap_transparent = ScalableBitmap(this, "transparent_color_picker", 25, false, false, true, replace).bmp();
|
|
transparent_changed = false;
|
|
dc.DrawBitmap(m_bitmap_transparent, 0, 0);
|
|
}
|
|
}
|
|
else {
|
|
dc.SetPen(wxPen(m_colour));
|
|
dc.SetBrush(wxBrush(m_colour));
|
|
dc.DrawCircle(size.x / 2, size.y / 2, radius);
|
|
}
|
|
|
|
if (m_selected) {
|
|
dc.SetPen(wxPen(m_colour));
|
|
dc.SetBrush(*wxTRANSPARENT_BRUSH);
|
|
dc.DrawCircle(size.x / 2, size.y / 2, size.x / 2);
|
|
}
|
|
|
|
if (m_show_full) {
|
|
dc.SetPen(wxPen(wxColour(0x6B6B6B)));
|
|
dc.SetBrush(*wxTRANSPARENT_BRUSH);
|
|
dc.DrawCircle(size.x / 2, size.y / 2, radius);
|
|
|
|
if (m_cols.size() > 1) {
|
|
if (ctype == 0) {
|
|
int left = FromDIP(0);
|
|
float total_width = size.x;
|
|
int gwidth = std::round(total_width / (m_cols.size() - 1));
|
|
|
|
for (int i = 0; i < m_cols.size() - 1; i++) {
|
|
|
|
if ((left + gwidth) > (size.x)) {
|
|
gwidth = size.x - left;
|
|
}
|
|
|
|
auto rect = wxRect(left, 0, gwidth, size.y);
|
|
dc.GradientFillLinear(rect, m_cols[i], m_cols[i + 1], wxEAST);
|
|
left += gwidth;
|
|
}
|
|
if (wxGetApp().dark_mode()) {
|
|
dc.DrawBitmap(m_bitmap_border_dark, wxPoint(0, 0));
|
|
}
|
|
else {
|
|
dc.DrawBitmap(m_bitmap_border, wxPoint(0, 0));
|
|
}
|
|
}
|
|
else {
|
|
float ev_angle = 360.0 / m_cols.size();
|
|
float startAngle = 270.0;
|
|
float endAngle = 270.0;
|
|
dc.SetPen(*wxTRANSPARENT_PEN);
|
|
for (int i = 0; i < m_cols.size(); i++) {
|
|
dc.SetBrush(m_cols[i]);
|
|
endAngle += ev_angle;
|
|
endAngle = endAngle > 360.0 ? endAngle - 360.0 : endAngle;
|
|
wxPoint center(size.x / 2, size.y / 2);
|
|
dc.DrawEllipticArc(center.x - radius, center.y - radius, 2 * radius, 2 * radius, startAngle, endAngle);
|
|
startAngle += ev_angle;
|
|
startAngle = startAngle > 360.0 ? startAngle - 360.0 : startAngle;
|
|
}
|
|
if (wxGetApp().dark_mode()) {
|
|
dc.DrawBitmap(m_bitmap_border_dark, wxPoint(0, 0));
|
|
}
|
|
else {
|
|
dc.DrawBitmap(m_bitmap_border, wxPoint(0, 0));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (m_is_empty) {
|
|
dc.SetTextForeground(*wxBLACK);
|
|
auto tsize = dc.GetTextExtent("?");
|
|
auto pot = wxPoint((size.x - tsize.x) / 2, (size.y - tsize.y) / 2);
|
|
dc.DrawText("?", pot);
|
|
}
|
|
}
|
|
|
|
ColorPickerPopup::ColorPickerPopup(wxWindow* parent)
|
|
:PopupWindow(parent, wxBORDER_NONE)
|
|
{
|
|
m_def_colors.clear();
|
|
m_def_colors.push_back(wxColour(0xFFFFFF));
|
|
m_def_colors.push_back(wxColour(0xfff144));
|
|
m_def_colors.push_back(wxColour(0xDCF478));
|
|
m_def_colors.push_back(wxColour(0x0ACC38));
|
|
m_def_colors.push_back(wxColour(0x057748));
|
|
m_def_colors.push_back(wxColour(0x0d6284));
|
|
m_def_colors.push_back(wxColour(0x0EE2A0));
|
|
m_def_colors.push_back(wxColour(0x76D9F4));
|
|
m_def_colors.push_back(wxColour(0x46a8f9));
|
|
m_def_colors.push_back(wxColour(0x2850E0));
|
|
m_def_colors.push_back(wxColour(0x443089));
|
|
m_def_colors.push_back(wxColour(0xA03CF7));
|
|
m_def_colors.push_back(wxColour(0xF330F9));
|
|
m_def_colors.push_back(wxColour(0xD4B1DD));
|
|
m_def_colors.push_back(wxColour(0xf95d73));
|
|
m_def_colors.push_back(wxColour(0xf72323));
|
|
m_def_colors.push_back(wxColour(0x7c4b00));
|
|
m_def_colors.push_back(wxColour(0xf98c36));
|
|
m_def_colors.push_back(wxColour(0xfcecd6));
|
|
m_def_colors.push_back(wxColour(0xD3C5A3));
|
|
m_def_colors.push_back(wxColour(0xAF7933));
|
|
m_def_colors.push_back(wxColour(0x898989));
|
|
m_def_colors.push_back(wxColour(0xBCBCBC));
|
|
m_def_colors.push_back(wxColour(0x161616));
|
|
|
|
|
|
SetBackgroundColour(wxColour(*wxWHITE));
|
|
|
|
wxBoxSizer* m_sizer_main = new wxBoxSizer(wxVERTICAL);
|
|
wxBoxSizer* m_sizer_box = new wxBoxSizer(wxVERTICAL);
|
|
|
|
m_def_color_box = new StaticBox(this);
|
|
wxBoxSizer* m_sizer_ams = new wxBoxSizer(wxHORIZONTAL);
|
|
auto m_title_ams = new wxStaticText(m_def_color_box, wxID_ANY, _L("AMS"), wxDefaultPosition, wxDefaultSize, 0);
|
|
m_title_ams->SetFont(::Label::Body_14);
|
|
m_title_ams->SetBackgroundColour(wxColour(238, 238, 238));
|
|
m_sizer_ams->Add(m_title_ams, 0, wxALL, 5);
|
|
auto ams_line = new wxPanel(m_def_color_box, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL);
|
|
ams_line->SetBackgroundColour(wxColour(0xCECECE));
|
|
ams_line->SetMinSize(wxSize(-1, 1));
|
|
ams_line->SetMaxSize(wxSize(-1, 1));
|
|
m_sizer_ams->Add(ams_line, 1, wxALIGN_CENTER, 0);
|
|
|
|
|
|
m_def_color_box->SetCornerRadius(FromDIP(10));
|
|
m_def_color_box->SetBackgroundColor(StateColor(std::pair<wxColour, int>(wxColour(238, 238, 238), StateColor::Normal)));
|
|
m_def_color_box->SetBorderColor(StateColor(std::pair<wxColour, int>(wxColour(238, 238, 238), StateColor::Normal)));
|
|
|
|
//ams
|
|
m_ams_fg_sizer = new wxFlexGridSizer(0, 8, 0, 0);
|
|
m_ams_fg_sizer->SetFlexibleDirection(wxBOTH);
|
|
m_ams_fg_sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
|
|
|
|
//other
|
|
wxFlexGridSizer* fg_sizer;
|
|
fg_sizer = new wxFlexGridSizer(0, 8, 0, 0);
|
|
fg_sizer->SetFlexibleDirection(wxBOTH);
|
|
fg_sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
|
|
|
|
|
|
for (wxColour col : m_def_colors) {
|
|
auto cp = new ColorPicker(m_def_color_box, wxID_ANY, wxDefaultPosition, wxDefaultSize);
|
|
cp->set_color(col);
|
|
cp->set_selected(false);
|
|
cp->SetBackgroundColour(StateColor::darkModeColorFor(wxColour(238,238,238)));
|
|
m_color_pickers.push_back(cp);
|
|
fg_sizer->Add(cp, 0, wxALL, FromDIP(3));
|
|
cp->Bind(wxEVT_LEFT_DOWN, [this, cp](auto& e) {
|
|
set_def_colour(cp->m_colour);
|
|
|
|
wxCommandEvent evt(EVT_SELECTED_COLOR);
|
|
unsigned long g_col = ((cp->m_colour.Red() & 0xff) << 24) + ((cp->m_colour.Green() & 0xff) << 16) + ((cp->m_colour.Blue() & 0xff) << 8) + (cp->m_colour.Alpha() & 0xff);
|
|
evt.SetInt(g_col);
|
|
wxPostEvent(GetParent(), evt);
|
|
});
|
|
}
|
|
|
|
wxBoxSizer* m_sizer_other = new wxBoxSizer(wxHORIZONTAL);
|
|
auto m_title_other = new wxStaticText(m_def_color_box, wxID_ANY, _L("Other Color"), wxDefaultPosition, wxDefaultSize, 0);
|
|
m_title_other->SetFont(::Label::Body_14);
|
|
m_title_other->SetBackgroundColour(wxColour(238, 238, 238));
|
|
m_sizer_other->Add(m_title_other, 0, wxALL, 5);
|
|
auto other_line = new wxPanel(m_def_color_box, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL);
|
|
other_line->SetMinSize(wxSize(-1, 1));
|
|
other_line->SetMaxSize(wxSize(-1, 1));
|
|
other_line->SetBackgroundColour(wxColour(0xCECECE));
|
|
m_sizer_other->Add(other_line, 1, wxALIGN_CENTER, 0);
|
|
|
|
//custom color
|
|
wxBoxSizer* m_sizer_custom = new wxBoxSizer(wxHORIZONTAL);
|
|
auto m_title_custom = new wxStaticText(m_def_color_box, wxID_ANY, _L("Custom Color"), wxDefaultPosition, wxDefaultSize, 0);
|
|
m_title_custom->SetFont(::Label::Body_14);
|
|
m_title_custom->SetBackgroundColour(wxColour(238, 238, 238));
|
|
auto custom_line = new wxPanel(m_def_color_box, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL);
|
|
custom_line->SetBackgroundColour(wxColour(0xCECECE));
|
|
custom_line->SetMinSize(wxSize(-1, 1));
|
|
custom_line->SetMaxSize(wxSize(-1, 1));
|
|
m_sizer_custom->Add(m_title_custom, 0, wxALL, 5);
|
|
m_sizer_custom->Add(custom_line, 1, wxALIGN_CENTER, 0);
|
|
|
|
m_custom_cp = new StaticBox(m_def_color_box);
|
|
m_custom_cp->SetSize(FromDIP(60), FromDIP(25));
|
|
m_custom_cp->SetMinSize(wxSize(FromDIP(60), FromDIP(25)));
|
|
m_custom_cp->SetMaxSize(wxSize(FromDIP(60), FromDIP(25)));
|
|
m_custom_cp->SetBorderColor(StateColor(std::pair<wxColour, int>(wxColour(238, 238, 238), StateColor::Normal)));
|
|
m_custom_cp->Bind(wxEVT_LEFT_DOWN, &ColorPickerPopup::on_custom_clr_picker, this);
|
|
m_custom_cp->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {
|
|
SetCursor(wxCURSOR_HAND);
|
|
});
|
|
m_custom_cp->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {
|
|
SetCursor(wxCURSOR_ARROW);
|
|
});
|
|
|
|
m_ts_bitmap_custom = ScalableBitmap(this, "ts_custom_color_picker", 25);
|
|
m_ts_stbitmap_custom = new wxStaticBitmap(m_custom_cp, wxID_ANY, m_ts_bitmap_custom.bmp());
|
|
|
|
m_ts_stbitmap_custom->Bind(wxEVT_LEFT_DOWN, &ColorPickerPopup::on_custom_clr_picker, this);
|
|
m_ts_stbitmap_custom->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {
|
|
SetCursor(wxCURSOR_HAND);
|
|
});
|
|
m_ts_stbitmap_custom->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {
|
|
SetCursor(wxCURSOR_ARROW);
|
|
});
|
|
|
|
auto sizer_custom = new wxBoxSizer(wxVERTICAL);
|
|
m_custom_cp->SetSizer(sizer_custom);
|
|
sizer_custom->Add(m_ts_stbitmap_custom, 0, wxEXPAND, 0);
|
|
m_custom_cp->Layout();
|
|
|
|
m_clrData = new wxColourData();
|
|
m_clrData->SetChooseFull(true);
|
|
m_clrData->SetChooseAlpha(false);
|
|
|
|
|
|
m_sizer_box->Add(0, 0, 0, wxTOP, FromDIP(10));
|
|
m_sizer_box->Add(m_sizer_ams, 1, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(10));
|
|
m_sizer_box->Add(m_ams_fg_sizer, 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(10));
|
|
m_sizer_box->Add(m_sizer_other, 1, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(10));
|
|
m_sizer_box->Add(fg_sizer, 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(10));
|
|
m_sizer_box->Add(m_sizer_custom, 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(10));
|
|
m_sizer_box->Add(m_custom_cp, 0, wxEXPAND|wxLEFT|wxRIGHT, FromDIP(16));
|
|
m_sizer_box->Add(0, 0, 0, wxTOP, FromDIP(10));
|
|
|
|
|
|
m_def_color_box->SetSizer(m_sizer_box);
|
|
m_def_color_box->Layout();
|
|
m_def_color_box->Fit();
|
|
|
|
m_sizer_main->Add(m_def_color_box, 0, wxALL | wxEXPAND, 10);
|
|
SetSizer(m_sizer_main);
|
|
Layout();
|
|
Fit();
|
|
|
|
Bind(wxEVT_PAINT, &ColorPickerPopup::paintEvent, this);
|
|
wxGetApp().UpdateDarkUIWin(this);
|
|
}
|
|
|
|
void ColorPickerPopup::on_custom_clr_picker(wxMouseEvent& event)
|
|
{
|
|
std::vector<std::string> colors = wxGetApp().app_config->get_custom_color_from_config();
|
|
for (int i = 0; i < colors.size(); i++) {
|
|
m_clrData->SetCustomColour(i, string_to_wxColor(colors[i]));
|
|
}
|
|
auto clr_dialog = new wxColourDialog(nullptr, m_clrData);
|
|
wxColour picker_color;
|
|
|
|
if (clr_dialog->ShowModal() == wxID_OK) {
|
|
m_clrData = &(clr_dialog->GetColourData());
|
|
if (colors.size() != CUSTOM_COLOR_COUNT) {
|
|
colors.resize(CUSTOM_COLOR_COUNT);
|
|
}
|
|
for (int i = 0; i < CUSTOM_COLOR_COUNT; i++) {
|
|
colors[i] = color_to_string(m_clrData->GetCustomColour(i));
|
|
}
|
|
wxGetApp().app_config->save_custom_color_to_config(colors);
|
|
|
|
picker_color = wxColour(
|
|
m_clrData->GetColour().Red(),
|
|
m_clrData->GetColour().Green(),
|
|
m_clrData->GetColour().Blue(),
|
|
255
|
|
);
|
|
|
|
if (picker_color.Alpha() == 0) {
|
|
m_ts_stbitmap_custom->Show();
|
|
}
|
|
else {
|
|
m_ts_stbitmap_custom->Hide();
|
|
m_custom_cp->SetBackgroundColor(picker_color);
|
|
}
|
|
|
|
set_def_colour(picker_color);
|
|
wxCommandEvent evt(EVT_SELECTED_COLOR);
|
|
unsigned long g_col = ((picker_color.Red() & 0xff) << 24) + ((picker_color.Green() & 0xff) << 16) + ((picker_color.Blue() & 0xff) << 8) + (picker_color.Alpha() & 0xff);
|
|
evt.SetInt(g_col);
|
|
wxPostEvent(GetParent(), evt);
|
|
}
|
|
}
|
|
|
|
void ColorPickerPopup::set_ams_colours(std::vector<wxColour> ams)
|
|
{
|
|
if (m_ams_color_pickers.size() > 0) {
|
|
for (ColorPicker* col_pick:m_ams_color_pickers) {
|
|
|
|
std::vector<ColorPicker*>::iterator iter = find(m_color_pickers.begin(), m_color_pickers.end(), col_pick);
|
|
if (iter != m_color_pickers.end()) {
|
|
col_pick->Destroy();
|
|
m_color_pickers.erase(iter);
|
|
}
|
|
}
|
|
|
|
m_ams_color_pickers.clear();
|
|
}
|
|
|
|
|
|
m_ams_colors = ams;
|
|
for (wxColour col : m_ams_colors) {
|
|
auto cp = new ColorPicker(m_def_color_box, wxID_ANY, wxDefaultPosition, wxDefaultSize);
|
|
cp->set_color(col);
|
|
cp->set_selected(false);
|
|
cp->SetBackgroundColour(StateColor::darkModeColorFor(wxColour(238,238,238)));
|
|
m_color_pickers.push_back(cp);
|
|
m_ams_color_pickers.push_back(cp);
|
|
m_ams_fg_sizer->Add(cp, 0, wxALL, FromDIP(3));
|
|
cp->Bind(wxEVT_LEFT_DOWN, [this, cp](auto& e) {
|
|
set_def_colour(cp->m_colour);
|
|
|
|
wxCommandEvent evt(EVT_SELECTED_COLOR);
|
|
unsigned long g_col = ((cp->m_colour.Red() & 0xff) << 24) + ((cp->m_colour.Green() & 0xff) << 16) + ((cp->m_colour.Blue() & 0xff) << 8) + (cp->m_colour.Alpha() & 0xff);
|
|
evt.SetInt(g_col);
|
|
wxPostEvent(GetParent(), evt);
|
|
});
|
|
}
|
|
m_ams_fg_sizer->Layout();
|
|
Layout();
|
|
Fit();
|
|
}
|
|
|
|
void ColorPickerPopup::set_def_colour(wxColour col)
|
|
{
|
|
m_def_col = col;
|
|
|
|
for (ColorPicker* cp : m_color_pickers) {
|
|
if (cp->m_selected) {
|
|
cp->set_selected(false);
|
|
}
|
|
}
|
|
|
|
for (ColorPicker* cp : m_color_pickers) {
|
|
if (cp->m_colour == m_def_col) {
|
|
cp->set_selected(true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (m_def_col.Alpha() == 0) {
|
|
m_ts_stbitmap_custom->Show();
|
|
}
|
|
else {
|
|
m_ts_stbitmap_custom->Hide();
|
|
m_custom_cp->SetBackgroundColor(m_def_col);
|
|
}
|
|
|
|
Dismiss();
|
|
}
|
|
|
|
void ColorPickerPopup::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 ColorPickerPopup::OnDismiss() {}
|
|
|
|
void ColorPickerPopup::Popup()
|
|
{
|
|
PopupWindow::Popup();
|
|
}
|
|
|
|
bool ColorPickerPopup::ProcessLeftDown(wxMouseEvent& event) {
|
|
return PopupWindow::ProcessLeftDown(event);
|
|
}
|
|
|
|
}} // namespace Slic3r::GUI
|