2011-10-03 09:55:32 +00:00
package Slic3r::GUI::SkeinPanel ;
use strict ;
use warnings ;
2011-10-03 11:08:43 +00:00
use utf8 ;
2011-10-03 09:55:32 +00:00
use File::Basename qw( basename ) ;
2011-10-05 16:13:47 +00:00
use Wx qw( :sizer :progressdialog wxOK wxICON_INFORMATION wxICON_ERROR wxID_OK wxFD_OPEN
wxFD_SAVE wxDEFAULT wxNORMAL ) ;
2011-10-03 09:55:32 +00: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 21:22:34 +00:00
printer = > {
2011-10-03 09:55:32 +00:00
title = > 'Printer' ,
2011-11-13 17:26:31 +00:00
options = > [ qw( nozzle_diameter print_center use_relative_e_distances no_extrusion z_offset ) ] ,
2011-11-13 21:22:34 +00:00
} ,
filament = > {
2011-10-03 09:55:32 +00:00
title = > 'Filament' ,
2011-10-09 20:29:13 +00:00
options = > [ qw( filament_diameter filament_packing_density temperature ) ] ,
2011-11-13 21:22:34 +00:00
} ,
speed = > {
2011-10-03 09:55:32 +00:00
title = > 'Speed' ,
2011-10-05 16:13:47 +00:00
options = > [ qw( print_feed_rate travel_feed_rate perimeter_feed_rate bottom_layer_speed_ratio ) ] ,
2011-11-13 21:22:34 +00:00
} ,
accuracy = > {
2011-10-03 09:55:32 +00:00
title = > 'Accuracy' ,
2011-10-18 13:57:53 +00:00
options = > [ qw( layer_height infill_every_layers ) ] ,
2011-11-13 21:22:34 +00:00
} ,
print = > {
2011-10-03 09:55:32 +00:00
title = > 'Print settings' ,
2011-11-17 09:38:23 +00:00
options = > [ qw( perimeters solid_layers fill_density fill_angle fill_pattern solid_fill_pattern ) ] ,
2011-11-13 21:22:34 +00:00
} ,
retract = > {
2011-10-03 09:55:32 +00:00
title = > 'Retraction' ,
2011-11-07 14:58:47 +00:00
options = > [ qw( retract_length retract_lift retract_speed retract_restart_extra retract_before_travel ) ] ,
2011-11-13 21:22:34 +00:00
} ,
skirt = > {
2011-10-03 09:55:32 +00:00
title = > 'Skirt' ,
2011-11-13 17:41:12 +00:00
options = > [ qw( skirts skirt_distance skirt_height ) ] ,
2011-11-13 21:22:34 +00:00
} ,
transform = > {
2011-10-03 09:55:32 +00:00
title = > 'Transform' ,
2011-11-07 14:49:07 +00:00
options = > [ qw( scale rotate duplicate_x duplicate_y duplicate_distance ) ] ,
2011-11-13 21:22:34 +00:00
} ,
2011-11-13 21:48:21 +00:00
gcode = > {
title = > 'Custom GCODE' ,
options = > [ qw( start_gcode end_gcode ) ] ,
} ,
2011-10-03 09:55:32 +00:00
) ;
2011-10-05 16:13:47 +00:00
$ self - > { panels } = \ % panels ;
2011-10-03 09:55:32 +00:00
2011-11-13 21:22:34 +00: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 09:55:32 +00:00
2011-11-14 16:21:44 +00:00
my $ tab1 = $ make_tab - > ( [ qw( transform accuracy skirt ) ] , [ qw( print retract ) ] ) ;
my $ tab2 = $ make_tab - > ( [ qw( printer filament ) ] , [ qw( speed ) ] ) ;
2011-11-13 21:48:21 +00:00
my $ tab3 = $ make_tab - > ( [ qw( gcode ) ] ) ;
2011-10-03 09:55:32 +00:00
2011-11-14 16:21:44 +00:00
$ tabpanel - > AddPage ( $ tab1 , "Print Settings" ) ;
$ tabpanel - > AddPage ( $ tab2 , "Printer and Filament" ) ;
2011-11-13 21:48:21 +00:00
$ tabpanel - > AddPage ( $ tab3 , "Start/End GCODE" ) ;
2011-11-13 21:22:34 +00:00
my $ buttons_sizer ;
2011-10-05 16:13:47 +00:00
{
2011-11-13 21:22:34 +00: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 16:13:47 +00:00
my $ save_button = Wx::Button - > new ( $ self , - 1 , "Save configuration..." ) ;
2011-11-13 21:22:34 +00:00
$ buttons_sizer - > Add ( $ save_button , 0 ) ;
2011-10-05 16:13:47 +00:00
EVT_BUTTON ( $ self , $ save_button , \ & save_config ) ;
my $ load_button = Wx::Button - > new ( $ self , - 1 , "Load configuration..." ) ;
2011-11-13 21:22:34 +00:00
$ buttons_sizer - > Add ( $ load_button , 0 ) ;
2011-10-05 16:13:47 +00:00
EVT_BUTTON ( $ self , $ load_button , \ & load_config ) ;
2011-11-13 21:57:58 +00: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 16:13:47 +00:00
my $ font = Wx::Font - > new ( 10 , wxDEFAULT , wxNORMAL , wxNORMAL ) ;
$ text - > SetFont ( $ font ) ;
2011-11-13 21:22:34 +00:00
$ buttons_sizer - > Add ( $ text , 1 , wxEXPAND | wxALIGN_RIGHT ) ;
2011-10-03 09:55:32 +00:00
}
2011-10-05 16:13:47 +00:00
my $ sizer = Wx::BoxSizer - > new ( wxVERTICAL ) ;
2011-11-13 21:22:34 +00:00
$ sizer - > Add ( $ buttons_sizer , 0 , wxEXPAND | wxALL , 10 ) ;
$ sizer - > Add ( $ tabpanel ) ;
2011-10-05 16:13:47 +00:00
2011-10-03 09:55:32 +00:00
$ sizer - > SetSizeHints ( $ self ) ;
$ self - > SetSizer ( $ sizer ) ;
2011-10-03 11:08:43 +00:00
$ self - > Layout ;
2011-10-03 09:55:32 +00:00
return $ self ;
}
sub do_slice {
my $ self = shift ;
2011-10-03 15:41:45 +00:00
my $ process_dialog ;
2011-10-03 09:55:32 +00:00
eval {
# validate configuration
Slic3r::Config - > validate ;
# select input file
2011-10-04 16:00:01 +00:00
my $ dialog = Wx::FileDialog - > new ( $ self , 'Choose a STL file to slice:' , "" , "" , "STL files *.stl|*.stl;*.STL" , wxFD_OPEN ) ;
2011-10-03 09:55:32 +00: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 15:41:45 +00:00
$ process_dialog = Wx::ProgressDialog - > new ( 'Slicing...' , "Processing $input_file_basename..." ,
2011-10-03 09:55:32 +00:00
100 , $ self , wxPD_APP_MODAL ) ;
$ process_dialog - > Pulse ;
my $ skein = Slic3r::Skein - > new (
input_file = > $ input_file ,
2011-11-13 19:45:15 +00:00
output_file = > $ main:: opt { output } ,
2011-10-03 09:55:32 +00:00
) ;
$ skein - > go ;
$ process_dialog - > Destroy ;
2011-10-03 15:41:45 +00:00
undef $ process_dialog ;
2011-10-03 09:55:32 +00:00
2011-11-13 19:45:15 +00:00
if ( ! $ main:: opt { close_after_slicing } ) {
Wx::MessageDialog - > new ( $ self , "$input_file_basename was successfully sliced." , 'Done!' ,
wxOK | wxICON_INFORMATION ) - > ShowModal ;
} else {
$ self - > GetParent - > Destroy ( ) ; # quit
}
2011-10-03 09:55:32 +00:00
} ;
2011-10-05 16:13:47 +00: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 ;
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 ;
2011-10-03 09:55:32 +00:00
2011-10-05 16:13:47 +00:00
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 09:55:32 +00:00
if ( my $ err = $@ ) {
2011-10-05 16:13:47 +00:00
$ cb - > ( ) if $ cb ;
2011-10-03 09:55:32 +00:00
Wx::MessageDialog - > new ( $ self , $ err , 'Error' , wxOK | wxICON_ERROR ) - > ShowModal ;
}
}
1 ;