2024-12-20 06:44:50 +00:00
# include "SendMultiMachinePage.hpp"
# include "TaskManager.hpp"
# include "I18N.hpp"
# include "GUI_App.hpp"
# include "MainFrame.hpp"
# include "Widgets/RadioBox.hpp"
# include <wx/listimpl.cpp>
namespace Slic3r {
namespace GUI {
WX_DEFINE_LIST ( AmsRadioSelectorList ) ;
class ScrolledWindow : public wxScrolledWindow {
public :
ScrolledWindow ( wxWindow * parent ,
wxWindowID id = wxID_ANY ,
const wxPoint & pos = wxDefaultPosition ,
const wxSize & size = wxDefaultSize ,
long style = wxVSCROLL ) : wxScrolledWindow ( parent , id , pos , size , style ) { }
bool ShouldScrollToChildOnFocus ( wxWindow * child ) override { return false ; }
} ;
SendDeviceItem : : SendDeviceItem ( wxWindow * parent , MachineObject * obj )
: DeviceItem ( parent , obj )
{
SetBackgroundColour ( * wxWHITE ) ;
m_bitmap_check_disable = ScalableBitmap ( this , " check_off_disabled " , 18 ) ;
m_bitmap_check_off = ScalableBitmap ( this , " check_off_focused " , 18 ) ;
m_bitmap_check_on = ScalableBitmap ( this , " check_on " , 18 ) ;
SetMinSize ( wxSize ( FromDIP ( DEVICE_ITEM_MAX_WIDTH ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
SetMaxSize ( wxSize ( FromDIP ( DEVICE_ITEM_MAX_WIDTH ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
Bind ( wxEVT_PAINT , & SendDeviceItem : : paintEvent , this ) ;
Bind ( wxEVT_ENTER_WINDOW , & SendDeviceItem : : OnEnterWindow , this ) ;
Bind ( wxEVT_LEAVE_WINDOW , & SendDeviceItem : : OnLeaveWindow , this ) ;
Bind ( wxEVT_LEFT_DOWN , & SendDeviceItem : : OnLeftDown , this ) ;
Bind ( wxEVT_MOTION , & SendDeviceItem : : OnMove , this ) ;
Bind ( EVT_MULTI_DEVICE_SELECTED , & SendDeviceItem : : OnSelectedDevice , this ) ;
wxGetApp ( ) . UpdateDarkUIWin ( this ) ;
}
void SendDeviceItem : : DrawTextWithEllipsis ( wxDC & dc , const wxString & text , int maxWidth , int left , int top /*= 0*/ )
{
wxSize size = GetSize ( ) ;
wxFont font = dc . GetFont ( ) ;
wxSize textSize = dc . GetTextExtent ( text ) ;
dc . SetTextForeground ( StateColor : : darkModeColorFor ( wxColour ( 50 , 58 , 61 ) ) ) ;
int textWidth = textSize . GetWidth ( ) ;
if ( textWidth > maxWidth ) {
wxString truncatedText = text ;
int ellipsisWidth = dc . GetTextExtent ( " ... " ) . GetWidth ( ) ;
int numChars = text . length ( ) ;
for ( int i = numChars - 1 ; i > = 0 ; - - i ) {
truncatedText = text . substr ( 0 , i ) + " ... " ;
int truncatedWidth = dc . GetTextExtent ( truncatedText ) . GetWidth ( ) ;
if ( truncatedWidth < = maxWidth - ellipsisWidth ) {
break ;
}
}
if ( top = = 0 ) {
dc . DrawText ( truncatedText , left , ( size . y - textSize . y ) / 2 ) ;
}
else {
dc . DrawText ( truncatedText , left , ( size . y - textSize . y ) / 2 - top ) ;
}
}
else {
if ( top = = 0 ) {
dc . DrawText ( text , left , ( size . y - textSize . y ) / 2 ) ;
}
else {
dc . DrawText ( text , left , ( size . y - textSize . y ) / 2 - top ) ;
}
}
}
void SendDeviceItem : : OnEnterWindow ( wxMouseEvent & evt )
{
m_hover = true ;
Refresh ( false ) ;
}
void SendDeviceItem : : OnLeaveWindow ( wxMouseEvent & evt )
{
m_hover = false ;
Refresh ( false ) ;
}
void SendDeviceItem : : OnSelectedDevice ( wxCommandEvent & evt )
{
auto dev_id = evt . GetString ( ) ;
auto state = evt . GetInt ( ) ;
if ( state = = 0 ) {
state_selected = 1 ;
}
else if ( state = = 1 ) {
state_selected = 0 ;
}
Refresh ( false ) ;
}
void SendDeviceItem : : OnLeftDown ( wxMouseEvent & evt )
{
int left = FromDIP ( 15 ) ;
auto mouse_pos = ClientToScreen ( evt . GetPosition ( ) ) ;
auto item = this - > ClientToScreen ( wxPoint ( 0 , 0 ) ) ;
if ( mouse_pos . x > ( item . x + left ) & &
mouse_pos . x < ( item . x + left + m_bitmap_check_disable . GetBmpWidth ( ) ) & &
mouse_pos . y > item . y & &
mouse_pos . y < ( item . y + DEVICE_ITEM_MAX_HEIGHT ) ) {
if ( state_printable < = 2 & & state_local_task > 1 ) {
post_event ( wxCommandEvent ( EVT_MULTI_DEVICE_SELECTED ) ) ;
}
}
}
void SendDeviceItem : : OnMove ( wxMouseEvent & evt )
{
int left = FromDIP ( 15 ) ;
auto mouse_pos = ClientToScreen ( evt . GetPosition ( ) ) ;
auto item = this - > ClientToScreen ( wxPoint ( 0 , 0 ) ) ;
if ( mouse_pos . x > ( item . x + left ) & &
mouse_pos . x < ( item . x + left + m_bitmap_check_disable . GetBmpWidth ( ) ) & &
mouse_pos . y > item . y & &
mouse_pos . y < ( item . y + DEVICE_ITEM_MAX_HEIGHT ) ) {
SetCursor ( wxCURSOR_HAND ) ;
}
else {
SetCursor ( wxCURSOR_ARROW ) ;
}
}
void SendDeviceItem : : paintEvent ( wxPaintEvent & evt )
{
wxPaintDC dc ( this ) ;
render ( dc ) ;
}
void SendDeviceItem : : 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 SendDeviceItem : : doRender ( wxDC & dc )
{
wxSize size = GetSize ( ) ;
dc . SetPen ( wxPen ( * wxBLACK ) ) ;
int left = FromDIP ( SEND_LEFT_PADDING_LEFT ) ;
//checkbox
if ( state_printable > 2 ) {
dc . DrawBitmap ( m_bitmap_check_disable . bmp ( ) , wxPoint ( left , ( size . y - m_bitmap_check_disable . GetBmpSize ( ) . y ) / 2 ) ) ;
}
else {
if ( state_selected = = 0 ) {
dc . DrawBitmap ( m_bitmap_check_off . bmp ( ) , wxPoint ( left , ( size . y - m_bitmap_check_disable . GetBmpSize ( ) . y ) / 2 ) ) ;
}
else if ( state_selected = = 1 ) {
dc . DrawBitmap ( m_bitmap_check_on . bmp ( ) , wxPoint ( left , ( size . y - m_bitmap_check_disable . GetBmpSize ( ) . y ) / 2 ) ) ;
}
}
//task status
if ( state_local_task < = 1 ) {
dc . DrawBitmap ( m_bitmap_check_disable . bmp ( ) , wxPoint ( left , ( size . y - m_bitmap_check_disable . GetBmpSize ( ) . y ) / 2 ) ) ;
}
left + = FromDIP ( SEND_LEFT_PRINTABLE ) ;
//dev names
DrawTextWithEllipsis ( dc , wxString : : FromUTF8 ( get_obj ( ) - > dev_name ) , FromDIP ( SEND_LEFT_DEV_NAME ) , left ) ;
left + = FromDIP ( SEND_LEFT_DEV_NAME ) ;
//device state
if ( state_printable < = 2 ) {
2025-03-21 07:12:45 +00:00
//dc.SetTextForeground(wxColour(0, 174, 66));
dc . SetTextForeground ( wxColour ( 0x9A5F21 ) ) ;
2024-12-20 06:44:50 +00:00
}
else {
dc . SetTextForeground ( wxColour ( 208 , 27 , 27 ) ) ;
}
DrawTextWithEllipsis ( dc , get_state_printable ( ) , FromDIP ( SEND_LEFT_DEV_NAME ) , left ) ;
left + = FromDIP ( SEND_LEFT_DEV_STATUS ) ;
dc . SetTextForeground ( * wxBLACK ) ;
//task state
//DrawTextWithEllipsis(dc, get_local_state_task(), FromDIP(SEND_LEFT_DEV_NAME), left);
//left += FromDIP(SEND_LEFT_DEV_STATUS);
//AMS
if ( ! obj_ - > has_ams ( ) ) {
DrawTextWithEllipsis ( dc , _L ( " No AMS " ) , FromDIP ( SEND_LEFT_DEV_NAME ) , left ) ;
}
else {
DrawTextWithEllipsis ( dc , _L ( " AMS " ) , FromDIP ( SEND_LEFT_DEV_NAME ) , left ) ;
}
if ( m_hover ) {
2025-03-21 07:12:45 +00:00
//dc.SetPen(wxPen(wxColour(0, 174, 66)));
dc . SetPen ( wxPen ( wxColour ( 0x9A5F21 ) ) ) ;
2024-12-20 06:44:50 +00:00
dc . SetBrush ( * wxTRANSPARENT_BRUSH ) ;
dc . DrawRoundedRectangle ( 0 , 0 , size . x , size . y , 3 ) ;
}
}
void SendDeviceItem : : post_event ( wxCommandEvent & & event )
{
event . SetEventObject ( this ) ;
event . SetString ( obj_ - > dev_id ) ;
event . SetInt ( state_selected ) ;
wxPostEvent ( this , event ) ;
}
void SendDeviceItem : : DoSetSize ( int x , int y , int width , int height , int sizeFlags /*= wxSIZE_AUTO*/ )
{
wxWindow : : DoSetSize ( x , y , width , height , sizeFlags ) ;
}
SendMultiMachinePage : : SendMultiMachinePage ( Plater * plater )
: DPIDialog ( static_cast < wxWindow * > ( wxGetApp ( ) . mainframe ) , wxID_ANY ,
_L ( " Send to Multi-device " ) ,
wxDefaultPosition , wxDefaultSize , wxCAPTION | wxCLOSE_BOX | wxRESIZE_BORDER )
, m_plater ( plater )
{
# ifdef __WINDOWS__
SetDoubleBuffered ( true ) ;
# endif //__WINDOWS__
app_config = get_app_config ( ) ;
SetBackgroundColour ( * wxWHITE ) ;
// icon
std : : string icon_path = ( boost : : format ( " %1%/images/BambuStudioTitle.ico " ) % resources_dir ( ) ) . str ( ) ;
SetIcon ( wxIcon ( encode_path ( icon_path . c_str ( ) ) , wxBITMAP_TYPE_ICO ) ) ;
wxBoxSizer * main_sizer = new wxBoxSizer ( wxVERTICAL ) ;
auto line_top = new wxPanel ( this , wxID_ANY , wxDefaultPosition , wxSize ( - 1 , 1 ) , wxTAB_TRAVERSAL ) ;
line_top - > SetBackgroundColour ( wxColour ( 166 , 169 , 170 ) ) ;
main_sizer - > Add ( line_top , 0 , wxEXPAND , 0 ) ;
main_sizer - > AddSpacer ( FromDIP ( 10 ) ) ;
m_main_scroll = new ScrolledWindow ( this , wxID_ANY , wxDefaultPosition , wxDefaultSize , wxVSCROLL ) ;
m_main_scroll - > SetBackgroundColour ( * wxWHITE ) ;
m_main_scroll - > SetScrollRate ( 5 , 5 ) ;
m_sizer_body = new wxBoxSizer ( wxVERTICAL ) ;
m_main_page = create_page ( ) ;
m_sizer_body - > Add ( m_main_page , 0 , wxEXPAND | wxLEFT | wxRIGHT , FromDIP ( 38 ) ) ;
m_main_scroll - > SetSizerAndFit ( m_sizer_body ) ;
m_main_scroll - > Layout ( ) ;
m_main_scroll - > Fit ( ) ;
m_main_scroll - > Centre ( wxBOTH ) ;
main_sizer - > Add ( m_main_scroll , 1 , wxEXPAND ) ;
SetSizer ( main_sizer ) ;
Layout ( ) ;
Fit ( ) ;
Centre ( wxBOTH ) ;
m_mapping_popup = new AmsMapingPopup ( m_main_page ) ;
Bind ( EVT_SET_FINISH_MAPPING , & SendMultiMachinePage : : on_set_finish_mapping , this ) ;
Bind ( wxEVT_LEFT_DOWN , [ this ] ( auto & e ) { check_fcous_state ( this ) ; e . Skip ( ) ; } ) ;
m_main_page - > Bind ( wxEVT_LEFT_DOWN , [ this ] ( auto & e ) { check_fcous_state ( this ) ; e . Skip ( ) ; } ) ;
m_main_scroll - > Bind ( wxEVT_LEFT_DOWN , [ this ] ( auto & e ) { check_fcous_state ( this ) ; e . Skip ( ) ; } ) ;
init_timer ( ) ;
Bind ( wxEVT_TIMER , & SendMultiMachinePage : : on_timer , this ) ;
wxGetApp ( ) . UpdateDlgDarkUI ( this ) ;
}
SendMultiMachinePage : : ~ SendMultiMachinePage ( )
{
// TODO
m_radio_group . DeleteContents ( true ) ;
if ( m_refresh_timer )
m_refresh_timer - > Stop ( ) ;
delete m_refresh_timer ;
}
void SendMultiMachinePage : : prepare ( int plate_idx )
{
// TODO
m_print_plate_idx = plate_idx ;
}
void SendMultiMachinePage : : on_dpi_changed ( const wxRect & suggested_rect )
{
m_select_checkbox - > Rescale ( ) ;
m_printer_name - > Rescale ( ) ;
m_printer_name - > SetMinSize ( wxSize ( FromDIP ( SEND_LEFT_DEV_NAME ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_printer_name - > SetMaxSize ( wxSize ( FromDIP ( SEND_LEFT_DEV_NAME ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_device_status - > Rescale ( ) ;
m_device_status - > SetMinSize ( wxSize ( FromDIP ( SEND_LEFT_DEV_STATUS ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_device_status - > SetMaxSize ( wxSize ( FromDIP ( SEND_LEFT_DEV_STATUS ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_ams - > Rescale ( ) ;
m_ams - > SetMinSize ( wxSize ( FromDIP ( TASK_LEFT_SEND_TIME ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_ams - > SetMaxSize ( wxSize ( FromDIP ( TASK_LEFT_SEND_TIME ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_refresh_button - > Rescale ( ) ;
m_refresh_button - > SetMinSize ( wxSize ( FromDIP ( 50 ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_refresh_button - > SetMaxSize ( wxSize ( FromDIP ( 50 ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_rename_button - > msw_rescale ( ) ;
print_time - > msw_rescale ( ) ;
print_weight - > msw_rescale ( ) ;
timeimg - > SetBitmap ( print_time - > bmp ( ) ) ;
weightimg - > SetBitmap ( print_weight - > bmp ( ) ) ;
m_button_add - > Rescale ( ) ;
m_button_add - > SetMinSize ( wxSize ( FromDIP ( 90 ) , FromDIP ( 36 ) ) ) ;
m_button_add - > SetMaxSize ( wxSize ( FromDIP ( 90 ) , FromDIP ( 36 ) ) ) ;
m_button_send - > Rescale ( ) ;
m_button_send - > SetMinSize ( wxSize ( FromDIP ( 120 ) , FromDIP ( 40 ) ) ) ;
m_button_send - > SetMinSize ( wxSize ( FromDIP ( 120 ) , FromDIP ( 40 ) ) ) ;
for ( auto it = m_device_items . begin ( ) ; it ! = m_device_items . end ( ) ; + + it ) {
it - > second - > Refresh ( ) ;
}
Fit ( ) ;
Layout ( ) ;
Refresh ( ) ;
}
void SendMultiMachinePage : : on_sys_color_changed ( )
{
}
void SendMultiMachinePage : : refresh_user_device ( )
{
sizer_machine_list - > Clear ( false ) ;
Slic3r : : DeviceManager * dev = Slic3r : : GUI : : wxGetApp ( ) . getDeviceManager ( ) ;
if ( ! dev ) {
for ( auto it = m_device_items . begin ( ) ; it ! = m_device_items . end ( ) ; it + + ) {
wxWindow * child = it - > second ;
child - > Destroy ( ) ;
}
return ;
}
auto all_machine = dev - > get_my_cloud_machine_list ( ) ;
auto user_machine = std : : map < std : : string , MachineObject * > ( ) ;
//selected machine
for ( int i = 0 ; i < PICK_DEVICE_MAX ; i + + ) {
auto dev_id = app_config - > get ( " multi_devices " , std : : to_string ( i ) ) ;
if ( all_machine . count ( dev_id ) > 0 ) {
user_machine [ dev_id ] = all_machine [ dev_id ] ;
}
}
auto task_manager = wxGetApp ( ) . getTaskManager ( ) ;
std : : vector < std : : string > subscribe_list ;
std : : vector < SendDeviceItem * > dev_temp ;
for ( auto it = user_machine . begin ( ) ; it ! = user_machine . end ( ) ; + + it ) {
SendDeviceItem * di = new SendDeviceItem ( scroll_macine_list , it - > second ) ;
if ( m_device_items . find ( it - > first ) ! = m_device_items . end ( ) ) {
auto item = m_device_items [ it - > first ] ;
if ( item - > state_selected = = 1 & & di - > state_printable < = 2 )
di - > state_selected = item - > state_selected ;
item - > Destroy ( ) ;
}
m_device_items [ it - > first ] = di ;
//update state
if ( task_manager ) {
m_device_items [ it - > first ] - > state_local_task = task_manager - > query_task_state ( it - > first ) ;
}
dev_temp . push_back ( m_device_items [ it - > first ] ) ;
subscribe_list . push_back ( it - > first ) ;
}
dev - > subscribe_device_list ( subscribe_list ) ;
if ( m_sort . rule = = SortItem : : SortRule : : SR_None ) {
this - > device_printable_big = false ;
m_sort . set_role ( SortItem : : SR_DEV_STATE , device_printable_big ) ;
}
std : : sort ( dev_temp . begin ( ) , dev_temp . end ( ) , m_sort . get_call_back ( ) ) ;
for ( auto i = 0 ; i < dev_temp . size ( ) ; + + i ) {
sizer_machine_list - > Add ( dev_temp [ i ] , 0 , wxALL | wxEXPAND , 0 ) ;
}
// maintenance dev_items
auto it = m_device_items . begin ( ) ;
while ( it ! = m_device_items . end ( ) ) {
if ( user_machine . find ( it - > first ) ! = user_machine . end ( ) ) {
+ + it ;
}
else {
it - > second - > Destroy ( ) ;
it = m_device_items . erase ( it ) ;
}
}
m_tip_text - > Show ( m_device_items . empty ( ) ) ;
m_button_add - > Show ( m_device_items . empty ( ) ) ;
sizer_machine_list - > Layout ( ) ;
Layout ( ) ;
Fit ( ) ;
}
BBL : : PrintParams SendMultiMachinePage : : request_params ( MachineObject * obj )
{
BBL : : PrintParams params ;
//get all setting
bool bed_leveling = app_config - > get ( " print " , " bed_leveling " ) = = " 1 " ? true : false ;
bool flow_cali = app_config - > get ( " print " , " flow_cali " ) = = " 1 " ? true : false ;
bool timelapse = app_config - > get ( " print " , " timelapse " ) = = " 1 " ? true : false ;
auto use_ams = false ;
AmsRadioSelectorList : : Node * node = m_radio_group . GetFirst ( ) ;
auto groupid = 0 ;
while ( node ) {
AmsRadioSelector * rs = node - > GetData ( ) ;
if ( rs - > m_param_name = = " use_ams " & & rs - > m_radiobox - > GetValue ( ) ) {
use_ams = true ;
}
if ( rs - > m_param_name = = " use_extra " & & rs - > m_radiobox - > GetValue ( ) ) {
use_ams = false ;
}
node = node - > GetNext ( ) ;
}
//use ams
PrintPrepareData job_data ;
m_plater - > get_print_job_data ( & job_data ) ;
if ( & job_data ) {
std : : string temp_file = Slic3r : : resources_dir ( ) + " /check_access_code.txt " ;
auto check_access_code_path = temp_file . c_str ( ) ;
BOOST_LOG_TRIVIAL ( trace ) < < " sned_job: check_access_code_path = " < < check_access_code_path ;
job_data . _temp_path = fs : : path ( check_access_code_path ) ;
}
int curr_plate_idx ;
if ( job_data . plate_idx > = 0 )
curr_plate_idx = job_data . plate_idx + 1 ;
else if ( job_data . plate_idx = = PLATE_CURRENT_IDX )
curr_plate_idx = m_plater - > get_partplate_list ( ) . get_curr_plate_index ( ) + 1 ;
else if ( job_data . plate_idx = = PLATE_ALL_IDX )
curr_plate_idx = m_plater - > get_partplate_list ( ) . get_curr_plate_index ( ) + 1 ;
else
curr_plate_idx = m_plater - > get_partplate_list ( ) . get_curr_plate_index ( ) + 1 ;
params . dev_ip = obj - > dev_ip ;
params . dev_id = obj - > dev_id ;
params . dev_name = obj - > dev_name ;
params . ftp_folder = obj - > get_ftp_folder ( ) ;
params . connection_type = obj - > connection_type ( ) ;
params . print_type = " from_normal " ;
params . filename = job_data . _3mf_path . string ( ) ;
params . config_filename = job_data . _3mf_config_path . string ( ) ;
params . plate_index = curr_plate_idx ;
params . task_bed_leveling = bed_leveling ;
params . task_flow_cali = flow_cali ;
params . task_vibration_cali = false ;
params . task_layer_inspect = true ;
params . task_record_timelapse = timelapse ;
if ( use_ams ) {
std : : string ams_array ;
std : : string mapping_info ;
get_ams_mapping_result ( ams_array , mapping_info ) ;
params . ams_mapping = ams_array ;
params . ams_mapping_info = mapping_info ;
}
else {
params . ams_mapping = " " ;
params . ams_mapping_info = " " ;
}
params . connection_type = obj - > connection_type ( ) ;
params . task_use_ams = use_ams ;
PartPlate * curr_plate = m_plater - > get_partplate_list ( ) . get_curr_plate ( ) ;
if ( curr_plate ) {
params . task_bed_type = bed_type_to_gcode_string ( curr_plate - > get_bed_type ( true ) ) ;
}
wxString filename ;
if ( m_current_project_name . IsEmpty ( ) ) {
filename = m_plater - > get_export_gcode_filename ( " " , true , m_print_plate_idx = = PLATE_ALL_IDX ? true : false ) ;
}
else {
filename = m_current_project_name ;
}
if ( m_print_plate_idx = = PLATE_ALL_IDX & & filename . empty ( ) ) {
filename = _L ( " Untitled " ) ;
}
if ( filename . empty ( ) ) {
filename = m_plater - > get_export_gcode_filename ( " " , true ) ;
if ( filename . empty ( ) ) filename = _L ( " Untitled " ) ;
}
if ( params . preset_name . empty ( ) ) { params . preset_name = wxString : : Format ( " %s_plate_%d " , filename , m_print_plate_idx ) . ToStdString ( ) ; }
if ( params . project_name . empty ( ) ) { params . project_name = filename . ToUTF8 ( ) ; }
// check access code and ip address
if ( obj - > connection_type ( ) = = " lan " ) {
/*params.dev_id = m_dev_id;
params . project_name = " verify_job " ;
params . filename = job_data . _temp_path . string ( ) ;
params . connection_type = this - > connection_type ;
result = m_agent - > start_send_gcode_to_sdcard ( params , nullptr , nullptr , nullptr ) ;
if ( result ! = 0 ) {
BOOST_LOG_TRIVIAL ( error ) < < " access code is invalid " ;
m_enter_ip_address_fun_fail ( ) ;
m_job_finished = true ;
return ;
}
params . project_name = " " ;
params . filename = " " ; */
}
else {
if ( params . dev_ip . empty ( ) )
params . comments = " no_ip " ;
else if ( obj - > is_support_cloud_print_only )
params . comments = " low_version " ;
else if ( ! obj - > has_sdcard ( ) )
params . comments = " no_sdcard " ;
else if ( params . password . empty ( ) )
params . comments = " no_password " ;
}
return params ;
}
bool SendMultiMachinePage : : get_ams_mapping_result ( std : : string & mapping_array_str , std : : string & ams_mapping_info )
{
if ( m_ams_mapping_result . empty ( ) )
return false ;
bool valid_mapping_result = true ;
int invalid_count = 0 ;
for ( int i = 0 ; i < m_ams_mapping_result . size ( ) ; i + + ) {
if ( m_ams_mapping_result [ i ] . tray_id = = - 1 ) {
valid_mapping_result = false ;
invalid_count + + ;
}
}
if ( invalid_count = = m_ams_mapping_result . size ( ) ) {
return false ;
}
else {
json j = json : : array ( ) ;
json mapping_info_json = json : : array ( ) ;
for ( int i = 0 ; i < wxGetApp ( ) . preset_bundle - > filament_presets . size ( ) ; i + + ) {
int tray_id = - 1 ;
json mapping_item ;
mapping_item [ " ams " ] = tray_id ;
mapping_item [ " targetColor " ] = " " ;
mapping_item [ " filamentId " ] = " " ;
mapping_item [ " filamentType " ] = " " ;
for ( int k = 0 ; k < m_ams_mapping_result . size ( ) ; k + + ) {
if ( m_ams_mapping_result [ k ] . id = = i ) {
tray_id = m_ams_mapping_result [ k ] . tray_id ;
mapping_item [ " ams " ] = tray_id ;
mapping_item [ " filamentType " ] = m_filaments [ k ] . type ;
auto it = wxGetApp ( ) . preset_bundle - > filaments . find_preset ( wxGetApp ( ) . preset_bundle - > filament_presets [ i ] ) ;
if ( it ! = nullptr ) {
mapping_item [ " filamentId " ] = it - > filament_id ;
}
//convert #RRGGBB to RRGGBBAA
mapping_item [ " sourceColor " ] = m_filaments [ k ] . color ;
mapping_item [ " targetColor " ] = m_ams_mapping_result [ k ] . color ;
}
}
j . push_back ( tray_id ) ;
mapping_info_json . push_back ( mapping_item ) ;
}
mapping_array_str = j . dump ( ) ;
ams_mapping_info = mapping_info_json . dump ( ) ;
return valid_mapping_result ;
}
return true ;
}
void SendMultiMachinePage : : on_send ( wxCommandEvent & event )
{
event . Skip ( ) ;
BOOST_LOG_TRIVIAL ( info ) < < " SendMultiMachinePage: on_send " ;
int result = m_plater - > send_gcode ( m_print_plate_idx , [ this ] ( int export_stage , int current , int total , bool & cancel ) {
if ( m_is_canceled ) return ;
bool cancelled = false ;
wxString msg = _L ( " Preparing print job " ) ;
//m_status_bar->update_status(msg, cancelled, 10, true);
//m_export_3mf_cancel = cancel = cancelled;
} ) ;
if ( m_is_canceled | | m_export_3mf_cancel ) {
BOOST_LOG_TRIVIAL ( info ) < < " print_job: m_export_3mf_cancel or m_is_canceled " ;
//m_status_bar->set_status_text(task_canceled_text);
return ;
}
if ( result < 0 ) {
wxString msg = _L ( " Abnormal print file data. Please slice again " ) ;
//m_status_bar->set_status_text(msg);
return ;
}
// export config 3mf if needed
result = m_plater - > export_config_3mf ( m_print_plate_idx ) ;
if ( result < 0 ) {
BOOST_LOG_TRIVIAL ( trace ) < < " export_config_3mf failed, result = " < < result ;
return ;
}
if ( m_is_canceled | | m_export_3mf_cancel ) {
BOOST_LOG_TRIVIAL ( info ) < < " print_job: m_export_3mf_cancel or m_is_canceled " ;
//m_status_bar->set_status_text(task_canceled_text);
return ;
}
std : : vector < BBL : : PrintParams > print_params ;
for ( auto it = m_device_items . begin ( ) ; it ! = m_device_items . end ( ) ; + + it ) {
auto obj = it - > second - > get_obj ( ) ;
if ( obj & & obj - > is_online ( ) & & ! obj - > can_abort ( ) & & ! obj - > is_in_upgrading ( ) & & it - > second - > get_state_selected ( ) = = 1 & & it - > second - > state_printable < = 2 ) {
if ( ! it - > second - > is_blocking_printing ( obj ) ) {
BBL : : PrintParams params = request_params ( obj ) ;
print_params . push_back ( params ) ;
}
}
}
if ( print_params . size ( ) < = 0 ) {
MessageDialog msg_wingow ( nullptr , _L ( " There is no device available to send printing. " ) , " " , wxICON_WARNING | wxOK ) ;
msg_wingow . ShowModal ( ) ;
return ;
}
if ( wxGetApp ( ) . getTaskManager ( ) ) {
TaskSettings settings ;
try
{
if ( app_config - > get ( " sending_interval " ) . empty ( ) ) {
app_config - > set ( " sending_interval " , " 1 " ) ;
app_config - > save ( ) ;
}
if ( app_config - > get ( " max_send " ) . empty ( ) ) {
app_config - > set ( " max_send " , " 10 " ) ;
app_config - > save ( ) ;
}
settings . sending_interval = std : : stoi ( app_config - > get ( " sending_interval " ) ) * 60 ;
settings . max_sending_at_same_time = std : : stoi ( app_config - > get ( " max_send " ) ) ;
if ( settings . max_sending_at_same_time < = 0 ) {
MessageDialog msg_wingow ( nullptr , _L ( " The number of printers in use simultaneously cannot be equal to 0. " ) , " " , wxICON_WARNING | wxOK ) ;
msg_wingow . ShowModal ( ) ;
return ;
}
wxGetApp ( ) . getTaskManager ( ) - > start_print ( print_params , & settings ) ;
}
catch ( . . . )
{ }
}
//jump to info
EndModal ( wxCLOSE ) ;
wxGetApp ( ) . mainframe - > jump_to_multipage ( ) ;
}
bool SendMultiMachinePage : : Show ( bool show )
{
if ( show ) {
refresh_user_device ( ) ;
set_default ( ) ;
m_refresh_timer - > Stop ( ) ;
m_refresh_timer - > SetOwner ( this ) ;
m_refresh_timer - > Start ( 4000 ) ;
wxPostEvent ( this , wxTimerEvent ( ) ) ;
}
else {
m_refresh_timer - > Stop ( ) ;
Slic3r : : DeviceManager * dev = Slic3r : : GUI : : wxGetApp ( ) . getDeviceManager ( ) ;
if ( dev ) {
dev - > subscribe_device_list ( std : : vector < std : : string > ( ) ) ;
}
}
return wxDialog : : Show ( show ) ;
}
wxBoxSizer * SendMultiMachinePage : : create_item_title ( wxString title , wxWindow * parent , wxString tooltip )
{
wxBoxSizer * m_sizer_title = new wxBoxSizer ( wxHORIZONTAL ) ;
auto m_title = new wxStaticText ( parent , wxID_ANY , title , wxDefaultPosition , wxDefaultSize , 0 ) ;
m_title - > SetForegroundColour ( DESIGN_GRAY800_COLOR ) ;
m_title - > SetFont ( : : Label : : Head_13 ) ;
m_title - > Wrap ( - 1 ) ;
m_title - > SetToolTip ( tooltip ) ;
auto m_line = new wxPanel ( parent , wxID_ANY , wxDefaultPosition , wxSize ( - 1 , 1 ) , wxTAB_TRAVERSAL ) ;
m_line - > SetBackgroundColour ( DESIGN_GRAY400_COLOR ) ;
m_sizer_title - > Add ( m_title , 0 , wxALIGN_CENTER | wxALL , 3 ) ;
m_sizer_title - > Add ( 0 , 0 , 0 , wxLEFT , 9 ) ;
wxBoxSizer * sizer_line = new wxBoxSizer ( wxVERTICAL ) ;
sizer_line - > Add ( m_line , 0 , wxEXPAND , 0 ) ;
m_sizer_title - > Add ( sizer_line , 1 , wxALIGN_CENTER , 0 ) ;
return m_sizer_title ;
}
wxBoxSizer * SendMultiMachinePage : : create_item_checkbox ( wxString title , wxWindow * parent , wxString tooltip , int padding_left , std : : string param )
{
wxBoxSizer * m_sizer_checkbox = new wxBoxSizer ( wxHORIZONTAL ) ;
m_sizer_checkbox - > Add ( 0 , 0 , 0 , wxEXPAND | wxLEFT , 23 ) ;
auto checkbox = new : : CheckBox ( parent ) ;
checkbox - > SetValue ( ( app_config - > get ( " print " , param ) = = " 1 " ) ? true : false ) ;
m_sizer_checkbox - > Add ( checkbox , 0 , wxALIGN_CENTER , 0 ) ;
m_sizer_checkbox - > Add ( 0 , 0 , 0 , wxEXPAND | wxLEFT , 8 ) ;
auto checkbox_title = new wxStaticText ( parent , wxID_ANY , title , wxDefaultPosition , wxDefaultSize , 0 ) ;
checkbox_title - > SetForegroundColour ( DESIGN_GRAY900_COLOR ) ;
checkbox_title - > SetFont ( : : Label : : Body_13 ) ;
auto size = checkbox_title - > GetTextExtent ( title ) ;
checkbox_title - > SetMinSize ( wxSize ( size . x + FromDIP ( 5 ) , - 1 ) ) ;
checkbox_title - > Wrap ( - 1 ) ;
m_sizer_checkbox - > Add ( checkbox_title , 0 , wxALIGN_CENTER | wxALL , 3 ) ;
// save
checkbox - > Bind ( wxEVT_TOGGLEBUTTON , [ this , checkbox , param ] ( wxCommandEvent & e ) {
app_config - > set_str ( " print " , param , checkbox - > GetValue ( ) ? std : : string ( " 1 " ) : std : : string ( " 0 " ) ) ;
app_config - > save ( ) ;
e . Skip ( ) ;
} ) ;
checkbox - > SetToolTip ( tooltip ) ;
m_checkbox_map . emplace ( param , checkbox ) ;
return m_sizer_checkbox ;
}
wxBoxSizer * SendMultiMachinePage : : create_item_input ( wxString str_before , wxString str_after , wxWindow * parent , wxString tooltip , std : : string param )
{
wxBoxSizer * sizer_input = new wxBoxSizer ( wxHORIZONTAL ) ;
auto input_title = new wxStaticText ( parent , wxID_ANY , str_before ) ;
input_title - > SetForegroundColour ( DESIGN_GRAY900_COLOR ) ;
input_title - > SetFont ( : : Label : : Body_13 ) ;
input_title - > SetToolTip ( tooltip ) ;
input_title - > Wrap ( - 1 ) ;
auto input = new : : TextInput ( parent , wxEmptyString , wxEmptyString , wxEmptyString , wxDefaultPosition , DESIGN_INPUT_SIZE , wxTE_PROCESS_ENTER ) ;
StateColor input_bg ( std : : pair < wxColour , int > ( wxColour ( " #F0F0F1 " ) , StateColor : : Disabled ) , std : : pair < wxColour , int > ( * wxWHITE , StateColor : : Enabled ) ) ;
input - > SetBackgroundColor ( input_bg ) ;
input - > GetTextCtrl ( ) - > SetValue ( app_config - > get ( param ) ) ;
wxTextValidator validator ( wxFILTER_DIGITS ) ;
input - > GetTextCtrl ( ) - > SetValidator ( validator ) ;
auto second_title = new wxStaticText ( parent , wxID_ANY , str_after , wxDefaultPosition , wxDefaultSize , wxST_ELLIPSIZE_END ) ;
second_title - > SetForegroundColour ( DESIGN_GRAY900_COLOR ) ;
second_title - > SetFont ( : : Label : : Body_13 ) ;
second_title - > SetToolTip ( tooltip ) ;
second_title - > Wrap ( - 1 ) ;
sizer_input - > Add ( 0 , 0 , 0 , wxEXPAND | wxLEFT , 23 ) ;
sizer_input - > Add ( input_title , 0 , wxALIGN_CENTER_VERTICAL | wxALL , 3 ) ;
sizer_input - > Add ( input , 0 , wxALIGN_CENTER_VERTICAL , 0 ) ;
sizer_input - > Add ( 0 , 0 , 0 , wxEXPAND | wxLEFT , 3 ) ;
sizer_input - > Add ( second_title , 0 , wxALIGN_CENTER_VERTICAL | wxALL , 3 ) ;
input - > GetTextCtrl ( ) - > Bind ( wxEVT_TEXT_ENTER , [ this , param , input ] ( wxCommandEvent & e ) {
auto value = input - > GetTextCtrl ( ) - > GetValue ( ) ;
app_config - > set ( param , std : : string ( value . mb_str ( ) ) ) ;
app_config - > save ( ) ;
e . Skip ( ) ;
} ) ;
input - > GetTextCtrl ( ) - > Bind ( wxEVT_KILL_FOCUS , [ this , param , input ] ( wxFocusEvent & e ) {
auto value = input - > GetTextCtrl ( ) - > GetValue ( ) ;
app_config - > set ( param , std : : string ( value . mb_str ( ) ) ) ;
app_config - > save ( ) ;
e . Skip ( ) ;
} ) ;
m_input_map . emplace ( param , input ) ;
return sizer_input ;
}
wxBoxSizer * SendMultiMachinePage : : create_item_radiobox ( wxString title , wxWindow * parent , wxString tooltip , int groupid , std : : string param )
{
wxBoxSizer * radiobox_sizer = new wxBoxSizer ( wxHORIZONTAL ) ;
RadioBox * radiobox = new RadioBox ( parent ) ;
radiobox - > SetBackgroundColour ( wxColour ( 248 , 248 , 248 ) ) ;
radiobox - > Bind ( wxEVT_LEFT_DOWN , & SendMultiMachinePage : : OnSelectRadio , this ) ;
AmsRadioSelector * rs = new AmsRadioSelector ;
rs - > m_groupid = groupid ;
rs - > m_param_name = param ;
rs - > m_radiobox = radiobox ;
rs - > m_selected = false ;
m_radio_group . Append ( rs ) ;
wxStaticText * text = new wxStaticText ( parent , wxID_ANY , title , wxDefaultPosition , wxDefaultSize ) ;
radiobox_sizer - > Add ( radiobox , 0 , wxLEFT , FromDIP ( 23 ) ) ;
radiobox_sizer - > Add ( text , 0 , wxLEFT , FromDIP ( 10 ) ) ;
radiobox - > SetToolTip ( tooltip ) ;
text - > SetToolTip ( tooltip ) ;
return radiobox_sizer ;
}
void SendMultiMachinePage : : OnSelectRadio ( wxMouseEvent & event )
{
AmsRadioSelectorList : : Node * node = m_radio_group . GetFirst ( ) ;
auto groupid = 0 ;
while ( node ) {
AmsRadioSelector * rs = node - > GetData ( ) ;
if ( rs - > m_radiobox - > GetId ( ) = = event . GetId ( ) ) groupid = rs - > m_groupid ;
node = node - > GetNext ( ) ;
}
node = m_radio_group . GetFirst ( ) ;
while ( node ) {
AmsRadioSelector * rs = node - > GetData ( ) ;
if ( rs - > m_groupid = = groupid & & rs - > m_radiobox - > GetId ( ) = = event . GetId ( ) ) rs - > m_radiobox - > SetValue ( true ) ;
if ( rs - > m_groupid = = groupid & & rs - > m_radiobox - > GetId ( ) ! = event . GetId ( ) ) rs - > m_radiobox - > SetValue ( false ) ;
node = node - > GetNext ( ) ;
}
}
void SendMultiMachinePage : : on_select_radio ( std : : string param )
{
AmsRadioSelectorList : : Node * node = m_radio_group . GetFirst ( ) ;
auto groupid = 0 ;
while ( node ) {
AmsRadioSelector * rs = node - > GetData ( ) ;
if ( rs - > m_param_name = = param ) groupid = rs - > m_groupid ;
node = node - > GetNext ( ) ;
}
node = m_radio_group . GetFirst ( ) ;
while ( node ) {
AmsRadioSelector * rs = node - > GetData ( ) ;
if ( rs - > m_groupid = = groupid & & rs - > m_param_name = = param ) rs - > m_radiobox - > SetValue ( true ) ;
if ( rs - > m_groupid = = groupid & & rs - > m_param_name ! = param ) rs - > m_radiobox - > SetValue ( false ) ;
node = node - > GetNext ( ) ;
}
}
bool SendMultiMachinePage : : get_value_radio ( std : : string param )
{
AmsRadioSelectorList : : Node * node = m_radio_group . GetFirst ( ) ;
auto groupid = 0 ;
while ( node ) {
AmsRadioSelector * rs = node - > GetData ( ) ;
if ( rs - > m_groupid = = groupid & & rs - > m_param_name = = param )
return rs - > m_radiobox - > GetValue ( ) ;
node = node - > GetNext ( ) ;
}
return false ;
}
void SendMultiMachinePage : : on_set_finish_mapping ( wxCommandEvent & evt )
{
auto selection_data = evt . GetString ( ) ;
auto selection_data_arr = wxSplit ( selection_data . ToStdString ( ) , ' | ' ) ;
BOOST_LOG_TRIVIAL ( info ) < < " The ams mapping selection result: data is " < < selection_data ;
if ( selection_data_arr . size ( ) = = 6 ) {
auto ams_colour = wxColour ( wxAtoi ( selection_data_arr [ 0 ] ) , wxAtoi ( selection_data_arr [ 1 ] ) , wxAtoi ( selection_data_arr [ 2 ] ) , wxAtoi ( selection_data_arr [ 3 ] ) ) ;
int old_filament_id = ( int ) wxAtoi ( selection_data_arr [ 5 ] ) ;
int ctype = 0 ;
std : : vector < wxColour > material_cols ;
std : : vector < std : : string > tray_cols ;
for ( auto mapping_item : m_mapping_popup - > m_mapping_item_list ) {
if ( mapping_item - > m_tray_data . id = = evt . GetInt ( ) ) {
ctype = mapping_item - > m_tray_data . ctype ;
material_cols = mapping_item - > m_tray_data . material_cols ;
for ( auto col : mapping_item - > m_tray_data . material_cols ) {
wxString color = wxString : : Format ( " #%02X%02X%02X%02X " , col . Red ( ) , col . Green ( ) , col . Blue ( ) , col . Alpha ( ) ) ;
tray_cols . push_back ( color . ToStdString ( ) ) ;
}
break ;
}
}
for ( auto i = 0 ; i < m_ams_mapping_result . size ( ) ; i + + ) {
if ( m_ams_mapping_result [ i ] . id = = wxAtoi ( selection_data_arr [ 5 ] ) ) {
m_ams_mapping_result [ i ] . tray_id = evt . GetInt ( ) ;
auto ams_colour = wxColour ( wxAtoi ( selection_data_arr [ 0 ] ) , wxAtoi ( selection_data_arr [ 1 ] ) , wxAtoi ( selection_data_arr [ 2 ] ) , wxAtoi ( selection_data_arr [ 3 ] ) ) ;
wxString color = wxString : : Format ( " #%02X%02X%02X%02X " , ams_colour . Red ( ) , ams_colour . Green ( ) , ams_colour . Blue ( ) , ams_colour . Alpha ( ) ) ;
m_ams_mapping_result [ i ] . color = color . ToStdString ( ) ;
m_ams_mapping_result [ i ] . ctype = ctype ;
m_ams_mapping_result [ i ] . colors = tray_cols ;
}
BOOST_LOG_TRIVIAL ( trace ) < < " The ams mapping result: id is " < < m_ams_mapping_result [ i ] . id < < " tray_id is " < < m_ams_mapping_result [ i ] . tray_id ;
}
MaterialHash : : iterator iter = m_material_list . begin ( ) ;
while ( iter ! = m_material_list . end ( ) ) {
Material * item = iter - > second ;
MaterialItem * m = item - > item ;
if ( item - > id = = m_current_filament_id ) {
auto ams_colour = wxColour ( wxAtoi ( selection_data_arr [ 0 ] ) , wxAtoi ( selection_data_arr [ 1 ] ) , wxAtoi ( selection_data_arr [ 2 ] ) , wxAtoi ( selection_data_arr [ 3 ] ) ) ;
m - > set_ams_info ( ams_colour , selection_data_arr [ 4 ] , ctype , material_cols ) ;
}
iter + + ;
}
}
}
wxPanel * SendMultiMachinePage : : create_page ( )
{
auto main_page = new wxPanel ( m_main_scroll , wxID_ANY , wxDefaultPosition , wxDefaultSize ) ;
main_page - > SetBackgroundColour ( * wxWHITE ) ;
wxBoxSizer * sizer = new wxBoxSizer ( wxVERTICAL ) ;
// add title
m_title_panel = new wxPanel ( main_page , wxID_ANY , wxDefaultPosition , wxDefaultSize ) ;
m_title_panel - > SetBackgroundColour ( * wxWHITE ) ;
m_title_sizer = new wxBoxSizer ( wxHORIZONTAL ) ;
m_rename_switch_panel = new wxSimplebook ( m_title_panel ) ;
m_rename_switch_panel - > SetMinSize ( wxSize ( FromDIP ( 240 ) , FromDIP ( 25 ) ) ) ;
m_rename_switch_panel - > SetMaxSize ( wxSize ( FromDIP ( 240 ) , FromDIP ( 25 ) ) ) ;
m_rename_normal_panel = new wxPanel ( m_rename_switch_panel , wxID_ANY , wxDefaultPosition , wxDefaultSize , wxTAB_TRAVERSAL ) ;
m_rename_normal_panel - > SetBackgroundColour ( * wxWHITE ) ;
rename_sizer_v = new wxBoxSizer ( wxVERTICAL ) ;
rename_sizer_h = new wxBoxSizer ( wxHORIZONTAL ) ;
m_task_name = new wxStaticText ( m_rename_normal_panel , wxID_ANY , wxT ( " MyLabel " ) , wxDefaultPosition , wxDefaultSize , wxST_ELLIPSIZE_END | wxALIGN_CENTRE ) ;
m_task_name - > SetFont ( : : Label : : Body_13 ) ;
m_task_name - > SetMinSize ( wxSize ( FromDIP ( 200 ) , - 1 ) ) ;
m_task_name - > SetMaxSize ( wxSize ( FromDIP ( 200 ) , - 1 ) ) ;
m_rename_button = new ScalableButton ( m_rename_normal_panel , wxID_ANY , " ams_editable " ) ;
m_rename_button - > SetBackgroundColour ( * wxWHITE ) ;
rename_sizer_h - > Add ( m_task_name , 0 , wxALIGN_CENTER , 0 ) ;
rename_sizer_h - > Add ( m_rename_button , 0 , wxALIGN_CENTER , 0 ) ;
rename_sizer_v - > Add ( rename_sizer_h , 1 , wxALIGN_CENTER , 0 ) ;
m_rename_normal_panel - > SetSizer ( rename_sizer_v ) ;
m_rename_normal_panel - > Layout ( ) ;
rename_sizer_v - > Fit ( m_rename_normal_panel ) ;
//rename edit
m_rename_edit_panel = new wxPanel ( m_rename_switch_panel , wxID_ANY , wxDefaultPosition , wxDefaultSize , wxTAB_TRAVERSAL ) ;
m_rename_edit_panel - > SetBackgroundColour ( * wxWHITE ) ;
auto rename_edit_sizer_v = new wxBoxSizer ( wxVERTICAL ) ;
m_rename_input = new : : TextInput ( m_rename_edit_panel , wxEmptyString , wxEmptyString , wxEmptyString , wxDefaultPosition , wxDefaultSize , wxTE_PROCESS_ENTER ) ;
m_rename_input - > GetTextCtrl ( ) - > SetFont ( : : Label : : Body_13 ) ;
m_rename_input - > SetSize ( wxSize ( FromDIP ( 220 ) , FromDIP ( 24 ) ) ) ;
m_rename_input - > SetMinSize ( wxSize ( FromDIP ( 220 ) , FromDIP ( 24 ) ) ) ;
m_rename_input - > SetMaxSize ( wxSize ( FromDIP ( 220 ) , FromDIP ( 24 ) ) ) ;
m_rename_input - > Bind ( wxEVT_TEXT_ENTER , [ this ] ( auto & e ) { on_rename_enter ( ) ; } ) ;
m_rename_input - > Bind ( wxEVT_KILL_FOCUS , [ this ] ( auto & e ) {
if ( ! m_rename_input - > HasFocus ( ) & & ! m_task_name - > HasFocus ( ) )
on_rename_enter ( ) ;
else
e . Skip ( ) ; } ) ;
rename_edit_sizer_v - > Add ( m_rename_input , 1 , wxALIGN_CENTER , 0 ) ;
m_rename_edit_panel - > SetSizer ( rename_edit_sizer_v ) ;
m_rename_edit_panel - > Layout ( ) ;
rename_edit_sizer_v - > Fit ( m_rename_edit_panel ) ;
m_rename_button - > Bind ( wxEVT_BUTTON , & SendMultiMachinePage : : on_rename_click , this ) ;
m_rename_switch_panel - > AddPage ( m_rename_normal_panel , wxEmptyString , true ) ;
m_rename_switch_panel - > AddPage ( m_rename_edit_panel , wxEmptyString , false ) ;
Bind ( wxEVT_CHAR_HOOK , [ this ] ( wxKeyEvent & e ) {
if ( e . GetKeyCode ( ) = = WXK_ESCAPE ) {
if ( m_rename_switch_panel - > GetSelection ( ) = = 0 ) {
e . Skip ( ) ;
}
else {
m_rename_switch_panel - > SetSelection ( 0 ) ;
m_task_name - > SetLabel ( m_current_project_name ) ;
m_rename_normal_panel - > Layout ( ) ;
}
}
else {
e . Skip ( ) ;
}
} ) ;
m_text_sizer = new wxBoxSizer ( wxVERTICAL ) ;
m_text_sizer - > Add ( m_rename_switch_panel , 0 , wxALIGN_CENTER_HORIZONTAL , 0 ) ;
m_panel_image = new wxPanel ( m_title_panel , wxID_ANY , wxDefaultPosition , wxDefaultSize , wxTAB_TRAVERSAL ) ;
m_image_sizer = new wxBoxSizer ( wxHORIZONTAL ) ;
m_thumbnail_panel = new ThumbnailPanel ( m_panel_image ) ;
m_thumbnail_panel - > SetSize ( wxSize ( THUMBNAIL_SIZE , THUMBNAIL_SIZE ) ) ;
m_thumbnail_panel - > SetMinSize ( wxSize ( THUMBNAIL_SIZE , THUMBNAIL_SIZE ) ) ;
m_thumbnail_panel - > SetMaxSize ( wxSize ( THUMBNAIL_SIZE , THUMBNAIL_SIZE ) ) ;
m_thumbnail_panel - > SetBackgroundColour ( * wxRED ) ;
m_image_sizer - > Add ( m_thumbnail_panel , 0 , wxALIGN_CENTER , 0 ) ;
m_panel_image - > SetSizer ( m_image_sizer ) ;
m_panel_image - > Layout ( ) ;
m_title_sizer - > Add ( m_panel_image , 0 , wxLEFT , 0 ) ;
wxBoxSizer * m_sizer_basic = new wxBoxSizer ( wxHORIZONTAL ) ;
wxBoxSizer * m_sizer_basic_time = new wxBoxSizer ( wxHORIZONTAL ) ;
wxBoxSizer * m_sizer_basic_weight = new wxBoxSizer ( wxHORIZONTAL ) ;
print_time = new ScalableBitmap ( m_title_panel , " print-time " , 18 ) ;
timeimg = new wxStaticBitmap ( m_title_panel , wxID_ANY , print_time - > bmp ( ) , wxDefaultPosition , wxSize ( FromDIP ( 18 ) , FromDIP ( 18 ) ) , 0 ) ;
m_sizer_basic_time - > Add ( timeimg , 1 , wxEXPAND | wxALL , FromDIP ( 5 ) ) ;
m_stext_time = new wxStaticText ( m_title_panel , wxID_ANY , wxEmptyString , wxDefaultPosition , wxDefaultSize , wxALIGN_RIGHT ) ;
m_sizer_basic_time - > Add ( m_stext_time , 0 , wxALL , FromDIP ( 5 ) ) ;
m_sizer_basic - > Add ( m_sizer_basic_time , 0 , wxALIGN_CENTER , 0 ) ;
m_sizer_basic - > Add ( 0 , 0 , 0 , wxEXPAND | wxLEFT | wxRIGHT , FromDIP ( 30 ) ) ;
print_weight = new ScalableBitmap ( m_title_panel , " print-weight " , 18 ) ;
weightimg = new wxStaticBitmap ( m_title_panel , wxID_ANY , print_weight - > bmp ( ) , wxDefaultPosition , wxSize ( FromDIP ( 18 ) , FromDIP ( 18 ) ) , 0 ) ;
m_sizer_basic_weight - > Add ( weightimg , 1 , wxEXPAND | wxALL , FromDIP ( 5 ) ) ;
m_stext_weight = new wxStaticText ( m_title_panel , wxID_ANY , wxEmptyString , wxDefaultPosition , wxDefaultSize , wxALIGN_LEFT ) ;
m_sizer_basic_weight - > Add ( m_stext_weight , 0 , wxALL , FromDIP ( 5 ) ) ;
m_sizer_basic - > Add ( m_sizer_basic_weight , 0 , wxALIGN_CENTER , 0 ) ;
m_text_sizer - > Add ( m_sizer_basic , wxALIGN_CENTER , 0 ) ;
m_title_sizer - > Add ( m_text_sizer , 0 , wxALIGN_CENTER_VERTICAL , 0 ) ;
m_title_panel - > SetSizer ( m_title_sizer ) ;
m_title_panel - > Layout ( ) ;
sizer - > Add ( m_title_panel , 0 , wxALIGN_CENTER_HORIZONTAL , 0 ) ;
// add filament
wxBoxSizer * title_filament = create_item_title ( _L ( " Filament " ) , main_page , " " ) ;
wxBoxSizer * radio_sizer = new wxBoxSizer ( wxHORIZONTAL ) ;
wxBoxSizer * use_external_sizer = create_item_radiobox ( _L ( " Use External Spool " ) , main_page , " " , 0 , " use_external " ) ;
wxBoxSizer * use_ams_sizer = create_item_radiobox ( _L ( " Use AMS " ) , main_page , " " , 0 , " use_ams " ) ;
radio_sizer - > Add ( use_external_sizer , 0 , wxLeft , FromDIP ( 20 ) ) ;
radio_sizer - > Add ( use_ams_sizer , 0 , wxLeft , FromDIP ( 5 ) ) ;
sizer - > Add ( title_filament , 0 , wxEXPAND , 0 ) ;
sizer - > Add ( radio_sizer , 0 , wxLEFT , FromDIP ( 20 ) ) ;
sizer - > AddSpacer ( FromDIP ( 5 ) ) ;
on_select_radio ( " use_external " ) ;
// add ams item
m_ams_list_sizer = new wxGridSizer ( 0 , 4 , 0 , FromDIP ( 5 ) ) ;
//sync_ams_list();
sizer - > Add ( m_ams_list_sizer , 0 , wxLEFT , FromDIP ( 25 ) ) ;
sizer - > AddSpacer ( FromDIP ( 10 ) ) ;
// select printer
wxBoxSizer * title_select_printer = create_item_title ( _L ( " Select Printers " ) , main_page , " " ) ;
// add table head
StateColor head_bg (
std : : pair < wxColour , int > ( TABLE_HEAD_PRESSED_COLOUR , StateColor : : Pressed ) ,
std : : pair < wxColour , int > ( TABLE_HEAR_NORMAL_COLOUR , StateColor : : Normal )
) ;
m_table_head_panel = new wxPanel ( main_page , wxID_ANY , wxDefaultPosition , wxDefaultSize ) ;
m_table_head_panel - > SetMinSize ( wxSize ( FromDIP ( DEVICE_ITEM_MAX_WIDTH ) , - 1 ) ) ;
m_table_head_panel - > SetMaxSize ( wxSize ( FromDIP ( DEVICE_ITEM_MAX_WIDTH ) , - 1 ) ) ;
m_table_head_panel - > SetBackgroundColour ( TABLE_HEAR_NORMAL_COLOUR ) ;
m_table_head_sizer = new wxBoxSizer ( wxHORIZONTAL ) ;
m_select_checkbox = new CheckBox ( m_table_head_panel , wxID_ANY ) ;
m_table_head_sizer - > AddSpacer ( FromDIP ( SEND_LEFT_PADDING_LEFT ) ) ;
m_table_head_sizer - > Add ( m_select_checkbox , 0 , wxALIGN_CENTER_VERTICAL , 0 ) ;
m_select_checkbox - > Bind ( wxEVT_TOGGLEBUTTON , [ this ] ( wxCommandEvent & e ) {
if ( m_select_checkbox - > GetValue ( ) ) {
for ( auto it = m_device_items . begin ( ) ; it ! = m_device_items . end ( ) ; it + + ) {
if ( it - > second - > state_printable < = 2 ) {
it - > second - > selected ( ) ;
}
}
}
else {
for ( auto it = m_device_items . begin ( ) ; it ! = m_device_items . end ( ) ; it + + ) {
it - > second - > unselected ( ) ;
}
}
Refresh ( false ) ;
e . Skip ( ) ;
} ) ;
m_printer_name = new Button ( m_table_head_panel , _L ( " Device Name " ) , " toolbar_double_directional_arrow " , wxNO_BORDER , ICON_SIZE ) ;
m_printer_name - > SetBackgroundColor ( head_bg ) ;
m_printer_name - > SetCornerRadius ( 0 ) ;
m_printer_name - > SetFont ( TABLE_HEAD_FONT ) ;
m_printer_name - > SetMinSize ( wxSize ( FromDIP ( SEND_LEFT_DEV_NAME ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_printer_name - > SetMaxSize ( wxSize ( FromDIP ( SEND_LEFT_DEV_NAME ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_printer_name - > SetCenter ( false ) ;
m_printer_name - > Bind ( wxEVT_ENTER_WINDOW , [ & ] ( wxMouseEvent & evt ) {
SetCursor ( wxCURSOR_HAND ) ;
} ) ;
m_printer_name - > Bind ( wxEVT_LEAVE_WINDOW , [ & ] ( wxMouseEvent & evt ) {
SetCursor ( wxCURSOR_ARROW ) ;
} ) ;
m_printer_name - > Bind ( wxEVT_LEFT_DOWN , [ this ] ( wxMouseEvent & evt ) {
device_name_big = ! device_name_big ;
this - > m_sort . set_role ( SortItem : : SortRule : : SR_DEV_NAME , device_name_big ) ;
this - > refresh_user_device ( ) ;
} ) ;
m_table_head_sizer - > Add ( 0 , 0 , 0 , wxLEFT , FromDIP ( 10 ) ) ;
m_table_head_sizer - > Add ( m_printer_name , 0 , wxALIGN_CENTER_VERTICAL , 0 ) ;
m_device_status = new Button ( m_table_head_panel , _L ( " Device Status " ) , " toolbar_double_directional_arrow " , wxNO_BORDER , ICON_SIZE ) ;
m_device_status - > SetBackgroundColor ( head_bg ) ;
m_device_status - > SetFont ( TABLE_HEAD_FONT ) ;
m_device_status - > SetCornerRadius ( 0 ) ;
m_device_status - > SetMinSize ( wxSize ( FromDIP ( SEND_LEFT_DEV_STATUS ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_device_status - > SetMaxSize ( wxSize ( FromDIP ( SEND_LEFT_DEV_STATUS ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_device_status - > SetCenter ( false ) ;
m_device_status - > Bind ( wxEVT_ENTER_WINDOW , [ & ] ( wxMouseEvent & evt ) {
SetCursor ( wxCURSOR_HAND ) ;
} ) ;
m_device_status - > Bind ( wxEVT_LEAVE_WINDOW , [ & ] ( wxMouseEvent & evt ) {
SetCursor ( wxCURSOR_ARROW ) ;
} ) ;
m_device_status - > Bind ( wxEVT_LEFT_DOWN , [ this ] ( wxMouseEvent & evt ) {
device_printable_big = ! device_printable_big ;
this - > m_sort . set_role ( SortItem : : SortRule : : SR_PRINTABLE , device_printable_big ) ;
this - > refresh_user_device ( ) ;
evt . Skip ( ) ;
} ) ;
m_table_head_sizer - > Add ( m_device_status , 0 , wxALIGN_CENTER_VERTICAL , 0 ) ;
/*m_task_status = new Button(m_table_head_panel, _L("Task Status"), "toolbar_double_directional_arrow", wxNO_BORDER, ICON_SIZE);
m_task_status - > SetBackgroundColor ( head_bg ) ;
m_task_status - > SetFont ( TABLE_HEAD_FONT ) ;
m_task_status - > SetCornerRadius ( 0 ) ;
m_task_status - > SetMinSize ( wxSize ( FromDIP ( SEND_LEFT_DEV_STATUS ) , FromDIP ( DEVICE_ITEM_MAX_HEIGHT ) ) ) ;
m_task_status - > SetMaxSize ( wxSize ( FromDIP ( SEND_LEFT_DEV_STATUS ) , FromDIP ( DEVICE_ITEM_MAX_HEIGHT ) ) ) ;
m_task_status - > SetCenter ( false ) ;
m_task_status - > Bind ( wxEVT_ENTER_WINDOW , [ & ] ( wxMouseEvent & evt ) {
SetCursor ( wxCURSOR_HAND ) ;
} ) ;
m_task_status - > Bind ( wxEVT_LEAVE_WINDOW , [ & ] ( wxMouseEvent & evt ) {
SetCursor ( wxCURSOR_ARROW ) ;
} ) ;
m_task_status - > Bind ( wxEVT_LEFT_DOWN , [ this ] ( wxMouseEvent & evt ) {
device_printable_big = ! device_printable_big ;
this - > m_sort . set_role ( SortItem : : SortRule : : SR_PRINTABLE , device_printable_big ) ;
this - > refresh_user_device ( ) ;
evt . Skip ( ) ;
} ) ; */
//m_table_head_sizer->Add(m_task_status, 0, wxALIGN_CENTER_VERTICAL, 0);
m_ams = new Button ( m_table_head_panel , _L ( " Ams Status " ) , " toolbar_double_directional_arrow " , wxNO_BORDER , ICON_SIZE , false ) ;
m_ams - > SetBackgroundColor ( head_bg ) ;
m_ams - > SetCornerRadius ( 0 ) ;
m_ams - > SetFont ( TABLE_HEAD_FONT ) ;
m_ams - > SetMinSize ( wxSize ( FromDIP ( TASK_LEFT_SEND_TIME ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_ams - > SetMaxSize ( wxSize ( FromDIP ( TASK_LEFT_SEND_TIME ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_ams - > SetCenter ( false ) ;
m_ams - > Bind ( wxEVT_ENTER_WINDOW , [ & ] ( wxMouseEvent & evt ) {
SetCursor ( wxCURSOR_HAND ) ;
} ) ;
m_ams - > Bind ( wxEVT_LEAVE_WINDOW , [ & ] ( wxMouseEvent & evt ) {
SetCursor ( wxCURSOR_ARROW ) ;
} ) ;
m_ams - > Bind ( wxEVT_LEFT_DOWN , [ this ] ( wxMouseEvent & evt ) {
device_en_ams_big = ! device_en_ams_big ;
this - > m_sort . set_role ( SortItem : : SortRule : : SR_EN_AMS , device_en_ams_big ) ;
this - > refresh_user_device ( ) ;
evt . Skip ( ) ;
} ) ;
m_table_head_sizer - > Add ( m_ams , 0 , wxALIGN_CENTER_VERTICAL , 0 ) ;
m_refresh_button = new Button ( m_table_head_panel , " " , " mall_control_refresh " , wxNO_BORDER , ICON_SIZE , false ) ;
m_refresh_button - > SetBackgroundColor ( head_bg ) ;
m_refresh_button - > SetCornerRadius ( 0 ) ;
m_refresh_button - > SetFont ( TABLE_HEAD_FONT ) ;
m_refresh_button - > SetMinSize ( wxSize ( FromDIP ( 50 ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_refresh_button - > SetMaxSize ( wxSize ( FromDIP ( 50 ) , FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
m_refresh_button - > Bind ( wxEVT_ENTER_WINDOW , [ & ] ( wxMouseEvent & evt ) {
SetCursor ( wxCURSOR_HAND ) ;
} ) ;
m_refresh_button - > Bind ( wxEVT_LEAVE_WINDOW , [ & ] ( wxMouseEvent & evt ) {
SetCursor ( wxCURSOR_ARROW ) ;
} ) ;
m_refresh_button - > Bind ( wxEVT_LEFT_DOWN , [ this ] ( wxMouseEvent & evt ) {
this - > refresh_user_device ( ) ;
evt . Skip ( ) ;
} ) ;
m_table_head_sizer - > Add ( m_refresh_button , 0 , wxALIGN_CENTER_VERTICAL , 0 ) ;
m_table_head_panel - > SetSizer ( m_table_head_sizer ) ;
m_table_head_panel - > Layout ( ) ;
m_tip_text = new wxStaticText ( main_page , wxID_ANY , wxEmptyString , wxDefaultPosition , wxDefaultSize , wxALIGN_CENTER ) ;
m_tip_text - > SetMinSize ( wxSize ( FromDIP ( DEVICE_ITEM_MAX_WIDTH ) , - 1 ) ) ;
m_tip_text - > SetMaxSize ( wxSize ( FromDIP ( DEVICE_ITEM_MAX_WIDTH ) , - 1 ) ) ;
m_tip_text - > SetLabel ( _L ( " Please select the devices you would like to manage here (up to 6 devices) " ) ) ;
m_tip_text - > SetForegroundColour ( DESIGN_GRAY800_COLOR ) ;
m_tip_text - > SetFont ( : : Label : : Head_20 ) ;
m_tip_text - > Wrap ( - 1 ) ;
auto m_btn_bg_enable = StateColor (
std : : pair < wxColour , int > ( wxColour ( 27 , 136 , 68 ) , StateColor : : Pressed ) ,
std : : pair < wxColour , int > ( wxColour ( 61 , 203 , 115 ) , StateColor : : Hovered ) ,
2025-03-21 07:12:45 +00:00
//std::pair<wxColour, int>(wxColour(0, 174, 66), StateColor::Normal)
std : : pair < wxColour , int > ( wxColour ( 0x9A5F21 ) , StateColor : : Normal )
2024-12-20 06:44:50 +00:00
) ;
m_button_add = new Button ( main_page , _L ( " Add " ) ) ;
m_button_add - > SetBackgroundColor ( m_btn_bg_enable ) ;
m_button_add - > SetBorderColor ( m_btn_bg_enable ) ;
m_button_add - > SetTextColor ( * wxWHITE ) ;
m_button_add - > SetFont ( Label : : Body_12 ) ;
m_button_add - > SetCornerRadius ( 6 ) ;
m_button_add - > SetMinSize ( wxSize ( FromDIP ( 90 ) , FromDIP ( 36 ) ) ) ;
m_button_add - > SetMaxSize ( wxSize ( FromDIP ( 90 ) , FromDIP ( 36 ) ) ) ;
m_button_add - > Bind ( wxEVT_BUTTON , [ this ] ( wxCommandEvent & evt ) {
MultiMachinePickPage dlg ;
dlg . ShowModal ( ) ;
refresh_user_device ( ) ;
evt . Skip ( ) ;
} ) ;
scroll_macine_list = new wxScrolledWindow ( main_page , wxID_ANY , wxDefaultPosition , wxSize ( FromDIP ( 800 ) , FromDIP ( 300 ) ) , wxHSCROLL | wxVSCROLL ) ;
scroll_macine_list - > SetBackgroundColour ( * wxWHITE ) ;
scroll_macine_list - > SetScrollRate ( 5 , 5 ) ;
scroll_macine_list - > SetMinSize ( wxSize ( FromDIP ( DEVICE_ITEM_MAX_WIDTH ) , 10 * FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
scroll_macine_list - > SetMaxSize ( wxSize ( FromDIP ( DEVICE_ITEM_MAX_WIDTH ) , 10 * FromDIP ( SEND_ITEM_MAX_HEIGHT ) ) ) ;
sizer_machine_list = new wxBoxSizer ( wxVERTICAL ) ;
scroll_macine_list - > SetSizer ( sizer_machine_list ) ;
scroll_macine_list - > Layout ( ) ;
sizer - > Add ( title_select_printer , 0 , wxEXPAND , 0 ) ;
sizer - > Add ( m_table_head_panel , 0 , wxALIGN_CENTER | wxLEFT | wxRIGHT , FromDIP ( 40 ) ) ;
sizer - > Add ( m_tip_text , 0 , wxALIGN_CENTER_HORIZONTAL | wxTOP , FromDIP ( 100 ) ) ;
sizer - > Add ( m_button_add , 0 , wxALIGN_CENTER_HORIZONTAL | wxTOP , FromDIP ( 20 ) ) ;
sizer - > Add ( scroll_macine_list , 0 , wxALIGN_CENTER | wxLEFT | wxRIGHT , FromDIP ( 40 ) ) ;
sizer - > AddSpacer ( FromDIP ( 10 ) ) ;
// add printing options
wxBoxSizer * title_print_option = create_item_title ( _L ( " Printing Options " ) , main_page , " " ) ;
wxBoxSizer * item_bed_level = create_item_checkbox ( _L ( " Bed Leveling " ) , main_page , " " , 50 , " bed_leveling " ) ;
wxBoxSizer * item_timelapse = create_item_checkbox ( _L ( " Timelapse " ) , main_page , " " , 50 , " timelapse " ) ;
wxBoxSizer * item_flow_dy_ca = create_item_checkbox ( _L ( " Flow Dynamics Calibration " ) , main_page , " " , 50 , " flow_cali " ) ;
sizer - > Add ( title_print_option , 0 , wxEXPAND , 0 ) ;
wxBoxSizer * options_sizer_v = new wxBoxSizer ( wxHORIZONTAL ) ;
options_sizer_v - > Add ( item_bed_level , 0 , wxLEFT , 0 ) ;
options_sizer_v - > Add ( item_timelapse , 0 , wxLEFT , FromDIP ( 100 ) ) ;
sizer - > Add ( options_sizer_v , 0 , wxLEFT , FromDIP ( 20 ) ) ;
sizer - > Add ( item_flow_dy_ca , 0 , wxLEFT , FromDIP ( 20 ) ) ;
sizer - > AddSpacer ( FromDIP ( 10 ) ) ;
// add send option
wxBoxSizer * title_send_option = create_item_title ( _L ( " Send Options " ) , main_page , " " ) ;
wxBoxSizer * max_printer_send = create_item_input ( _L ( " Send " ) , _L ( " printers at the same time.(It depends on how many devices can undergo heating at the same time.) " ) , main_page , " " , " max_send " ) ;
wxBoxSizer * delay_time = create_item_input ( _L ( " Wait " ) , _L ( " minute each batch.(It depends on how long it takes to complete the heating.) " ) , main_page , " " , " sending_interval " ) ;
sizer - > Add ( title_send_option , 0 , wxEXPAND , 0 ) ;
sizer - > Add ( max_printer_send , 0 , wxLEFT , FromDIP ( 20 ) ) ;
sizer - > AddSpacer ( FromDIP ( 3 ) ) ;
sizer - > Add ( delay_time , 0 , wxLEFT , FromDIP ( 20 ) ) ;
sizer - > AddSpacer ( FromDIP ( 10 ) ) ;
// add send button
btn_bg_enable = StateColor ( std : : pair < wxColour , int > ( wxColour ( 27 , 136 , 68 ) , StateColor : : Pressed ) , std : : pair < wxColour , int > ( wxColour ( 61 , 203 , 115 ) , StateColor : : Hovered ) ,
2025-03-21 07:12:45 +00:00
//std::pair<wxColour, int>(wxColour(0, 174, 66), StateColor::Normal));
std : : pair < wxColour , int > ( wxColour ( 0x9A5F21 ) , StateColor : : Normal ) ) ;
2024-12-20 06:44:50 +00:00
m_button_send = new Button ( main_page , _L ( " Send " ) ) ;
m_button_send - > SetBackgroundColor ( btn_bg_enable ) ;
m_button_send - > SetBorderColor ( btn_bg_enable ) ;
m_button_send - > SetTextColor ( StateColor : : darkModeColorFor ( " #FFFFFE " ) ) ;
m_button_send - > SetSize ( wxSize ( FromDIP ( 120 ) , FromDIP ( 40 ) ) ) ;
m_button_send - > SetMinSize ( wxSize ( FromDIP ( 120 ) , FromDIP ( 40 ) ) ) ;
m_button_send - > SetMinSize ( wxSize ( FromDIP ( 120 ) , FromDIP ( 40 ) ) ) ;
m_button_send - > SetCornerRadius ( FromDIP ( 5 ) ) ;
m_button_send - > Bind ( wxEVT_BUTTON , & SendMultiMachinePage : : on_send , this ) ;
//m_button_send->Disable();
//m_button_send->SetBackgroundColor(wxColour(0x90, 0x90, 0x90));
//m_button_send->SetBorderColor(wxColour(0x90, 0x90, 0x90));
sizer - > Add ( m_button_send , 0 , wxALIGN_CENTER , 0 ) ;
main_page - > SetSizer ( sizer ) ;
main_page - > Layout ( ) ;
main_page - > Fit ( ) ;
return main_page ;
}
void SendMultiMachinePage : : sync_ams_list ( )
{
// for black list
std : : vector < std : : string > materials ;
std : : vector < std : : string > brands ;
std : : vector < std : : string > display_materials ;
std : : vector < std : : string > m_filaments_id ;
auto preset_bundle = wxGetApp ( ) . preset_bundle ;
for ( auto filament_name : preset_bundle - > filament_presets ) {
for ( int f_index = 0 ; f_index < preset_bundle - > filaments . size ( ) ; f_index + + ) {
PresetCollection * filament_presets = & wxGetApp ( ) . preset_bundle - > filaments ;
Preset * preset = & filament_presets - > preset ( f_index ) ;
if ( preset & & filament_name . compare ( preset - > name ) = = 0 ) {
std : : string display_filament_type ;
std : : string filament_type = preset - > config . get_filament_type ( display_filament_type ) ;
std : : string m_filament_id = preset - > filament_id ;
display_materials . push_back ( display_filament_type ) ;
materials . push_back ( filament_type ) ;
m_filaments_id . push_back ( m_filament_id ) ;
std : : string m_vendor_name = " " ;
auto vendor = dynamic_cast < ConfigOptionStrings * > ( preset - > config . option ( " filament_vendor " ) ) ;
if ( vendor & & ( vendor - > values . size ( ) > 0 ) ) {
std : : string vendor_name = vendor - > values [ 0 ] ;
m_vendor_name = vendor_name ;
}
brands . push_back ( m_vendor_name ) ;
}
}
}
auto extruders = wxGetApp ( ) . plater ( ) - > get_partplate_list ( ) . get_curr_plate ( ) - > get_used_extruders ( ) ;
BitmapCache bmcache ;
MaterialHash : : iterator iter = m_material_list . begin ( ) ;
while ( iter ! = m_material_list . end ( ) ) {
int id = iter - > first ;
Material * item = iter - > second ;
item - > item - > Destroy ( ) ;
delete item ;
iter + + ;
}
m_ams_list_sizer - > Clear ( ) ;
m_material_list . clear ( ) ;
m_filaments . clear ( ) ;
m_ams_mapping_result . clear ( ) ;
for ( auto i = 0 ; i < extruders . size ( ) ; i + + ) {
auto extruder = extruders [ i ] - 1 ;
auto colour = wxGetApp ( ) . preset_bundle - > project_config . opt_string ( " filament_colour " , ( unsigned int ) extruder ) ;
unsigned char rgb [ 4 ] ;
bmcache . parse_color4 ( colour , rgb ) ;
auto colour_rgb = wxColour ( ( int ) rgb [ 0 ] , ( int ) rgb [ 1 ] , ( int ) rgb [ 2 ] , ( int ) rgb [ 3 ] ) ;
if ( extruder > = materials . size ( ) | | extruder < 0 | | extruder > = display_materials . size ( ) ) continue ;
MaterialItem * item = new MaterialItem ( m_main_page , colour_rgb , _L ( display_materials [ extruder ] ) ) ;
item - > set_ams_info ( wxColour ( " #CECECE " ) , " A1 " , 0 , std : : vector < wxColour > ( ) ) ;
m_ams_list_sizer - > Add ( item , 0 , wxALL , FromDIP ( 4 ) ) ;
item - > Bind ( wxEVT_LEFT_UP , [ this , item , materials , extruder ] ( wxMouseEvent & e ) { } ) ;
item - > Bind ( wxEVT_LEFT_DOWN , [ this , item , materials , extruder ] ( wxMouseEvent & e ) {
MaterialHash : : iterator iter = m_material_list . begin ( ) ;
while ( iter ! = m_material_list . end ( ) ) {
int id = iter - > first ;
Material * item = iter - > second ;
MaterialItem * m = item - > item ;
m - > on_normal ( ) ;
iter + + ;
}
m_current_filament_id = extruder ;
item - > on_selected ( ) ;
auto mouse_pos = ClientToScreen ( e . GetPosition ( ) ) ;
wxPoint rect = item - > ClientToScreen ( wxPoint ( 0 , 0 ) ) ;
// update ams data
if ( get_value_radio ( " use_ams " ) ) {
if ( m_mapping_popup - > IsShown ( ) ) return ;
wxPoint pos = item - > ClientToScreen ( wxPoint ( 0 , 0 ) ) ;
pos . y + = item - > GetRect ( ) . height ;
m_mapping_popup - > Move ( pos ) ;
m_mapping_popup - > set_parent_item ( item ) ;
m_mapping_popup - > set_current_filament_id ( extruder ) ;
m_mapping_popup - > set_tag_texture ( materials [ extruder ] ) ;
m_mapping_popup - > update_ams_data_multi_machines ( ) ;
m_mapping_popup - > Popup ( ) ;
}
} ) ;
Material * material_item = new Material ( ) ;
material_item - > id = extruder ;
material_item - > item = item ;
m_material_list [ i ] = material_item ;
// build for ams mapping
if ( extruder < materials . size ( ) & & extruder > = 0 ) {
FilamentInfo info ;
info . id = extruder ;
info . tray_id = 0 ;
info . type = materials [ extruder ] ;
info . brand = brands [ extruder ] ;
info . filament_id = m_filaments_id [ extruder ] ;
//info.color = wxString::Format("#%02X%02X%02X%02X", colour_rgb.Red(), colour_rgb.Green(), colour_rgb.Blue(), colour_rgb.Alpha()).ToStdString();
info . color = " #CECECEFF " ;
m_filaments . push_back ( info ) ;
m_ams_mapping_result . push_back ( info ) ;
}
}
if ( extruders . size ( ) < = 8 ) {
m_ams_list_sizer - > SetCols ( extruders . size ( ) ) ;
}
else {
m_ams_list_sizer - > SetCols ( 8 ) ;
}
}
void SendMultiMachinePage : : set_default_normal ( const ThumbnailData & data )
{
if ( data . is_valid ( ) ) {
wxImage image ( data . width , data . height ) ;
image . InitAlpha ( ) ;
for ( unsigned int r = 0 ; r < data . height ; + + r ) {
unsigned int rr = ( data . height - 1 - r ) * data . width ;
for ( unsigned int c = 0 ; c < data . width ; + + c ) {
unsigned char * px = ( unsigned char * ) data . pixels . data ( ) + 4 * ( rr + c ) ;
image . SetRGB ( ( int ) c , ( int ) r , px [ 0 ] , px [ 1 ] , px [ 2 ] ) ;
image . SetAlpha ( ( int ) c , ( int ) r , px [ 3 ] ) ;
}
}
image = image . Rescale ( THUMBNAIL_SIZE , THUMBNAIL_SIZE ) ;
m_thumbnail_panel - > set_thumbnail ( image ) ;
}
m_main_scroll - > Layout ( ) ;
m_main_scroll - > Fit ( ) ;
// basic info
auto aprint_stats = m_plater - > get_partplate_list ( ) . get_current_fff_print ( ) . print_statistics ( ) ;
wxString time ;
PartPlate * plate = m_plater - > get_partplate_list ( ) . get_curr_plate ( ) ;
if ( plate ) {
if ( plate - > get_slice_result ( ) ) { time = wxString : : Format ( " %s " , short_time ( get_time_dhms ( plate - > get_slice_result ( ) - > print_statistics . modes [ 0 ] . time ) ) ) ; }
}
char weight [ 64 ] ;
if ( wxGetApp ( ) . app_config - > get ( " use_inches " ) = = " 1 " ) {
: : sprintf ( weight , " %.2f oz " , aprint_stats . total_weight * 0.035274 ) ;
}
else {
: : sprintf ( weight , " %.2f g " , aprint_stats . total_weight ) ;
}
m_stext_time - > SetLabel ( time ) ;
m_stext_weight - > SetLabel ( weight ) ;
}
void SendMultiMachinePage : : set_default ( )
{
wxString filename = m_plater - > get_export_gcode_filename ( " " , true , m_print_plate_idx = = PLATE_ALL_IDX ? true : false ) ;
if ( m_print_plate_idx = = PLATE_ALL_IDX & & filename . empty ( ) ) {
filename = _L ( " Untitled " ) ;
}
if ( filename . empty ( ) ) {
filename = m_plater - > get_export_gcode_filename ( " " , true ) ;
if ( filename . empty ( ) ) filename = _L ( " Untitled " ) ;
}
fs : : path filename_path ( filename . c_str ( ) ) ;
std : : string file_name = filename_path . filename ( ) . string ( ) ;
if ( from_u8 ( file_name ) . find ( _L ( " Untitled " ) ) ! = wxString : : npos ) {
PartPlate * part_plate = m_plater - > get_partplate_list ( ) . get_plate ( m_print_plate_idx ) ;
if ( part_plate ) {
if ( std : : vector < ModelObject * > objects = part_plate - > get_objects_on_this_plate ( ) ; objects . size ( ) > 0 ) {
file_name = objects [ 0 ] - > name ;
for ( int i = 1 ; i < objects . size ( ) ; i + + ) {
file_name + = ( " + " + objects [ i ] - > name ) ;
}
}
if ( file_name . size ( ) > 100 ) {
file_name = file_name . substr ( 0 , 97 ) + " ... " ;
}
}
}
m_current_project_name = wxString : : FromUTF8 ( file_name ) ;
//unsupported character filter
m_current_project_name = from_u8 ( filter_characters ( m_current_project_name . ToUTF8 ( ) . data ( ) , " <>[]:/ \\ |?* \" " ) ) ;
m_task_name - > SetLabel ( m_current_project_name ) ;
sync_ams_list ( ) ;
set_default_normal ( m_plater - > get_partplate_list ( ) . get_curr_plate ( ) - > thumbnail_data ) ;
}
void SendMultiMachinePage : : on_rename_enter ( )
{
if ( m_is_rename_mode = = false ) {
return ;
}
else {
m_is_rename_mode = false ;
}
auto new_file_name = m_rename_input - > GetTextCtrl ( ) - > GetValue ( ) ;
wxString temp ;
int num = 0 ;
for ( auto t : new_file_name ) {
if ( t = = wxString : : FromUTF8 ( " \x20 " ) ) {
num + + ;
if ( num = = 1 ) temp + = t ;
}
else {
num = 0 ;
temp + = t ;
}
}
new_file_name = temp ;
auto m_valid_type = Valid ;
wxString info_line ;
const char * unusable_symbols = " <>[]:/ \\ |?* \" " ;
const std : : string unusable_suffix = PresetCollection : : get_suffix_modified ( ) ; //"(modified)";
for ( size_t i = 0 ; i < std : : strlen ( unusable_symbols ) ; i + + ) {
if ( new_file_name . find_first_of ( unusable_symbols [ i ] ) ! = std : : string : : npos ) {
info_line = _L ( " Name is invalid; " ) + " \n " + _L ( " illegal characters: " ) + " " + unusable_symbols ;
m_valid_type = NoValid ;
break ;
}
}
if ( m_valid_type = = Valid & & new_file_name . find ( unusable_suffix ) ! = std : : string : : npos ) {
info_line = _L ( " Name is invalid; " ) + " \n " + _L ( " illegal suffix: " ) + " \n \t " + from_u8 ( PresetCollection : : get_suffix_modified ( ) ) ;
m_valid_type = NoValid ;
}
if ( m_valid_type = = Valid & & new_file_name . empty ( ) ) {
info_line = _L ( " The name is not allowed to be empty. " ) ;
m_valid_type = NoValid ;
}
if ( m_valid_type = = Valid & & new_file_name . find_first_of ( ' ' ) = = 0 ) {
info_line = _L ( " The name is not allowed to start with space character. " ) ;
m_valid_type = NoValid ;
}
if ( m_valid_type = = Valid & & new_file_name . find_last_of ( ' ' ) = = new_file_name . length ( ) - 1 ) {
info_line = _L ( " The name is not allowed to end with space character. " ) ;
m_valid_type = NoValid ;
}
if ( m_valid_type = = Valid & & new_file_name . size ( ) > = 100 ) {
info_line = _L ( " The name length exceeds the limit. " ) ;
m_valid_type = NoValid ;
}
if ( m_valid_type ! = Valid ) {
MessageDialog msg_wingow ( nullptr , info_line , " " , wxICON_WARNING | wxOK ) ;
if ( msg_wingow . ShowModal ( ) = = wxID_OK ) {
m_rename_switch_panel - > SetSelection ( 0 ) ;
m_task_name - > SetLabel ( m_current_project_name ) ;
m_rename_normal_panel - > Layout ( ) ;
return ;
}
}
m_current_project_name = new_file_name ;
m_rename_switch_panel - > SetSelection ( 0 ) ;
m_task_name - > SetLabelText ( m_current_project_name ) ;
m_rename_normal_panel - > Layout ( ) ;
}
void SendMultiMachinePage : : check_fcous_state ( wxWindow * window )
{
check_focus ( window ) ;
auto children = window - > GetChildren ( ) ;
for ( auto child : children ) {
check_fcous_state ( child ) ;
}
}
void SendMultiMachinePage : : check_focus ( wxWindow * window )
{
if ( window = = m_rename_input | | window = = m_rename_input - > GetTextCtrl ( ) ) {
on_rename_enter ( ) ;
}
}
void SendMultiMachinePage : : on_rename_click ( wxCommandEvent & event )
{
m_is_rename_mode = true ;
m_rename_input - > GetTextCtrl ( ) - > SetValue ( m_current_project_name ) ;
m_rename_switch_panel - > SetSelection ( 1 ) ;
m_rename_input - > GetTextCtrl ( ) - > SetFocus ( ) ;
m_rename_input - > GetTextCtrl ( ) - > SetInsertionPointEnd ( ) ;
}
void SendMultiMachinePage : : init_timer ( )
{
m_refresh_timer = new wxTimer ( ) ;
}
void SendMultiMachinePage : : on_timer ( wxTimerEvent & event )
{
for ( auto it = m_device_items . begin ( ) ; it ! = m_device_items . end ( ) ; it + + ) {
it - > second - > sync_state ( ) ;
it - > second - > Refresh ( ) ;
}
}
} // namespace GUI
} // namespace Slic3r