2018-03-01 08:19:34 +00:00
# include <algorithm>
2018-02-28 15:04:56 +00:00
# include "WipeTowerDialog.hpp"
// Human-readable output of Parameters structure
std : : ostream & operator < < ( std : : ostream & str , Slic3r : : WipeTowerParameters & par ) {
str < < " sampling: " < < par . sampling < < " \n " ;
str < < " line widths: " ;
for ( const auto & a : par . ramming_line_width_multiplicator ) str < < a < < " " ;
str < < " line spacing: " ;
for ( const auto & a : par . ramming_step_multiplicator ) str < < a < < " " ;
str < < " \n \n ramming_speeds: \n " ;
for ( const auto & a : par . ramming_speed ) {
for ( const auto & b : a )
str < < b < < " " ;
str < < " \n " ;
}
str < < " \n \n ramming_buttons: \n " ;
for ( const auto & a : par . ramming_buttons ) {
for ( const auto & b : a ) {
Slic3r : : operator < < ( str , b ) ; // temporary hack (this << is in the namespace Slic3r)
str < < " | " ; // the function will be deleted after everything is debugged, anyway
}
str < < " \n " ;
}
str < < " \n \n wipe volumes: \n " ;
for ( const auto & a : par . wipe_volumes ) {
for ( const auto & b : a )
str < < b < < " " ;
str < < " \n " ;
}
str < < " \n \n filament wipe volumes: \n " ;
for ( const auto & a : par . filament_wipe_volumes ) {
Slic3r : : operator < < ( str , a ) ;
str < < " " ;
}
str < < " \n " ;
return str ;
}
RammingPanel : : RammingPanel ( wxWindow * parent , const Slic3r : : WipeTowerParameters & p )
: wxPanel ( parent , wxID_ANY , wxPoint ( 0 , 0 ) , wxSize ( 0 , 0 ) , wxBORDER_RAISED )
{
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 ) ;
new wxStaticText ( this , wxID_ANY , wxString ( " Extruder #: " ) , wxPoint ( 500 , 12 ) , wxSize ( 200 , 25 ) , wxALIGN_LEFT ) ;
wxArrayString choices ;
for ( unsigned int i = 0 ; i < p . ramming_line_width_multiplicator . size ( ) ; + + i ) { // for all extruders
choices . Add ( wxString ( " " ) < < i + 1 ) ;
m_ramming_line_width_multiplicators . push_back ( p . ramming_line_width_multiplicator [ i ] * 100 ) ;
m_ramming_step_multiplicators . push_back ( p . ramming_step_multiplicator [ i ] * 100 ) ;
}
m_widget_extruder = new wxChoice ( this , wxID_ANY , wxPoint ( 580 , 5 ) , wxSize ( 50 , 27 ) , choices ) ;
m_chart = new Chart ( this , wxRect ( 10 , 10 , 480 , 360 ) , p . ramming_buttons , p . ramming_speed , p . sampling ) ;
m_chart - > set_extruder ( 0 ) ;
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 ( ) ;
m_widget_extruder - > SetSelection ( 0 ) ;
extruder_selection_changed ( ) ; // tell everyone to redraw
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_extruder - > Bind ( wxEVT_CHOICE , [ this ] ( wxCommandEvent & ) { extruder_selection_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
Bind ( EVT_WIPE_TOWER_CHART_CHANGED , [ this ] ( wxCommandEvent & ) { m_widget_volume - > SetValue ( m_chart - > get_volume ( ) ) ; m_widget_time - > SetValue ( m_chart - > get_time ( ) ) ; } ) ;
}
void RammingPanel : : fill_parameters ( Slic3r : : WipeTowerParameters & p )
{
if ( ! m_chart ) return ;
p . ramming_buttons = m_chart - > get_buttons ( ) ;
p . ramming_speed = m_chart - > get_ramming_speeds ( p . sampling ) ;
for ( unsigned int i = 0 ; i < m_ramming_line_width_multiplicators . size ( ) ; + + i ) { // we assume m_ramming_line_width_multiplicators.size() == m_ramming_step_multiplicators.size()
p . ramming_line_width_multiplicator . push_back ( m_ramming_line_width_multiplicators [ i ] / 100.f ) ;
p . ramming_step_multiplicator . push_back ( m_ramming_step_multiplicators [ i ] / 100.f ) ;
}
}
void RammingPanel : : extruder_selection_changed ( ) {
m_current_extruder = m_widget_extruder - > GetSelection ( ) ;
m_chart - > set_extruder ( m_current_extruder ) ; // tell our chart to redraw
m_widget_ramming_line_width_multiplicator - > SetValue ( m_ramming_line_width_multiplicators [ m_current_extruder ] ) ;
m_widget_ramming_step_multiplicator - > SetValue ( m_ramming_step_multiplicators [ m_current_extruder ] ) ;
}
void RammingPanel : : line_parameters_changed ( ) {
m_ramming_line_width_multiplicators [ m_current_extruder ] = m_widget_ramming_line_width_multiplicator - > GetValue ( ) ;
m_ramming_step_multiplicators [ m_current_extruder ] = m_widget_ramming_step_multiplicator - > GetValue ( ) ;
}
WipingPanel : : WipingPanel ( wxWindow * parent , const Slic3r : : WipeTowerParameters & p )
: wxPanel ( parent , wxID_ANY , wxPoint ( 0 , 0 ) , wxSize ( 0 , 0 ) , wxBORDER_RAISED )
{
const int N = 4 ; // number of extruders
new wxStaticText ( this , wxID_ANY , wxString ( " Volume to wipe when the filament is being " ) , wxPoint ( 40 , 55 ) , wxSize ( 500 , 25 ) ) ;
new wxStaticText ( this , wxID_ANY , wxString ( " unloaded " ) , wxPoint ( 110 , 75 ) , wxSize ( 500 , 25 ) ) ;
new wxStaticText ( this , wxID_ANY , wxString ( " loaded " ) , wxPoint ( 195 , 75 ) , wxSize ( 500 , 25 ) ) ;
m_widget_button = new wxButton ( this , wxID_ANY , " -> Fill in the matrix -> " , wxPoint ( 300 , 130 ) , wxSize ( 175 , 50 ) ) ;
for ( int i = 0 ; i < N ; + + i ) {
new wxStaticText ( this , wxID_ANY , wxString ( " Filament # " ) < < i + 1 < < " : " , wxPoint ( 20 , 105 + 30 * i ) , wxSize ( 150 , 25 ) , wxALIGN_LEFT ) ;
m_old . push_back ( new wxSpinCtrl ( this , wxID_ANY , wxEmptyString , wxPoint ( 120 , 100 + 30 * i ) , wxSize ( 50 , 25 ) , wxSP_ARROW_KEYS | wxALIGN_RIGHT , 0 , 100 , p . filament_wipe_volumes [ i ] . first ) ) ;
m_new . push_back ( new wxSpinCtrl ( this , wxID_ANY , wxEmptyString , wxPoint ( 195 , 100 + 30 * i ) , wxSize ( 50 , 25 ) , wxSP_ARROW_KEYS | wxALIGN_RIGHT , 0 , 100 , p . filament_wipe_volumes [ i ] . second ) ) ;
}
wxPoint origin ( 515 , 55 ) ;
for ( int i = 0 ; i < N ; + + i ) {
edit_boxes . push_back ( std : : vector < wxTextCtrl * > ( 0 ) ) ;
new wxStaticText ( this , wxID_ANY , wxString ( " " ) < < i + 1 , origin + wxPoint ( 45 + 60 * i , 25 ) , wxSize ( 20 , 25 ) ) ;
new wxStaticText ( this , wxID_ANY , wxString ( " " ) < < i + 1 , origin + wxPoint ( 0 , 50 + 30 * i ) , wxSize ( 500 , 25 ) ) ;
for ( int j = 0 ; j < N ; + + j ) {
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
edit_boxes [ i ] [ j ] - > SetValue ( wxString ( " " ) < < int ( p . wipe_volumes [ j ] [ i ] ) ) ;
}
new wxStaticText ( this , wxID_ANY , wxString ( " Filament changed to " ) , origin + wxPoint ( 75 , 0 ) , wxSize ( 500 , 25 ) ) ;
}
m_widget_button - > Bind ( wxEVT_BUTTON , [ this ] ( wxCommandEvent & ) { fill_in_matrix ( ) ; } ) ;
}
void WipingPanel : : fill_parameters ( Slic3r : : WipeTowerParameters & p ) {
p . wipe_volumes . clear ( ) ;
p . filament_wipe_volumes . clear ( ) ;
for ( int i = 0 ; i < 4 ; + + i ) {
// first go through the full matrix:
p . wipe_volumes . push_back ( std : : vector < float > ( ) ) ;
for ( int j = 0 ; j < 4 ; + + j ) {
double val = 0. ;
edit_boxes [ j ] [ i ] - > GetValue ( ) . ToDouble ( & val ) ;
p . wipe_volumes [ i ] . push_back ( ( float ) val ) ;
}
// now the filament volumes:
p . filament_wipe_volumes . push_back ( std : : make_pair ( m_old [ i ] - > GetValue ( ) , m_new [ i ] - > GetValue ( ) ) ) ;
}
}
void WipingPanel : : fill_in_matrix ( ) {
wxArrayString choices ;
choices . Add ( " sum " ) ;
choices . Add ( " maximum " ) ;
wxSingleChoiceDialog dialog ( this , " How shall I calculate volume for any given pair? \n \n I can either sum volumes for old and new filament, or just use the higher value. " , " DEBUGGING " , choices ) ;
if ( dialog . ShowModal ( ) = = wxID_CANCEL )
return ;
for ( unsigned i = 0 ; i < 4 ; + + i ) {
for ( unsigned j = 0 ; j < 4 ; + + j ) {
if ( i = = j ) continue ;
if ( ! dialog . GetSelection ( ) ) edit_boxes [ j ] [ i ] - > SetValue ( wxString ( " " ) < < ( m_old [ i ] - > GetValue ( ) + m_new [ j ] - > GetValue ( ) ) ) ;
else
edit_boxes [ j ] [ i ] - > SetValue ( wxString ( " " ) < < ( std : : max ( m_old [ i ] - > GetValue ( ) , m_new [ j ] - > GetValue ( ) ) ) ) ;
}
}
}
WipeTowerDialog : : WipeTowerDialog ( wxWindow * parent , const std : : string & init_data )
: wxDialog ( parent , - 1 , wxT ( " Wipe tower advanced settings " ) , wxPoint ( 50 , 50 ) , wxSize ( 800 , 550 ) , wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER )
{
this - > Centre ( ) ;
Slic3r : : WipeTowerParameters parameters ( init_data ) ;
if ( ! parameters . validate ( ) ) {
wxMessageDialog ( this , " Wipe tower parameters not parsed correctly! \n Restoring default settings. " , " Error " , wxICON_ERROR ) ;
parameters . set_defaults ( ) ;
}
wxNotebook * notebook = new wxNotebook ( this , wxID_ANY , wxPoint ( 0 , 0 ) , wxSize ( 800 , 450 ) ) ;
2018-03-12 14:41:25 +00:00
//m_panel_general = new GeneralPanel(notebook,parameters);
2018-02-28 15:04:56 +00:00
m_panel_ramming = new RammingPanel ( notebook , parameters ) ;
2018-03-12 14:41:25 +00:00
//m_panel_cooling = new CoolingPanel(notebook,parameters);
2018-02-28 15:04:56 +00:00
m_panel_wiping = new WipingPanel ( notebook , parameters ) ;
2018-03-12 14:41:25 +00:00
//notebook->AddPage(m_panel_general,"General");
2018-02-28 15:04:56 +00:00
notebook - > AddPage ( m_panel_ramming , " Ramming " ) ;
2018-03-12 14:41:25 +00:00
//notebook->AddPage(m_panel_cooling,"Cooling");
2018-02-28 15:04:56 +00:00
notebook - > AddPage ( m_panel_wiping , " Wiping " ) ;
this - > Show ( ) ;
auto main_sizer = new wxBoxSizer ( wxVERTICAL ) ;
main_sizer - > Add ( notebook , 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 & ) {
m_output_data = read_dialog_values ( ) ;
EndModal ( wxID_OK ) ;
} , wxID_OK ) ;
}