2016-09-14 09:22:41 +00:00
# The config wizard is executed when the Slic3r is first started.
# The wizard helps the user to specify the 3D printer properties.
2012-06-26 15:42:29 +00:00
package Slic3r::GUI::ConfigWizard ;
use strict ;
use warnings ;
use utf8 ;
2012-07-03 15:21:32 +00:00
use Wx ;
2012-06-26 15:42:29 +00:00
use base 'Wx::Wizard' ;
2014-06-16 18:11:52 +00:00
use Slic3r::Geometry qw( unscale ) ;
2012-06-26 15:42:29 +00:00
2012-07-16 16:34:44 +00:00
# adhere to various human interface guidelines
our $ wizard = 'Wizard' ;
$ wizard = 'Assistant' if & Wx:: wxMAC || & Wx:: wxGTK ;
2012-06-26 15:42:29 +00:00
sub new {
my $ class = shift ;
my ( $ parent ) = @ _ ;
2012-07-16 16:34:44 +00:00
my $ self = $ class - > SUPER:: new ( $ parent , - 1 , "Configuration $wizard" ) ;
2012-06-26 15:42:29 +00:00
2012-07-28 09:34:12 +00:00
# initialize an empty repository
$ self - > { config } = Slic3r::Config - > new ;
2012-06-30 21:56:11 +00:00
2012-06-26 15:42:29 +00:00
$ self - > add_page ( Slic3r::GUI::ConfigWizard::Page::Welcome - > new ( $ self ) ) ;
$ self - > add_page ( Slic3r::GUI::ConfigWizard::Page::Firmware - > new ( $ self ) ) ;
$ self - > add_page ( Slic3r::GUI::ConfigWizard::Page::Bed - > new ( $ self ) ) ;
2012-06-27 15:59:29 +00:00
$ self - > add_page ( Slic3r::GUI::ConfigWizard::Page::Nozzle - > new ( $ self ) ) ;
2012-06-26 15:42:29 +00:00
$ self - > add_page ( Slic3r::GUI::ConfigWizard::Page::Filament - > new ( $ self ) ) ;
$ self - > add_page ( Slic3r::GUI::ConfigWizard::Page::Temperature - > new ( $ self ) ) ;
$ self - > add_page ( Slic3r::GUI::ConfigWizard::Page::BedTemperature - > new ( $ self ) ) ;
$ self - > add_page ( Slic3r::GUI::ConfigWizard::Page::Finished - > new ( $ self ) ) ;
2012-07-03 15:21:32 +00:00
$ _ - > build_index for @ { $ self - > { pages } } ;
2012-06-26 15:42:29 +00:00
return $ self ;
}
sub add_page {
my $ self = shift ;
my ( $ page ) = @ _ ;
my $ n = push @ { $ self - > { pages } } , $ page ;
# add first page to the page area sizer
$ self - > GetPageAreaSizer - > Add ( $ page ) if $ n == 1 ;
# link pages
$ self - > { pages } [ $ n - 2 ] - > set_next_page ( $ page ) if $ n >= 2 ;
$ page - > set_previous_page ( $ self - > { pages } [ $ n - 2 ] ) if $ n >= 2 ;
}
sub run {
my $ self = shift ;
2012-07-28 09:34:12 +00:00
2012-06-30 22:10:48 +00:00
if ( Wx::Wizard:: RunWizard ( $ self , $ self - > { pages } [ 0 ] ) ) {
2012-07-28 09:34:12 +00:00
# it would be cleaner to have these defined inside each page class,
# in some event getting called before leaving the page
{
# set first_layer_height + layer_height based on nozzle_diameter
my $ nozzle = $ self - > { config } - > nozzle_diameter ;
$ self - > { config } - > set ( 'first_layer_height' , $ nozzle - > [ 0 ] ) ;
$ self - > { config } - > set ( 'layer_height' , $ nozzle - > [ 0 ] - 0.1 ) ;
# set first_layer_temperature to temperature + 5
$ self - > { config } - > set ( 'first_layer_temperature' , [ $ self - > { config } - > temperature - > [ 0 ] + 5 ] ) ;
# set first_layer_bed_temperature to temperature + 5
2013-09-21 18:14:17 +00:00
$ self - > { config } - > set ( 'first_layer_bed_temperature' ,
( $ self - > { config } - > bed_temperature > 0 ) ? ( $ self - > { config } - > bed_temperature + 5 ) : 0 ) ;
2012-06-26 15:42:29 +00:00
}
2012-07-28 09:34:12 +00:00
$ self - > Destroy ;
return $ self - > { config } ;
2012-06-26 15:42:29 +00:00
} else {
2012-07-28 09:34:12 +00:00
$ self - > Destroy ;
return undef ;
2012-06-26 15:42:29 +00:00
}
}
2012-07-03 15:21:32 +00:00
package Slic3r::GUI::ConfigWizard::Index ;
2012-07-08 17:41:13 +00:00
use Wx qw( :bitmap :dc :font :misc :sizer :systemsettings :window ) ;
use Wx::Event qw( EVT_ERASE_BACKGROUND EVT_PAINT ) ;
2012-07-03 15:21:32 +00:00
use base 'Wx::Panel' ;
sub new {
my $ class = shift ;
my ( $ parent , $ title ) = @ _ ;
my $ self = $ class - > SUPER:: new ( $ parent ) ;
2012-07-08 17:41:13 +00:00
push @ { $ self - > { titles } } , $ title ;
$ self - > { own_index } = 0 ;
2012-07-03 15:21:32 +00:00
2016-04-09 17:10:57 +00:00
$ self - > { bullets } - > { before } = Wx::Bitmap - > new ( $ Slic3r:: var - > ( "bullet_black.png" ) , wxBITMAP_TYPE_PNG ) ;
$ self - > { bullets } - > { own } = Wx::Bitmap - > new ( $ Slic3r:: var - > ( "bullet_blue.png" ) , wxBITMAP_TYPE_PNG ) ;
$ self - > { bullets } - > { after } = Wx::Bitmap - > new ( $ Slic3r:: var - > ( "bullet_white.png" ) , wxBITMAP_TYPE_PNG ) ;
2012-07-03 15:21:32 +00:00
2016-04-09 17:10:57 +00:00
$ self - > { background } = Wx::Bitmap - > new ( $ Slic3r:: var - > ( "Slic3r_192px_transparent.png" ) , wxBITMAP_TYPE_PNG ) ;
2012-07-03 22:03:05 +00:00
$ self - > SetMinSize ( Wx::Size - > new ( $ self - > { background } - > GetWidth , $ self - > { background } - > GetHeight ) ) ;
2012-07-08 17:41:13 +00:00
EVT_PAINT ( $ self , \ & repaint ) ;
2012-07-03 22:03:05 +00:00
2012-07-03 15:21:32 +00:00
return $ self ;
}
2012-07-08 17:41:13 +00:00
sub repaint {
2012-07-03 22:03:05 +00:00
my ( $ self , $ event ) = @ _ ;
2012-07-08 17:41:13 +00:00
my $ size = $ self - > GetClientSize ;
2012-07-22 13:06:56 +00:00
my $ gap = 5 ;
2012-07-08 17:41:13 +00:00
my $ dc = Wx::PaintDC - > new ( $ self ) ;
$ dc - > SetBackgroundMode ( wxTRANSPARENT ) ;
$ dc - > SetFont ( $ self - > GetFont ) ;
$ dc - > SetTextForeground ( $ self - > GetForegroundColour ) ;
my $ background_h = $ self - > { background } - > GetHeight ;
my $ background_w = $ self - > { background } - > GetWidth ;
$ dc - > DrawBitmap ( $ self - > { background } , ( $ size - > GetWidth - $ background_w ) / 2, ($size->GetHeight - $background_h) / 2 , 1 ) ;
my $ label_h = $ self - > { bullets } - > { own } - > GetHeight ;
$ label_h = $ dc - > GetCharHeight if $ dc - > GetCharHeight > $ label_h ;
my $ label_w = $ size - > GetWidth ;
my $ i = 0 ;
foreach ( @ { $ self - > { titles } } ) {
my $ bullet = $ self - > { bullets } - > { own } ;
$ bullet = $ self - > { bullets } - > { before } if $ i < $ self - > { own_index } ;
$ bullet = $ self - > { bullets } - > { after } if $ i > $ self - > { own_index } ;
$ dc - > SetTextForeground ( Wx::Colour - > new ( 128 , 128 , 128 ) ) if $ i > $ self - > { own_index } ;
2012-07-22 13:06:56 +00:00
$ dc - > DrawLabel ( $ _ , $ bullet , Wx::Rect - > new ( 0 , $ i * ( $ label_h + $ gap ) , $ label_w , $ label_h ) ) ;
2012-07-08 17:41:13 +00:00
$ i + + ;
2012-07-03 22:03:05 +00:00
}
2012-07-08 17:41:13 +00:00
$ event - > Skip ;
2012-07-03 22:03:05 +00:00
}
2012-07-03 15:21:32 +00:00
sub prepend_title {
my $ self = shift ;
my ( $ title ) = @ _ ;
2012-07-08 17:41:13 +00:00
unshift @ { $ self - > { titles } } , $ title ;
$ self - > { own_index } + + ;
$ self - > Refresh ;
2012-07-03 15:21:32 +00:00
}
sub append_title {
my $ self = shift ;
my ( $ title ) = @ _ ;
2012-07-08 17:41:13 +00:00
push @ { $ self - > { titles } } , $ title ;
$ self - > Refresh ;
2012-07-03 15:21:32 +00:00
}
2012-06-26 15:42:29 +00:00
package Slic3r::GUI::ConfigWizard::Page ;
2012-06-30 21:28:07 +00:00
use Wx qw( :font :misc :sizer :staticline :systemsettings ) ;
2012-06-26 15:42:29 +00:00
use base 'Wx::WizardPage' ;
sub new {
my $ class = shift ;
2012-07-03 15:21:32 +00:00
my ( $ parent , $ title , $ short_title ) = @ _ ;
2012-06-26 15:42:29 +00:00
my $ self = $ class - > SUPER:: new ( $ parent ) ;
2012-07-03 15:21:32 +00:00
my $ sizer = Wx::FlexGridSizer - > new ( 0 , 2 , 10 , 10 ) ;
2012-07-03 22:03:05 +00:00
$ sizer - > AddGrowableCol ( 1 , 1 ) ;
$ sizer - > AddGrowableRow ( 1 , 1 ) ;
2012-07-03 15:21:32 +00:00
$ sizer - > AddStretchSpacer ( 0 ) ;
$ self - > SetSizer ( $ sizer ) ;
2012-06-26 15:42:29 +00:00
# title
2012-06-30 21:28:07 +00:00
my $ text = Wx::StaticText - > new ( $ self , - 1 , $ title , wxDefaultPosition , wxDefaultSize , wxALIGN_LEFT ) ;
my $ bold_font = Wx::SystemSettings:: GetFont ( wxSYS_DEFAULT_GUI_FONT ) ;
$ bold_font - > SetWeight ( wxFONTWEIGHT_BOLD ) ;
2012-06-26 15:42:29 +00:00
$ bold_font - > SetPointSize ( 14 ) ;
$ text - > SetFont ( $ bold_font ) ;
2012-07-03 15:21:32 +00:00
$ sizer - > Add ( $ text , 0 , wxALIGN_LEFT , 0 ) ;
# index
$ self - > { short_title } = $ short_title ? $ short_title : $ title ;
$ self - > { index } = Slic3r::GUI::ConfigWizard::Index - > new ( $ self , $ self - > { short_title } ) ;
2012-07-03 22:03:05 +00:00
$ sizer - > Add ( $ self - > { index } , 1 , wxEXPAND | wxTOP | wxRIGHT , 10 ) ;
2012-07-03 15:21:32 +00:00
# contents
2012-08-02 21:08:40 +00:00
$ self - > { width } = 430 ;
2012-07-03 15:21:32 +00:00
$ self - > { vsizer } = Wx::BoxSizer - > new ( wxVERTICAL ) ;
2012-08-02 21:07:42 +00:00
$ sizer - > Add ( $ self - > { vsizer } , 1 ) ;
2012-06-26 15:42:29 +00:00
return $ self ;
}
sub append_text {
my $ self = shift ;
my ( $ text ) = @ _ ;
2012-06-30 21:28:07 +00:00
my $ para = Wx::StaticText - > new ( $ self , - 1 , $ text , wxDefaultPosition , wxDefaultSize , wxALIGN_LEFT ) ;
2012-06-26 15:42:29 +00:00
$ para - > Wrap ( $ self - > { width } ) ;
2012-07-03 15:21:32 +00:00
$ para - > SetMinSize ( [ $ self - > { width } , - 1 ] ) ;
$ self - > { vsizer } - > Add ( $ para , 0 , wxALIGN_LEFT | wxTOP | wxBOTTOM , 10 ) ;
2012-06-26 15:42:29 +00:00
}
sub append_option {
my $ self = shift ;
2012-07-28 09:34:12 +00:00
my ( $ full_key ) = @ _ ;
# populate repository with the factory default
2014-09-23 18:00:51 +00:00
my ( $ opt_key , $ opt_index ) = split /#/ , $ full_key , 2 ;
2014-06-16 18:11:52 +00:00
$ self - > config - > apply ( Slic3r::Config - > new_from_defaults ( $ opt_key ) ) ;
2012-07-28 09:34:12 +00:00
# draw the control
my $ optgroup = Slic3r::GUI::ConfigOptionsGroup - > new (
parent = > $ self ,
title = > '' ,
2014-06-16 18:11:52 +00:00
config = > $ self - > config ,
2013-09-21 18:25:34 +00:00
full_labels = > 1 ,
2012-07-28 09:34:12 +00:00
) ;
2014-09-23 18:00:51 +00:00
$ optgroup - > append_single_option_line ( $ opt_key , $ opt_index ) ;
2012-07-28 09:34:12 +00:00
$ self - > { vsizer } - > Add ( $ optgroup - > sizer , 0 , wxEXPAND | wxTOP | wxBOTTOM , 10 ) ;
2012-06-26 15:42:29 +00:00
}
2014-06-16 18:11:52 +00:00
sub append_panel {
my ( $ self , $ panel ) = @ _ ;
$ self - > { vsizer } - > Add ( $ panel , 0 , wxEXPAND | wxTOP | wxBOTTOM , 10 ) ;
}
2012-06-26 15:42:29 +00:00
sub set_previous_page {
my $ self = shift ;
my ( $ previous_page ) = @ _ ;
$ self - > { previous_page } = $ previous_page ;
}
sub GetPrev {
my $ self = shift ;
return $ self - > { previous_page } ;
}
sub set_next_page {
my $ self = shift ;
my ( $ next_page ) = @ _ ;
$ self - > { next_page } = $ next_page ;
}
sub GetNext {
my $ self = shift ;
return $ self - > { next_page } ;
}
2012-07-03 15:21:32 +00:00
sub get_short_title {
my $ self = shift ;
return $ self - > { short_title } ;
}
sub build_index {
my $ self = shift ;
my $ page = $ self ;
$ self - > { index } - > prepend_title ( $ page - > get_short_title ) while ( $ page = $ page - > GetPrev ) ;
$ page = $ self ;
$ self - > { index } - > append_title ( $ page - > get_short_title ) while ( $ page = $ page - > GetNext ) ;
}
2014-06-16 18:11:52 +00:00
sub config {
my ( $ self ) = @ _ ;
return $ self - > GetParent - > { config } ;
}
2012-06-26 15:42:29 +00:00
package Slic3r::GUI::ConfigWizard::Page::Welcome ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $ class = shift ;
my ( $ parent ) = @ _ ;
2012-07-16 16:34:44 +00:00
my $ self = $ class - > SUPER:: new ( $ parent , "Welcome to the Slic3r Configuration $wizard" , 'Welcome' ) ;
2012-06-26 15:42:29 +00:00
2012-07-16 16:34:44 +00:00
$ self - > append_text ( 'Hello, welcome to Slic3r! This ' . lc ( $ wizard ) . ' helps you with the initial configuration; just a few settings and you will be ready to print.' ) ;
$ self - > append_text ( 'To import an existing configuration instead, cancel this ' . lc ( $ wizard ) . ' and use the Open Config menu item found in the File menu.' ) ;
2012-06-27 17:41:37 +00:00
$ self - > append_text ( 'To continue, click Next.' ) ;
2012-06-26 15:42:29 +00:00
return $ self ;
}
package Slic3r::GUI::ConfigWizard::Page::Firmware ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $ class = shift ;
my ( $ parent ) = @ _ ;
my $ self = $ class - > SUPER:: new ( $ parent , 'Firmware Type' ) ;
2012-06-27 17:41:37 +00:00
$ self - > append_text ( 'Choose the type of firmware used by your printer, then click Next.' ) ;
2012-06-26 15:42:29 +00:00
$ self - > append_option ( 'gcode_flavor' ) ;
return $ self ;
}
package Slic3r::GUI::ConfigWizard::Page::Bed ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $ class = shift ;
my ( $ parent ) = @ _ ;
my $ self = $ class - > SUPER:: new ( $ parent , 'Bed Size' ) ;
2014-06-16 18:11:52 +00:00
$ self - > append_text ( 'Set the shape of your printer\'s bed, then click Next.' ) ;
$ self - > config - > apply ( Slic3r::Config - > new_from_defaults ( 'bed_shape' ) ) ;
$ self - > { bed_shape_panel } = my $ panel = Slic3r::GUI::BedShapePanel - > new ( $ self , $ self - > config - > bed_shape ) ;
$ self - > { bed_shape_panel } - > on_change ( sub {
$ self - > config - > set ( 'bed_shape' , $ self - > { bed_shape_panel } - > GetValue ) ;
} ) ;
$ self - > append_panel ( $ self - > { bed_shape_panel } ) ;
2012-06-26 15:42:29 +00:00
return $ self ;
}
2012-06-27 15:59:29 +00:00
package Slic3r::GUI::ConfigWizard::Page::Nozzle ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $ class = shift ;
my ( $ parent ) = @ _ ;
my $ self = $ class - > SUPER:: new ( $ parent , 'Nozzle Diameter' ) ;
2014-06-16 18:11:52 +00:00
$ self - > append_text ( 'Enter the diameter of your printer\'s hot end nozzle, then click Next.' ) ;
2012-07-19 20:56:38 +00:00
$ self - > append_option ( 'nozzle_diameter#0' ) ;
2012-06-27 15:59:29 +00:00
return $ self ;
}
2012-06-26 15:42:29 +00:00
package Slic3r::GUI::ConfigWizard::Page::Filament ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $ class = shift ;
my ( $ parent ) = @ _ ;
my $ self = $ class - > SUPER:: new ( $ parent , 'Filament Diameter' ) ;
2012-06-27 17:41:37 +00:00
$ self - > append_text ( 'Enter the diameter of your filament, then click Next.' ) ;
$ self - > append_text ( 'Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average.' ) ;
2012-07-19 20:56:38 +00:00
$ self - > append_option ( 'filament_diameter#0' ) ;
2012-06-26 15:42:29 +00:00
return $ self ;
}
package Slic3r::GUI::ConfigWizard::Page::Temperature ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $ class = shift ;
my ( $ parent ) = @ _ ;
my $ self = $ class - > SUPER:: new ( $ parent , 'Extrusion Temperature' ) ;
2012-06-27 17:41:37 +00:00
$ self - > append_text ( 'Enter the temperature needed for extruding your filament, then click Next.' ) ;
2012-07-16 16:34:44 +00:00
$ self - > append_text ( 'A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS.' ) ;
2012-07-19 20:56:38 +00:00
$ self - > append_option ( 'temperature#0' ) ;
2012-06-26 15:42:29 +00:00
return $ self ;
}
package Slic3r::GUI::ConfigWizard::Page::BedTemperature ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $ class = shift ;
my ( $ parent ) = @ _ ;
my $ self = $ class - > SUPER:: new ( $ parent , 'Bed Temperature' ) ;
2012-06-27 17:41:37 +00:00
$ self - > append_text ( 'Enter the bed temperature needed for getting your filament to stick to your heated bed, then click Next.' ) ;
2013-09-21 18:14:17 +00:00
$ self - > append_text ( 'A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed.' ) ;
2012-06-26 15:42:29 +00:00
$ self - > append_option ( 'bed_temperature' ) ;
2013-09-21 18:25:34 +00:00
2012-06-26 15:42:29 +00:00
return $ self ;
}
package Slic3r::GUI::ConfigWizard::Page::Finished ;
use base 'Slic3r::GUI::ConfigWizard::Page' ;
sub new {
my $ class = shift ;
my ( $ parent ) = @ _ ;
2012-07-03 15:21:32 +00:00
my $ self = $ class - > SUPER:: new ( $ parent , 'Congratulations!' , 'Finish' ) ;
2012-06-26 15:42:29 +00:00
2012-07-16 16:34:44 +00:00
$ self - > append_text ( "You have successfully completed the Slic3r Configuration $wizard. " .
2012-06-27 21:20:29 +00:00
'Slic3r is now configured for your printer and filament.' ) ;
2012-07-16 16:34:44 +00:00
$ self - > append_text ( 'To close this ' . lc ( $ wizard ) . ' and apply the newly created configuration, click Finish.' ) ;
2012-06-26 15:42:29 +00:00
return $ self ;
}
1 ;