2018-03-01 08:19:34 +00:00
# include <algorithm>
2018-03-15 13:04:12 +00:00
# include <sstream>
2018-02-28 15:04:56 +00:00
# include "WipeTowerDialog.hpp"
2018-03-20 12:50:51 +00:00
//! macro used to mark string used at localization,
//! return same string
# define L(s) s
2018-03-13 14:54:29 +00:00
2018-03-15 13:04:12 +00:00
RammingDialog : : RammingDialog ( wxWindow * parent , const std : : string & parameters )
2018-03-13 14:54:29 +00:00
: wxDialog ( parent , - 1 , wxT ( " Ramming customization " ) , wxPoint ( 50 , 50 ) , wxSize ( 800 , 550 ) , wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER )
{
this - > Centre ( ) ;
2018-03-15 13:04:12 +00:00
m_panel_ramming = new RammingPanel ( this , parameters ) ;
2018-03-13 14:54:29 +00:00
m_panel_ramming - > Show ( true ) ;
this - > Show ( ) ;
auto main_sizer = new wxBoxSizer ( wxVERTICAL ) ;
main_sizer - > Add ( m_panel_ramming , 1 , wxEXPAND ) ;
main_sizer - > Add ( CreateButtonSizer ( wxOK | wxCANCEL ) , 0 , wxALIGN_CENTER_HORIZONTAL | wxBOTTOM , 10 ) ;
SetSizer ( main_sizer ) ;
SetMinSize ( GetSize ( ) ) ;
main_sizer - > SetSizeHints ( this ) ;
this - > Bind ( wxEVT_CLOSE_WINDOW , [ this ] ( wxCloseEvent & e ) { EndModal ( wxCANCEL ) ; } ) ;
2018-02-28 15:04:56 +00:00
2018-03-13 14:54:29 +00:00
this - > Bind ( wxEVT_BUTTON , [ this ] ( wxCommandEvent & ) {
2018-03-15 13:04:12 +00:00
m_output_data = m_panel_ramming - > get_parameters ( ) ;
2018-03-13 14:54:29 +00:00
EndModal ( wxID_OK ) ;
} , wxID_OK ) ;
}
2018-02-28 15:04:56 +00:00
2018-03-15 13:04:12 +00:00
RammingPanel : : RammingPanel ( wxWindow * parent , const std : : string & parameters )
2018-03-13 14:54:29 +00:00
: wxPanel ( parent , wxID_ANY , wxPoint ( 50 , 50 ) , wxSize ( 800 , 350 ) , wxBORDER_RAISED )
2018-02-28 15:04:56 +00:00
{
new wxStaticText ( this , wxID_ANY , wxString ( " Total ramming time (s) : " ), wxPoint(500,105), wxSize(200,25),wxALIGN_LEFT) ;
m_widget_time = new wxSpinCtrlDouble ( this , wxID_ANY , wxEmptyString , wxPoint ( 700 , 100 ) , wxSize ( 75 , 25 ) , wxSP_ARROW_KEYS | wxALIGN_RIGHT , 0. , 5.0 , 3. , 0.5 ) ;
new wxStaticText ( this , wxID_ANY , wxString ( " Total rammed volume (mm3) : " ), wxPoint(500,135), wxSize(200,25),wxALIGN_LEFT) ;
m_widget_volume = new wxSpinCtrl ( this , wxID_ANY , wxEmptyString , wxPoint ( 700 , 130 ) , wxSize ( 75 , 25 ) , wxSP_ARROW_KEYS | wxALIGN_RIGHT , 0 , 10000 , 0 ) ;
new wxStaticText ( this , wxID_ANY , wxString ( " Ramming line width (%) : " ), wxPoint(500,205), wxSize(200,25),wxALIGN_LEFT) ;
m_widget_ramming_line_width_multiplicator = new wxSpinCtrl ( this , wxID_ANY , wxEmptyString , wxPoint ( 700 , 200 ) , wxSize ( 75 , 25 ) , wxSP_ARROW_KEYS | wxALIGN_RIGHT , 10 , 200 , 100 ) ;
new wxStaticText ( this , wxID_ANY , wxString ( " Ramming line spacing (%) : " ), wxPoint(500,235), wxSize(200,25),wxALIGN_LEFT) ;
m_widget_ramming_step_multiplicator = new wxSpinCtrl ( this , wxID_ANY , wxEmptyString , wxPoint ( 700 , 230 ) , wxSize ( 75 , 25 ) , wxSP_ARROW_KEYS | wxALIGN_RIGHT , 10 , 200 , 100 ) ;
2018-03-15 13:04:12 +00:00
std : : stringstream stream { parameters } ;
stream > > m_ramming_line_width_multiplicator > > m_ramming_step_multiplicator ;
int ramming_speed_size = 0 ;
float dummy = 0.f ;
while ( stream > > dummy )
+ + ramming_speed_size ;
stream . clear ( ) ;
stream . get ( ) ;
std : : vector < std : : pair < float , float > > buttons ;
float x = 0.f ;
float y = 0.f ;
while ( stream > > x > > y )
buttons . push_back ( std : : make_pair ( x , y ) ) ;
2018-02-28 15:04:56 +00:00
2018-03-15 13:04:12 +00:00
m_chart = new Chart ( this , wxRect ( 10 , 10 , 480 , 360 ) , buttons , ramming_speed_size , 0.25f ) ;
2018-02-28 15:04:56 +00:00
m_widget_time - > SetValue ( m_chart - > get_time ( ) ) ;
m_widget_time - > SetDigits ( 2 ) ;
m_widget_volume - > SetValue ( m_chart - > get_volume ( ) ) ;
m_widget_volume - > Disable ( ) ;
2018-03-13 14:54:29 +00:00
m_widget_ramming_line_width_multiplicator - > SetValue ( m_ramming_line_width_multiplicator ) ;
m_widget_ramming_step_multiplicator - > SetValue ( m_ramming_step_multiplicator ) ;
2018-02-28 15:04:56 +00:00
m_widget_ramming_step_multiplicator - > Bind ( wxEVT_TEXT , [ this ] ( wxCommandEvent & ) { line_parameters_changed ( ) ; } ) ;
m_widget_ramming_line_width_multiplicator - > Bind ( wxEVT_TEXT , [ this ] ( wxCommandEvent & ) { line_parameters_changed ( ) ; } ) ;
m_widget_time - > Bind ( wxEVT_TEXT , [ this ] ( wxCommandEvent & ) { m_chart - > set_xy_range ( m_widget_time - > GetValue ( ) , - 1 ) ; } ) ;
m_widget_time - > Bind ( wxEVT_CHAR , [ ] ( wxKeyEvent & ) { } ) ; // do nothing - prevents the user to change the value
m_widget_volume - > Bind ( wxEVT_CHAR , [ ] ( wxKeyEvent & ) { } ) ; // do nothing - prevents the user to change the value
2018-03-13 14:54:29 +00:00
Bind ( EVT_WIPE_TOWER_CHART_CHANGED , [ this ] ( wxCommandEvent & ) { m_widget_volume - > SetValue ( m_chart - > get_volume ( ) ) ; m_widget_time - > SetValue ( m_chart - > get_time ( ) ) ; } ) ;
Refresh ( this ) ;
2018-02-28 15:04:56 +00:00
}
2018-03-15 13:04:12 +00:00
void RammingPanel : : line_parameters_changed ( ) {
m_ramming_line_width_multiplicator = m_widget_ramming_line_width_multiplicator - > GetValue ( ) ;
m_ramming_step_multiplicator = m_widget_ramming_step_multiplicator - > GetValue ( ) ;
}
2018-03-13 14:54:29 +00:00
2018-03-15 13:04:12 +00:00
std : : string RammingPanel : : get_parameters ( )
2018-02-28 15:04:56 +00:00
{
2018-03-15 13:04:12 +00:00
std : : vector < float > speeds = m_chart - > get_ramming_speed ( 0.25f ) ;
std : : vector < std : : pair < float , float > > buttons = m_chart - > get_buttons ( ) ;
std : : stringstream stream ;
stream < < m_ramming_line_width_multiplicator < < " " < < m_ramming_step_multiplicator ;
for ( const float & speed_value : speeds )
stream < < " " < < speed_value ;
stream < < " | " ;
for ( const auto & button : buttons )
stream < < " " < < button . first < < " " < < button . second ;
return stream . str ( ) ;
2018-02-28 15:04:56 +00:00
}
2018-03-13 14:54:29 +00:00
2018-03-15 13:04:12 +00:00
2018-03-20 12:50:51 +00:00
WipingDialog : : WipingDialog ( wxWindow * parent , const std : : vector < float > & matrix , const std : : vector < float > & extruders )
: wxDialog ( parent , - 1 , wxT ( L ( " Wipe tower - Purging volume adjustment " ) ) , wxPoint ( 50 , 50 ) , wxSize ( 800 , 550 ) , wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER )
2018-03-15 13:04:12 +00:00
{
this - > Centre ( ) ;
2018-03-16 12:58:58 +00:00
2018-03-20 12:50:51 +00:00
m_panel_wiping = new WipingPanel ( this , matrix , extruders ) ;
2018-03-15 13:04:12 +00:00
this - > Show ( ) ;
auto main_sizer = new wxBoxSizer ( wxVERTICAL ) ;
main_sizer - > Add ( m_panel_wiping , 1 , wxEXPAND ) ;
main_sizer - > Add ( CreateButtonSizer ( wxOK | wxCANCEL ) , 0 , wxALIGN_CENTER_HORIZONTAL | wxBOTTOM , 10 ) ;
SetSizer ( main_sizer ) ;
SetMinSize ( GetSize ( ) ) ;
main_sizer - > SetSizeHints ( this ) ;
this - > Bind ( wxEVT_CLOSE_WINDOW , [ this ] ( wxCloseEvent & e ) { EndModal ( wxCANCEL ) ; } ) ;
this - > Bind ( wxEVT_BUTTON , [ this ] ( wxCommandEvent & ) {
2018-03-20 12:50:51 +00:00
m_output_matrix = m_panel_wiping - > read_matrix_values ( ) ;
m_output_extruders = m_panel_wiping - > read_extruders_values ( ) ;
2018-03-15 13:04:12 +00:00
EndModal ( wxID_OK ) ;
} , wxID_OK ) ;
}
2018-02-28 15:04:56 +00:00
2018-03-20 12:50:51 +00:00
WipingPanel : : WipingPanel ( wxWindow * parent , const std : : vector < float > & matrix , const std : : vector < float > & extruders )
: wxPanel ( parent , wxID_ANY , wxPoint ( 50 , 50 ) , wxSize ( 500 , 350 ) , wxBORDER_RAISED )
2018-02-28 15:04:56 +00:00
{
2018-03-20 12:50:51 +00:00
m_number_of_extruders = ( int ) ( sqrt ( matrix . size ( ) ) + 0.001 ) ; // number of extruders
m_notadvanced_widgets . push_back ( new wxStaticText ( this , wxID_ANY , wxString ( L ( " Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded. " ) ) , wxPoint ( 40 , 25 ) , wxSize ( 500 , 35 ) ) ) ;
m_notadvanced_widgets . push_back ( new wxStaticText ( this , wxID_ANY , wxString ( L ( " Volume to purge (mm \u00B3 ) when the filament is being " ) ) , wxPoint ( 40 , 85 ) , wxSize ( 500 , 25 ) ) ) ;
m_notadvanced_widgets . push_back ( new wxStaticText ( this , wxID_ANY , wxString ( L ( " unloaded " ) ) , wxPoint ( 110 , 105 ) , wxSize ( 500 , 25 ) ) ) ;
m_notadvanced_widgets . push_back ( new wxStaticText ( this , wxID_ANY , wxString ( L ( " loaded " ) ) , wxPoint ( 195 , 105 ) , wxSize ( 500 , 25 ) ) ) ;
m_widget_button = new wxButton ( this , wxID_ANY , " - " , wxPoint ( 0 , 0 ) , wxSize ( 170 , 20 ) ) ;
for ( unsigned int i = 0 ; i < m_number_of_extruders ; + + i ) {
m_notadvanced_widgets . push_back ( new wxStaticText ( this , wxID_ANY , wxString ( L ( " Tool # " ) ) < < i + 1 < < " : " , wxPoint ( 20 , 135 + 30 * i ) , wxSize ( 150 , 25 ) , wxALIGN_LEFT ) ) ;
m_old . push_back ( new wxSpinCtrl ( this , wxID_ANY , wxEmptyString , wxPoint ( 120 , 130 + 30 * i ) , wxSize ( 50 , 25 ) , wxSP_ARROW_KEYS | wxALIGN_RIGHT , 0 , 300 , extruders [ 2 * i ] ) ) ;
m_new . push_back ( new wxSpinCtrl ( this , wxID_ANY , wxEmptyString , wxPoint ( 195 , 130 + 30 * i ) , wxSize ( 50 , 25 ) , wxSP_ARROW_KEYS | wxALIGN_RIGHT , 0 , 300 , extruders [ 2 * i + 1 ] ) ) ;
2018-02-28 15:04:56 +00:00
}
2018-03-20 12:50:51 +00:00
wxPoint origin ( 50 , 85 ) ;
m_advanced_widgets . push_back ( new wxStaticText ( this , wxID_ANY , wxString ( L ( " Here you can adjust required purging volume (mm \u00B3 ) for any given pair of tools. " ) ) , wxPoint ( 40 , 25 ) , wxSize ( 500 , 35 ) ) ) ;
for ( unsigned int i = 0 ; i < m_number_of_extruders ; + + i ) {
2018-02-28 15:04:56 +00:00
edit_boxes . push_back ( std : : vector < wxTextCtrl * > ( 0 ) ) ;
2018-03-20 12:50:51 +00:00
m_advanced_widgets . push_back ( new wxStaticText ( this , wxID_ANY , wxString ( " " ) < < i + 1 , origin + wxPoint ( 45 + 60 * i , 25 ) , wxSize ( 20 , 25 ) ) ) ;
m_advanced_widgets . push_back ( new wxStaticText ( this , wxID_ANY , wxString ( " " ) < < i + 1 , origin + wxPoint ( 0 , 50 + 30 * i ) , wxSize ( 500 , 25 ) ) ) ;
for ( unsigned int j = 0 ; j < m_number_of_extruders ; + + j ) {
2018-02-28 15:04:56 +00:00
edit_boxes . back ( ) . push_back ( new wxTextCtrl ( this , wxID_ANY , wxEmptyString , origin + wxPoint ( 25 + 60 * i , 45 + 30 * j ) , wxSize ( 50 , 25 ) ) ) ;
if ( i = = j )
edit_boxes [ i ] [ j ] - > Disable ( ) ;
else
2018-03-20 12:50:51 +00:00
edit_boxes [ i ] [ j ] - > SetValue ( wxString ( " " ) < < int ( matrix [ m_number_of_extruders * j + i ] ) ) ;
2018-02-28 15:04:56 +00:00
}
2018-03-20 12:50:51 +00:00
m_advanced_widgets . push_back ( new wxStaticText ( this , wxID_ANY , wxString ( L ( " Filament changed to " ) ) , origin + wxPoint ( 75 , 0 ) , wxSize ( 500 , 25 ) ) ) ;
2018-02-28 15:04:56 +00:00
}
2018-03-20 12:50:51 +00:00
m_widget_button - > Bind ( wxEVT_BUTTON , [ this ] ( wxCommandEvent & ) { toggle_advanced ( true ) ; } ) ;
toggle_advanced ( ) ;
}
std : : vector < float > WipingPanel : : read_matrix_values ( ) {
if ( ! m_advanced )
fill_in_matrix ( ) ;
std : : vector < float > output ;
for ( unsigned int i = 0 ; i < m_number_of_extruders ; + + i ) {
for ( unsigned int j = 0 ; j < m_number_of_extruders ; + + j ) {
double val = 0. ;
edit_boxes [ j ] [ i ] - > GetValue ( ) . ToDouble ( & val ) ;
output . push_back ( ( float ) val ) ;
}
}
return output ;
}
std : : vector < float > WipingPanel : : read_extruders_values ( ) {
std : : vector < float > output ;
for ( unsigned int i = 0 ; i < m_number_of_extruders ; + + i ) {
output . push_back ( m_old [ i ] - > GetValue ( ) ) ;
output . push_back ( m_new [ i ] - > GetValue ( ) ) ;
}
return output ;
2018-02-28 15:04:56 +00:00
}
2018-03-20 12:50:51 +00:00
2018-02-28 15:04:56 +00:00
void WipingPanel : : fill_in_matrix ( ) {
2018-03-20 12:50:51 +00:00
for ( unsigned i = 0 ; i < m_number_of_extruders ; + + i ) {
for ( unsigned j = 0 ; j < m_number_of_extruders ; + + j ) {
2018-02-28 15:04:56 +00:00
if ( i = = j ) continue ;
2018-03-20 12:50:51 +00:00
edit_boxes [ j ] [ i ] - > SetValue ( wxString ( " " ) < < ( m_old [ i ] - > GetValue ( ) + m_new [ j ] - > GetValue ( ) ) ) ;
2018-02-28 15:04:56 +00:00
}
}
}
2018-03-20 12:50:51 +00:00
bool WipingPanel : : advanced_matches_simple ( ) {
for ( unsigned i = 0 ; i < m_number_of_extruders ; + + i ) {
for ( unsigned j = 0 ; j < m_number_of_extruders ; + + j ) {
if ( i = = j ) continue ;
if ( edit_boxes [ j ] [ i ] - > GetValue ( ) ! = ( wxString ( " " ) < < ( m_old [ i ] - > GetValue ( ) + m_new [ j ] - > GetValue ( ) ) ) )
return false ;
}
}
return true ;
}
void WipingPanel : : toggle_advanced ( bool user_button ) {
if ( m_advanced & & ! advanced_matches_simple ( ) & & user_button ) {
if ( wxMessageDialog ( this , wxString ( L ( " Switching to simple settings will discard changes done in the advanced mode! \n \n Do you want to proceed? " ) ) ,
wxString ( L ( " Warning " ) ) , wxYES_NO | wxICON_EXCLAMATION ) . ShowModal ( ) ! = wxID_YES )
return ;
}
2018-02-28 15:04:56 +00:00
2018-03-20 12:50:51 +00:00
m_advanced = ! m_advanced ;
2018-02-28 15:04:56 +00:00
2018-03-20 12:50:51 +00:00
if ( ! user_button ) { // we were called from constructor
if ( advanced_matches_simple ( ) ) // advanced and simple match - let's show simple version
m_advanced = false ;
else
m_advanced = true ;
}
2018-02-28 15:04:56 +00:00
2018-03-20 12:50:51 +00:00
for ( unsigned i = 0 ; i < m_number_of_extruders ; + + i ) { // shows/hides input controls
for ( unsigned j = 0 ; j < m_number_of_extruders ; + + j )
edit_boxes [ i ] [ j ] - > Show ( m_advanced ) ;
m_old [ i ] - > Show ( ! m_advanced ) ;
m_new [ i ] - > Show ( ! m_advanced ) ;
}
for ( const auto & widget : m_advanced_widgets ) // shows/hides other widgets
widget - > Show ( m_advanced ) ;
for ( const auto & widget : m_notadvanced_widgets )
widget - > Show ( ! m_advanced ) ;
if ( m_advanced ) {
if ( user_button ) fill_in_matrix ( ) ; // otherwise keep values loaded from config
m_widget_button - > SetLabel ( L ( " Show simplified settings " ) ) ;
}
else
m_widget_button - > SetLabel ( L ( " Show advanced settings " ) ) ;
2018-02-28 15:04:56 +00:00
2018-03-20 12:50:51 +00:00
this - > Refresh ( ) ;
}