2011-10-03 11:55:32 +02:00
package Slic3r::GUI::SkeinPanel ;
use strict ;
use warnings ;
2011-10-03 13:08:43 +02:00
use utf8 ;
2011-10-03 11:55:32 +02:00
use File::Basename qw(basename) ;
2011-11-27 11:40:03 +01:00
use Wx qw(:sizer :progressdialog wxOK wxICON_INFORMATION wxICON_WARNING wxICON_ERROR wxID_OK wxFD_OPEN
2011-10-05 18:13:47 +02:00
wxFD_SAVE wxDEFAULT wxNORMAL) ;
2011-10-03 11:55:32 +02:00
use Wx::Event qw(EVT_BUTTON) ;
use base 'Wx::Panel' ;
sub new {
my $class = shift ;
my ( $parent ) = @_ ;
my $self = $class -> SUPER:: new ( $parent , - 1 );
my %panels = (
2011-11-13 22:22:34 +01:00
printer => {
2011-10-03 11:55:32 +02:00
title => 'Printer' ,
2011-12-01 22:34:21 +01:00
options => [ qw(nozzle_diameter print_center use_relative_e_distances extrusion_axis z_offset) ],
2011-11-13 22:22:34 +01:00
},
filament => {
2011-10-03 11:55:32 +02:00
title => 'Filament' ,
2011-11-25 11:15:20 +01:00
options => [ qw(filament_diameter extrusion_multiplier temperature) ],
2011-11-13 22:22:34 +01:00
},
2011-11-28 19:11:26 +01:00
print_speed => {
title => 'Print speed' ,
2011-12-04 20:50:03 +01:00
options => [ qw(perimeter_speed small_perimeter_speed infill_speed solid_infill_speed bridge_speed) ],
2011-11-28 19:11:26 +01:00
},
2011-11-13 22:22:34 +01:00
speed => {
2011-11-28 19:11:26 +01:00
title => 'Other speed settings' ,
2011-12-01 22:03:13 +01:00
options => [ qw(travel_speed bottom_layer_speed_ratio) ],
2011-11-13 22:22:34 +01:00
},
accuracy => {
2011-10-03 11:55:32 +02:00
title => 'Accuracy' ,
2011-12-04 19:17:42 +01:00
options => [ qw(layer_height first_layer_height_ratio infill_every_layers) ],
2011-11-13 22:22:34 +01:00
},
print => {
2011-10-03 11:55:32 +02:00
title => 'Print settings' ,
2011-11-17 10:38:23 +01:00
options => [ qw(perimeters solid_layers fill_density fill_angle fill_pattern solid_fill_pattern) ],
2011-11-13 22:22:34 +01:00
},
retract => {
2011-10-03 11:55:32 +02:00
title => 'Retraction' ,
2011-11-07 15:58:47 +01:00
options => [ qw(retract_length retract_lift retract_speed retract_restart_extra retract_before_travel) ],
2011-11-13 22:22:34 +01:00
},
skirt => {
2011-10-03 11:55:32 +02:00
title => 'Skirt' ,
2011-11-13 18:41:12 +01:00
options => [ qw(skirts skirt_distance skirt_height) ],
2011-11-13 22:22:34 +01:00
},
transform => {
2011-10-03 11:55:32 +02:00
title => 'Transform' ,
2011-11-07 15:49:07 +01:00
options => [ qw(scale rotate duplicate_x duplicate_y duplicate_distance) ],
2011-11-13 22:22:34 +01:00
},
2011-11-13 22:48:21 +01:00
gcode => {
title => 'Custom GCODE' ,
options => [ qw(start_gcode end_gcode) ],
},
2011-11-25 10:58:13 +01:00
extrusion => {
title => 'Extrusion' ,
2011-12-04 20:29:21 +01:00
options => [ qw(extrusion_width_ratio bridge_flow_ratio) ],
2011-11-25 10:58:13 +01:00
},
2011-10-03 11:55:32 +02:00
);
2011-10-05 18:13:47 +02:00
$self -> { panels } = \ %panels ;
2011-10-03 11:55:32 +02:00
2011-11-13 22:22:34 +01:00
my $tabpanel = Wx::Notebook -> new ( $self , - 1 , Wx:: wxDefaultPosition , Wx:: wxDefaultSize , & Wx:: wxNB_TOP );
my $make_tab = sub {
my @cols = @_ ;
my $tab = Wx::Panel -> new ( $tabpanel , - 1 );
my $sizer = Wx::BoxSizer -> new ( wxHORIZONTAL );
foreach my $col ( @cols ) {
my $vertical_sizer = Wx::BoxSizer -> new ( wxVERTICAL );
for my $optgroup ( @$col ) {
my $optpanel = Slic3r::GUI::OptionsGroup -> new ( $tab , % { $panels { $optgroup }});
$vertical_sizer -> Add ( $optpanel , 0 , wxEXPAND | wxALL , 10 );
}
$sizer -> Add ( $vertical_sizer );
}
$tab -> SetSizer ( $sizer );
return $tab ;
};
2011-10-03 11:55:32 +02:00
2011-11-25 10:58:13 +01:00
my @tabs = (
$make_tab -> ([ qw(transform accuracy skirt) ], [ qw(print retract) ]),
2011-11-28 19:11:26 +01:00
$make_tab -> ([ qw(printer filament) ], [ qw(print_speed speed) ]),
2011-11-25 10:58:13 +01:00
$make_tab -> ([ qw(gcode) ]),
$make_tab -> ([ qw(extrusion) ]),
);
2011-10-03 11:55:32 +02:00
2011-11-25 10:58:13 +01:00
$tabpanel -> AddPage ( $tabs [ 0 ], "Print Settings" );
$tabpanel -> AddPage ( $tabs [ 1 ], "Printer and Filament" );
$tabpanel -> AddPage ( $tabs [ 2 ], "Start/End GCODE" );
$tabpanel -> AddPage ( $tabs [ 3 ], "Advanced" );
2011-11-13 22:22:34 +01:00
my $buttons_sizer ;
2011-10-05 18:13:47 +02:00
{
2011-11-13 22:22:34 +01:00
$buttons_sizer = Wx::BoxSizer -> new ( wxHORIZONTAL );
my $slice_button = Wx::Button -> new ( $self , - 1 , "Slice..." );
$buttons_sizer -> Add ( $slice_button , 0 );
EVT_BUTTON ( $self , $slice_button , \& do_slice );
2011-10-05 18:13:47 +02:00
my $save_button = Wx::Button -> new ( $self , - 1 , "Save configuration..." );
2011-11-13 22:22:34 +01:00
$buttons_sizer -> Add ( $save_button , 0 );
2011-10-05 18:13:47 +02:00
EVT_BUTTON ( $self , $save_button , \& save_config );
my $load_button = Wx::Button -> new ( $self , - 1 , "Load configuration..." );
2011-11-13 22:22:34 +01:00
$buttons_sizer -> Add ( $load_button , 0 );
2011-10-05 18:13:47 +02:00
EVT_BUTTON ( $self , $load_button , \& load_config );
2011-11-13 22:57:58 +01:00
my $text = Wx::StaticText -> new ( $self , - 1 , "Remember to check for updates at http://slic3r.org/\nVersion: $Slic3r::VERSION" , Wx:: wxDefaultPosition , Wx:: wxDefaultSize , wxALIGN_RIGHT );
2011-10-05 18:13:47 +02:00
my $font = Wx::Font -> new ( 10 , wxDEFAULT , wxNORMAL , wxNORMAL );
$text -> SetFont ( $font );
2011-11-13 22:22:34 +01:00
$buttons_sizer -> Add ( $text , 1 , wxEXPAND | wxALIGN_RIGHT );
2011-10-03 11:55:32 +02:00
}
2011-10-05 18:13:47 +02:00
my $sizer = Wx::BoxSizer -> new ( wxVERTICAL );
2011-11-13 22:22:34 +01:00
$sizer -> Add ( $buttons_sizer , 0 , wxEXPAND | wxALL , 10 );
$sizer -> Add ( $tabpanel );
2011-10-05 18:13:47 +02:00
2011-10-03 11:55:32 +02:00
$sizer -> SetSizeHints ( $self );
$self -> SetSizer ( $sizer );
2011-10-03 13:08:43 +02:00
$self -> Layout ;
2011-10-03 11:55:32 +02:00
return $self ;
}
sub do_slice {
my $self = shift ;
2011-10-03 17:41:45 +02:00
my $process_dialog ;
2011-10-03 11:55:32 +02:00
eval {
# validate configuration
Slic3r::Config -> validate ;
# select input file
2011-10-04 18:00:01 +02:00
my $dialog = Wx::FileDialog -> new ( $self , 'Choose a STL file to slice:' , "" , "" , "STL files *.stl|*.stl;*.STL" , wxFD_OPEN );
2011-10-03 11:55:32 +02:00
return unless $dialog -> ShowModal == wxID_OK ;
my ( $input_file ) = $dialog -> GetPaths ;
my $input_file_basename = basename ( $input_file );
# show processbar dialog
2011-10-03 17:41:45 +02:00
$process_dialog = Wx::ProgressDialog -> new ( 'Slicing...' , "Processing $input_file_basename..." ,
2011-10-03 11:55:32 +02:00
100 , $self , wxPD_APP_MODAL );
$process_dialog -> Pulse ;
2011-11-26 16:52:10 +01:00
2011-10-03 11:55:32 +02:00
my $skein = Slic3r::Skein -> new (
input_file => $input_file ,
2011-11-13 20:45:15 +01:00
output_file => $ main:: opt { output },
2011-11-26 16:19:30 +01:00
status_cb => sub {
my ( $percent , $message ) = @_ ;
2011-11-26 16:52:10 +01:00
if ( & Wx:: wxVERSION_STRING =~ / 2\.(8\.|9\.[2-9])/ ) {
$process_dialog -> Update ( $percent , $message );
}
2011-11-26 16:19:30 +01:00
},
2011-10-03 11:55:32 +02:00
);
2011-11-27 11:40:03 +01:00
{
local $SIG { __WARN__ } = sub {
my $message = shift ;
2011-12-04 18:37:37 +01:00
Wx::MessageDialog -> new ( $self , $message , 'Warning' ,
2011-11-27 11:40:03 +01:00
wxOK | wxICON_WARNING ) -> ShowModal ;
};
$skein -> go ;
}
2011-10-03 11:55:32 +02:00
$process_dialog -> Destroy ;
2011-10-03 17:41:45 +02:00
undef $process_dialog ;
2011-10-03 11:55:32 +02:00
2011-11-13 20:45:15 +01:00
if ( ! $ main:: opt { close_after_slicing }) {
2011-11-26 16:19:30 +01:00
my $message = sprintf "%s was successfully sliced in %d minutes and %.3f seconds." ,
$input_file_basename , int ( $skein -> processing_time / 60 ),
$skein -> processing_time - int ( $skein -> processing_time / 60 ) * 60 ;
Wx::MessageDialog -> new ( $self , $message , 'Done!' ,
2011-11-13 20:45:15 +01:00
wxOK | wxICON_INFORMATION ) -> ShowModal ;
} else {
$self -> GetParent -> Destroy (); # quit
}
2011-10-03 11:55:32 +02:00
};
2011-10-05 18:13:47 +02:00
$self -> catch_error ( sub { $process_dialog -> Destroy if $process_dialog });
}
my $ini_wildcard = "INI files *.ini|*.ini;*.INI" ;
sub save_config {
my $self = shift ;
2011-10-03 11:55:32 +02:00
2011-10-05 18:13:47 +02:00
my $dlg = Wx::FileDialog -> new ( $self , 'Save configuration as:' , "" , "config.ini" ,
$ini_wildcard , wxFD_SAVE );
if ( $dlg -> ShowModal == wxID_OK ) {
Slic3r::Config -> save ( $dlg -> GetPath );
}
}
sub load_config {
my $self = shift ;
my $dlg = Wx::FileDialog -> new ( $self , 'Select configuration to load:' , "" , "config.ini" ,
$ini_wildcard , wxFD_OPEN );
if ( $dlg -> ShowModal == wxID_OK ) {
my ( $file ) = $dlg -> GetPaths ;
eval {
Slic3r::Config -> load ( $file );
};
$self -> catch_error ();
$_ -> () for @ Slic3r::GUI::OptionsGroup:: reload_callbacks ;
}
}
sub catch_error {
my ( $self , $cb ) = @_ ;
2011-10-03 11:55:32 +02:00
if ( my $err = $@ ) {
2011-10-05 18:13:47 +02:00
$cb -> () if $cb ;
2011-10-03 11:55:32 +02:00
Wx::MessageDialog -> new ( $self , $err , 'Error' , wxOK | wxICON_ERROR ) -> ShowModal ;
}
}
1 ;