Files
OrcaSlicer/src/slic3r/GUI/Widgets/AMSItem.cpp
T
Kris Austin 36740ffdd8 build: clear 53 warnings - discarded values and i18n markers (#15421)
build: clear 53 unused value warnings

49 of them are deliberate i18n markers. L(s) expands to s, so
L("Main Extruder"); is a string literal as a statement and its value is
discarded. The strings have to stay, because the real values come from
printers/*.json at runtime and xgettext cannot scan those. Each block is
now a static const char *const markers[], which uses the values rather
than discarding them. Extraction is unchanged: the xgettext invocation
from scripts/run_gettext.bat gives 76 msgids over the two marker files
before and after, with identical msgid and msgctxt sets.

The other 4 are statements with no effect. AMSItem.cpp:117 and :174
construct and drop a wxColour(255, 255, 255); AMS_TRAY_DEFAULT_COL is
that colour, and the line above already assigns it. UpgradePanel.cpp:865
reads a member and drops it.

wgtDeviceNozzleSelect.cpp:269 writes
if (item; auto ptr = m_nozzle_rack.lock()), which puts the null check in
the init-statement position where its value is discarded, so the check
never runs, and sGetNozzlePosId then dereferences item. Nothing reaches
that today, because the only sender of the event sets itself as the
event object and the dynamic_cast always succeeds. The check now runs.
2026-08-31 10:55:42 -03:00

4132 lines
145 KiB
C++

#include "AMSItem.hpp"
#include "Label.hpp"
#include "../BitmapCache.hpp"
#include "../I18N.hpp"
#include "../GUI_App.hpp"
#include "../FilamentBitmapUtils.hpp"
#include "../Utils/WxFontUtils.hpp"
#include "slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h"
#include "slic3r/GUI/DeviceCore/DevFilaSystem.h"
#include "slic3r/GUI/DeviceCore/DevConfig.h"
#include "slic3r/GUI/DeviceCore/DevManager.h"
#include <wx/simplebook.h>
#include <wx/dcgraph.h>
#include <boost/log/trivial.hpp>
#include "CalibUtils.hpp"
namespace Slic3r { namespace GUI {
static const wxColour AMS_TRAY_DEFAULT_COL = wxColour(255, 255, 255);
wxDEFINE_EVENT(EVT_AMS_EXTRUSION_CALI, wxCommandEvent);
wxDEFINE_EVENT(EVT_AMS_LOAD, SimpleEvent);
wxDEFINE_EVENT(EVT_AMS_UNLOAD, SimpleEvent);
wxDEFINE_EVENT(EVT_AMS_SETTINGS, SimpleEvent);
wxDEFINE_EVENT(EVT_AMS_FILAMENT_BACKUP, SimpleEvent);
wxDEFINE_EVENT(EVT_AMS_REFRESH_RFID, wxCommandEvent);
wxDEFINE_EVENT(EVT_AMS_ON_SELECTED, wxCommandEvent);
wxDEFINE_EVENT(EVT_AMS_ON_FILAMENT_EDIT, wxCommandEvent);
wxDEFINE_EVENT(EVT_VAMS_ON_FILAMENT_EDIT, wxCommandEvent);
wxDEFINE_EVENT(EVT_AMS_CLIBRATION_AGAIN, wxCommandEvent);
wxDEFINE_EVENT(EVT_AMS_CLIBRATION_CANCEL, wxCommandEvent);
wxDEFINE_EVENT(EVT_AMS_GUIDE_WIKI, wxCommandEvent);
wxDEFINE_EVENT(EVT_AMS_RETRY, wxCommandEvent);
wxDEFINE_EVENT(EVT_AMS_SHOW_HUMIDITY_TIPS, wxCommandEvent);
wxDEFINE_EVENT(EVT_AMS_UNSELETED_VAMS, wxCommandEvent);
wxDEFINE_EVENT(EVT_AMS_SWITCH, SimpleEvent);
#define AMS_CANS_SIZE wxSize(FromDIP(284), -1)
//#define AMS_CANS_WINDOW_SIZE wxSize(FromDIP(264), 144)
//#define AMS_SINGLE_CAN_SIZE wxSize(FromDIP(78), 144)
#define AMS_CANS_WINDOW_SIZE wxSize(FromDIP(264), FromDIP(174))
#define AMS_SINGLE_CAN_SIZE wxSize(FromDIP(78), FromDIP(174))
bool AMSinfo::parse_ams_info(MachineObject *obj, DevAms *ams, bool remain_flag, bool humidity_flag)
{
if (!ams) return false;
this->ams_id = ams->GetAmsId();
if (ams->SupportHumidity()){
this->ams_humidity = ams->GetHumidityLevel();
}
else{
this->ams_humidity = -1;
}
this->humidity_raw = ams->GetHumidityPercent();
this->left_dray_time = ams->GetLeftDryTime();
this->current_temperature = ams->GetCurrentTemperature();
this->ams_type = AMSModel(ams->GetAmsType());
nozzle_id = ams->GetExtruderId();
switch_pos = ams->GetSwitcherPos(); // Orca: carry the switch inlet for inlet-aware panel placement
cans.clear();
for (int i = 0; i < ams->GetTrays().size(); i++) {
auto it = ams->GetTrays().find(std::to_string(i));
Caninfo info;
// tray is exists
if (it != ams->GetTrays().end() && it->second->is_exists) {
if (it->second->is_tray_info_ready()) {
info.can_id = it->second->id;
info.ctype = it->second->ctype;
info.material_name = it->second->get_display_filament_type();
info.cali_idx = it->second->cali_idx;
info.filament_id = it->second->setting_id;
if (!it->second->color.empty()) {
info.material_colour = DevAmsTray::decode_color(it->second->color);
} else {
// set to white by default
info.material_colour = AMS_TRAY_DEFAULT_COL;
}
for (std::string cols:it->second->cols) {
info.material_cols.push_back(DevAmsTray::decode_color(cols));
}
if (DevFilaSystem::IsBBL_Filament(it->second->tag_uid)) {
info.material_state = AMSCanType::AMS_CAN_TYPE_BRAND;
} else {
info.material_state = AMSCanType::AMS_CAN_TYPE_THIRDBRAND;
}
if (!DevFilaSystem::IsBBL_Filament(it->second->tag_uid) || !remain_flag) {
info.material_remain = 100;
} else {
if(it->second->remain < 0 || it->second->remain > 100) {
info.material_remain = 100;/*ignore the invalid data*/
} else {
info.material_remain = it->second->remain;
}
}
} else {
info.can_id = it->second->id;
info.material_name = "";
info.cali_idx = -1;
info.filament_id = "";
info.ctype = 0;
info.material_colour = AMS_TRAY_DEFAULT_COL;
info.material_state = AMSCanType::AMS_CAN_TYPE_THIRDBRAND;
}
if (it->second->is_tray_info_ready() && obj->cali_version >= 0) {
CalibUtils::get_pa_k_n_value_by_cali_idx(obj, it->second->cali_idx, info.k, info.n);
}
else {
info.k = it->second->k;
info.n = it->second->n;
}
} else {
//info.can_id = i;
info.can_id = std::to_string(i);
info.material_state = AMSCanType::AMS_CAN_TYPE_EMPTY;
}
cans.push_back(info);
}
return true;
}
void AMSinfo::parse_ext_info(MachineObject* obj, DevAmsTray tray) {
this->ams_id = tray.id;
this->ams_type = AMSModel::EXT_AMS;
Caninfo info;
info.can_id = std::to_string(0);
this->cans.clear();
if (tray.id == std::to_string(VIRTUAL_TRAY_MAIN_ID))
this->nozzle_id = 0;
else if (tray.id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID))
this->nozzle_id = 1;
if (tray.is_tray_info_ready()) {
info.ctype = tray.ctype;
info.material_name = tray.get_display_filament_type();
info.cali_idx = tray.cali_idx;
info.filament_id = tray.setting_id;
if (!tray.color.empty()) {
info.material_colour = DevAmsTray::decode_color(tray.color);
}
else {
// set to white by default
info.material_colour = AMS_TRAY_DEFAULT_COL;
}
for (std::string cols : tray.cols) {
info.material_cols.push_back(DevAmsTray::decode_color(cols));
}
info.material_remain = 100;
}
else {
info.material_name = "";
info.cali_idx = -1;
info.filament_id = "";
info.ctype = 0;
info.material_colour = AMS_TRAY_DEFAULT_COL;
}
info.material_state = AMSCanType::AMS_CAN_TYPE_VIRTUAL;
if (tray.is_tray_info_ready() && obj->cali_version >= 0) {
CalibUtils::get_pa_k_n_value_by_cali_idx(obj, tray.cali_idx, info.k, info.n);
}
else {
info.k = tray.k;
info.n = tray.n;
}
this->cans.push_back(info);
}
Caninfo AMSinfo::get_caninfo(const std::string& can_id, bool& found) const
{
found = false;
for (const auto& can_info : cans)
{
if (can_info.can_id == can_id)
{
found = true;
return can_info;
}
}
return Caninfo();
};
int AMSinfo::get_humidity_display_idx() const
{
if (ams_type == AMSModel::GENERIC_AMS)
{
if (ams_humidity > 0 && ams_humidity < 6)
{
return ams_humidity;
}
}
else if (ams_type == AMSModel::N3F_AMS || ams_type == AMSModel::N3S_AMS)
{
if (humidity_raw < 20)
{
return 5;
}
else if (humidity_raw < 40)
{
return 4;
}
else if (humidity_raw < 60)
{
return 3;
}
else if (humidity_raw < 80)
{
return 2;
}
else
{
return 1;
}
}
//assert(false && "Invalid AMS type for humidity display");
return 1;
}
// Orca: inlet-aware panel routing. REF placed AMS by switch inlet (POS_IN_A/B) via a tray-level binding
// that Orca's pull-mode fila model does not carry; the AMS-level DevAms::GetSwitcherPos() does, and it is
// stashed in switch_pos. When a Filament Track Switch is installed the device pins nozzle_id to MAIN for
// command consumers, so placement follows the inlet here instead (POS_IN_B -> main/right, POS_IN_A ->
// deputy/left). switch_pos is empty on switch-less machines and for ext spools (no tray-level inlet in the
// kept model), so this reduces to the original nozzle_id == MAIN_EXTRUDER_ID test — identical behavior.
bool AMSinfo::routes_to_main_extruder() const
{
if (switch_pos.has_value())
return switch_pos.value() == DevFilaSwitch::SwitchPos::POS_IN_B;
return nozzle_id == MAIN_EXTRUDER_ID;
}
/*************************************************
Description:AMSExtText
**************************************************/
AMSExtText::AMSExtText(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size)
{
wxWindow::Create(parent, id, pos, AMS_REFRESH_SIZE);
SetBackgroundColour(StateColor::darkModeColorFor(AMS_CONTROL_DEF_LIB_BK_COLOUR));
Bind(wxEVT_PAINT, &AMSExtText::paintEvent, this);
SetSize(AMS_REFRESH_SIZE);
SetMinSize(AMS_REFRESH_SIZE);
}
AMSExtText::~AMSExtText() {}
void AMSExtText::msw_rescale()
{
Layout();
Fit();
Refresh();
}
void AMSExtText::paintEvent(wxPaintEvent& evt)
{
wxPaintDC dc(this);
render(dc);
}
void AMSExtText::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 AMSExtText::doRender(wxDC& dc)
{
auto size = GetSize();
dc.SetPen(wxPen(StateColor::darkModeColorFor(AMS_CONTROL_GRAY800), 2, wxPENSTYLE_SOLID));
dc.SetTextForeground(StateColor::darkModeColorFor(AMS_CONTROL_GRAY800));
dc.SetFont(Label::Body_13);
WxFontUtils::get_suitable_font_size(0.7 * size.GetHeight(), dc);
auto tsize = dc.GetMultiLineTextExtent(_L("Ext"));
wxPoint pot(FromDIP((size.x - tsize.x) / 2), FromDIP((size.y - tsize.y) / 2));
dc.DrawText(_L("Ext"), pot);
}
/*************************************************
Description:AMSrefresh
**************************************************/
AMSrefresh::AMSrefresh() { SetFont(Label::Body_10);}
AMSrefresh::AMSrefresh(wxWindow *parent, std::string ams_id, wxString can_id, Caninfo info, const wxPoint &pos, const wxSize &size) : AMSrefresh()
{
m_can_id = can_id.ToStdString();
create(parent, wxID_ANY, pos, size);
UpdateInfo(ams_id, info);
}
AMSrefresh::AMSrefresh(wxWindow *parent, std::string ams_id, int can_id, Caninfo info, const wxPoint &pos, const wxSize &size) : AMSrefresh()
{
m_can_id = wxString::Format("%d", can_id).ToStdString();
create(parent, wxID_ANY, pos, size);
UpdateInfo(ams_id, info);
}
AMSrefresh::~AMSrefresh()
{
if (m_playing_timer) {
m_playing_timer->Stop();
delete m_playing_timer;
m_playing_timer = nullptr;
}
}
void AMSrefresh::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size)
{
wxWindow::Create(parent, id, pos, size, wxBORDER_NONE);
SetBackgroundColour(StateColor::darkModeColorFor(AMS_CONTROL_DEF_LIB_BK_COLOUR));
Bind(wxEVT_TIMER, &AMSrefresh::on_timer, this);
Bind(wxEVT_PAINT, &AMSrefresh::paintEvent, this);
Bind(wxEVT_ENTER_WINDOW, &AMSrefresh::OnEnterWindow, this);
Bind(wxEVT_LEAVE_WINDOW, &AMSrefresh::OnLeaveWindow, this);
Bind(wxEVT_LEFT_DOWN, &AMSrefresh::OnClick, this);
m_bitmap_normal = ScalableBitmap(this, "ams_refresh_normal", 32);
m_bitmap_selected = ScalableBitmap(this, "ams_refresh_selected", 32);
m_bitmap_ams_rfid_0 = ScalableBitmap(this, "ams_rfid_0", 32);
m_bitmap_ams_rfid_1 = ScalableBitmap(this, "ams_rfid_1", 32);
m_bitmap_ams_rfid_2 = ScalableBitmap(this, "ams_rfid_2", 32);
m_bitmap_ams_rfid_3 = ScalableBitmap(this, "ams_rfid_3", 32);
m_bitmap_ams_rfid_4 = ScalableBitmap(this, "ams_rfid_4", 32);
m_bitmap_ams_rfid_5 = ScalableBitmap(this, "ams_rfid_5", 32);
m_bitmap_ams_rfid_6 = ScalableBitmap(this, "ams_rfid_6", 32);
m_bitmap_ams_rfid_7 = ScalableBitmap(this, "ams_rfid_7", 32);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_0);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_1);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_2);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_3);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_4);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_5);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_6);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_7);
m_playing_timer = new wxTimer();
m_playing_timer->SetOwner(this);
SetSize(AMS_REFRESH_SIZE);
SetMinSize(AMS_REFRESH_SIZE);
SetMaxSize(AMS_REFRESH_SIZE);
Refresh();
}
void AMSrefresh::on_timer(wxTimerEvent &event)
{
//if (m_rotation_angle >= m_rfid_bitmap_list.size()) {
// m_rotation_angle = 0;
//} else {
// m_rotation_angle++;
//}
Refresh();
}
void AMSrefresh::PlayLoading()
{
if (m_play_loading || m_disable_mode) return;
m_play_loading = true;
m_playing_timer->Start(AMS_REFRESH_PLAY_LOADING_TIMER);
Refresh();
}
void AMSrefresh::StopLoading()
{
if (!m_play_loading || m_disable_mode) return;
m_playing_timer->Stop();
m_play_loading = false;
Refresh();
}
void AMSrefresh::OnEnterWindow(wxMouseEvent &evt)
{
m_selected = true;
Refresh();
}
void AMSrefresh::OnLeaveWindow(wxMouseEvent &evt)
{
m_selected = false;
Refresh();
}
void AMSrefresh::OnClick(wxMouseEvent &evt) {
post_event(wxCommandEvent(EVT_AMS_REFRESH_RFID));
}
void AMSrefresh::post_event(wxCommandEvent &&event)
{
if (m_play_loading) { return;}
if (m_disable_mode)
return;
event.SetString(m_info.can_id);
event.SetInt(atoi(m_ams_id.c_str()));
event.SetEventObject(m_parent);
wxPostEvent(m_parent, event);
event.Skip();
}
void AMSrefresh::paintEvent(wxPaintEvent &evt)
{
wxSize size = GetSize();
wxPaintDC dc(this);
auto colour = StateColor::darkModeColorFor(AMS_CONTROL_GRAY700);
if (!wxWindow::IsEnabled()) { colour = StateColor::darkModeColorFor(AMS_CONTROL_GRAY500); }
auto pot = wxPoint((size.x - m_bitmap_selected.GetBmpSize().x) / 2, (size.y - m_bitmap_selected.GetBmpSize().y) / 2);
if (!m_disable_mode) {
if (!m_play_loading) {
dc.DrawBitmap(m_selected ? m_bitmap_selected.bmp() : m_bitmap_normal.bmp(), pot);
}
else {
/* m_bitmap_rotation = ScalableBitmap(this, "ams_refresh_normal", 30);
auto image = m_bitmap_rotation.bmp().ConvertToImage();
wxPoint offset;
auto loading_img = image.Rotate(m_rotation_angle, wxPoint(image.GetWidth() / 2, image.GetHeight() / 2), true, &offset);
ScalableBitmap loading_bitmap;
loading_bitmap.bmp() = wxBitmap(loading_img);
dc.DrawBitmap(loading_bitmap.bmp(), offset.x , offset.y);*/
m_rotation_angle++;
if (m_rotation_angle >= m_rfid_bitmap_list.size()) {
m_rotation_angle = 0;
}
if (m_rfid_bitmap_list.size() <= 0)return;
dc.DrawBitmap(m_rfid_bitmap_list[m_rotation_angle].bmp(), pot);
}
}
dc.SetFont(Label::Body_10);
//dc.SetTextForeground(StateColor::darkModeColorFor(AMS_CONTROL_BLACK_COLOUR));
dc.SetTextForeground(colour);
auto tsize = dc.GetTextExtent(m_refresh_id);
pot = wxPoint((size.x - tsize.x) / 2, (size.y - tsize.y) / 2);
dc.DrawText(m_refresh_id, pot);
}
void AMSrefresh::UpdateInfo(std::string ams_id, Caninfo info)
{
if (m_ams_id == ams_id && m_info == info)
{
return;
}
m_ams_id = ams_id;
m_info = info;
if (!m_ams_id.empty() && !m_can_id.empty()) {
auto aid = atoi(m_ams_id.c_str());
auto tid = atoi(m_can_id.c_str());
auto tray_id = aid * 4 + tid;
m_refresh_id = wxGetApp().transition_tridid(tray_id);
}
Refresh();
}
void AMSrefresh::msw_rescale() {
m_bitmap_normal = ScalableBitmap(this, "ams_refresh_normal", 32);
m_bitmap_selected = ScalableBitmap(this, "ams_refresh_selected", 32);
m_bitmap_ams_rfid_0 = ScalableBitmap(this, "ams_rfid_0", 32);
m_bitmap_ams_rfid_1 = ScalableBitmap(this, "ams_rfid_1", 32);
m_bitmap_ams_rfid_2 = ScalableBitmap(this, "ams_rfid_2", 32);
m_bitmap_ams_rfid_3 = ScalableBitmap(this, "ams_rfid_3", 32);
m_bitmap_ams_rfid_4 = ScalableBitmap(this, "ams_rfid_4", 32);
m_bitmap_ams_rfid_5 = ScalableBitmap(this, "ams_rfid_5", 32);
m_bitmap_ams_rfid_6 = ScalableBitmap(this, "ams_rfid_6", 32);
m_bitmap_ams_rfid_7 = ScalableBitmap(this, "ams_rfid_7", 32);
m_rfid_bitmap_list.clear();
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_0);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_1);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_2);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_3);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_4);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_5);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_6);
m_rfid_bitmap_list.push_back(m_bitmap_ams_rfid_7);
Layout();
Refresh();
}
void AMSrefresh::DoSetSize(int x, int y, int width, int height, int sizeFlags)
{
wxWindow::DoSetSize(x, y, width, height, sizeFlags);
}
/*************************************************
Description:AMSextruder
**************************************************/
void AMSextruderImage::OnAmsLoading(bool load, wxColour col)
{
if (m_ams_loading != load || m_colour != col) {
m_ams_loading = load;
m_colour = col;
Refresh();
}
}
void AMSextruderImage::TurnOff()
{
m_colour = AMS_EXTRUDER_DEF_COLOUR;
Refresh();
}
void AMSextruderImage::msw_rescale()
{
//m_ams_extruder.SetSize(AMS_EXTRUDER_BITMAP_SIZE);
//auto image = m_ams_extruder.ConvertToImage();
m_ams_extruder = ScalableBitmap(this, m_file_name, 36);
Layout();
Refresh();
}
void AMSextruderImage::paintEvent(wxPaintEvent &evt)
{
wxPaintDC dc(this);
render(dc);
}
void AMSextruderImage::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 AMSextruderImage::doRender(wxDC &dc)
{
auto size = GetSize();
//dc.DrawRectangle(0, FromDIP(5), size.x, size.y - FromDIP(5) - FromDIP(2));
if (m_show_state){
if (m_ams_loading) {
dc.SetPen(*wxTRANSPARENT_PEN);
dc.SetBrush(m_colour);
dc.DrawRectangle(FromDIP(2), FromDIP(10), size.x - FromDIP(3), size.y - FromDIP(20));
}
else{
dc.SetPen(*wxTRANSPARENT_PEN);
dc.SetBrush(*wxWHITE);
dc.DrawRectangle(FromDIP(3), FromDIP(10), size.x - FromDIP(6), size.y - FromDIP(20));
}
dc.DrawBitmap(m_ams_extruder.bmp(), wxPoint((size.x - m_ams_extruder.GetBmpSize().x) / 2, 0));
}
}
AMSextruderImage::AMSextruderImage(wxWindow *parent, wxWindowID id, string file_name, const wxSize& size, const wxPoint &pos)
{
wxWindow::Create(parent, id, pos, size);
SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
m_ams_extruder = ScalableBitmap(this, file_name,36);
m_file_name = file_name;
SetSize(size);
SetMinSize(size);
SetMaxSize(size);
Bind(wxEVT_PAINT, &AMSextruderImage::paintEvent, this);
}
AMSextruderImage::~AMSextruderImage() {}
/*************************************************
Description:AMSExtImage upon ext lib
**************************************************/
AMSExtImage::AMSExtImage(wxWindow* parent, AMSPanelPos ext_pos, int total_ext_num, bool over_ext, wxWindowID id, const wxPoint& pos)
{
if (over_ext)
{
wxWindow::Create(parent, id, pos);
SetMinSize(AMS_HUMIDITY_SIZE);
SetMaxSize(AMS_HUMIDITY_SIZE);
m_show_ams_ext = true;
}
else
{
wxWindow::Create(parent, id, pos);
SetMinSize(wxSize(FromDIP(98), FromDIP(99)));
SetMaxSize(wxSize(FromDIP(98), FromDIP(99)));
m_show_ext = true;
}
m_ext_num = total_ext_num;
m_ext_pos = ext_pos;
SetBackgroundColour(StateColor::darkModeColorFor(AMS_CONTROL_DEF_LIB_BK_COLOUR));
Bind(wxEVT_PAINT, &AMSExtImage::paintEvent, this);
}
AMSExtImage::~AMSExtImage() {}
const wxBitmap &AMSExtImage::get_bmp(const std::string &printer_type, bool is_ams_ext, AMSPanelPos pos)
{
int pos_id = 0;
if (pos == AMSPanelPos::LEFT_PANEL) { pos_id = 1;}
const std::string &image_name = DevPrinterConfigUtil::get_printer_ext_img(printer_type, pos_id);
if (image_name.empty()) { return wxNullBitmap; }
int image_size = is_ams_ext ? 25 : 98;
if ((m_ext_image.name() != image_name) || (m_ext_image.GetBmpWidth() != image_size)) {
m_ext_image = ScalableBitmap(this, image_name, image_size);
}
return m_ext_image.bmp();
}
void AMSExtImage::msw_rescale()
{
if (m_ext_image.bmp().IsOk()) {
m_ext_image.msw_rescale();
}
Layout();
Fit();
Refresh();
}
void AMSExtImage::setShowAmsExt(bool show)
{
if (m_show_ams_ext != show)
{
m_show_ams_ext = show;
Refresh();
}
}
void AMSExtImage::setTotalExtNum(const std::string &series_name, const std::string &printer_type, int num)
{
if ((m_ext_num != num) || (m_series_name != series_name) || (m_printer_type_name != printer_type))
{
m_ext_num = num;
m_series_name = series_name;
m_printer_type_name = printer_type;
Refresh();
}
}
void AMSExtImage::paintEvent(wxPaintEvent& evt)
{
wxPaintDC dc(this);
render(dc);
}
void AMSExtImage::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 AMSExtImage::doRender(wxDC& dc)
{
auto size = GetSize();
dc.SetPen(*wxTRANSPARENT_PEN);
if (m_show_ams_ext)
{
const wxBitmap &bmp = get_bmp(m_printer_type_name, true, m_ext_pos);
dc.DrawBitmap(bmp, wxPoint((size.x - ScalableBitmap::GetBmpSize(bmp).x) / 2, 0));
Layout();
return;
}
if (m_show_ext)
{
const wxBitmap &bmp = get_bmp(m_printer_type_name, false, m_ext_pos);
const wxSize& bmp_size = ScalableBitmap::GetBmpSize(bmp);
dc.DrawBitmap(bmp, wxPoint((size.x - bmp_size.x) / 2, (size.y - bmp_size.GetHeight())));
Layout();
return;
}
}
// Orca: SwitcherImage — routing glyph drawn when a Filament Track Switch is installed.
void SwitcherImage::paintEvent(wxPaintEvent &evt)
{
wxPaintDC dc(this);
render(dc);
}
void SwitcherImage::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 SwitcherImage::doRender(wxDC &dc)
{
auto size = GetSize();
if (m_show_state){
dc.SetPen(*wxTRANSPARENT_PEN);
dc.SetBrush(*wxWHITE);
dc.DrawBitmap(m_switcher.bmp(), wxPoint((size.x - m_switcher.GetBmpSize().x) / 2, 0));
}
Layout();
}
SwitcherImage::SwitcherImage(wxWindow *parent, wxWindowID id, string file_name, const wxSize& size, const wxPoint &pos)
{
wxWindow::Create(parent, id, pos, size);
SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
m_show_state = true;
m_switcher = ScalableBitmap(this, file_name, 16);
m_file_name = file_name;
SetSize(size);
SetMinSize(size);
SetMaxSize(size);
Bind(wxEVT_PAINT, &SwitcherImage::paintEvent, this);
}
SwitcherImage::~SwitcherImage() {}
//DevAms Extruder
AMSextruder::AMSextruder(wxWindow *parent, wxWindowID id, int nozzle_num, const wxPoint &pos, const wxSize &size)
{
create(parent, id, pos, size, nozzle_num);
}
AMSextruder::~AMSextruder() {}
void AMSextruder::TurnOn(wxColour col)
{
//m_left_extruder->TurnOn(col);
}
void AMSextruder::TurnOff()
{
m_left_extruder->TurnOff();
}
void AMSextruder::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int nozzle_num)
{
wxWindow::Create(parent, id, pos, wxSize(-1, FromDIP(36)), wxBORDER_NONE);
SetBackgroundColour(*wxWHITE);
updateNozzleNum(nozzle_num);
Layout();
}
void AMSextruder::OnVamsLoading(bool load, wxColour col)
{
m_vams_loading = load;
if (load)m_current_colur = col;
Refresh();
}
void AMSextruder::OnAmsLoading(bool load, int nozzle_id, wxColour col /*= AMS_CONTROL_GRAY500*/)
{
m_ams_loading = load;
if (m_nozzle_num == 1){
m_left_extruder->OnAmsLoading(load, col);
if (load) m_current_colur_deputy = col;
}
else if (m_nozzle_num > 1){
if (nozzle_id == MAIN_EXTRUDER_ID) {
m_right_extruder->OnAmsLoading(load, col);
if (m_current_colur != col){
if (load) m_current_colur = col;
}
}
else if(nozzle_id == DEPUTY_EXTRUDER_ID) {
m_left_extruder->OnAmsLoading(load, col);
if (m_current_colur_deputy != col) {
if (load) m_current_colur_deputy = col;
}
}
}
}
/*return true if something is updated*/
bool AMSextruder::updateNozzleNum(int nozzle_num, const string& series_name)
{
if (m_nozzle_num == nozzle_num && m_series_name == series_name) return false;
m_series_name = series_name;
m_nozzle_num = nozzle_num;
this->DestroyChildren();
m_right_extruder = new AMSextruderImage(this, wxID_ANY, "right_nozzle", AMS_EXTRUDER_DOUBLE_NOZZLE_BITMAP_SIZE);
wxBoxSizer* m_bitmap_sizer = new wxBoxSizer(wxHORIZONTAL);
if (m_nozzle_num >= 2)
{
m_left_extruder = new AMSextruderImage(this, wxID_ANY, "left_nozzle", AMS_EXTRUDER_DOUBLE_NOZZLE_BITMAP_SIZE);
m_left_extruder->setShowState(true);
m_right_extruder->setShowState(true);
m_bitmap_sizer->Add(m_left_extruder, 0, wxALIGN_LEFT | wxALIGN_TOP, 0);
m_bitmap_sizer->Add(m_right_extruder, 0, wxLEFT | wxALIGN_TOP, FromDIP(2));
m_bitmap_sizer->AddSpacer(2);
}
else
{
if (MachineObject::is_series_n(m_series_name))
{
m_left_extruder = new AMSextruderImage(this, wxID_ANY, "single_nozzle_n", AMS_EXTRUDER_SINGLE_NOZZLE_N_SIZE);
}
else if(MachineObject::is_series_x(m_series_name) || MachineObject::is_series_p(m_series_name))
{
m_left_extruder = new AMSextruderImage(this, wxID_ANY, "single_nozzle_xp", AMS_EXTRUDER_SINGLE_NOZZLE_XP_SIZE);
}
else
{
m_left_extruder = new AMSextruderImage(this, wxID_ANY, "single_nozzle_xp", AMS_EXTRUDER_SINGLE_NOZZLE_XP_SIZE);
}
m_left_extruder->setShowState(true);
m_right_extruder->setShowState(false);
m_bitmap_sizer->Add(m_left_extruder, 0, wxALIGN_LEFT | wxALIGN_TOP, 0);
m_bitmap_sizer->Add(m_right_extruder, 0, wxLEFT | wxALIGN_TOP, FromDIP(3));
}
SetSizer(m_bitmap_sizer);
Layout();
Refresh();
return true;
}
void AMSextruder::msw_rescale()
{
//m_amsSextruder->msw_rescale();
if (m_left_extruder) m_left_extruder->msw_rescale();
if (m_right_extruder) m_right_extruder->msw_rescale();
Layout();
Update();
Refresh();
}
/*************************************************
Description:AMSLib
**************************************************/
AMSLib::AMSLib(wxWindow *parent, std::string ams_idx, Caninfo info, AMSModelOriginType ext_type)
{
m_border_color = (wxColour(130, 130, 128));
m_road_def_color = AMS_CONTROL_GRAY500;
m_ext_type = ext_type;
wxWindow::SetBackgroundColour(StateColor::darkModeColorFor(AMS_CONTROL_DEF_LIB_BK_COLOUR));
create(parent);
Bind(wxEVT_PAINT, &AMSLib::paintEvent, this);
Bind(wxEVT_ENTER_WINDOW, &AMSLib::on_enter_window, this);
Bind(wxEVT_LEAVE_WINDOW, &AMSLib::on_leave_window, this);
Bind(wxEVT_LEFT_DOWN, &AMSLib::on_left_down, this);
UpdateInfo(info, ams_idx, false);
}
AMSLib::~AMSLib()
{
}
void AMSLib::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size)
{
wxWindow::Create(parent, id, pos, size);
SetSize(AMS_CAN_LIB_SIZE);
SetMinSize(AMS_CAN_LIB_SIZE);
SetMaxSize(AMS_CAN_LIB_SIZE);
auto m_sizer_body = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *m_sizer_edit = new wxBoxSizer(wxHORIZONTAL);
m_bitmap_editable = ScalableBitmap(this, "ams_editable", 14);
m_bitmap_editable_light = ScalableBitmap(this, "ams_editable_light", 14);
m_bitmap_readonly = ScalableBitmap(this, "ams_readonly", 14);
m_bitmap_readonly_light = ScalableBitmap(this, "ams_readonly_light", 14);
m_bitmap_transparent = ScalableBitmap(this, "transparent_ams_lib", 76);
m_bitmap_transparent_def = ScalableBitmap(this, "transparent_ams_lib", 76);
m_bitmap_transparent_lite = ScalableBitmap(this, "transparent_ams_lib", 56);
m_bitmap_extra_tray_left = ScalableBitmap(this, "extra_ams_tray_left", 72);
m_bitmap_extra_tray_right = ScalableBitmap(this, "extra_ams_tray_right", 72);
m_bitmap_extra_tray_mid = ScalableBitmap(this, "extra_ams_tray_mid", 72);
m_bitmap_extra_tray_left_hover = ScalableBitmap(this, "extra_ams_tray_left_hover", 72);
m_bitmap_extra_tray_right_hover = ScalableBitmap(this, "extra_ams_tray_right_hover", 72);
m_bitmap_extra_tray_mid_hover = ScalableBitmap(this, "extra_ams_tray_mid_hover", 72);
m_bitmap_extra_tray_left_selected = ScalableBitmap(this, "extra_ams_tray_left_selected", 72);
m_bitmap_extra_tray_right_selected = ScalableBitmap(this, "extra_ams_tray_right_selected", 72);
m_bitmap_extra_tray_mid_selected = ScalableBitmap(this, "extra_ams_tray_mid_selected", 72);
m_sizer_body->Add(0, 0, 1, wxEXPAND, 0);
m_sizer_body->Add(m_sizer_edit, 0, wxALIGN_CENTER, 0);
m_sizer_body->Add(0, 0, 0, wxBOTTOM, GetSize().y * 0.12);
SetSizer(m_sizer_body);
Layout();
}
void AMSLib::on_enter_window(wxMouseEvent &evt)
{
m_hover = true;
Refresh();
}
void AMSLib::on_leave_window(wxMouseEvent &evt)
{
m_hover = false;
Refresh();
}
void AMSLib::on_left_down(wxMouseEvent &evt)
{
if (m_info.material_state != AMSCanType::AMS_CAN_TYPE_EMPTY && m_info.material_state != AMSCanType::AMS_CAN_TYPE_NONE) {
auto size = GetSize();
auto pos = evt.GetPosition();
if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND || m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND ||
m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) {
auto left = FromDIP(10);
auto right = size.x - FromDIP(10);
auto top = 0;
auto bottom = 0;
if (m_ams_model == AMSModel::GENERIC_AMS || m_ams_model == AMSModel::N3F_AMS || m_ams_model == AMSModel::N3S_AMS || m_ams_model == AMSModel::EXT_AMS) {
top = (size.y - FromDIP(15) - m_bitmap_editable_light.GetBmpSize().y);
bottom = size.y - FromDIP(15);
}
else if (m_ams_model == AMSModel::AMS_LITE) {
top = (size.y - FromDIP(20) - m_bitmap_editable_light.GetBmpSize().y);
bottom = size.y - FromDIP(20);
}
if (pos.x >= left && pos.x <= right && pos.y >= top && top <= bottom) {
if (m_selected) {
if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) {
post_event(wxCommandEvent(EVT_VAMS_ON_FILAMENT_EDIT));
}
else {
post_event(wxCommandEvent(EVT_AMS_ON_FILAMENT_EDIT));
}
} else {
BOOST_LOG_TRIVIAL(trace) << "current amslib is not selected";
}
}
}
}
}
void AMSLib::paintEvent(wxPaintEvent &evt)
{
wxPaintDC dc(this);
render(dc);
}
void AMSLib::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
// text
if (m_ams_model == AMSModel::AMS_LITE || (m_ams_model == AMSModel::EXT_AMS && m_ext_type == AMSModelOriginType::LITE_EXT)) {
render_lite_text(dc);
}
else{
render_generic_text(dc);
}
}
void AMSLib::render_lite_text(wxDC& dc)
{
auto tmp_lib_colour = m_info.material_colour;
change_the_opacity(tmp_lib_colour);
auto temp_text_colour = AMS_CONTROL_GRAY800;
if (tmp_lib_colour.GetLuminance() < 0.6) {
temp_text_colour = AMS_CONTROL_WHITE_COLOUR;
}
else {
temp_text_colour = AMS_CONTROL_GRAY800;
}
if (m_info.material_remain < 50) {
temp_text_colour = AMS_CONTROL_GRAY800;
}
if (tmp_lib_colour.Alpha() == 0) {
temp_text_colour = AMS_CONTROL_GRAY800;
}
dc.SetFont(::Label::Body_13);
dc.SetTextForeground(temp_text_colour);
auto libsize = GetSize();
if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND
|| m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND
|| m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) {
if (m_info.material_name.empty()) {
auto tsize = dc.GetMultiLineTextExtent("?");
auto pot = wxPoint(0, 0);
pot = wxPoint((libsize.x - tsize.x) / 2 + FromDIP(2), (libsize.y - tsize.y) / 2 - FromDIP(5));
dc.DrawText(L("?"), pot);
}
else {
auto tsize = dc.GetMultiLineTextExtent(m_info.material_name);
std::vector<std::string> split_char_arr = { " ", "-" };
bool has_split = false;
std::string has_split_char = " ";
for (std::string split_char : split_char_arr) {
if (m_info.material_name.find(split_char) != std::string::npos) {
has_split = true;
has_split_char = split_char;
}
}
if (has_split) {
dc.SetFont(::Label::Body_10);
auto line_top = m_info.material_name.substr(0, m_info.material_name.find(has_split_char));
auto line_bottom = m_info.material_name.substr(m_info.material_name.find(has_split_char));
auto line_top_tsize = dc.GetMultiLineTextExtent(line_top);
auto line_bottom_tsize = dc.GetMultiLineTextExtent(line_bottom);
auto pot_top = wxPoint((libsize.x - line_top_tsize.x) / 2 + FromDIP(3), (libsize.y - line_top_tsize.y) / 2 - line_top_tsize.y);
dc.DrawText(line_top, pot_top);
auto pot_bottom = wxPoint((libsize.x - line_bottom_tsize.x) / 2 + FromDIP(3), (libsize.y - line_bottom_tsize.y) / 2);
dc.DrawText(line_bottom, pot_bottom);
}
else {
dc.SetFont(::Label::Body_10);
auto pot = wxPoint(0, 0);
if (m_obj ) {
pot = wxPoint((libsize.x - tsize.x) / 2 + FromDIP(6), (libsize.y - tsize.y) / 2 - FromDIP(5));
}
dc.DrawText(m_info.material_name, pot);
}
}
}
if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_EMPTY) {
auto tsize = dc.GetMultiLineTextExtent(_L("/"));
auto pot = wxPoint((libsize.x - tsize.x) / 2 + FromDIP(2), (libsize.y - tsize.y) / 2 + FromDIP(3));
dc.DrawText(_L("/"), pot);
}
}
void AMSLib::render_generic_text(wxDC &dc)
{
bool show_k_value = true;
if (m_info.material_name.empty()) {
show_k_value = false;
}
else if (m_info.cali_idx == -1 || (m_obj && (CalibUtils::get_selected_calib_idx(m_obj->pa_calib_tab, m_info.cali_idx) == -1))) {
if (m_obj && m_obj->GetConfig()->SupportCalibrationPA_FlowAuto())
show_k_value = false;
else
get_default_k_n_value(m_info.filament_id, m_info.k, m_info.n);
}
else if (abs(m_info.k) < EPSILON) {
show_k_value = false;
}
auto tmp_lib_colour = m_info.material_colour;
change_the_opacity(tmp_lib_colour);
auto temp_text_colour = AMS_CONTROL_GRAY800;
if (tmp_lib_colour.GetLuminance() < 0.6) {
temp_text_colour = AMS_CONTROL_WHITE_COLOUR;
}
else {
temp_text_colour = AMS_CONTROL_GRAY800;
}
if (m_info.material_remain < 50) {
temp_text_colour = AMS_CONTROL_GRAY800;
}
if (tmp_lib_colour.Alpha() == 0) {
temp_text_colour = AMS_CONTROL_GRAY800;
}
dc.SetFont(::Label::Body_13);
dc.SetTextForeground(temp_text_colour);
auto alpha = m_info.material_colour.Alpha();
if (alpha != 0 && alpha != 255 && alpha != 254) {
dc.SetTextForeground(*wxBLACK);
}
auto libsize = GetSize();
if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND
|| m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND
|| m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL) {
if (m_info.material_name.empty() /*&& m_info.material_state != AMSCanType::AMS_CAN_TYPE_VIRTUAL*/) {
auto tsize = dc.GetMultiLineTextExtent("?");
auto pot = wxPoint(0, 0);
if (m_obj && show_k_value) {
pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 - FromDIP(9));
}
else {
pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 + FromDIP(3));
}
dc.DrawText(L("?"), pot);
}
else {
auto tsize = dc.GetMultiLineTextExtent(m_info.material_name);
std::vector<std::string> split_char_arr = { " ", "-" };
bool has_split = false;
std::string has_split_char = " ";
for (std::string split_char : split_char_arr) {
if (m_info.material_name.find(split_char) != std::string::npos) {
has_split = true;
has_split_char = split_char;
}
}
if (has_split) {
dc.SetFont(::Label::Body_12);
auto line_top = m_info.material_name.substr(0, m_info.material_name.find(has_split_char));
auto line_bottom = m_info.material_name.substr(m_info.material_name.find(has_split_char));
auto line_top_tsize = dc.GetMultiLineTextExtent(line_top);
auto line_bottom_tsize = dc.GetMultiLineTextExtent(line_bottom);
if (!m_show_kn) {
auto pot_top = wxPoint((libsize.x - line_top_tsize.x) / 2, (libsize.y - line_top_tsize.y) / 2 - line_top_tsize.y + FromDIP(6));
dc.DrawText(line_top, pot_top);
auto pot_bottom = wxPoint((libsize.x - line_bottom_tsize.x) / 2, (libsize.y - line_bottom_tsize.y) / 2 + FromDIP(4));
dc.DrawText(line_bottom, pot_bottom);
}
else {
auto pot_top = wxPoint((libsize.x - line_top_tsize.x) / 2, (libsize.y - line_top_tsize.y) / 2 - line_top_tsize.y - FromDIP(6));
dc.DrawText(line_top, pot_top);
auto pot_bottom = wxPoint((libsize.x - line_bottom_tsize.x) / 2, (libsize.y - line_bottom_tsize.y) / 2 - FromDIP(8));
dc.DrawText(line_bottom, pot_bottom);
}
}
else {
auto pot = wxPoint(0, 0);
if (m_obj && show_k_value) {
pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 - FromDIP(9));
} else {
pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 + FromDIP(3));
}
dc.DrawText(m_info.material_name, pot);
}
}
//draw k&n
if (m_obj && show_k_value) {
if (m_show_kn) {
wxString str_k = wxString::Format("K %1.3f", m_info.k);
wxString str_n = wxString::Format("N %1.3f", m_info.n);
dc.SetFont(::Label::Body_11);
auto tsize = dc.GetMultiLineTextExtent(str_k);
auto pot_k = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 - FromDIP(9) + tsize.y);
dc.DrawText(str_k, pot_k);
}
}
}
if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_EMPTY) {
auto tsize = dc.GetMultiLineTextExtent(_L("Empty"));
auto pot = wxPoint((libsize.x - tsize.x) / 2, (libsize.y - tsize.y) / 2 + FromDIP(3));
dc.DrawText(_L("Empty"), pot);
}
}
void AMSLib::doRender(wxDC &dc)
{
if (m_ams_model == AMSModel::AMS_LITE || m_ext_type == AMSModelOriginType::LITE_EXT) {
render_lite_lib(dc);
}
else {
render_generic_lib(dc);
}
}
void AMSLib::render_lite_lib(wxDC& dc)
{
wxSize size = GetSize();
auto libsize = AMS_LITE_CAN_LIB_SIZE;
ScalableBitmap tray_bitmap, tray_bitmap_hover, tray_bitmap_selected;
if (m_ams_model == AMSModel::AMS_LITE){
tray_bitmap = (m_can_index <= 1) ? m_bitmap_extra_tray_left : m_bitmap_extra_tray_right;
tray_bitmap_hover = (m_can_index <= 1) ? m_bitmap_extra_tray_left_hover : m_bitmap_extra_tray_right_hover;
tray_bitmap_selected = (m_can_index <= 1) ? m_bitmap_extra_tray_left_selected : m_bitmap_extra_tray_right_selected;
}
else{
tray_bitmap = m_bitmap_extra_tray_mid;
tray_bitmap_hover = m_bitmap_extra_tray_mid_hover;
tray_bitmap_selected = m_bitmap_extra_tray_mid_selected;
}
auto tmp_lib_colour = m_info.material_colour;
change_the_opacity(tmp_lib_colour);
auto temp_bitmap_third = m_bitmap_editable_light;
auto temp_bitmap_brand = m_bitmap_readonly_light;
//draw road
dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
if (m_pass_road) {
dc.SetPen(wxPen(m_info.material_colour, 4, wxPENSTYLE_SOLID));
}
if (m_can_index == 0 || m_can_index == 3) {
dc.DrawLine(size.x / 2, size.y / 2, size.x / 2, size.y);
}
else {
dc.DrawLine(size.x / 2, size.y / 2, size.x / 2, 0);
}
//draw def background
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(wxBrush(StateColor::darkModeColorFor(AMS_CONTROL_DEF_LIB_BK_COLOUR)));
if (m_ams_model == AMSModel::EXT_AMS){
dc.DrawRoundedRectangle(FromDIP(10), FromDIP(6), libsize.x - FromDIP(20), libsize.y - FromDIP(12), 0);
}
dc.DrawRoundedRectangle(FromDIP(10), FromDIP(10), libsize.x - FromDIP(20), libsize.y - FromDIP(20), 0);
if (tmp_lib_colour.GetLuminance() < 0.6) {
temp_bitmap_third = m_bitmap_editable_light;
temp_bitmap_brand = m_bitmap_readonly_light;
}
else {
temp_bitmap_third = m_bitmap_editable;
temp_bitmap_brand = m_bitmap_readonly;
}
if (m_info.material_remain < 50) {
temp_bitmap_third = m_bitmap_editable;
temp_bitmap_brand = m_bitmap_readonly;
}
if (tmp_lib_colour.Alpha() == 0) {
temp_bitmap_third = m_bitmap_editable;
temp_bitmap_brand = m_bitmap_readonly;
if (m_ams_model == AMSModel::EXT_AMS) {
dc.DrawBitmap(m_bitmap_transparent_lite.bmp(), FromDIP(8), (size.y - libsize.y) / 2 + FromDIP(8));
} else {
dc.DrawBitmap(m_bitmap_transparent_lite.bmp(), FromDIP(10), (size.y - libsize.y) / 2 + FromDIP(8));
}
}
// View-only mode forces the read-only (eye) icon even for third-party spools.
if (m_view_only) {
temp_bitmap_third = temp_bitmap_brand;
}
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
if (m_info.material_cols.size() > 1) {
int left = FromDIP(10);
int gwidth = std::round(libsize.x / (m_info.material_cols.size() - 1));
//gradient
if (m_info.ctype == 0) {
for (int i = 0; i < m_info.material_cols.size() - 1; i++) {
auto rect = wxRect(left, FromDIP(10), libsize.x - FromDIP(18), libsize.y - FromDIP(18));
fill_gradient_rect_east(dc, rect, m_info.material_cols[i], m_info.material_cols[i + 1]);
left += gwidth;
}
}
else {
int cols_size = m_info.material_cols.size();
for (int i = 0; i < cols_size; i++) {
dc.SetBrush(wxBrush(m_info.material_cols[i]));
float x = FromDIP(10) + ((float)libsize.x - FromDIP(18)) * i / cols_size;
dc.DrawRoundedRectangle(x, FromDIP(10), ((float)libsize.x - FromDIP(17)) / cols_size, libsize.y - FromDIP(20), 0);
}
dc.SetBrush(wxBrush(tmp_lib_colour));
}
}
else {
dc.SetBrush(wxBrush(tmp_lib_colour));
if (m_ams_model == AMSModel::EXT_AMS) {
dc.DrawRoundedRectangle(FromDIP(10), (size.y - libsize.y) / 2 + FromDIP(8), libsize.x - FromDIP(17), libsize.y - FromDIP(16), 0);
}
else{
dc.DrawRoundedRectangle(FromDIP(10), (size.y - libsize.y) / 2 + FromDIP(10), libsize.x - FromDIP(17), libsize.y - FromDIP(20), 0);
}
}
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(wxBrush(tmp_lib_colour));
if (!m_disable_mode) {
// edit icon
if (m_info.material_state != AMSCanType::AMS_CAN_TYPE_EMPTY && m_info.material_state != AMSCanType::AMS_CAN_TYPE_NONE)
{
if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND || m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL)
dc.DrawBitmap(temp_bitmap_third.bmp(), (size.x - temp_bitmap_third.GetBmpSize().x) / 2 + FromDIP(2), (size.y - FromDIP(18) - temp_bitmap_third.GetBmpSize().y));
if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND)
dc.DrawBitmap(temp_bitmap_brand.bmp(), (size.x - temp_bitmap_brand.GetBmpSize().x) / 2 + FromDIP(2), (size.y - FromDIP(18) - temp_bitmap_brand.GetBmpSize().y));
}
}
// selected & hover
if (m_selected) {
dc.DrawBitmap(tray_bitmap_selected.bmp(), (size.x - tray_bitmap_selected.GetBmpSize().x) / 2, (size.y - tray_bitmap_selected.GetBmpSize().y) / 2);
}
else if (!m_selected && m_hover) {
dc.DrawBitmap(tray_bitmap_hover.bmp(), (size.x - tray_bitmap_hover.GetBmpSize().x) / 2, (size.y - tray_bitmap_hover.GetBmpSize().y) / 2);
}
else {
dc.DrawBitmap(tray_bitmap.bmp(), (size.x - tray_bitmap.GetBmpSize().x) / 2, (size.y - tray_bitmap.GetBmpSize().y) / 2);
}
}
void AMSLib::render_generic_lib(wxDC &dc)
{
wxSize size = GetSize();
auto tmp_lib_colour = m_info.material_colour;
change_the_opacity(tmp_lib_colour);
auto temp_bitmap_third = m_bitmap_editable_light;
auto temp_bitmap_brand = m_bitmap_readonly_light;
//draw def background
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(wxBrush(AMS_CONTROL_DEF_LIB_BK_COLOUR));
dc.DrawRoundedRectangle(FromDIP(2), FromDIP(2), size.x - FromDIP(4), size.y - FromDIP(3), m_radius);
if (tmp_lib_colour.GetLuminance() < 0.6) {
temp_bitmap_third = m_bitmap_editable_light;
temp_bitmap_brand = m_bitmap_readonly_light;
}
else {
temp_bitmap_third = m_bitmap_editable;
temp_bitmap_brand = m_bitmap_readonly;
}
if (m_info.material_remain < 50) {
temp_bitmap_third = m_bitmap_editable;
temp_bitmap_brand = m_bitmap_readonly;
}
if (tmp_lib_colour.Alpha() == 0) {
temp_bitmap_third = m_bitmap_editable;
temp_bitmap_brand = m_bitmap_readonly;
}
// View-only mode forces the read-only (eye) icon even for third-party spools.
if (m_view_only) {
temp_bitmap_third = temp_bitmap_brand;
}
dc.SetPen(wxPen(tmp_lib_colour, 1, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(tmp_lib_colour));
//draw remain
auto alpha = m_info.material_colour.Alpha();
int height = size.y;
int curr_height = height * float(m_info.material_remain * 1.0 / 100.0);
if (curr_height != 0) { curr_height = std::max(curr_height, FromDIP(2)); }/*STUDIO-11323 too small to show, enlarge it*/
dc.SetFont(::Label::Body_13);
int top = height - curr_height;
if (m_ams_model == EXT_AMS){
dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), size.x - FromDIP(2), size.y - FromDIP(1), m_radius - 1);
if (alpha == 0) {
dc.DrawBitmap(m_bitmap_transparent_def.bmp(), FromDIP(2), FromDIP(2));
}
else if (alpha != 255 && alpha != 254) {
if (transparent_changed) {
transparent_changed = false;
}
dc.DrawBitmap(m_bitmap_transparent.bmp(), FromDIP(2), FromDIP(2));
}
if (!m_disable_mode) {
// edit icon
if (m_info.material_state != AMSCanType::AMS_CAN_TYPE_EMPTY && m_info.material_state != AMSCanType::AMS_CAN_TYPE_NONE) {
if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND || m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL)
dc.DrawBitmap(temp_bitmap_third.bmp(), (size.x - temp_bitmap_third.GetBmpSize().x) / 2, (size.y - FromDIP(10) - temp_bitmap_third.GetBmpSize().y));
if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND)
dc.DrawBitmap(temp_bitmap_brand.bmp(), (size.x - temp_bitmap_brand.GetBmpSize().x) / 2, (size.y - FromDIP(10) - temp_bitmap_brand.GetBmpSize().y));
}
}
dc.SetPen(wxPen(wxColour(130, 130, 128), 1, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
#ifdef __APPLE__
dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), size.x - FromDIP(2), size.y - FromDIP(1), m_radius);
#else
dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), size.x - FromDIP(2), size.y - FromDIP(1), m_radius);
#endif
if (m_selected) {
dc.SetPen(wxPen(AMS_CONTROL_BRAND_COLOUR, 3, wxPENSTYLE_SOLID));
//dc.SetPen(wxPen(tmp_lib_colour, 2, wxPENSTYLE_SOLID));
if (tmp_lib_colour.Alpha() == 0) {
dc.SetPen(wxPen(wxColour(tmp_lib_colour.Red(), tmp_lib_colour.Green(), tmp_lib_colour.Blue(), 128), 3, wxPENSTYLE_SOLID));
}
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
#ifdef __APPLE__
dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), size.x - FromDIP(2), size.y - FromDIP(2), 0);
#else
dc.DrawRoundedRectangle(0, 0, size.x, size.y, m_radius);
#endif
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(wxBrush(tmp_lib_colour));
}
if (!m_selected && m_hover) {
dc.SetPen(wxPen(AMS_CONTROL_BRAND_COLOUR, 3, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
#ifdef __APPLE__
dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), size.x - FromDIP(2), size.y - FromDIP(2), 0);
#else
dc.DrawRoundedRectangle(0, 0, size.x, size.y, m_radius);
#endif
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(wxBrush(tmp_lib_colour));
}
return;
}
if (curr_height >= FromDIP(1)) {
//transparent
if (alpha == 0) {
dc.DrawBitmap(m_bitmap_transparent_def.bmp(), FromDIP(2), FromDIP(2));
}
else if (alpha != 255 && alpha != 254) {
if (transparent_changed) {
std::string rgb = (tmp_lib_colour.GetAsString(wxC2S_HTML_SYNTAX)).ToStdString();
if (rgb.size() == 9) {
//delete alpha value
rgb = rgb.substr(0, rgb.size() - 2);
}
float alpha_f = 0.7 * tmp_lib_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_ams_lib", 76, false, false, true, replace);
transparent_changed = false;
}
dc.DrawBitmap(m_bitmap_transparent.bmp(), FromDIP(2), FromDIP(2));
}
//gradient
if (m_info.material_cols.size() > 1) {
auto left = FromDIP(2);
float total_width = size.x - FromDIP(4);
int gwidth = std::round(total_width / (m_info.material_cols.size() - 1));
//gradient
if (m_info.ctype == 0) {
for (int i = 0; i < m_info.material_cols.size() - 1; i++) {
if ((left + gwidth) > (size.x)) {
gwidth = (size.x) - left;
}
auto rect = wxRect(left, height - curr_height, gwidth, curr_height);
fill_gradient_rect_east(dc, rect, m_info.material_cols[i], m_info.material_cols[i + 1]);
left += gwidth;
}
}
else {
//multicolour
gwidth = std::round(total_width / m_info.material_cols.size());
for (int i = 0; i < m_info.material_cols.size(); i++) {
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(wxBrush(m_info.material_cols[i]));
if (i == 0 || i == m_info.material_cols.size() - 1) {
#ifdef __APPLE__
dc.DrawRoundedRectangle(left + gwidth * i - FromDIP(1), height - curr_height, gwidth, curr_height, m_radius);
#else
dc.DrawRoundedRectangle(left + gwidth * i, height - curr_height, gwidth, curr_height, m_radius - 1);
#endif
//add rectangle
int dr_gwidth = std::round(gwidth * 0.6);
if (i == 0) {
dc.DrawRectangle(left + gwidth - dr_gwidth, height - curr_height, dr_gwidth, curr_height);
}
else {
dc.DrawRectangle(left + gwidth*i, height - curr_height, dr_gwidth, curr_height);
}
}
else {
dc.DrawRectangle(left + gwidth * i, height - curr_height, gwidth, curr_height);
}
}
//reset pen and brush
if (m_selected || m_hover) {
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(wxBrush(tmp_lib_colour));
}
else {
dc.SetPen(wxPen(tmp_lib_colour, 1, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(tmp_lib_colour));
}
}
}
else {
auto brush = dc.GetBrush();
if (alpha != 0 && alpha != 255 && alpha != 254) dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
dc.DrawRoundedRectangle(FromDIP(2), FromDIP(1) + top, size.x - FromDIP(4), curr_height, m_radius - 1);
dc.SetBrush(brush);
}
}
if (top > 2) {
if (curr_height >= FromDIP(1)) {
//dc.DrawLine(FromDIP(2), top, size.x - FromDIP(4), top);
if (alpha != 255 && alpha != 254) {
dc.SetPen(wxPen(*wxWHITE));
dc.SetBrush(wxBrush(*wxWHITE));
#ifdef __APPLE__
dc.DrawRoundedRectangle(FromDIP(2), FromDIP(1) , size.x - FromDIP(4), top, m_radius);
#else
dc.DrawRoundedRectangle(FromDIP(2), FromDIP(1) , size.x - FromDIP(4), top, m_radius - 1);
#endif
}
if (tmp_lib_colour.Red() > 238 && tmp_lib_colour.Green() > 238 && tmp_lib_colour.Blue() > 238) {
dc.SetPen(wxPen(wxColour(130, 129, 128), 1, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
if (m_info.material_cols.size() <= 1){
dc.DrawLine(FromDIP(2), top, size.x - FromDIP(4), top);
}
}
}
else {
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
if (tmp_lib_colour.Red() > 238 && tmp_lib_colour.Green() > 238 && tmp_lib_colour.Blue() > 238) {
dc.SetPen(wxPen(wxColour(130, 129, 128), 2, wxPENSTYLE_SOLID));
}
else {
dc.SetPen(wxPen(tmp_lib_colour, 2, wxPENSTYLE_SOLID));
}
#ifdef __APPLE__
dc.DrawLine(FromDIP(5), FromDIP(4) + height - FromDIP(2), size.x - FromDIP(5), FromDIP(4) + height - FromDIP(2));
dc.DrawLine(FromDIP(6), FromDIP(4) + height - FromDIP(1), size.x - FromDIP(6), FromDIP(4) + height - FromDIP(1));
#else
//dc.DrawLine(FromDIP(2), FromDIP(0 + height), FromDIP(size.x - 4), FromDIP(height));
dc.DrawLine(FromDIP(2), height - FromDIP(1), size.x - FromDIP(4), height - FromDIP(1));
#endif
}
}
//border
dc.SetPen(wxPen(wxColour(130, 130, 128), 1, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
#ifdef __APPLE__
dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), size.x - FromDIP(2), size.y - FromDIP(1), m_radius);
#else
dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), size.x - FromDIP(2), size.y - FromDIP(1), m_radius);
#endif
if (m_selected) {
dc.SetPen(wxPen(AMS_CONTROL_BRAND_COLOUR, 3, wxPENSTYLE_SOLID));
//dc.SetPen(wxPen(tmp_lib_colour, 3, wxPENSTYLE_SOLID));
if (tmp_lib_colour.Alpha() == 0) {
dc.SetPen(wxPen(wxColour(tmp_lib_colour.Red(), tmp_lib_colour.Green(), tmp_lib_colour.Blue(), 128), 3, wxPENSTYLE_SOLID));
}
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
#ifdef __APPLE__
dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), size.x - FromDIP(2), size.y - FromDIP(2), 0);
#else
dc.DrawRoundedRectangle(0, 0, size.x, size.y, m_radius);
#endif
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(wxBrush(tmp_lib_colour));
}
if (!m_selected && m_hover) {
dc.SetPen(wxPen(AMS_CONTROL_BRAND_COLOUR, 3, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
#ifdef __APPLE__
dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), size.x - FromDIP(2), size.y - FromDIP(2), 0);
#else
dc.DrawRoundedRectangle(0, 0, size.x, size.y, m_radius);
#endif
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(wxBrush(tmp_lib_colour));
}
if (!m_disable_mode) {
// edit icon
if (m_info.material_state != AMSCanType::AMS_CAN_TYPE_EMPTY && m_info.material_state != AMSCanType::AMS_CAN_TYPE_NONE)
{
if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_THIRDBRAND || m_info.material_state == AMSCanType::AMS_CAN_TYPE_VIRTUAL)
dc.DrawBitmap(temp_bitmap_third.bmp(), (size.x - temp_bitmap_third.GetBmpSize().x) / 2, (size.y - FromDIP(10) - temp_bitmap_third.GetBmpSize().y));
if (m_info.material_state == AMSCanType::AMS_CAN_TYPE_BRAND)
dc.DrawBitmap(temp_bitmap_brand.bmp(), (size.x - temp_bitmap_brand.GetBmpSize().x) / 2, (size.y - FromDIP(10) - temp_bitmap_brand.GetBmpSize().y));
}
}
}
void AMSLib::on_pass_road(bool pass)
{
if (m_pass_road != pass) {
m_pass_road = pass;
Refresh();
}
}
void AMSLib::UpdateInfo(Caninfo info, std::string ams_idx, bool refresh)
{
DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
if (!dev) return;
if (dev->get_selected_machine() && dev->get_selected_machine() != m_obj) {
m_obj = dev->get_selected_machine();
}
if (info.material_colour.Alpha() != 0 && info.material_colour.Alpha() != 255 && info.material_colour.Alpha() != 254 && m_info.material_colour != info.material_colour) {
transparent_changed = true;
}
m_info = info;
m_ams_id = ams_idx;
m_slot_id = info.can_id;
if (refresh) Refresh();
}
wxColour AMSLib::GetLibColour() { return m_info.material_colour; }
void AMSLib::OnSelected()
{
if (!wxWindow::IsEnabled()) return;
if (m_unable_selected) return;
post_event(wxCommandEvent(EVT_AMS_ON_SELECTED));
m_selected = true;
Refresh();
}
void AMSLib::post_event(wxCommandEvent &&event)
{
//int tray_id = atoi(m_ams_id.c_str()) * 4 + atoi(m_info.can_id.c_str());
//event.SetString(m_info.can_id);
event.SetString(m_slot_id);
event.SetInt(std::stoi(m_ams_id));
event.SetEventObject(m_parent);
wxPostEvent(m_parent, event);
event.Skip();
}
void AMSLib::UnSelected()
{
m_selected = false;
Refresh();
}
bool AMSLib::Enable(bool enable) { return wxWindow::Enable(enable); }
void AMSLib::msw_rescale()
{
//m_bitmap_transparent.msw_rescale();
m_bitmap_transparent_def.msw_rescale();
m_bitmap_transparent_lite.msw_rescale();
m_bitmap_editable = ScalableBitmap(this, "ams_editable", 14);
m_bitmap_editable_light = ScalableBitmap(this, "ams_editable_light", 14);
m_bitmap_readonly = ScalableBitmap(this, "ams_readonly", 14);
m_bitmap_readonly_light = ScalableBitmap(this, "ams_readonly_light", 14);
m_bitmap_transparent = ScalableBitmap(this, "transparent_ams_lib", 76);
m_bitmap_transparent_def = ScalableBitmap(this, "transparent_ams_lib", 76);
m_bitmap_extra_tray_left = ScalableBitmap(this, "extra_ams_tray_left", 72);
m_bitmap_extra_tray_right = ScalableBitmap(this, "extra_ams_tray_right", 72);
m_bitmap_extra_tray_mid = ScalableBitmap(this, "extra_ams_tray_mid", 72);
m_bitmap_extra_tray_left_hover = ScalableBitmap(this, "extra_ams_tray_left_hover", 72);
m_bitmap_extra_tray_right_hover = ScalableBitmap(this, "extra_ams_tray_right_hover", 72);
m_bitmap_extra_tray_mid_hover = ScalableBitmap(this, "extra_ams_tray_mid_hover", 72);
m_bitmap_extra_tray_left_selected = ScalableBitmap(this, "extra_ams_tray_left_selected", 72);
m_bitmap_extra_tray_right_selected = ScalableBitmap(this, "extra_ams_tray_right_selected", 72);
m_bitmap_extra_tray_mid_selected = ScalableBitmap(this, "extra_ams_tray_mid_selected", 72);
Layout();
Refresh();
}
/*************************************************
Description:AMSRoad
**************************************************/
AMSRoad::AMSRoad() : m_road_def_color(AMS_CONTROL_GRAY500), m_road_color(AMS_CONTROL_GRAY500) {}
AMSRoad::AMSRoad(wxWindow *parent, wxWindowID id, Caninfo info, int canindex, int maxcan, const wxPoint &pos, const wxSize &size)
: AMSRoad()
{
m_info = info;
m_canindex = canindex;
// road type
auto mode = AMSRoadMode::AMS_ROAD_MODE_END;
if (m_canindex == 0 && maxcan == 1) {
m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_NONE;
} else if (m_canindex == 0 && maxcan > 1) {
m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_END;
} else if (m_canindex < (maxcan - 1)) {
m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_LEFT_RIGHT;
} else if (m_canindex == (maxcan - 1)) {
m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_LEFT;
} else if (m_canindex == -1 && maxcan == -1) {
m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_VIRTUAL_TRAY;
}
else {
m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_NONE_ANY_ROAD;
}
for (int i = 1; i <= 5; i++) {
ams_humidity_img.push_back(ScalableBitmap(this, "hum_level" + std::to_string(i) + "_light", 32));
}
for (int i = 1; i <= 5; i++) {
ams_humidity_img.push_back(ScalableBitmap(this, "hum_level" + std::to_string(i) + "_dark", 32));
}
if (m_rode_mode != AMSRoadMode::AMS_ROAD_MODE_VIRTUAL_TRAY) {
create(parent, id, pos, size);
}
else {
wxSize virtual_size(size.x - 1, size.y + 2);
create(parent, id, pos, virtual_size);
}
Bind(wxEVT_PAINT, &AMSRoad::paintEvent, this);
wxWindow::SetBackgroundColour(AMS_CONTROL_DEF_BLOCK_BK_COLOUR);
Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) {
if (m_canindex == 3 && m_show_humidity) {
auto mouse_pos = ClientToScreen(e.GetPosition());
auto rect = ClientToScreen(wxPoint(0, 0));
if (mouse_pos.x > rect.x + GetSize().x - FromDIP(40) &&
mouse_pos.y > rect.y + GetSize().y - FromDIP(40)) {
wxCommandEvent show_event(EVT_AMS_SHOW_HUMIDITY_TIPS);
wxPostEvent(GetParent()->GetParent(), show_event);
}
}
});
}
void AMSRoad::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size) { wxWindow::Create(parent, id, pos, size); }
void AMSRoad::UpdateInfo(AMSinfo amsinfo, Caninfo info, int canindex, int maxcan)
{
m_amsinfo = amsinfo;
m_info = info;
m_canindex = canindex;
if (m_canindex == 0 && maxcan == 1) {
m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_END_ONLY;
} else if (m_canindex == 0 && maxcan > 1) {
m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_END;
} else if (m_canindex < (maxcan - 1)) {
m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_LEFT_RIGHT;
} else if (m_canindex == (maxcan - 1)) {
m_rode_mode = AMSRoadMode::AMS_ROAD_MODE_LEFT;
}
m_pass_rode_mode.push_back(AMSPassRoadMode::AMS_ROAD_MODE_NONE);
Refresh();
}
void AMSRoad::OnVamsLoading(bool load, wxColour col /*= AMS_CONTROL_GRAY500*/)
{
/*m_vams_loading = load;
if(load)m_road_color = col;
Refresh();*/
}
void AMSRoad::SetPassRoadColour(wxColour col) { m_road_color = col; }
void AMSRoad::SetMode(AMSRoadMode mode)
{
m_rode_mode = mode;
Refresh();
}
void AMSRoad::paintEvent(wxPaintEvent &evt)
{
wxPaintDC dc(this);
render(dc);
}
void AMSRoad::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 AMSRoad::doRender(wxDC &dc)
{
wxSize size = GetSize();
dc.SetPen(wxPen(m_road_def_color, 2, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
// left mode
if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_LEFT) { dc.DrawRoundedRectangle(-10, -10, size.x / 2 + 10, size.y * 0.6 + 10, 4); }
// left right mode
if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_LEFT_RIGHT) {
dc.DrawLine(size.x / 2, 0, size.x / 2, size.y * 0.6 - FromDIP(1));
dc.DrawLine(0, size.y * 0.6 - 1, size.x, size.y * 0.6 - FromDIP(1));
}
// end mode
if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_END) {
dc.SetBrush(wxBrush(m_road_def_color));
dc.DrawLine(size.x / 2, -1, size.x / 2, size.y * 0.6 - 1);
dc.DrawLine(size.x / 2, size.y * 0.6, size.x / 2, size.y);
dc.DrawLine(size.x / 2, size.y * 0.6 - 1, size.x, size.y * 0.6 - 1);
}
// end mode only
if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_END_ONLY) {
dc.SetBrush(wxBrush(m_road_def_color));
dc.DrawLine(size.x / 2, -1, size.x / 2, size.y * 0.6 - 1);
dc.DrawLine(size.x / 2, size.y * 0.6, size.x / 2, size.y);
}
// end none
if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_NONE) {
dc.SetBrush(wxBrush(m_road_def_color));
dc.DrawLine(size.x / 2, -1, size.x / 2, size.y * 0.6 - 1);
dc.DrawLine(size.x / 2, size.y * 0.6, size.x / 2, size.y);
// dc.DrawLine(size.x / 2, size.y * 0.6 - 1, size.x, size.y * 0.6 - 1);
}
//virtual road
if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_VIRTUAL_TRAY) {
dc.SetBrush(wxBrush(m_road_def_color));
dc.DrawLine(size.x / 2, -1, size.x / 2, size.y - 1);
}
// mode none
// if (m_pass_rode_mode.size() == 1 && m_pass_rode_mode[0] == AMSPassRoadMode::AMS_ROAD_MODE_NONE) return;
if (m_road_color.Alpha() == 0) {dc.SetPen(wxPen(*wxWHITE, m_passroad_width, wxPENSTYLE_SOLID));}
else {dc.SetPen(wxPen(m_road_color, m_passroad_width, wxPENSTYLE_SOLID));}
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
// left pass mode
for (auto pass_mode : m_pass_rode_mode) {
switch (pass_mode) {
case AMSPassRoadMode::AMS_ROAD_MODE_LEFT: dc.DrawRoundedRectangle(-10, -10, size.x / 2 + 10, size.y * 0.6 + 10, 4); break;
case AMSPassRoadMode::AMS_ROAD_MODE_LEFT_RIGHT: dc.DrawLine(0, size.y * 0.6 - 1, size.x, size.y * 0.6 - 1); break;
case AMSPassRoadMode::AMS_ROAD_MODE_END_TOP: dc.DrawLine(size.x / 2, -1, size.x / 2, size.y * 0.6 - 1); break;
case AMSPassRoadMode::AMS_ROAD_MODE_END_BOTTOM: dc.DrawLine(size.x / 2, size.y * 0.6, size.x / 2, size.y); break;
case AMSPassRoadMode::AMS_ROAD_MODE_END_RIGHT: dc.DrawLine(size.x / 2, size.y * 0.6 - 1, size.x, size.y * 0.6 - 1); break;
default: break;
}
}
if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_VIRTUAL_TRAY && m_vams_loading) {
dc.DrawLine(size.x / 2, -1, size.x / 2, size.y - 1);
}
// end mode
if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_END || m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_END_ONLY) {
dc.SetPen(wxPen(m_road_def_color, 2, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(m_road_def_color));
dc.DrawRoundedRectangle(size.x * 0.37 / 2, size.y * 0.6 - size.y / 6, size.x * 0.63, size.y / 3, m_radius);
}
if (m_canindex == 3) /*To check, tao.wang*/{
if (m_amsinfo.ams_humidity >= 1 && m_amsinfo.ams_humidity <= 5) {m_show_humidity = true;}
else {m_show_humidity = false;}
if (m_amsinfo.ams_humidity >= 1 && m_amsinfo.ams_humidity <= 5) {
int hum_index = m_amsinfo.ams_humidity - 1;
if (wxGetApp().dark_mode()) {
hum_index += 5;
}
if (hum_index >= 0) {
dc.DrawBitmap(ams_humidity_img[hum_index].bmp(), wxPoint(size.x - FromDIP(33), size.y - FromDIP(33)));
}
}
else {
//to do ...
}
}
}
void AMSRoad::UpdatePassRoad(int tag_index, AMSPassRoadType type, AMSPassRoadSTEP step) {}
void AMSRoad::OnPassRoad(std::vector<AMSPassRoadMode> prord_list)
{
// AMS_ROAD_MODE_NONE, AMS_ROAD_MODE_LEFT, AMS_ROAD_MODE_LEFT_RIGHT, AMS_ROAD_MODE_END_TOP, AMS_ROAD_MODE_END_BOTTOM, AMS_ROAD_MODE_END_RIGHT,
// AMS_ROAD_MODE_LEFT, AMS_ROAD_MODE_LEFT_RIGHT, AMS_ROAD_MODE_END,
m_pass_rode_mode.clear();
auto left_types = std::vector<AMSPassRoadMode>{AMSPassRoadMode::AMS_ROAD_MODE_NONE, AMSPassRoadMode::AMS_ROAD_MODE_LEFT};
auto left_right_types = std::vector<AMSPassRoadMode>{AMSPassRoadMode::AMS_ROAD_MODE_NONE, AMSPassRoadMode::AMS_ROAD_MODE_LEFT, AMSPassRoadMode::AMS_ROAD_MODE_LEFT_RIGHT};
auto end_types = std::vector<AMSPassRoadMode>{AMSPassRoadMode::AMS_ROAD_MODE_NONE, AMSPassRoadMode::AMS_ROAD_MODE_END_TOP, AMSPassRoadMode::AMS_ROAD_MODE_END_BOTTOM,
AMSPassRoadMode::AMS_ROAD_MODE_END_RIGHT};
// left
if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_LEFT) {
for (auto i = 0; i < prord_list.size(); i++) {
std::vector<AMSPassRoadMode>::iterator iter = std::find(left_types.begin(), left_types.end(), prord_list[i]);
if (iter != left_types.end()) m_pass_rode_mode.push_back(prord_list[i]);
if (prord_list[i] == AMSPassRoadMode::AMS_ROAD_MODE_NONE) {
m_pass_rode_mode = std::vector<AMSPassRoadMode>{AMSPassRoadMode::AMS_ROAD_MODE_NONE};
break;
}
}
}
// left right
if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_LEFT_RIGHT) {
for (auto i = 0; i < prord_list.size(); i++) {
std::vector<AMSPassRoadMode>::iterator iter = std::find(left_right_types.begin(), left_right_types.end(), prord_list[i]);
if (iter != left_right_types.end()) m_pass_rode_mode.push_back(prord_list[i]);
if (prord_list[i] == AMSPassRoadMode::AMS_ROAD_MODE_NONE) {
m_pass_rode_mode = std::vector<AMSPassRoadMode>{AMSPassRoadMode::AMS_ROAD_MODE_NONE};
break;
}
}
}
// left end
if (m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_END || m_rode_mode == AMSRoadMode::AMS_ROAD_MODE_END_ONLY) {
for (auto i = 0; i < prord_list.size(); i++) {
std::vector<AMSPassRoadMode>::iterator iter = std::find(end_types.begin(), end_types.end(), prord_list[i]);
if (iter != end_types.end()) m_pass_rode_mode.push_back(prord_list[i]);
if (prord_list[i] == AMSPassRoadMode::AMS_ROAD_MODE_NONE) {
m_pass_rode_mode = std::vector<AMSPassRoadMode>{AMSPassRoadMode::AMS_ROAD_MODE_NONE};
break;
}
}
}
}
/*************************************************
Description:AMSRoadUpPart
**************************************************/
AMSRoadUpPart::AMSRoadUpPart() : m_road_def_color(AMS_CONTROL_GRAY500), m_road_color(AMS_CONTROL_GRAY500) {}
AMSRoadUpPart::AMSRoadUpPart(wxWindow* parent, wxWindowID id, AMSinfo info, AMSModel model, const wxPoint& pos, const wxSize& size)
: AMSRoadUpPart()
{
m_amsinfo = info;
// road type
auto mode = AMSRoadMode::AMS_ROAD_MODE_END;
m_ams_model = model;
if (m_ams_model == AMSModel::GENERIC_AMS){
create(parent, id, pos, wxSize(FromDIP(264), FromDIP(34)));
}
else{
create(parent, id, pos, wxSize(FromDIP(78), FromDIP(34)));
}
/*create(parent, id, pos, size);
this->SetMinSize(AMS_SINGLE_CAN_SIZE);
this->SetSize(AMS_SINGLE_CAN_SIZE);*/
Bind(wxEVT_PAINT, &AMSRoadUpPart::paintEvent, this);
wxWindow::SetBackgroundColour(StateColor::darkModeColorFor(AMS_CONTROL_DEF_LIB_BK_COLOUR));
}
void AMSRoadUpPart::create(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) {
wxWindow::Create(parent, id, pos, size);
SetSize(size);
SetMinSize(size);
SetBackgroundColour(AMS_CONTROL_WHITE_COLOUR);
Layout();
Fit();
Refresh();
}
void AMSRoadUpPart::UpdateInfo(AMSinfo amsinfo)
{
if (m_amsinfo != amsinfo)
{
m_amsinfo = amsinfo;
Refresh();
}
}
void AMSRoadUpPart::OnVamsLoading(bool load, wxColour col /*= AMS_CONTROL_GRAY500*/)
{
/*m_vams_loading = load;
if(load)m_road_color = col;
Refresh();*/
}
void AMSRoadUpPart::SetPassRoadColour(wxColour col)
{
if (m_road_color != col)
{
m_road_color = col;
Refresh();
}
}
void AMSRoadUpPart::SetMode(AMSRoadShowMode mode)
{
if (m_road_mode != mode)
{
m_road_mode = mode;
Refresh();
}
}
void AMSRoadUpPart::paintEvent(wxPaintEvent& evt)
{
wxPaintDC dc(this);
render(dc);
}
static wxColour _get_diff_clr(wxWindow *win, wxColour pen_clr) /*STUDIO-10093 get diff color*/
{
if (!wxGetApp().dark_mode())
{
if (pen_clr.GetRGB() == wxWHITE->GetRGB())
{
static int default_distance = 20;
pen_clr.Set(pen_clr.Red() - default_distance, pen_clr.Green() - default_distance, pen_clr.Blue() - default_distance, pen_clr.Alpha());
}
}
if (pen_clr.Alpha() == 0)/*STUDIO-10249 Make the color visible*/
{
pen_clr.Set(pen_clr.Red(), pen_clr.Green(), pen_clr.Blue(), 150);
}
return pen_clr;
}
void AMSRoadUpPart::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 AMSRoadUpPart::doRender(wxDC& dc)
{
wxSize size = GetSize();
//dc.SetPen(wxPen(m_road_def_color, 2, wxPENSTYLE_SOLID));
dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
if ((m_ams_model == N3S_AMS || m_ams_model == EXT_AMS) && m_amsinfo.cans.size() != 4){
dc.DrawLine(((float)size.x / 2), (0), ((float)size.x / 2), (size.y));
if (m_load_step == AMSPassRoadSTEP::AMS_ROAD_STEP_2 || m_load_step == AMSPassRoadSTEP::AMS_ROAD_STEP_3){
dc.SetPen(wxPen(_get_diff_clr(this, m_amsinfo.cans[m_load_slot_index].material_colour), 4, wxPENSTYLE_SOLID));
dc.DrawLine((size.x / 2), (0), (size.x / 2), (size.y));
}
}
else{
auto x_start = FromDIP(40);
auto x = x_start;
auto width = FromDIP(63);
auto height = FromDIP(21);
for (int i = 0; i < 4; i++){
dc.DrawLine((x), (0), (x), (height));
x += width;
}
x -= width;
dc.DrawLine((x_start), (height), (x), (height));
dc.DrawLine((size.x / 2), (height), (size.x / 2), (size.y));
dc.SetPen(wxPen(_get_diff_clr(this, m_amsinfo.cans[m_load_slot_index].material_colour), 4, wxPENSTYLE_SOLID));
auto temp = m_amsinfo;
if (m_load_step != AMSPassRoadSTEP::AMS_ROAD_STEP_NONE){
if (m_amsinfo.cans.size() <= m_load_slot_index || m_load_slot_index < 0){
BOOST_LOG_TRIVIAL(trace) << "up road render error";
return;
}
x = x_start + m_load_slot_index * width;
dc.DrawLine((x), (0), (x), (height));
if (x < size.x / 2){
dc.DrawLine((x), (height), (size.x / 2), (height));
}
else {
dc.DrawLine((size.x / 2), (height), (x), (height));
}
if(m_load_step == AMSPassRoadSTEP::AMS_ROAD_STEP_2 || m_load_step == AMSPassRoadSTEP::AMS_ROAD_STEP_3){
dc.DrawLine((size.x / 2), (height), (size.x / 2), (size.y));
}
}
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(wxBrush(wxColour(194, 194, 194)));
//width = 0.11 * size.x, height = 0.294 * size.y;
//dc.DrawRectangle((size.x - width) / 2, (16), (28), (10));
//dc.DrawRectangle((size.x - width) / 2, (size.y * 0.62 - height / 2), (width), (height));
dc.DrawRectangle(size.x / 2 - FromDIP(14), height - FromDIP(5), FromDIP(28), FromDIP(10));
}
// left mode
}
void AMSRoadUpPart::UpdatePassRoad(std::string ams_index, std::string slot_index, AMSPassRoadType type, AMSPassRoadSTEP step)
{
int ams_idx = atoi(ams_index.c_str());
int slot_idx = atoi(slot_index.c_str());
if (m_load_ams_index == ams_idx && m_load_slot_index == slot_idx && m_load_step == step)
{
return;
};
m_load_ams_index = ams_idx;
m_load_slot_index = slot_idx;
m_load_step = step;
Refresh();
}
void AMSRoadUpPart::OnPassRoad(std::vector<AMSPassRoadMode> prord_list)
{
// AMS_ROAD_MODE_NONE, AMS_ROAD_MODE_LEFT, AMS_ROAD_MODE_LEFT_RIGHT, AMS_ROAD_MODE_END_TOP, AMS_ROAD_MODE_END_BOTTOM, AMS_ROAD_MODE_END_RIGHT,
// AMS_ROAD_MODE_LEFT, AMS_ROAD_MODE_LEFT_RIGHT, AMS_ROAD_MODE_END,
//wait fill
}
void AMSRoadUpPart::msw_rescale() {
Layout();
Fit();
Refresh();
}
/*************************************************
Description:AMSRoadDownPart
**************************************************/
AMSRoadDownPart::AMSRoadDownPart(){}
AMSRoadDownPart::AMSRoadDownPart(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size)
: AMSRoadDownPart()
{
/*m_info = info;
m_canindex = canindex;*/
// road type
m_road_color[0] = AMS_CONTROL_GRAY500;
m_road_color[1] = AMS_CONTROL_GRAY500;
m_left_rode_mode = AMSRoadShowMode::AMS_ROAD_MODE_FOUR;
m_right_rode_mode = AMSRoadShowMode::AMS_ROAD_MODE_FOUR;
m_selected = false;
m_left_road_length = -1;
m_right_road_length = -1;
create(parent, id, pos, size);
this->SetMinSize(AMS_DOWN_ROAD_SIZE);
this->SetSize(AMS_DOWN_ROAD_SIZE);
Bind(wxEVT_PAINT, &AMSRoadDownPart::paintEvent, this);
wxWindow::SetBackgroundColour(*wxWHITE);
}
void AMSRoadDownPart::create(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) { wxWindow::Create(parent, id, pos, size); }
void AMSRoadDownPart::UpdateLeft(int nozzle_num, AMSRoadShowMode mode)
{
if (nozzle_num == m_nozzle_num && m_left_rode_mode == mode) { return;}
this->m_left_rode_mode = mode;
m_nozzle_num = nozzle_num;
Refresh();
}
void AMSRoadDownPart::UpdateRight(int nozzle_num, AMSRoadShowMode mode)
{
if (nozzle_num == m_nozzle_num && m_right_rode_mode == mode) { return; }
this->m_right_rode_mode = mode;
m_nozzle_num = nozzle_num;
Refresh();
}
void AMSRoadDownPart::OnVamsLoading(bool load, wxColour col /*= AMS_CONTROL_GRAY500*/)
{
/*m_vams_loading = load;
if(load)m_road_color = col;
Refresh();*/
}
void AMSRoadDownPart::SetPassRoadColour(bool left, wxColour col)
{
if (left)
{
if (m_road_color[DEPUTY_EXTRUDER_ID] == col)
{
return;
}
m_road_color[DEPUTY_EXTRUDER_ID] = col;
}
else
{
if (m_road_color[MAIN_EXTRUDER_ID] == col)
{
return;
}
m_road_color[MAIN_EXTRUDER_ID] = col;
}
Refresh();
}
void AMSRoadDownPart::SetShowMode(AMSRoadShowMode left_mode, AMSRoadShowMode right_mode)
{
if (m_left_rode_mode == left_mode && m_right_rode_mode == right_mode) { return; }
m_left_rode_mode = left_mode;
m_right_rode_mode = right_mode;
Refresh();
}
void AMSRoadDownPart::paintEvent(wxPaintEvent& evt)
{
wxPaintDC dc(this);
render(dc);
}
void AMSRoadDownPart::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 AMSRoadDownPart::doRender(wxDC& dc)
{
wxSize size = GetSize();
wxPoint left_nozzle_pos = wxPoint(std::ceil((float)size.x / 2 - FromDIP(8)), FromDIP(258));
wxPoint right_nozzle_pos = wxPoint(std::ceil((float)size.x / 2 + FromDIP(6)), FromDIP(258));
/*if (m_road_color.Alpha() == 0) { dc.SetPen(wxPen(*wxWHITE, m_passroad_width, wxPENSTYLE_SOLID)); }
else { dc.SetPen(wxPen(m_road_color, m_passroad_width, wxPENSTYLE_SOLID)); }*/
dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxPENSTYLE_SOLID));
auto xpos = left_nozzle_pos.x;
if (m_left_rode_mode == AMSRoadShowMode::AMS_ROAD_MODE_NONE || m_right_rode_mode == AMSRoadShowMode::AMS_ROAD_MODE_NONE){
auto length = 50;
if (m_left_rode_mode == AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE || m_right_rode_mode == AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE)
length = -13;
dc.DrawLine(left_nozzle_pos.x - FromDIP(length), (size.y / 2), (left_nozzle_pos.x), (size.y / 2));
dc.DrawLine(left_nozzle_pos.x - FromDIP(length), (0), left_nozzle_pos.x - FromDIP(length), (size.y / 2));
dc.DrawLine(left_nozzle_pos.x, size.y / 2, left_nozzle_pos.x, size.y);
}
else {
switch (m_left_rode_mode)
{
case AMSRoadShowMode::AMS_ROAD_MODE_FOUR:
dc.DrawLine(left_nozzle_pos.x - FromDIP((129)), (size.y / 2), left_nozzle_pos.x, (size.y / 2));
dc.DrawLine(left_nozzle_pos.x - FromDIP((129)), 0, left_nozzle_pos.x - FromDIP((129)), (size.y / 2));
break;
case AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE:
dc.DrawLine(left_nozzle_pos.x - FromDIP(218), (size.y / 2), left_nozzle_pos.x, (size.y / 2));
dc.DrawLine(left_nozzle_pos.x - FromDIP(110), 0, left_nozzle_pos.x - FromDIP(110), (size.y / 2));
dc.DrawLine(left_nozzle_pos.x - FromDIP(218), 0, left_nozzle_pos.x - FromDIP(218), (size.y / 2));
break;
case AMSRoadShowMode::AMS_ROAD_MODE_SINGLE:
dc.DrawLine(left_nozzle_pos.x - FromDIP(192), (size.y / 2), left_nozzle_pos.x, (size.y / 2));
dc.DrawLine(left_nozzle_pos.x - FromDIP(192), 0, left_nozzle_pos.x - FromDIP(192), (size.y / 2));
break;
case AMSRoadShowMode::AMS_ROAD_MODE_SINGLE_N3S:
dc.DrawLine(left_nozzle_pos.x - FromDIP((129)), (size.y / 2), left_nozzle_pos.x, (size.y / 2));
dc.DrawLine(left_nozzle_pos.x - FromDIP((129)), 0, left_nozzle_pos.x - FromDIP((129)), (size.y / 2));
break;
case AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE:
dc.DrawLine(left_nozzle_pos.x, 0, left_nozzle_pos.x, size.y);
break;
default:
break;
}
switch (m_right_rode_mode)
{
case AMSRoadShowMode::AMS_ROAD_MODE_FOUR:
dc.DrawLine(right_nozzle_pos.x, (size.y / 2), right_nozzle_pos.x + FromDIP(131), (size.y / 2));
dc.DrawLine(right_nozzle_pos.x + FromDIP(131), 0, right_nozzle_pos.x + FromDIP(131), (size.y / 2));
break;
case AMSRoadShowMode::AMS_ROAD_MODE_DOUBLE:
dc.DrawLine(right_nozzle_pos.x, (size.y / 2), right_nozzle_pos.x + FromDIP(218), (size.y / 2));
dc.DrawLine(right_nozzle_pos.x + FromDIP(110), 0, right_nozzle_pos.x + FromDIP(110), (size.y / 2));
dc.DrawLine(right_nozzle_pos.x + FromDIP(218), 0, right_nozzle_pos.x + FromDIP(218), (size.y / 2));
break;
case AMSRoadShowMode::AMS_ROAD_MODE_SINGLE:
dc.DrawLine(right_nozzle_pos.x, (size.y / 2), right_nozzle_pos.x + FromDIP(68), (size.y / 2));
dc.DrawLine(right_nozzle_pos.x + FromDIP(68), 0, right_nozzle_pos.x + FromDIP(68), (size.y / 2));
break;
case AMSRoadShowMode::AMS_ROAD_MODE_SINGLE_N3S:
dc.DrawLine(left_nozzle_pos.x - FromDIP((129)), (size.y / 2), left_nozzle_pos.x, (size.y / 2));
dc.DrawLine(left_nozzle_pos.x - FromDIP((129)), 0, left_nozzle_pos.x - FromDIP((129)), (size.y / 2));
break;
case AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE:
dc.DrawLine(left_nozzle_pos.x, (size.y / 2), left_nozzle_pos.x + FromDIP(145), (size.y / 2));
dc.DrawLine(left_nozzle_pos.x + FromDIP(145), 0, left_nozzle_pos.x + FromDIP(145), (size.y / 2));
break;
default:
break;
}
}
if (m_right_rode_mode != AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE){
if (m_nozzle_num == 2) {
/*dc.DrawLine(FromDIP(left_nozzle_pos.x), FromDIP(size.y / 2), FromDIP(left_nozzle_pos.x), FromDIP(size.y));
dc.DrawLine(FromDIP(right_nozzle_pos.x), FromDIP(size.y / 2), FromDIP(right_nozzle_pos.x), FromDIP(size.y));*/
dc.DrawLine((left_nozzle_pos.x), (size.y / 2), (left_nozzle_pos.x), (size.y));
dc.DrawLine((right_nozzle_pos.x), (size.y / 2), (right_nozzle_pos.x), (size.y));
}
else {
if (m_right_rode_mode != AMSRoadShowMode::AMS_ROAD_MODE_NONE && m_left_rode_mode != AMSRoadShowMode::AMS_ROAD_MODE_NONE) {
dc.DrawLine((left_nozzle_pos.x), (size.y / 2), (right_nozzle_pos.x), (size.y / 2));
}
dc.DrawLine((left_nozzle_pos.x), (size.y / 2), (left_nozzle_pos.x), (size.y));
}
}
/*if (m_nozzle_mode == AMSRoadDownPartMode::AMS_ROAD_MODE_SINGLE)
{
dc.DrawLine(left_nozzle_pos.x, left_nozzle_pos.y, FromDIP(left_nozzle_pos.x + 30), left_nozzle_pos.y);
}*/
//dc.SetBrush(wxBrush(*wxBLUE));
if (m_pass_road_right_step == AMSPassRoadSTEP::AMS_ROAD_STEP_2 || m_pass_road_right_step == AMSPassRoadSTEP::AMS_ROAD_STEP_3) {
dc.SetPen(wxPen(_get_diff_clr(this, m_road_color[0]), 4, wxPENSTYLE_SOLID));
if (m_right_road_length > 0) {
if (m_right_rode_mode == AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE){
/* dc.SetPen(wxPen(*wxRED));
dc.DrawLine(right_nozzle_pos.x, 0, right_nozzle_pos.x + , size.y / 2);
xpos = left_nozzle_pos.x;
if (m_nozzle_num >= 2) xpos = right_nozzle_pos.x;
dc.SetPen(wxPen(*wxGREEN));
dc.DrawLine(xpos, size.y / 2, right_nozzle_pos.x, size.y / 2);
dc.SetPen(wxPen(*wxYELLOW));
dc.DrawLine(xpos, size.y / 2, xpos, size.y);*/
int x = left_nozzle_pos.x;
int len = m_right_road_length;
if (m_nozzle_num == 2) {
x = right_nozzle_pos.x;
len = len - 14;
}
dc.DrawLine(((x)), (size.y / 2), x + FromDIP(len), (size.y / 2));
dc.DrawLine(x + FromDIP(len), (0), x + FromDIP(len), (size.y / 2));
dc.DrawLine((x), (size.y / 2), (x), (size.y));
}
else{
int x = left_nozzle_pos.x;
int len = m_right_road_length;
if (m_nozzle_num == 2) {
x = right_nozzle_pos.x;
len = len - 14;
}
dc.DrawLine(((x)), (size.y / 2), x + FromDIP(len), (size.y / 2));
dc.DrawLine(x + FromDIP(len), (0), x + FromDIP(len), (size.y / 2));
dc.DrawLine((x), (size.y / 2), (x), (size.y));
}
}
}
if (m_pass_road_left_step == AMSPassRoadSTEP::AMS_ROAD_STEP_2 || m_pass_road_left_step == AMSPassRoadSTEP::AMS_ROAD_STEP_3) {
dc.SetPen(wxPen(_get_diff_clr(this, m_road_color[1]), 4, wxPENSTYLE_SOLID));
if (m_left_road_length > 0) {
if (m_left_rode_mode == AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE){
dc.DrawLine(left_nozzle_pos.x, 0, left_nozzle_pos.x, size.y);
}
else{
dc.DrawLine((left_nozzle_pos.x - FromDIP(m_left_road_length)), (size.y / 2), (left_nozzle_pos.x), (size.y / 2));
dc.DrawLine((left_nozzle_pos.x), (size.y / 2), (left_nozzle_pos.x), (size.y));
dc.DrawLine(left_nozzle_pos.x - FromDIP(m_left_road_length), (0), left_nozzle_pos.x - FromDIP(m_left_road_length), (size.y / 2));
}
}
}
}
void AMSRoadDownPart::UpdatePassRoad(AMSPanelPos pos, int len, AMSPassRoadSTEP step) {
if (m_nozzle_num >= 2){
if (pos == AMSPanelPos::LEFT_PANEL){
if (m_left_road_length == len && m_pass_road_left_step == step){ return; }
m_left_road_length = len;;
m_pass_road_left_step = step;
}
else{
if (m_right_road_length == len && m_pass_road_right_step == step) { return; }
m_right_road_length = len;
m_pass_road_right_step = step;
}
}
else{
if (pos == AMSPanelPos::LEFT_PANEL) {
if (m_left_road_length == len && m_pass_road_left_step == step && m_right_road_length == -1) { return; }
m_left_road_length = len;
m_right_road_length = -1;
m_pass_road_left_step = step;
}
else {
if (m_right_road_length == len && m_pass_road_right_step == step && m_left_road_length == -1) { return; }
m_right_road_length = len;
m_left_road_length = -1;
m_pass_road_right_step = step;
}
}
Refresh();
}
void AMSRoadDownPart::msw_rescale() {
Layout();
Fit();
Refresh();
}
/*************************************************
Description:AMSPreview
**************************************************/
AMSPreview::AMSPreview() {}
AMSPreview::AMSPreview(wxWindow* parent, wxWindowID id, AMSinfo amsinfo, AMSModel itemType, const wxPoint& pos, const wxSize& size) : AMSPreview()
{
wxWindow::Create(parent, id, pos);
if (itemType == AMSModel::GENERIC_AMS || itemType == AMSModel::AMS_LITE || itemType == AMSModel::N3F_AMS) {
create(parent, id, pos, AMS_PREV_FOUR_SIZE);
}
else {
create(parent, id, pos, AMS_PREV_SINGLE_SIZE);
}
m_amsinfo = amsinfo;
m_ams_item_type = itemType;
//create(parent, id, pos, AMS_PREVIEW_SIZE);
Bind(wxEVT_PAINT, &AMSPreview::paintEvent, this);
Bind(wxEVT_ENTER_WINDOW, &AMSPreview::OnEnterWindow, this);
Bind(wxEVT_LEAVE_WINDOW, &AMSPreview::OnLeaveWindow, this);
}
void AMSPreview::Open()
{
m_open = true;
Show();
}
void AMSPreview::Close()
{
m_open = false;
Hide();
}
void AMSPreview::UpdateInfo(AMSinfo amsinfo)
{
if (m_amsinfo == amsinfo)
{
return;
}
m_amsinfo = amsinfo;
m_ams_item_type = amsinfo.ams_type;
if (m_ams_item_type == AMSModel::GENERIC_AMS || m_ams_item_type == AMSModel::AMS_LITE || m_ams_item_type == AMSModel::N3F_AMS) {
SetMinSize(AMS_PREV_FOUR_SIZE);
SetMaxSize(AMS_PREV_FOUR_SIZE);
} else {
SetMinSize(AMS_PREV_SINGLE_SIZE);
SetMaxSize(AMS_PREV_SINGLE_SIZE);
}
Refresh();
}
void AMSPreview::create(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size)
{
m_ts_bitmap_cube = ScalableBitmap(this, "ts_bitmap_cube", 12);
m_ts_bitmap_cube_dark = ScalableBitmap(this, "ts_bitmap_cube_dark", 12);
m_four_slot_bitmap = ScalableBitmap(this, "four_slot_ams_item", 32);
m_four_slot_bitmap_dark = ScalableBitmap(this, "four_slot_ams_item_dark", 32);
m_single_slot_bitmap = ScalableBitmap(this, "single_slot_ams_item", 32);
m_single_slot_bitmap_dark = ScalableBitmap(this, "single_slot_ams_item_dark", 32);
SetMinSize(size);
SetMaxSize(size);
Refresh();
}
void AMSPreview::OnEnterWindow(wxMouseEvent &evt)
{
// m_hover = true;
// Refresh();
}
void AMSPreview::OnLeaveWindow(wxMouseEvent &evt)
{
// m_hover = false;
// Refresh();
}
bool AMSPreview::IsSelected() const
{
return m_selected;
}
void AMSPreview::OnSelected()
{
if (!wxWindow::IsEnabled()) { return; }
m_selected = true;
Refresh();
}
void AMSPreview::UnSelected()
{
m_selected = false;
Refresh();
}
bool AMSPreview::Enable(bool enable) { return wxWindow::Enable(enable); }
void AMSPreview::paintEvent(wxPaintEvent &evt)
{
wxPaintDC dc(this);
render(dc);
}
void AMSPreview::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 AMSPreview::doRender(wxDC &dc)
{
wxSize size = GetSize();
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
// draw background
if (wxGetApp().dark_mode())
{
dc.SetBrush(StateColor::darkModeColorFor(*wxWHITE));
}
else
{
dc.SetBrush(AMS_CONTROL_DEF_BLOCK_BK_COLOUR);
}
dc.DrawRoundedRectangle(0, 0, size.x, size.y, 0);
// draw container
auto color = *wxWHITE;
dc.SetBrush(StateColor::darkModeColorFor(color));
dc.DrawRoundedRectangle(0, 0, size.x, size.y, FromDIP(3));
auto left = 0;
//four slot
if (m_ams_item_type != AMSModel::EXT_AMS && m_ams_item_type != AMSModel::N3S_AMS){
left = FromDIP(8);
for (std::vector<Caninfo>::iterator iter = m_amsinfo.cans.begin(); iter != m_amsinfo.cans.end(); iter++) {
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
if (wxWindow::IsThisEnabled()) {
wxColour color = iter->material_colour;
change_the_opacity(color);
dc.SetBrush(wxBrush(color));
}
else {
dc.SetBrush(AMS_CONTROL_DISABLE_COLOUR);
}
if (iter->material_cols.size() > 1) {
int fleft = left;
int gwidth = (AMS_ITEM_CUBE_SIZE.x / (iter->material_cols.size() - 1));
if (iter->ctype == 0) {
for (int i = 0; i < iter->material_cols.size() - 1; i++) {
if (fleft + gwidth > (AMS_ITEM_CUBE_SIZE.x)) {
gwidth = fleft + AMS_ITEM_CUBE_SIZE.x - fleft;
}
auto rect = wxRect(fleft, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, gwidth, AMS_ITEM_CUBE_SIZE.y);
fill_gradient_rect_east(dc, rect, iter->material_cols[i], iter->material_cols[i + 1]);
fleft += gwidth;
}
}
else {
int cols_size = iter->material_cols.size();
for (int i = 0; i < cols_size; i++) {
dc.SetBrush(wxBrush(iter->material_cols[i]));
int x = left + AMS_ITEM_CUBE_SIZE.x * i / cols_size;
dc.DrawRectangle(x, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, AMS_ITEM_CUBE_SIZE.x / cols_size, AMS_ITEM_CUBE_SIZE.y);
}
}
}
else {
if (iter->material_colour.Alpha() == 0) {
if (wxGetApp().dark_mode())
{
dc.DrawBitmap(m_ts_bitmap_cube_dark.bmp(), left - FromDIP(1), (size.y - m_ts_bitmap_cube_dark.GetBmpHeight()) / 2);
}
else
{
dc.DrawBitmap(m_ts_bitmap_cube.bmp(), left - FromDIP(1), (size.y - m_ts_bitmap_cube.GetBmpHeight()) / 2);
}
}
else {
wxRect rect(left, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, AMS_ITEM_CUBE_SIZE.x, AMS_ITEM_CUBE_SIZE.y);
if (iter->material_state == AMSCanType::AMS_CAN_TYPE_EMPTY) {
dc.SetPen(wxPen(wxColor(0, 0, 0)));
dc.DrawLine(rect.GetRight() - FromDIP(1), rect.GetTop() + FromDIP(1), rect.GetLeft() + FromDIP(1), rect.GetBottom() - FromDIP(1));
}
else {
dc.DrawRoundedRectangle(rect, 2);
}
}
}
left += AMS_ITEM_CUBE_SIZE.x;
}
//auto pot = wxPoint((size.x - m_four_slot_bitmap.GetBmpSize().x) / 2, (size.y - m_four_slot_bitmap.GetBmpSize().y) / 2);
if (wxGetApp().dark_mode())
{
dc.DrawBitmap(m_four_slot_bitmap_dark.bmp(), wxPoint(0, 0));
}
else
{
dc.DrawBitmap(m_four_slot_bitmap.bmp(), wxPoint(0, 0));
}
}
//single slot
else if (m_amsinfo.cans.size() == 1) {
auto iter = m_amsinfo.cans[0];
// ORCA dont add additional background. four tray already doesnt use one
//dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
//dc.SetBrush(StateColor::darkModeColorFor(AMS_CONTROL_DEF_BLOCK_BK_COLOUR));
//wxSize rec_size = wxSize(FromDIP(16), FromDIP(24));
//dc.DrawRoundedRectangle((size.x - rec_size.x) / 2, (size.y - rec_size.y) / 2, rec_size.x, rec_size.y, FromDIP(2));
if (iter.material_cols.size() > 1)
{
int fleft = (size.x - AMS_ITEM_CUBE_SIZE.x) / 2;
float total_width = AMS_ITEM_CUBE_SIZE.x;
int gwidth = (total_width / (iter.material_cols.size()));
if (iter.ctype == 0) {
for (int i = 0; i < iter.material_cols.size() - 1; i++) {
if ((fleft + gwidth) > (AMS_ITEM_CUBE_SIZE.x)) {
gwidth = (fleft + AMS_ITEM_CUBE_SIZE.x) - fleft;
}
auto rect = wxRect(fleft, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, gwidth, AMS_ITEM_CUBE_SIZE.y);
fill_gradient_rect_east(dc, rect, iter.material_cols[i], iter.material_cols[i + 1]);
fleft += gwidth;
}
}
else {
int cols_size = iter.material_cols.size();
for (int i = 0; i < cols_size; i++) {
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(wxBrush(iter.material_cols[i]));
float x = (size.x - AMS_ITEM_CUBE_SIZE.x) / 2 + total_width * i / cols_size;
dc.DrawRectangle(x, (size.y - AMS_ITEM_CUBE_SIZE.y) / 2, total_width / cols_size, AMS_ITEM_CUBE_SIZE.y);
}
}
}
else {
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(iter.material_colour);
//dc.SetBrush(*wxGREEN);
if (m_ams_item_type == AMSModel::N3S_AMS) {
auto rect = wxRect(((size.x - AMS_ITEM_CUBE_SIZE.x) / 2), ((size.y - AMS_ITEM_CUBE_SIZE.y) / 2), (AMS_ITEM_CUBE_SIZE.x), (AMS_ITEM_CUBE_SIZE.y));
dc.DrawRoundedRectangle(rect, 0);
} else {
auto rect = wxRect(((size.x - AMS_ITEM_CUBE_SIZE2.x) / 2), ((size.y - AMS_ITEM_CUBE_SIZE2.y) / 2), (AMS_ITEM_CUBE_SIZE2.x), (AMS_ITEM_CUBE_SIZE2.y));
dc.DrawRoundedRectangle(rect, FromDIP(3));
}
}
if (m_ams_item_type == AMSModel::N3S_AMS) {
//auto pot = wxPoint(((size.x - m_single_slot_bitmap.GetBmpSize().x) / 2), ((size.y - m_single_slot_bitmap.GetBmpSize().y) / 2));
if (wxGetApp().dark_mode())
{
dc.DrawBitmap(m_single_slot_bitmap_dark.bmp(), wxPoint(0, 0));
}
else
{
dc.DrawBitmap(m_single_slot_bitmap.bmp(), wxPoint(0, 0));
}
}
if (((iter.material_colour.Red() >= 238 && iter.material_colour.Green() >= 238 && iter.material_colour.Blue() >= 238)
|| iter.material_colour.Alpha() == 0) && m_ams_item_type == AMSModel::EXT_AMS) {
dc.SetPen(wxPen(AMS_CONTROL_GRAY500));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
auto rect = wxRect(((size.x - AMS_ITEM_CUBE_SIZE2.x) / 2), ((size.y - AMS_ITEM_CUBE_SIZE2.y) / 2), (AMS_ITEM_CUBE_SIZE2.x), (AMS_ITEM_CUBE_SIZE2.y));
dc.DrawRoundedRectangle(rect, FromDIP(3));
}
}
auto border_colour = AMS_CONTROL_BRAND_COLOUR;
if (!wxWindow::IsEnabled()) { border_colour = AMS_CONTROL_DISABLE_COLOUR; }
if (m_hover) {
dc.SetPen(wxPen(border_colour, 1));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
dc.DrawRoundedRectangle(0, 0, size.x, size.y, 3);
}
if (m_selected) {
dc.SetPen(wxPen(border_colour, 1));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
dc.DrawRoundedRectangle(0, 0, size.x, size.y, 3);
}
}
void AMSPreview::msw_rescale()
{
m_ts_bitmap_cube.msw_rescale();
m_ts_bitmap_cube_dark.msw_rescale();
m_four_slot_bitmap.msw_rescale();
m_four_slot_bitmap_dark.msw_rescale();
m_single_slot_bitmap.msw_rescale();
m_single_slot_bitmap_dark.msw_rescale();
Refresh();
}
/*************************************************
Description:AMSHumidity
**************************************************/
AMSHumidity::AMSHumidity() {}
AMSHumidity::AMSHumidity(wxWindow* parent, wxWindowID id, AMSinfo info, const wxPoint& pos, const wxSize& size)
: AMSHumidity()
{
create(parent, id, pos, wxDefaultSize);
for (int i = 1; i <= 5; i++) { ams_humidity_imgs.push_back(ScalableBitmap(this, "hum_level" + std::to_string(i) + "_light", 20));}
for (int i = 1; i <= 5; i++) { ams_humidity_dark_imgs.push_back(ScalableBitmap(this, "hum_level" + std::to_string(i) + "_dark", 20));}
for (int i = 1; i <= 5; i++) { ams_humidity_no_num_imgs.push_back(ScalableBitmap(this, "hum_level" + std::to_string(i) + "_no_num_light", 16)); }
for (int i = 1; i <= 5; i++) { ams_humidity_no_num_dark_imgs.push_back(ScalableBitmap(this, "hum_level" + std::to_string(i) + "_no_num_dark", 16)); }
ams_sun_img = ScalableBitmap(this, "ams_drying", 20);
ams_drying_img = ScalableBitmap(this, "ams_is_drying", 20);
Bind(wxEVT_PAINT, &AMSHumidity::paintEvent, this);
//wxWindow::SetBackgroundColour(AMS_CONTROL_DEF_HUMIDITY_BK_COLOUR);
Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) {
int humidity_display_idx = m_amsinfo.get_humidity_display_idx();
if (1 <= humidity_display_idx && humidity_display_idx <= 5) {
auto mouse_pos = ClientToScreen(e.GetPosition());
auto rect = ClientToScreen(wxPoint(0, 0));
if (mouse_pos.x > rect.x &&
mouse_pos.y > rect.y) {
wxCommandEvent show_event(EVT_AMS_SHOW_HUMIDITY_TIPS);
uiAmsHumidityInfo *info = new uiAmsHumidityInfo;
info->ams_id = m_amsinfo.ams_id;
info->ams_type = m_amsinfo.ams_type;
info->humidity_display_idx = m_amsinfo.get_humidity_display_idx();
info->humidity_percent = m_amsinfo.humidity_raw;
info->left_dry_time = m_amsinfo.left_dray_time;
info->current_temperature = m_amsinfo.current_temperature;
show_event.SetClientData(info);
wxPostEvent(GetParent()->GetParent(), show_event);
}
}
});
UpdateInfo(info);
}
void AMSHumidity::create(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) {
wxWindow::Create(parent, id, pos, size);
SetBackgroundColour(StateColor::darkModeColorFor(AMS_CONTROL_DEF_LIB_BK_COLOUR));
}
void AMSHumidity::UpdateInfo(AMSinfo amsinfo)
{
if (m_amsinfo != amsinfo)
{
m_amsinfo = amsinfo;
update_size();
Refresh();
}
}
void AMSHumidity::update_size()
{
wxSize size;
if (m_amsinfo.ams_type == AMSModel::GENERIC_AMS) {
size = AMS_HUMIDITY_NO_PERCENT_SIZE;
} else {
size = AMS_HUMIDITY_SIZE;
}
if (!m_amsinfo.support_drying()) { size.x -= AMS_HUMIDITY_DRY_WIDTH; }
SetMaxSize(size);
SetMinSize(size);
SetSize(size);
}
void AMSHumidity::paintEvent(wxPaintEvent& evt)
{
wxPaintDC dc(this);
render(dc);
}
void AMSHumidity::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 AMSHumidity::doRender(wxDC& dc)
{
wxSize size = GetSize();
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(wxBrush(StateColor::darkModeColorFor(AMS_CONTROL_DEF_BLOCK_BK_COLOUR)));
// left mode
int humidity_display_idx = m_amsinfo.get_humidity_display_idx();
if (1 <= humidity_display_idx && humidity_display_idx <= 5) {
//background
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetBrush(wxBrush(StateColor::darkModeColorFor(AMS_CONTROL_DEF_BLOCK_BK_COLOUR)));
dc.DrawRoundedRectangle(0, 0, (size.x), (size.y), (size.y / 2));
wxPoint pot;
if (m_amsinfo.ams_type == AMSModel::GENERIC_AMS) /*image with stage*/
{
ScalableBitmap hum_img;
if (!wxGetApp().dark_mode()) {
hum_img = ams_humidity_imgs[humidity_display_idx - 1];
} else {
hum_img = ams_humidity_dark_imgs[humidity_display_idx - 1];
}
pot = wxPoint((size.x - hum_img.GetBmpWidth()) / 2, ((size.y - hum_img.GetBmpSize().y) / 2));
dc.DrawBitmap(hum_img.bmp(), pot);
pot.x = pot.x + hum_img.GetBmpSize().x;
}
else if (m_amsinfo.humidity_raw != -1) /*image with no number + percentage*/
{
// hum image
ScalableBitmap hum_img;
if (!wxGetApp().dark_mode()) {
hum_img = ams_humidity_no_num_imgs[humidity_display_idx - 1];
} else {
hum_img = ams_humidity_no_num_dark_imgs[humidity_display_idx - 1];
}
pot = wxPoint(FromDIP(5), ((size.y - hum_img.GetBmpSize().y) / 2));
dc.DrawBitmap(hum_img.bmp(), pot);
pot.x += hum_img.GetBmpSize().x + FromDIP(3);
// percentage
wxString hum_percentage(std::to_string(m_amsinfo.humidity_raw));
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
dc.SetFont(Label::Body_14);
dc.SetTextForeground(StateColor::darkModeColorFor(AMS_CONTROL_BLACK_COLOUR));
WxFontUtils::get_suitable_font_size(0.7 * size.GetHeight(), dc);
auto tsize1 = dc.GetMultiLineTextExtent(hum_percentage);
pot.y = (size.y - tsize1.y) / 2;
dc.DrawText(hum_percentage, pot);
pot.x += (tsize1.x + FromDIP(3));
// percentage sign
dc.SetFont(Label::Body_12);
WxFontUtils::get_suitable_font_size(0.5 * size.GetHeight(), dc);
auto tsize2 = dc.GetMultiLineTextExtent(_L("%"));
pot.y = pot.y + ((tsize1.y - tsize2.y) / 2) + FromDIP(2);
dc.DrawText(_L("%"), pot);
pot.x += tsize2.x;
}
if (m_amsinfo.support_drying())
{
pot.x += FromDIP(2);// spacing
// vertical line
dc.SetPen(wxPen(wxColour(194, 194, 194)));
dc.SetBrush(wxBrush(wxColour(194, 194, 194)));
dc.DrawLine(pot.x, GetSize().y / 2 - FromDIP(10), pot.x, GetSize().y / 2 + FromDIP(10));
// sun image
dc.SetPen(wxPen(*wxTRANSPARENT_PEN));
pot.x += ((size.GetWidth() - pot.x) - ams_drying_img.GetBmpWidth()) / 2;// spacing
if (m_amsinfo.left_dray_time > 0) {
pot.y = (size.y - ams_drying_img.GetBmpHeight()) / 2;
dc.DrawBitmap(ams_drying_img.bmp(), pot);
} else {
pot.y = (size.y - ams_sun_img.GetBmpHeight()) / 2;
dc.DrawBitmap(ams_sun_img.bmp(), pot);
}
}
}
else {
//to do ...
}
}
void AMSHumidity::msw_rescale() {
for (auto& img : ams_humidity_imgs) { img.msw_rescale();}
for (auto& img : ams_humidity_dark_imgs) { img.msw_rescale(); }
for (auto &img : ams_humidity_no_num_imgs) { img.msw_rescale(); }
for (auto &img : ams_humidity_no_num_dark_imgs) { img.msw_rescale(); }
ams_sun_img.msw_rescale();
ams_drying_img.msw_rescale();
Layout();
Refresh();
}
/*************************************************
Description:AmsItem
**************************************************/
AmsItem::AmsItem(wxWindow *parent,AMSinfo info, AMSModel model, AMSPanelPos pos)
{
m_bitmap_extra_framework = ScalableBitmap(this, "ams_extra_framework_mid_new", 134);
SetDoubleBuffered(true);
m_ams_model = model;
m_info = info;
m_panel_pos = pos;
if (m_ams_model == AMSModel::GENERIC_AMS){
wxWindow::Create(parent, wxID_ANY, wxDefaultPosition, AMS_CANS_WINDOW_SIZE);
SetSize(AMS_CANS_WINDOW_SIZE);
SetMinSize(AMS_CANS_WINDOW_SIZE);
SetMaxSize(AMS_CANS_WINDOW_SIZE);
}
else{
wxWindow::Create(parent, wxID_ANY, wxDefaultPosition, AMS_SINGLE_CAN_SIZE);
SetSize(AMS_SINGLE_CAN_SIZE);
SetMinSize(AMS_SINGLE_CAN_SIZE);
SetMaxSize(AMS_SINGLE_CAN_SIZE);
}
create(parent);
SetBackgroundColour(StateColor::darkModeColorFor(AMS_CONTROL_DEF_LIB_BK_COLOUR));
Bind(wxEVT_PAINT, &AmsItem::paintEvent, this);
}
AmsItem::~AmsItem()
{
}
void AmsItem::create(wxWindow *parent)
{
Freeze();
//if (m_ams_model == AMSModel::GENERIC_AMS)
if (m_ams_model != AMSModel::AMS_LITE) {
sizer_can = new wxBoxSizer(wxHORIZONTAL);
sizer_item = new wxBoxSizer(wxVERTICAL);
auto it = m_info.cans.begin();
for (; it != m_info.cans.end(); it++) {
AddCan(*it, m_can_count, m_info.cans.size(), sizer_can);
m_can_count++;
}
it = m_info.cans.begin();
//auto road_panel = new wxWindow(this, wxID_ANY);
//auto road_panel = new wxPanel(this, wxID_ANY);
//road_panel->SetSize(AMS_CAN_ROAD_SIZE);
//road_panel->SetMinSize(AMS_CAN_ROAD_SIZE);
if (m_ams_model == AMSModel::GENERIC_AMS || m_ams_model == AMSModel::N3F_AMS || m_ams_model == AMSModel::N3S_AMS){
m_humidity = new AMSHumidity(this, wxID_ANY, m_info);
sizer_item->Add(m_humidity, 0, wxALIGN_CENTER_HORIZONTAL, 0);
}
else{
if (m_ams_model == EXT_AMS){
m_ext_image = new AMSExtImage(this, m_panel_pos, 1, true);
sizer_item->Add(m_ext_image, 0, wxALIGN_CENTER, 0);
}
}
m_panel_road = new AMSRoadUpPart(this, wxID_ANY, m_info, m_ams_model);
sizer_item->Add(sizer_can, 0, wxALIGN_CENTER_HORIZONTAL, 0);
//sizer_item->Add(m_panel_road, 0, wxALIGN_CENTER_HORIZONTAL, 0);
sizer_item->Add(m_panel_road, 1, wxEXPAND);
SetSizer(sizer_item);
}
else{
sizer_can_extra = new wxGridSizer(2, 2, FromDIP(18), FromDIP(20));
//sizer_can_extra = new wxGridSizer(2, 2, 20, 20);
sizer_item = new wxBoxSizer(wxVERTICAL);
if (m_info.cans.size() == GENERIC_AMS_SLOT_NUM){
AddLiteCan(m_info.cans[0], 0, sizer_can_extra);
AddLiteCan(m_info.cans[3], 3, sizer_can_extra);
AddLiteCan(m_info.cans[1], 1, sizer_can_extra);
AddLiteCan(m_info.cans[2], 2, sizer_can_extra);
m_can_count = GENERIC_AMS_SLOT_NUM;
}
sizer_item->Add(sizer_can_extra, 0, wxALIGN_CENTER_HORIZONTAL | wxALIGN_TOP, 0);
//sizer_item->Add(sizer_can_extra, 0, wxALIGN_CENTER);
SetSizer(sizer_item);
}
Layout();
Fit();
Thaw();
//Refresh();
}
void AmsItem::AddCan(Caninfo caninfo, int canindex, int maxcan, wxBoxSizer* sizer)
{
auto amscan = new wxWindow(this, wxID_ANY);
amscan->SetSize(wxSize(FromDIP(52), FromDIP(109)));
amscan->SetMinSize(wxSize(FromDIP(52), FromDIP(109)));
amscan->SetBackgroundColour(StateColor::darkModeColorFor(AMS_CONTROL_DEF_LIB_BK_COLOUR));
//amscan->SetBackgroundColour(wxTRANSPARENT);
wxBoxSizer* m_sizer_ams = new wxBoxSizer(wxVERTICAL);
AMSrefresh* m_panel_refresh;
if (m_ams_model != AMSModel::EXT_AMS)
{
m_panel_refresh = new AMSrefresh(amscan, m_info.ams_id, m_can_count, caninfo);
m_can_refresh_list[caninfo.can_id] = m_panel_refresh;
}
else if (m_ams_model == AMSModel::EXT_AMS){
m_ext_text = new AMSExtText(amscan, wxID_ANY);
}
AMSLib* m_panel_lib = nullptr;
if (m_ams_model == AMSModel::EXT_AMS && m_info.ext_type == AMSModelOriginType::LITE_EXT) {
m_panel_lib = new AMSLib(amscan, m_info.ams_id, caninfo, AMSModelOriginType::LITE_EXT);
}
else{
m_panel_lib = new AMSLib(amscan, m_info.ams_id, caninfo);
}
try{
m_panel_lib->Bind(wxEVT_LEFT_DOWN, [this, canindex](wxMouseEvent& ev) {
m_canlib_selection = canindex;
// m_canlib_id = caninfo.can_id;
for (auto lib_it : m_can_lib_list) {
AMSLib* lib = lib_it.second;
if (lib->m_can_index == m_canlib_selection) {
wxCommandEvent evt(EVT_AMS_UNSELETED_VAMS);
evt.SetString(m_info.ams_id);
wxPostEvent(GetParent()->GetParent(), evt);
lib->OnSelected();
}
else {
lib->UnSelected();
}
}
ev.Skip();
});
m_panel_lib->m_ams_model = m_ams_model;
m_panel_lib->m_ams_id = m_info.ams_id;
m_panel_lib->m_slot_id = caninfo.can_id;
m_panel_lib->m_info.can_id = caninfo.can_id;
m_panel_lib->m_can_index = canindex;
}
catch (...)
{
;
}
//auto m_panel_road = new AMSRoad(amscan, wxID_ANY, caninfo, canindex, maxcan, wxDefaultPosition, AMS_CAN_ROAD_SIZE);
if (m_ams_model != AMSModel::AMS_LITE && m_ams_model != AMSModel::EXT_AMS) {
m_sizer_ams->Add(0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 0);
m_sizer_ams->Add(m_panel_refresh, 0, wxALIGN_CENTER_HORIZONTAL | wxDOWN, FromDIP(4));
m_sizer_ams->Add(m_panel_lib, 0, wxALIGN_CENTER_HORIZONTAL, 0);
}
else
{
if (m_ams_model == AMSModel::EXT_AMS){
m_sizer_ams->Add(0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 0);
//m_sizer_ams->Add(m_panel_text, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, 4);
m_sizer_ams->Add(m_ext_text, 0, wxALIGN_CENTER_HORIZONTAL | wxDOWN, FromDIP(4));
m_sizer_ams->Add(m_panel_lib, 0, wxALIGN_CENTER_HORIZONTAL, 0);
}
}
amscan->SetSizer(m_sizer_ams);
amscan->Layout();
amscan->Fit();
sizer->Add(amscan, 0, wxUP | wxLEFT | wxRIGHT, FromDIP(5));
m_can_lib_list[caninfo.can_id] = m_panel_lib;
//m_can_road_list[caninfo.can_id] = m_panel_road;
}
void AmsItem::AddLiteCan(Caninfo caninfo, int canindex, wxGridSizer* sizer)
{
auto amscan = new wxWindow(this, wxID_ANY);
/*amscan->SetSize(wxSize(FromDIP(49), FromDIP(72)));
amscan->SetMinSize(wxSize(FromDIP(49), FromDIP(72)));
amscan->SetMaxSize(wxSize(FromDIP(49), FromDIP(72)));*/
amscan->SetSize(wxSize(FromDIP(80), FromDIP(72)));
amscan->SetMinSize(wxSize(FromDIP(80), FromDIP(72)));
amscan->SetMaxSize(wxSize(FromDIP(80), FromDIP(72)));
amscan->SetBackgroundColour(StateColor::darkModeColorFor(AMS_CONTROL_DEF_LIB_BK_COLOUR));
wxBoxSizer* m_sizer_ams = new wxBoxSizer(wxHORIZONTAL);
auto m_panel_lib = new AMSLib(amscan, m_info.ams_id, caninfo);
m_panel_lib->Bind(wxEVT_LEFT_DOWN, [this, canindex](wxMouseEvent& ev) {
m_canlib_selection = canindex;
// m_canlib_id = caninfo.can_id;
for (auto lib_it : m_can_lib_list) {
AMSLib* lib = lib_it.second;
if (lib->m_can_index == m_canlib_selection) {
wxCommandEvent evt(EVT_AMS_UNSELETED_VAMS);
evt.SetString(m_info.ams_id);
wxPostEvent(GetParent()->GetParent(), evt);
lib->OnSelected();
}
else {
lib->UnSelected();
}
}
ev.Skip();
});
auto ams_refresh = new AMSrefresh(amscan, m_info.ams_id, canindex, caninfo);
m_can_refresh_list[caninfo.can_id] = ams_refresh;
m_panel_lib->m_ams_model = m_ams_model;
m_panel_lib->m_ams_id = m_info.ams_id;
m_panel_lib->m_slot_id = caninfo.can_id;
m_panel_lib->m_info.can_id = caninfo.can_id;
m_panel_lib->m_can_index = canindex;
//auto m_panel_road = new AMSRoad(amscan, wxID_ANY, caninfo, canindex, maxcan, wxDefaultPosition, AMS_CAN_ROAD_SIZE);
if (caninfo.can_id == "0" || caninfo.can_id == "1") {
m_sizer_ams->Add(ams_refresh, 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 0);
}
switch (canindex){
case 0:
m_sizer_ams->Add(m_panel_lib, 0, wxALIGN_RIGHT | wxALIGN_BOTTOM, 0);
break;
case 1:
m_sizer_ams->Add(m_panel_lib, 0, wxALIGN_RIGHT | wxALIGN_TOP, 0);
break;
case 2:
m_sizer_ams->Add(m_panel_lib, 0, wxALIGN_LEFT | wxALIGN_TOP, 0);
break;
case 3:
m_sizer_ams->Add(m_panel_lib, 0, wxALIGN_LEFT | wxALIGN_BOTTOM, 0);
break;
default:
break;
}
if (caninfo.can_id == "2" || caninfo.can_id == "3") {
m_sizer_ams->Add(ams_refresh, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL, 0);
}
amscan->SetSizer(m_sizer_ams);
amscan->Layout();
amscan->Fit();
sizer->Add(amscan, 0, wxUP | wxLEFT | wxRIGHT, FromDIP(5));
m_can_lib_list[caninfo.can_id] = m_panel_lib;
//m_can_road_list[caninfo.can_id] = m_panel_road;
}
void AmsItem::UpdateInfo(AMSinfo info)
{
if (m_info == info)
{
return;
}
m_info = info;
m_can_count = info.cans.size();
if (m_humidity)
{
m_humidity->UpdateInfo(m_info);
}
for (int i = 0; i < m_can_count; i++) {
auto it = m_can_refresh_list.find(std::to_string(i));
if (it == m_can_refresh_list.end()) break;
auto refresh = it->second;
if (refresh != nullptr){
refresh->UpdateInfo(info.ams_id, info.cans[i]);
refresh->Show();
}
}
for (int i = 0; i < m_can_lib_list.size(); i++) {
AMSLib* lib = m_can_lib_list[std::to_string(i)];
if (lib != nullptr){
if (i < m_can_count){
lib->UpdateInfo(info.cans[i], info.ams_id);
lib->Show();
}
else{
lib->Hide();
}
}
}
if (m_panel_road != nullptr){
m_panel_road->UpdateInfo(m_info);
}
Layout();
}
void AmsItem::SetDefSelectCan()
{
for (auto lib_it : m_can_lib_list) {
AMSLib* lib = lib_it.second;
m_canlib_selection =lib->m_can_index;
m_canlib_id = lib->m_info.can_id;
SelectCan(m_canlib_id);
break;
}
}
void AmsItem::SelectCan(std::string canid)
{
for (auto lib_it : m_can_lib_list) {
AMSLib* lib = lib_it.second;
if (lib->m_info.can_id == canid) {
m_canlib_selection = lib->m_can_index;
}
}
m_canlib_id = canid;
for (auto lib_it : m_can_lib_list) {
AMSLib* lib = lib_it.second;
if (lib->m_info.can_id == m_canlib_id) {
wxCommandEvent evt(EVT_AMS_UNSELETED_VAMS);
evt.SetString(m_info.ams_id);
wxPostEvent(GetParent()->GetParent(), evt);
lib->OnSelected();
} else {
lib->UnSelected();
}
}
}
wxColour AmsItem::GetTagColr(wxString canid)
{
auto tag_colour = *wxWHITE;
for (auto lib_it : m_can_lib_list) {
AMSLib* lib = lib_it.second;
if (canid == lib->m_info.can_id) tag_colour = lib->GetLibColour();
}
return tag_colour;
}
void AmsItem::SetAmsStepExtra(wxString canid, AMSPassRoadType type, AMSPassRoadSTEP step)
{
if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1 || step == AMSPassRoadSTEP::AMS_ROAD_STEP_1) {
SetAmsStep(canid.ToStdString());
}else if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2 || step == AMSPassRoadSTEP::AMS_ROAD_STEP_2) {
SetAmsStep(canid.ToStdString());
}else if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3 || step == AMSPassRoadSTEP::AMS_ROAD_STEP_3) {
SetAmsStep(canid.ToStdString());
}else if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) {
SetAmsStep("");
}
}
void AmsItem::SetAmsStep(std::string amsid, std::string canid, AMSPassRoadType type, AMSPassRoadSTEP step)
{
if (m_panel_road){
m_panel_road->UpdatePassRoad(amsid, canid, type, step);
}
if (m_info.ams_id != amsid){
return;
}
SetAmsStepExtra(canid, type, step);
/*if (m_info.ams_type == AMSModel::EXTRA_AMS){
SetAmsStepExtra(canid, type, step);
}*/
/*if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE){
m_road_canid = "";
}
else{
m_road_canid = canid;
}*/
}
//void AmsItem::SetAmsStep(wxString amsid, wxString canid, AMSPassRoadType type, AMSPassRoadSTEP step)
//{
//
// if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) {
// for (auto road_it : m_can_road_list) {
// AMSRoad* road = road_it.second;
// auto pr = std::vector<AMSPassRoadMode>{};
// pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_NONE);
// road->OnPassRoad(pr);
// }
//
// return;
// }
//
//
// auto tag_can_index = -1;
// for (auto road_it : m_can_road_list) {
// AMSRoad* road = road_it.second;
// if (canid == road->m_info.can_id) { tag_can_index = road->m_canindex; }
// }
// if (tag_can_index == -1) return;
//
// // get colour
// auto tag_colour = *wxWHITE;
// for (auto lib_it : m_can_lib_list) {
// AMSLib* lib = lib_it.second;
// if (canid == lib->m_info.can_id) tag_colour = lib->GetLibColour();
// }
//
// // unload
// if (type == AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD) {
// for (auto road_it : m_can_road_list) {
// AMSRoad* road = road_it.second;
//
// auto index = road->m_canindex;
// auto pr = std::vector<AMSPassRoadMode>{};
//
// pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_BOTTOM);
// if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_2) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_BOTTOM); }
//
// if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_3) {
// if (index == tag_can_index && index > 0) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_LEFT); }
// if (index < tag_can_index && index > 0) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_LEFT_RIGHT); }
// if (index == 0 && tag_can_index == index) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_TOP); }
// if (index == 0 && tag_can_index > index) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_RIGHT); }
// }
//
// road->SetPassRoadColour(tag_colour);
// road->OnPassRoad(pr);
// }
// }
//
// // load
// if (type == AMSPassRoadType::AMS_ROAD_TYPE_LOAD) {
// for (auto road_it : m_can_road_list) {
// AMSRoad* road = road_it.second;
//
// auto index = road->m_canindex;
// auto pr = std::vector<AMSPassRoadMode>{};
//
// if (index == tag_can_index && index > 0) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_LEFT); }
// if (index < tag_can_index && index > 0) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_LEFT_RIGHT); }
// if (index == 0 && tag_can_index == index) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_TOP); }
// if (index == 0 && tag_can_index > index) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_RIGHT); }
//
// if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_2) { pr.push_back(AMSPassRoadMode::AMS_ROAD_MODE_END_BOTTOM); }
//
// road->SetPassRoadColour(tag_colour);
// road->OnPassRoad(pr);
// }
// }
//}
void AmsItem::SetAmsStep(std::string can_id)
{
if (m_road_canid != can_id) {
m_road_canid = can_id;
Refresh();
}
for (auto lib : m_can_lib_list){
if (lib.second->m_info.can_id == can_id){
lib.second->on_pass_road(true);
}
else{
lib.second->on_pass_road(false);
}
}
}
void AmsItem::PlayRridLoading(wxString canid)
{
for (auto refresh_it : m_can_refresh_list) {
AMSrefresh* refresh = refresh_it.second;
if (refresh->GetCanId() == canid) { refresh->PlayLoading(); }
}
}
std::string AmsItem::GetCurrentCan()
{
if (m_canlib_selection < 0)
return "";
return wxString::Format("%d", m_canlib_selection).ToStdString();
}
void AmsItem::paintEvent(wxPaintEvent& evt)
{
wxPaintDC dc(this);
render(dc);
}
void AmsItem::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 AmsItem::doRender(wxDC& dc)
{
wxSize size = GetSize();
//road for extra
if (m_ams_model == AMSModel::AMS_LITE) {
dc.DrawBitmap(m_bitmap_extra_framework.bmp(), (size.x - m_bitmap_extra_framework.GetBmpSize().x) / 2, (size.y - m_bitmap_extra_framework.GetBmpSize().y) / 2 - FromDIP(4));
// A1
dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
RenderLiteRoad(dc, size);
}
}
// Orca: toggle the road segment below the item (m_panel_road). Used to drop the external-spool
// road when a Filament Track Switch is installed. No-op (returns false) when already in state.
bool AmsItem::ShowRoad(bool show)
{
if (!m_panel_road) return false;
if (m_panel_road->IsShown() == show) return false;
m_panel_road->Show(show);
Layout();
Refresh();
return true;
}
void AmsItem::RenderLiteRoad(wxDC& dc, wxSize size) {
auto end_top = size.x - FromDIP(3);
if (m_panel_pos == AMSPanelPos::RIGHT_PANEL){
end_top = 0;
}
auto passroad_width = 4;
auto a1_top = m_panel_pos == AMSPanelPos::RIGHT_PANEL ? size.y / 2 - FromDIP(4) : size.y / 2;
auto a2_top = m_panel_pos == AMSPanelPos::RIGHT_PANEL ? size.y / 2 : size.y / 2 - FromDIP(4);
auto a3_top = m_panel_pos == AMSPanelPos::RIGHT_PANEL ? size.y / 2 + FromDIP(8) : size.y / 2 + FromDIP(4);
auto a4_top = m_panel_pos == AMSPanelPos::RIGHT_PANEL ? size.y / 2 + FromDIP(4) : size.y / 2 + FromDIP(8);
if (m_can_lib_list.empty()) {
//to Extruder
dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
auto top = std::min(a1_top, a2_top);
dc.DrawLine(end_top, top, end_top, size.y);
return;
}
try
{
auto a1_left = m_can_lib_list["0"]->GetScreenPosition().x + m_can_lib_list["0"]->GetSize().x / 2;
auto local_pos1 = GetScreenPosition().x + GetSize().x / 2;
a1_left = size.x / 2 + (a1_left - local_pos1);
dc.DrawLine(a1_left, FromDIP(30), a1_left, a1_top);
dc.DrawLine(a1_left, a1_top, end_top, a1_top);
// A2
auto a2_left = m_can_lib_list["3"]->GetScreenPosition().x + m_can_lib_list["3"]->GetSize().x / 2;
auto local_pos2 = GetScreenPosition().x + GetSize().x / 2;
a2_left = size.x / 2 + (a2_left - local_pos2);
dc.DrawLine(a2_left, FromDIP(30), a2_left, a2_top);
dc.DrawLine(a2_left, a2_top, end_top, a2_top);
// A3
auto a3_left = m_can_lib_list["1"]->GetScreenPosition().x + m_can_lib_list["1"]->GetSize().x / 2;
auto local_pos3 = GetScreenPosition().x + GetSize().x / 2;
a3_left = size.x / 2 + (a3_left - local_pos3);
dc.DrawLine(a3_left, FromDIP(160), a3_left, a3_top);
dc.DrawLine(a3_left, a3_top, end_top, a3_top);
//// A4
auto a4_left = m_can_lib_list["2"]->GetScreenPosition().x + m_can_lib_list["2"]->GetSize().x / 2;
auto local_pos4 = GetScreenPosition().x + GetSize().x / 2;
a4_left = size.x / 2 + (a4_left - local_pos4);
dc.DrawLine(a4_left, FromDIP(160), a4_left, a4_top);
dc.DrawLine(a4_left, a4_top, end_top, a4_top);
//to Extruder
dc.SetPen(wxPen(AMS_CONTROL_GRAY500, 2, wxPENSTYLE_SOLID));
dc.SetBrush(wxBrush(*wxTRANSPARENT_BRUSH));
auto top = std::min(a1_top, a2_top);
dc.DrawLine(end_top, top, end_top, size.y);
if (!m_road_canid.empty()) {
int can_idx = atoi(m_road_canid.c_str());
if (can_idx < 0 || can_idx >= m_info.cans.size()) {
return;
}
m_road_colour = m_info.cans[can_idx].material_colour;
dc.SetPen(wxPen(m_road_colour, passroad_width, wxPENSTYLE_SOLID));
if (m_road_canid == "0") {
dc.DrawLine(a1_left, FromDIP(30), a1_left, a1_top);
dc.DrawLine(a1_left, a1_top, end_top, a1_top);
dc.DrawLine(end_top, a1_top, end_top, size.y);
}
if (m_road_canid == "3") {
dc.DrawLine(a2_left, FromDIP(30), a2_left, a2_top);
dc.DrawLine(a2_left, a2_top, end_top, a2_top);
dc.DrawLine(end_top, a2_top, end_top, size.y);
}
if (m_road_canid == "1") {
dc.DrawLine(a3_left, FromDIP(160), a3_left, a3_top);
dc.DrawLine(a3_left, a3_top, end_top, a3_top);
dc.DrawLine(end_top, a3_top, end_top, size.y);
}
if (m_road_canid == "2") {
dc.DrawLine(a4_left, FromDIP(160), a4_left, a4_top);
dc.DrawLine(a4_left, a4_top, end_top, a4_top);
dc.DrawLine(end_top, a4_top, end_top, size.y);
}
}
}
catch (...) {}
}
void AmsItem::StopRridLoading(wxString canid)
{
for (auto refresh_it : m_can_refresh_list) {
AMSrefresh* refresh = refresh_it.second;
if (refresh->GetCanId() == canid) { refresh->StopLoading(); }
}
}
void AmsItem::msw_rescale()
{
for (auto refresh_it : m_can_refresh_list) {
AMSrefresh* refresh = refresh_it.second;
if(refresh) refresh->msw_rescale();
}
for (auto lib_it : m_can_lib_list) {
AMSLib* lib = lib_it.second;
if (lib) lib->msw_rescale();
}
if (m_humidity != nullptr) m_humidity->msw_rescale();
if (m_ext_text != nullptr) m_ext_text->msw_rescale();
if (m_ext_image != nullptr) m_ext_image->msw_rescale(); //ext image upon the lib
m_bitmap_extra_framework = ScalableBitmap(this, "ams_extra_framework_mid_new", 134);
Layout();
Refresh();
}
void AmsItem::show_sn_value(bool show)
{
for (auto lib_it : m_can_lib_list) {
AMSLib* lib = lib_it.second;
if (lib) lib->show_kn_value(show);
}
}
DevExtruderImage::DevExtruderImage(wxWindow *parent, wxWindowID id, int extruder_num, const wxPoint &pos, const wxSize &size) : wxWindow(parent, id, pos, wxDefaultSize), m_extruder_num(extruder_num)
{
// wxWindow::Create(parent, id, pos, wxSize(FromDIP(45), FromDIP(112)));
SetBackgroundColour(*wxWHITE);
SetSize(wxSize(FromDIP(48), FromDIP(112)));
SetMinSize(wxSize(FromDIP(48), FromDIP(112)));
SetMaxSize(wxSize(FromDIP(48), FromDIP(112)));
m_left_extruder_active_filled = new ScalableBitmap(this, "left_extruder_active_filled", 62);
m_left_extruder_active_empty = new ScalableBitmap(this, "left_extruder_active_empty", 62);
m_left_extruder_unactive_filled = new ScalableBitmap(this, "left_extruder_unactive_filled", 62);
m_left_extruder_unactive_empty = new ScalableBitmap(this, "left_extruder_unactive_empty", 62);
m_right_extruder_active_filled = new ScalableBitmap(this, "right_extruder_active_filled", 62);
m_right_extruder_active_empty = new ScalableBitmap(this, "right_extruder_active_empty", 62);
m_right_extruder_unactive_filled = new ScalableBitmap(this, "right_extruder_unactive_filled", 62);
m_right_extruder_unactive_empty = new ScalableBitmap(this, "right_extruder_unactive_empty", 62);
m_extruder_single_nozzle_empty_load = new ScalableBitmap(this, "monitor_extruder_empty_load", 106);
m_extruder_single_nozzle_empty_unload = new ScalableBitmap(this, "monitor_extruder_empty_unload", 106);
m_extruder_single_nozzle_filled_load = new ScalableBitmap(this, "monitor_extruder_filled_load", 106);
m_extruder_single_nozzle_filled_unload = new ScalableBitmap(this, "monitor_extruder_filled_unload", 106);
Bind(wxEVT_PAINT, &DevExtruderImage::paintEvent, this);
}
void DevExtruderImage::msw_rescale()
{
m_left_extruder_active_filled->msw_rescale();
m_left_extruder_active_empty->msw_rescale();
m_left_extruder_unactive_filled->msw_rescale();
m_left_extruder_unactive_empty->msw_rescale();
m_right_extruder_active_filled->msw_rescale();
m_right_extruder_active_empty->msw_rescale();
m_right_extruder_unactive_filled->msw_rescale();
m_right_extruder_unactive_empty->msw_rescale();
m_extruder_single_nozzle_empty_load->msw_rescale();
m_extruder_single_nozzle_empty_unload->msw_rescale();
m_extruder_single_nozzle_filled_load->msw_rescale();
m_extruder_single_nozzle_filled_unload->msw_rescale();
Layout();
Refresh();
}
void DevExtruderImage::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 DevExtruderImage::doRender(wxDC &dc)
{
auto size = GetSize();
auto pot = wxPoint(size.x / 2, (size.y - m_left_extruder_active_filled->GetBmpSize().y) / 2);
if (m_extruder_num >= 2)
{
ScalableBitmap *left_extruder_bmp{nullptr};
ScalableBitmap *right_extruder_bmp{nullptr};
switch (m_right_ext_state)
{
case DevExtruderState::FILLED_LOAD:
right_extruder_bmp = current_extruder_loc == "right" ? m_right_extruder_active_filled : m_right_extruder_unactive_filled;
break;
case DevExtruderState::FILLED_UNLOAD:
right_extruder_bmp = current_extruder_loc == "right" ? m_right_extruder_active_filled : m_right_extruder_unactive_filled;
break;
case DevExtruderState::EMPTY_LOAD:
if (current_extruder_loc.empty())
{
right_extruder_bmp = m_right_extruder_active_empty;
}
else
{
right_extruder_bmp = current_extruder_loc == "right" ? m_right_extruder_active_empty : m_right_extruder_unactive_empty;
}
break;
case DevExtruderState::EMPTY_UNLOAD:
right_extruder_bmp = current_extruder_loc == "right" ? m_right_extruder_active_empty : m_right_extruder_unactive_empty;
break;
default: break;
}
switch (m_left_ext_state)
{
case DevExtruderState::FILLED_LOAD:
left_extruder_bmp = current_extruder_loc == "left" ? m_left_extruder_active_filled : m_left_extruder_unactive_filled;
break;
case DevExtruderState::FILLED_UNLOAD:
left_extruder_bmp = current_extruder_loc == "left" ? m_left_extruder_active_filled : m_left_extruder_unactive_filled;
break;
case DevExtruderState::EMPTY_LOAD:
if (current_extruder_loc.empty())
{
left_extruder_bmp = m_left_extruder_active_empty;
}
else
{
left_extruder_bmp = current_extruder_loc == "left" ? m_left_extruder_active_empty : m_left_extruder_unactive_empty;
}
break;
case DevExtruderState::EMPTY_UNLOAD:
left_extruder_bmp = current_extruder_loc == "left" ? m_left_extruder_active_empty : m_left_extruder_unactive_empty;
break;
default: break;
}
if (left_extruder_bmp) { dc.DrawBitmap(left_extruder_bmp->bmp(), pot.x - left_extruder_bmp->GetBmpWidth(), pot.y); }
if (right_extruder_bmp) { dc.DrawBitmap(right_extruder_bmp->bmp(), pot.x, pot.y); }
}
else
{
ScalableBitmap *extruder_bmp = nullptr;
switch (m_single_ext_state)
{
case DevExtruderState::FILLED_LOAD:
extruder_bmp = m_extruder_single_nozzle_filled_load;
break;
case DevExtruderState::FILLED_UNLOAD:
extruder_bmp = m_extruder_single_nozzle_filled_unload;
break;
case DevExtruderState::EMPTY_LOAD:
extruder_bmp = m_extruder_single_nozzle_empty_load;
break;
case DevExtruderState::EMPTY_UNLOAD:
extruder_bmp = m_extruder_single_nozzle_empty_unload;
break;
default: break;
}
if (extruder_bmp) { dc.DrawBitmap(extruder_bmp->bmp(), pot.x - extruder_bmp->GetBmpWidth() / 2, (size.y - extruder_bmp->GetBmpHeight()) / 2); }
}
}
FeedDirectionDialog::FeedDirectionDialog(wxWindow* parent,
const int extruderNum,
const std::string& printer_type)
: wxDialog(parent, wxID_ANY, "", wxDefaultPosition, wxDefaultSize),
m_extruder_num(extruderNum),
m_printer_type(printer_type)
{
SetBackgroundColour(wxColour("#FFFFFF"));
SetMaxSize(wxSize(FromDIP(360), FromDIP(207)));
SetMinSize(wxSize(FromDIP(360), FromDIP(207)));
SetSize(wxSize(FromDIP(360), FromDIP(207)));
wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
wxGridSizer* topSizer = new wxGridSizer (1, 3, FromDIP(5), 0);
m_radioHelper = new wxRadioButton(this, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
m_leftRadio = new wxRadioButton(this, wxID_ANY,
_L(DevPrinterConfigUtil::get_toolhead_display_name(m_printer_type, DEPUTY_EXTRUDER_ID, ToolHeadComponent::Extruder, ToolHeadNameCase::TitleCase, true)));
m_rightRadio = new wxRadioButton(this, wxID_ANY,
_L(DevPrinterConfigUtil::get_toolhead_display_name(m_printer_type, MAIN_EXTRUDER_ID, ToolHeadComponent::Extruder, ToolHeadNameCase::TitleCase, true)));
m_radioHelper->Show(false);
m_radioHelper->SetCanFocus(false);
m_leftRadio->SetForegroundColour(*wxBLACK);
m_rightRadio->SetForegroundColour(*wxBLACK);
topSizer->Add(m_leftRadio, 0, wxALIGN_CENTER | wxALL, FromDIP(20));
m_extruderImage = new DevExtruderImage(this, wxID_ANY, m_extruder_num);
topSizer->Add(m_extruderImage, 0, wxALIGN_CENTER | wxALL, FromDIP(5));
topSizer->Add(m_rightRadio, 0, wxALIGN_CENTER | wxALL, FromDIP(20));
mainSizer->AddStretchSpacer(1);
mainSizer->Add(topSizer, 1, wxEXPAND);
mainSizer->AddStretchSpacer(1);
wxBoxSizer* bottomSizer = new wxBoxSizer(wxHORIZONTAL);
m_confirmBtn = new Button(this, _L("Confirm"));
m_confirmBtn->SetSize(wxSize(FromDIP(80), FromDIP(32)));
m_confirmBtn->Enable(false);
m_confirmBtn->SetFont(::Label::Body_14);
bottomSizer->Add(m_confirmBtn, 0, wxALIGN_RIGHT);
mainSizer->Add(bottomSizer, 0, wxALIGN_RIGHT | wxBOTTOM | wxRIGHT, FromDIP(10));
SetSizer(mainSizer);
Layout();
Centre(wxBOTH);
m_lastChecked = m_radioHelper;
m_confirmBtn->Bind(wxEVT_BUTTON, &FeedDirectionDialog::OnConfirm, this);
m_leftRadio->Bind(wxEVT_RADIOBUTTON, &FeedDirectionDialog::OnRadioClicked, this);
m_rightRadio->Bind(wxEVT_RADIOBUTTON, &FeedDirectionDialog::OnRadioClicked, this);
}
void FeedDirectionDialog::OnConfirm(wxCommandEvent& event)
{
EndModal(wxID_OK);
}
void FeedDirectionDialog::OnRadioClicked(wxCommandEvent& evt)
{
auto clicked = static_cast<wxRadioButton*>(evt.GetEventObject());
m_load_extruder_id = std::nullopt;
if (clicked == m_lastChecked)
{
m_radioHelper->SetValue(true);
m_lastChecked = m_radioHelper;
m_confirmBtn->Enable(false);
m_extruderImage->update(DevExtruderState::EMPTY_LOAD, DevExtruderState::EMPTY_LOAD);
m_extruderImage->setExtruderUsed("");
}
else
{
clicked->SetValue(true);
m_lastChecked = clicked;
m_confirmBtn->Enable(true);
if (clicked == m_leftRadio)
{
m_extruderImage->update(DevExtruderState::FILLED_LOAD, DevExtruderState::EMPTY_LOAD);
m_extruderImage->setExtruderUsed("left");
m_load_extruder_id = 1;
{
SetTitle(wxString::Format(_L("Load %s to ") + _L(DevPrinterConfigUtil::get_toolhead_display_name(m_printer_type, DEPUTY_EXTRUDER_ID, ToolHeadComponent::Extruder, ToolHeadNameCase::LowerCase)), m_filament_id));
}
}
else if (clicked == m_rightRadio)
{
m_extruderImage->update(DevExtruderState::EMPTY_LOAD, DevExtruderState::FILLED_LOAD);
m_extruderImage->setExtruderUsed("right");
m_load_extruder_id = 0;
{
SetTitle(wxString::Format(_L("Load %s to ") + _L(DevPrinterConfigUtil::get_toolhead_display_name(m_printer_type, MAIN_EXTRUDER_ID, ToolHeadComponent::Extruder, ToolHeadNameCase::LowerCase)), m_filament_id));
}
}
}
m_leftRadio->Refresh();
m_rightRadio->Refresh();
Fit();
Update();
}
std::optional<int> FeedDirectionDialog::GetExtruderID()
{
if (m_extruderImage)
{
return m_load_extruder_id;
}
return std::nullopt;
}
wxString FeedDirectionDialog::calcTrayName(MachineObject* obj, const std::string& amsID, const std::string& slotID)
{
if (amsID.empty() || slotID.empty() || !obj)
return wxString();
auto filaSys = obj->GetFilaSystem();
if (!filaSys)
return wxString();
DevAms* ams = filaSys->GetAmsById(amsID);
if (!ams)
return wxString();
int ams_id_int = std::stoi(amsID);
int slot_id_int = std::stoi(slotID);
int tray_id = 0;
// Orca: DevAms::AmsType is the local enum (AMS / AMS_LITE / N3F / N3S); it has no EXT_SPOOL
// member, and external/virtual spools are not real DevAms objects (GetAmsById returns nullptr
// above), so the EXT_SPOOL branch from upstream is unnecessary here.
if (ams->GetAmsType() == DevAms::AMS || ams->GetAmsType() == DevAms::AMS_LITE || ams->GetAmsType() == DevAms::N3F) {
tray_id = ams_id_int * 4 + slot_id_int;
} else if (ams->GetAmsType() == DevAms::N3S) {
tray_id = ams_id_int + slot_id_int;
} else {
return wxString();
}
return wxGetApp().transition_tridid(tray_id);
}
void FeedDirectionDialog::SetExtruderMapping(MachineObject* obj,
const std::string& currAmsId,
const std::string& currSlotId,
const std::vector<std::pair<std::string, std::string>>& extruderSlots)
{
wxString filamentID = calcTrayName(obj, currAmsId, currSlotId);
if (filamentID.empty())
return;
m_filament_id = filamentID;
SetTitle(wxString::Format(_L("Load %s to "), filamentID));
std::vector<wxString> extruderMapping(extruderSlots.size());
for (size_t i = 0; i < extruderSlots.size(); ++i) {
if (!extruderSlots[i].first.empty())
extruderMapping[i] = calcTrayName(obj, extruderSlots[i].first, extruderSlots[i].second);
}
if (extruderMapping.size() > 1 && extruderMapping[1] == filamentID) //left extruder
{
m_leftRadio->Enable(false);
m_confirmBtn->Enable(false);
m_extruderImage->update(DevExtruderState::EMPTY_LOAD, DevExtruderState::EMPTY_LOAD);
m_extruderImage->setExtruderUsed("right");
}
else if (!extruderMapping.empty() && extruderMapping[0] == filamentID) //right extruder
{
m_rightRadio->Enable(false);
m_confirmBtn->Enable(false);
m_extruderImage->update(DevExtruderState::EMPTY_LOAD, DevExtruderState::EMPTY_LOAD);
m_extruderImage->setExtruderUsed("left");
}
else
{
m_radioHelper->SetValue(true);
m_lastChecked = m_radioHelper;
m_confirmBtn->Enable(false);
m_extruderImage->update(DevExtruderState::EMPTY_LOAD, DevExtruderState::EMPTY_LOAD);
m_extruderImage->setExtruderUsed("");
}
}
}} // namespace Slic3r::GUI