diff --git a/cmake/modules/FindAlienWx.cmake b/cmake/modules/FindAlienWx.cmake index a96c29195..65221172b 100644 --- a/cmake/modules/FindAlienWx.cmake +++ b/cmake/modules/FindAlienWx.cmake @@ -49,6 +49,7 @@ my \$defines = ' ' . Alien::wxWidgets->defines; my \$cflags = Alien::wxWidgets->c_flags; my \$linkflags = Alien::wxWidgets->link_flags; my \$libraries = ' ' . Alien::wxWidgets->libraries(@components); +my \$gui_toolkit = Alien::wxWidgets->config->{toolkit}; #my @libraries = Alien::wxWidgets->link_libraries(@components); #my @implib = Alien::wxWidgets->import_libraries(@components); #my @shrlib = Alien::wxWidgets->shared_libraries(@components); @@ -82,6 +83,7 @@ cmake_set_var('LIBRARIES', \$libraries); cmake_set_var('DEFINITIONS', \$defines); #cmake_set_var('DEFINITIONS_DEBUG', ); cmake_set_var('CXX_FLAGS', \$cflags); +cmake_set_var('GUI_TOOLKIT', \$gui_toolkit); close \$fh; ") include(${AlienWx_TEMP_INCLUDE}) @@ -96,6 +98,7 @@ if (AlienWx_DEBUG) message(STATUS " AlienWx_DEFINITIONS = ${AlienWx_DEFINITIONS}") message(STATUS " AlienWx_DEFINITIONS_DEBUG = ${AlienWx_DEFINITIONS_DEBUG}") message(STATUS " AlienWx_CXX_FLAGS = ${AlienWx_CXX_FLAGS}") + message(STATUS " AlienWx_GUI_TOOLKIT = ${AlienWx_GUI_TOOLKIT}") endif() include(FindPackageHandleStandardArgs) diff --git a/lib/Slic3r/GUI/MainFrame.pm b/lib/Slic3r/GUI/MainFrame.pm index 910b86dd8..ea4a158f4 100644 --- a/lib/Slic3r/GUI/MainFrame.pm +++ b/lib/Slic3r/GUI/MainFrame.pm @@ -110,6 +110,10 @@ sub _init_tabpanel { EVT_NOTEBOOK_PAGE_CHANGED($self, $self->{tabpanel}, sub { my $panel = $self->{tabpanel}->GetCurrentPage; $panel->OnActivate if $panel->can('OnActivate'); + + for my $tab_name (qw(print filament printer)) { + Slic3r::GUI::get_preset_tab("$tab_name")->OnActivate if ("$tab_name" eq $panel->GetName); + } }); if (!$self->{no_plater}) { diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index f4ba05bdb..2b0a5a0d5 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -186,7 +186,7 @@ sub new { # Initialize 3D toolpaths preview if ($Slic3r::GUI::have_OpenGL) { $self->{preview3D} = Slic3r::GUI::Plater::3DPreview->new($self->{preview_notebook}, $self->{print}, $self->{gcode_preview_data}, $self->{config}); - Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0); + Slic3r::GUI::_3DScene::enable_legend_texture($self->{preview3D}->canvas, 1); Slic3r::GUI::_3DScene::register_on_viewport_changed_callback($self->{preview3D}->canvas, sub { Slic3r::GUI::_3DScene::set_viewport_from_scene($self->{canvas3D}, $self->{preview3D}->canvas); }); $self->{preview_notebook}->AddPage($self->{preview3D}, L('Preview')); $self->{preview3D_page_idx} = $self->{preview_notebook}->GetPageCount-1; @@ -200,21 +200,13 @@ sub new { EVT_NOTEBOOK_PAGE_CHANGED($self, $self->{preview_notebook}, sub { my $preview = $self->{preview_notebook}->GetCurrentPage; - if ($preview == $self->{preview3D}) - { - Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 1); - Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 0); - Slic3r::GUI::_3DScene::enable_legend_texture($self->{preview3D}->canvas, 1); - $self->{preview3D}->load_print(1); + if (($preview != $self->{preview3D}) && ($preview != $self->{canvas3D})) { + $preview->OnActivate if $preview->can('OnActivate'); + } elsif ($preview == $self->{preview3D}) { + $self->{preview3D}->load_print; # sets the canvas as dirty to force a render at the 1st idle event (wxWidgets IsShownOnScreen() is buggy and cannot be used reliably) Slic3r::GUI::_3DScene::set_as_dirty($self->{preview3D}->canvas); - } else { - Slic3r::GUI::_3DScene::enable_legend_texture($self->{preview3D}->canvas, 0); - } - - if ($preview == $self->{canvas3D}) { - Slic3r::GUI::_3DScene::set_active($self->{canvas3D}, 1); - Slic3r::GUI::_3DScene::set_active($self->{preview3D}->canvas, 0); + } elsif ($preview == $self->{canvas3D}) { if (Slic3r::GUI::_3DScene::is_reload_delayed($self->{canvas3D})) { my $selections = $self->collect_selections; Slic3r::GUI::_3DScene::set_objects_selections($self->{canvas3D}, \@$selections); @@ -222,8 +214,6 @@ sub new { } # sets the canvas as dirty to force a render at the 1st idle event (wxWidgets IsShownOnScreen() is buggy and cannot be used reliably) Slic3r::GUI::_3DScene::set_as_dirty($self->{canvas3D}); - } else { - $preview->OnActivate if $preview->can('OnActivate'); } }); @@ -1892,6 +1882,8 @@ sub on_config_change { $update_scheduled = 1; } elsif ($opt_key eq 'printer_model') { # update to force bed selection (for texturing) + Slic3r::GUI::_3DScene::set_bed_shape($self->{canvas3D}, $self->{config}->bed_shape) if $self->{canvas3D}; + Slic3r::GUI::_3DScene::set_bed_shape($self->{preview3D}->canvas, $self->{config}->bed_shape) if $self->{preview3D}; $update_scheduled = 1; } } diff --git a/lib/Slic3r/GUI/Plater/2D.pm b/lib/Slic3r/GUI/Plater/2D.pm index ad8f54ddb..88a05c292 100644 --- a/lib/Slic3r/GUI/Plater/2D.pm +++ b/lib/Slic3r/GUI/Plater/2D.pm @@ -231,8 +231,9 @@ sub mouse_event { } $self->Refresh; } elsif ($event->LeftUp) { - $self->{on_instances_moved}->() - if $self->{drag_object}; + if ($self->{drag_object}) { + $self->{on_instances_moved}->(); + } $self->{drag_start_pos} = undef; $self->{drag_object} = undef; $self->SetCursor(wxSTANDARD_CURSOR); diff --git a/lib/Slic3r/GUI/Plater/2DToolpaths.pm b/lib/Slic3r/GUI/Plater/2DToolpaths.pm index 1093d35ba..b4e49a971 100644 --- a/lib/Slic3r/GUI/Plater/2DToolpaths.pm +++ b/lib/Slic3r/GUI/Plater/2DToolpaths.pm @@ -199,11 +199,11 @@ sub new { my $old_zoom = $self->_zoom; # Calculate the zoom delta and apply it to the current zoom factor - my $zoom = $e->GetWheelRotation() / $e->GetWheelDelta(); + my $zoom = -$e->GetWheelRotation() / $e->GetWheelDelta(); $zoom = max(min($zoom, 4), -4); $zoom /= 10; $self->_zoom($self->_zoom / (1-$zoom)); - $self->_zoom(1) if $self->_zoom > 1; # prevent from zooming out too much + $self->_zoom(1.25) if $self->_zoom > 1.25; # prevent from zooming out too much { # In order to zoom around the mouse point we need to translate @@ -227,7 +227,6 @@ sub new { } $self->_dirty(1); - $self->Refresh; }); EVT_MOUSE_EVENTS($self, \&mouse_event); @@ -255,8 +254,8 @@ sub mouse_event { return if !$self->GetParent->enabled; my $pos = Slic3r::Pointf->new($e->GetPositionXY); - if ($e->Entering && &Wx::wxMSW) { - # wxMSW needs focus in order to catch mouse wheel events + if ($e->Entering && (&Wx::wxMSW || $^O eq 'linux')) { + # wxMSW and Linux needs focus in order to catch key events $self->SetFocus; } elsif ($e->Dragging) { if ($e->LeftIsDown || $e->MiddleIsDown || $e->RightIsDown) { @@ -276,7 +275,6 @@ sub mouse_event { ); $self->_dirty(1); - $self->Refresh; } $self->_drag_start_xy($pos); } @@ -635,6 +633,27 @@ sub Resize { glLoadIdentity(); my $bb = $self->bb->clone; + + # rescale in dependence of window aspect ratio + my $bb_size = $bb->size; + my $ratio_x = ($x != 0.0) ? $bb_size->x / $x : 1.0; + my $ratio_y = ($y != 0.0) ? $bb_size->y / $y : 1.0; + + if ($ratio_y < $ratio_x) { + if ($ratio_y != 0.0) { + my $new_size_y = $bb_size->y * $ratio_x / $ratio_y; + my $half_delta_size_y = 0.5 * ($new_size_y - $bb_size->y); + $bb->set_y_min($bb->y_min - $half_delta_size_y); + $bb->set_y_max($bb->y_max + $half_delta_size_y); + } + } elsif ($ratio_x < $ratio_y) { + if ($ratio_x != 0.0) { + my $new_size_x = $bb_size->x * $ratio_y / $ratio_x; + my $half_delta_size_x = 0.5 * ($new_size_x - $bb_size->x); + $bb->set_x_min($bb->x_min - $half_delta_size_x); + $bb->set_x_max($bb->x_max + $half_delta_size_x); + } + } # center bounding box around origin before scaling it my $bb_center = $bb->center; @@ -649,25 +668,25 @@ sub Resize { # translate camera $bb->translate(@{$self->_camera_target}); - # keep camera_bb within total bb - # (i.e. prevent user from panning outside the bounding box) - { - my @translate = (0,0); - if ($bb->x_min < $self->bb->x_min) { - $translate[X] += $self->bb->x_min - $bb->x_min; - } - if ($bb->y_min < $self->bb->y_min) { - $translate[Y] += $self->bb->y_min - $bb->y_min; - } - if ($bb->x_max > $self->bb->x_max) { - $translate[X] -= $bb->x_max - $self->bb->x_max; - } - if ($bb->y_max > $self->bb->y_max) { - $translate[Y] -= $bb->y_max - $self->bb->y_max; - } - $self->_camera_target->translate(@translate); - $bb->translate(@translate); - } +# # keep camera_bb within total bb +# # (i.e. prevent user from panning outside the bounding box) +# { +# my @translate = (0,0); +# if ($bb->x_min < $self->bb->x_min) { +# $translate[X] += $self->bb->x_min - $bb->x_min; +# } +# if ($bb->y_min < $self->bb->y_min) { +# $translate[Y] += $self->bb->y_min - $bb->y_min; +# } +# if ($bb->x_max > $self->bb->x_max) { +# $translate[X] -= $bb->x_max - $self->bb->x_max; +# } +# if ($bb->y_max > $self->bb->y_max) { +# $translate[Y] -= $bb->y_max - $self->bb->y_max; +# } +# $self->_camera_target->translate(@translate); +# $bb->translate(@translate); +# } # save camera $self->_camera_bb($bb); diff --git a/lib/Slic3r/Print.pm b/lib/Slic3r/Print.pm index 8300fdbed..a9763a824 100644 --- a/lib/Slic3r/Print.pm +++ b/lib/Slic3r/Print.pm @@ -101,7 +101,12 @@ sub export_gcode { die "The configured post-processing script is not executable: check permissions. ($script)\n"; } if ($^O eq 'MSWin32' && $script =~ /\.[pP][lL]/) { - system($^X, $script, $output_file); + # The current process (^X) may be slic3r.exe or slic3r-console.exe. + # Replace it with the current perl interpreter. + my($filename, $directories, $suffix) = fileparse($^X); + $filename =~ s/^slic3r.*$/perl5\.24\.0\.exe/; + my $interpreter = $directories . $filename; + system($interpreter, $script, $output_file); } else { system($script, $output_file); } diff --git a/resources/localization/Slic3rPE.pot b/resources/localization/Slic3rPE.pot index 782f94c49..029e7c4b2 100644 --- a/resources/localization/Slic3rPE.pot +++ b/resources/localization/Slic3rPE.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-06-11 13:34+0200\n" +"POT-Creation-Date: 2018-06-26 11:11+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -33,7 +33,7 @@ msgid "Rectangular" msgstr "" #: xs/src/slic3r/GUI/BedShapeDialog.cpp:50 xs/src/slic3r/GUI/Tab.cpp:1745 -#: lib/Slic3r/GUI/Plater.pm:432 +#: lib/Slic3r/GUI/Plater.pm:477 msgid "Size" msgstr "" @@ -56,8 +56,10 @@ msgid "Circular" msgstr "" #: xs/src/slic3r/GUI/BedShapeDialog.cpp:65 -#: xs/src/slic3r/GUI/ConfigWizard.cpp:87 xs/src/slic3r/GUI/ConfigWizard.cpp:434 -#: xs/src/slic3r/GUI/ConfigWizard.cpp:448 xs/src/slic3r/GUI/RammingChart.cpp:81 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:87 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:439 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:453 +#: xs/src/slic3r/GUI/RammingChart.cpp:81 #: xs/src/slic3r/GUI/WipeTowerDialog.cpp:79 #: xs/src/libslic3r/PrintConfig.cpp:130 xs/src/libslic3r/PrintConfig.cpp:173 #: xs/src/libslic3r/PrintConfig.cpp:181 xs/src/libslic3r/PrintConfig.cpp:229 @@ -79,7 +81,8 @@ msgstr "" msgid "mm" msgstr "" -#: xs/src/slic3r/GUI/BedShapeDialog.cpp:66 xs/src/libslic3r/PrintConfig.cpp:494 +#: xs/src/slic3r/GUI/BedShapeDialog.cpp:66 +#: xs/src/libslic3r/PrintConfig.cpp:494 msgid "Diameter" msgstr "" @@ -121,7 +124,7 @@ msgid "" msgstr "" #: xs/src/slic3r/GUI/BedShapeDialog.hpp:44 -#: xs/src/slic3r/GUI/ConfigWizard.cpp:397 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:402 msgid "Bed Shape" msgstr "" @@ -239,7 +242,7 @@ msgstr "" msgid "Activate" msgstr "" -#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 xs/src/slic3r/GUI/GUI.cpp:321 +#: xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp:96 xs/src/slic3r/GUI/GUI.cpp:323 msgid "Configuration Snapshots" msgstr "" @@ -255,54 +258,54 @@ msgstr "" msgid "Select none" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:207 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:212 #, possible-c-format msgid "Welcome to the Slic3r %s" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:207 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:212 msgid "Welcome" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:213 xs/src/slic3r/GUI/GUI.cpp:318 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:218 xs/src/slic3r/GUI/GUI.cpp:320 #, possible-c-format msgid "Run %s" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:215 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:220 #, possible-c-format msgid "" "Hello, welcome to Slic3r Prusa Edition! This %s helps you with the initial " "configuration; just a few settings and you will be ready to print." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:219 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:224 msgid "" "Remove user profiles - install from scratch (a snapshot will be taken " "beforehand)" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:240 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:245 msgid "Other vendors" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:242 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:247 msgid "Custom setup" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:266 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:271 msgid "Automatic updates" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:266 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:271 msgid "Updates" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:274 xs/src/slic3r/GUI/Preferences.cpp:59 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:279 xs/src/slic3r/GUI/Preferences.cpp:59 msgid "Check for application updates" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:277 xs/src/slic3r/GUI/Preferences.cpp:61 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:282 xs/src/slic3r/GUI/Preferences.cpp:61 msgid "" "If enabled, Slic3r checks for new versions of Slic3r PE online. When a new " "version becomes available a notification is displayed at the next " @@ -310,11 +313,11 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:281 xs/src/slic3r/GUI/Preferences.cpp:67 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:286 xs/src/slic3r/GUI/Preferences.cpp:67 msgid "Update built-in Presets automatically" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:284 xs/src/slic3r/GUI/Preferences.cpp:69 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:289 xs/src/slic3r/GUI/Preferences.cpp:69 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -322,327 +325,339 @@ msgid "" "startup." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:285 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:290 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:290 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:295 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:297 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:302 msgid "Other Vendors" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:299 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:304 msgid "Pick another vendor supported by Slic3r PE:" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:358 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:363 msgid "Firmware Type" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:358 xs/src/slic3r/GUI/Tab.cpp:1628 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:363 xs/src/slic3r/GUI/Tab.cpp:1628 msgid "Firmware" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:362 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:367 msgid "Choose the type of firmware used by your printer." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:397 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:402 msgid "Bed Shape and Size" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:400 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:405 msgid "Set the shape of your printer's bed." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:414 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:419 msgid "Filament and Nozzle Diameters" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:414 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:419 msgid "Print Diameters" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:430 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:435 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:433 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:438 msgid "Nozzle Diameter:" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:443 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:448 msgid "Enter the diameter of your filament." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:444 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:449 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:447 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:452 msgid "Filament Diameter:" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:465 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:470 msgid "Extruder and Bed Temperatures" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:465 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:470 msgid "Temperatures" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:481 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:486 msgid "Enter the temperature needed for extruding your filament." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:482 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:487 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:485 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:490 msgid "Extrusion Temperature:" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:486 -#: xs/src/slic3r/GUI/ConfigWizard.cpp:500 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:491 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:505 msgid "°C" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:495 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:500 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:496 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:501 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:499 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:504 msgid "Bed Temperature:" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:807 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:817 +msgid "< &Back" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:818 +msgid "&Next >" +msgstr "" + +#: xs/src/slic3r/GUI/ConfigWizard.cpp:819 msgid "&Finish" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:865 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:889 msgid "Configuration Wizard" msgstr "" -#: xs/src/slic3r/GUI/ConfigWizard.cpp:867 +#: xs/src/slic3r/GUI/ConfigWizard.cpp:891 msgid "Configuration Assistant" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:84 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:87 msgid "Flash!" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:85 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:88 msgid "Cancel" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:123 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:128 msgid "Flashing in progress. Please do not disconnect the printer!" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:145 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:155 msgid "Flashing succeeded!" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:146 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:156 msgid "Flashing failed. Please see the avrdude log below." msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:147 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:157 msgid "Flashing cancelled." msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:213 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:294 msgid "Cancelling..." msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:266 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:347 msgid "Firmware flasher" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:286 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:367 msgid "Serial port:" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:288 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:369 msgid "Rescan" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:293 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:374 msgid "Firmware image:" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:296 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:377 msgid "Status:" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:297 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:378 msgid "Ready" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:300 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:381 msgid "Progress:" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:319 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:400 msgid "Advanced: avrdude output log" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:365 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:446 msgid "" "Are you sure you want to cancel firmware flashing?\n" "This could leave your printer in an unusable state!" msgstr "" -#: xs/src/slic3r/GUI/FirmwareDialog.cpp:366 +#: xs/src/slic3r/GUI/FirmwareDialog.cpp:447 msgid "Confirmation" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:206 +#: xs/src/slic3r/GUI/GLCanvas3D.cpp:1990 +msgid "Detected object outside print volume" +msgstr "" + +#: xs/src/slic3r/GUI/GUI.cpp:208 msgid "Array of language names and identifiers should have the same size." msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:217 +#: xs/src/slic3r/GUI/GUI.cpp:219 msgid "Select the language" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:217 +#: xs/src/slic3r/GUI/GUI.cpp:219 msgid "Language" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:279 xs/src/libslic3r/PrintConfig.cpp:187 +#: xs/src/slic3r/GUI/GUI.cpp:281 xs/src/libslic3r/PrintConfig.cpp:187 msgid "Default" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:321 +#: xs/src/slic3r/GUI/GUI.cpp:323 msgid "Inspect / activate configuration snapshots" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:322 +#: xs/src/slic3r/GUI/GUI.cpp:324 msgid "Take Configuration Snapshot" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:322 +#: xs/src/slic3r/GUI/GUI.cpp:324 msgid "Capture a configuration snapshot" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:325 xs/src/slic3r/GUI/Preferences.cpp:9 +#: xs/src/slic3r/GUI/GUI.cpp:327 xs/src/slic3r/GUI/Preferences.cpp:9 msgid "Preferences" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:325 +#: xs/src/slic3r/GUI/GUI.cpp:327 msgid "Application preferences" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:326 +#: xs/src/slic3r/GUI/GUI.cpp:328 msgid "Change Application Language" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:328 +#: xs/src/slic3r/GUI/GUI.cpp:330 msgid "Flash printer firmware" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:328 +#: xs/src/slic3r/GUI/GUI.cpp:330 msgid "Upload a firmware image into an Arduino based printer" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:340 +#: xs/src/slic3r/GUI/GUI.cpp:342 msgid "Taking configuration snapshot" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:340 +#: xs/src/slic3r/GUI/GUI.cpp:342 msgid "Snapshot name" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:378 +#: xs/src/slic3r/GUI/GUI.cpp:380 msgid "Application will be restarted" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:378 +#: xs/src/slic3r/GUI/GUI.cpp:380 msgid "Attention!" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:393 +#: xs/src/slic3r/GUI/GUI.cpp:396 msgid "&Configuration" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:417 +#: xs/src/slic3r/GUI/GUI.cpp:420 msgid "You have unsaved changes " msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:417 +#: xs/src/slic3r/GUI/GUI.cpp:420 msgid ". Discard changes and continue anyway?" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:418 +#: xs/src/slic3r/GUI/GUI.cpp:421 msgid "Unsaved Presets" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:626 +#: xs/src/slic3r/GUI/GUI.cpp:629 msgid "Notice" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:631 +#: xs/src/slic3r/GUI/GUI.cpp:634 msgid "Attempt to free unreferenced scalar" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:633 xs/src/slic3r/GUI/WipeTowerDialog.cpp:39 +#: xs/src/slic3r/GUI/GUI.cpp:636 xs/src/slic3r/GUI/WipeTowerDialog.cpp:39 #: xs/src/slic3r/GUI/WipeTowerDialog.cpp:321 msgid "Warning" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:822 +#: xs/src/slic3r/GUI/GUI.cpp:825 msgid "Support" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:825 +#: xs/src/slic3r/GUI/GUI.cpp:828 msgid "Select what kind of support do you need" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:826 xs/src/libslic3r/GCode/PreviewData.cpp:157 +#: xs/src/slic3r/GUI/GUI.cpp:829 xs/src/libslic3r/GCode/PreviewData.cpp:157 msgid "None" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:827 xs/src/libslic3r/PrintConfig.cpp:1516 +#: xs/src/slic3r/GUI/GUI.cpp:830 xs/src/libslic3r/PrintConfig.cpp:1516 msgid "Support on build plate only" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:828 +#: xs/src/slic3r/GUI/GUI.cpp:831 msgid "Everywhere" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:840 xs/src/slic3r/GUI/Tab.cpp:872 +#: xs/src/slic3r/GUI/GUI.cpp:843 xs/src/slic3r/GUI/Tab.cpp:872 msgid "Brim" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:842 +#: xs/src/slic3r/GUI/GUI.cpp:845 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:851 +#: xs/src/slic3r/GUI/GUI.cpp:854 msgid "Purging volumes" msgstr "" -#: xs/src/slic3r/GUI/GUI.cpp:893 +#: xs/src/slic3r/GUI/GUI.cpp:896 msgid "Export print config" msgstr "" @@ -891,12 +906,12 @@ msgid "Profile dependencies" msgstr "" #: xs/src/slic3r/GUI/Tab.cpp:1011 xs/src/slic3r/GUI/Tab.cpp:1362 -#: xs/src/slic3r/GUI/Tab.cpp:2248 xs/src/libslic3r/PrintConfig.cpp:144 +#: xs/src/slic3r/GUI/Tab.cpp:2261 xs/src/libslic3r/PrintConfig.cpp:144 msgid "Compatible printers" msgstr "" #: xs/src/slic3r/GUI/Tab.cpp:1044 -#, possible-c-format +#, no-c-format msgid "" "The Spiral Vase mode requires:\n" "- one perimeter\n" @@ -952,7 +967,7 @@ msgid "The " msgstr "" #: xs/src/slic3r/GUI/Tab.cpp:1153 -#, possible-c-format +#, no-c-format msgid "" " infill pattern is not supposed to work at 100% density.\n" "\n" @@ -960,7 +975,7 @@ msgid "" msgstr "" #: xs/src/slic3r/GUI/Tab.cpp:1258 xs/src/slic3r/GUI/Tab.cpp:1259 -#: lib/Slic3r/GUI/Plater.pm:388 +#: lib/Slic3r/GUI/Plater.pm:433 msgid "Filament" msgstr "" @@ -1043,7 +1058,7 @@ msgstr "" msgid "Bed shape" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1446 xs/src/slic3r/GUI/Tab.cpp:2216 +#: xs/src/slic3r/GUI/Tab.cpp:1446 xs/src/slic3r/GUI/Tab.cpp:2229 msgid " Set " msgstr "" @@ -1083,7 +1098,7 @@ msgstr "" msgid "Connection failed." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1542 xs/src/slic3r/Utils/OctoPrint.cpp:50 +#: xs/src/slic3r/GUI/Tab.cpp:1542 xs/src/slic3r/Utils/OctoPrint.cpp:110 msgid "OctoPrint upload" msgstr "" @@ -1168,8 +1183,8 @@ msgid "" "setups)" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:1776 lib/Slic3r/GUI/Plater.pm:160 -#: lib/Slic3r/GUI/Plater.pm:2189 +#: xs/src/slic3r/GUI/Tab.cpp:1776 lib/Slic3r/GUI/Plater.pm:192 +#: lib/Slic3r/GUI/Plater.pm:2283 msgid "Preview" msgstr "" @@ -1228,74 +1243,74 @@ msgstr "" msgid "Unsaved Changes" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2126 +#: xs/src/slic3r/GUI/Tab.cpp:2139 msgid "The supplied name is empty. It can't be saved." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2131 +#: xs/src/slic3r/GUI/Tab.cpp:2144 msgid "Cannot overwrite a system profile." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2135 +#: xs/src/slic3r/GUI/Tab.cpp:2148 msgid "Cannot overwrite an external profile." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2159 +#: xs/src/slic3r/GUI/Tab.cpp:2172 msgid "remove" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2159 +#: xs/src/slic3r/GUI/Tab.cpp:2172 msgid "delete" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2160 +#: xs/src/slic3r/GUI/Tab.cpp:2173 msgid "Are you sure you want to " msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2160 +#: xs/src/slic3r/GUI/Tab.cpp:2173 msgid " the selected preset?" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2161 +#: xs/src/slic3r/GUI/Tab.cpp:2174 msgid "Remove" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2161 lib/Slic3r/GUI/Plater.pm:188 -#: lib/Slic3r/GUI/Plater.pm:206 lib/Slic3r/GUI/Plater.pm:2085 +#: xs/src/slic3r/GUI/Tab.cpp:2174 lib/Slic3r/GUI/Plater.pm:233 +#: lib/Slic3r/GUI/Plater.pm:251 lib/Slic3r/GUI/Plater.pm:2174 msgid "Delete" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2162 +#: xs/src/slic3r/GUI/Tab.cpp:2175 msgid " Preset" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2215 +#: xs/src/slic3r/GUI/Tab.cpp:2228 msgid "All" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2247 +#: xs/src/slic3r/GUI/Tab.cpp:2260 msgid "Select the printers this profile is compatible with." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2293 xs/src/slic3r/GUI/Tab.cpp:2379 +#: xs/src/slic3r/GUI/Tab.cpp:2306 xs/src/slic3r/GUI/Tab.cpp:2392 #: xs/src/slic3r/GUI/Preset.cpp:613 xs/src/slic3r/GUI/Preset.cpp:653 #: xs/src/slic3r/GUI/Preset.cpp:678 xs/src/slic3r/GUI/Preset.cpp:710 #: xs/src/slic3r/GUI/PresetBundle.cpp:1119 -#: xs/src/slic3r/GUI/PresetBundle.cpp:1172 lib/Slic3r/GUI/Plater.pm:573 +#: xs/src/slic3r/GUI/PresetBundle.cpp:1172 lib/Slic3r/GUI/Plater.pm:618 msgid "System presets" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2294 xs/src/slic3r/GUI/Tab.cpp:2380 +#: xs/src/slic3r/GUI/Tab.cpp:2307 xs/src/slic3r/GUI/Tab.cpp:2393 msgid "Default presets" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2449 +#: xs/src/slic3r/GUI/Tab.cpp:2462 msgid "" "LOCKED LOCK;indicates that the settings are the same as the system values " "for the current option group" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2452 +#: xs/src/slic3r/GUI/Tab.cpp:2465 msgid "" "UNLOCKED LOCK;indicates that some settings were changed and are not equal to " "the system values for the current option group.\n" @@ -1303,13 +1318,13 @@ msgid "" "to the system values." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2458 +#: xs/src/slic3r/GUI/Tab.cpp:2471 msgid "" "WHITE BULLET;for the left button: \tindicates a non-system preset,\n" "for the right button: \tindicates that the settings hasn't been modified." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2462 +#: xs/src/slic3r/GUI/Tab.cpp:2475 msgid "" "BACK ARROW;indicates that the settings were changed and are not equal to the " "last saved preset for the current option group.\n" @@ -1317,30 +1332,30 @@ msgid "" "to the last saved preset." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2488 +#: xs/src/slic3r/GUI/Tab.cpp:2501 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system " "values for the current option group" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2490 +#: xs/src/slic3r/GUI/Tab.cpp:2503 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system values for the current option group.\n" "Click to reset all settings for current option group to the system values." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2493 +#: xs/src/slic3r/GUI/Tab.cpp:2506 msgid "WHITE BULLET icon indicates a non system preset." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2496 +#: xs/src/slic3r/GUI/Tab.cpp:2509 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2498 +#: xs/src/slic3r/GUI/Tab.cpp:2511 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -1348,46 +1363,53 @@ msgid "" "preset." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2504 +#: xs/src/slic3r/GUI/Tab.cpp:2517 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system value." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2505 +#: xs/src/slic3r/GUI/Tab.cpp:2518 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system value.\n" "Click to reset current value to the system value." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2511 +#: xs/src/slic3r/GUI/Tab.cpp:2524 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2512 +#: xs/src/slic3r/GUI/Tab.cpp:2525 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" "Click to reset current value to the last saved preset." msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2582 lib/Slic3r/GUI/MainFrame.pm:448 -#: lib/Slic3r/GUI/Plater.pm:1685 +#: xs/src/slic3r/GUI/Tab.cpp:2595 lib/Slic3r/GUI/MainFrame.pm:450 +#: lib/Slic3r/GUI/Plater.pm:1756 msgid "Save " msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2582 +#: xs/src/slic3r/GUI/Tab.cpp:2595 msgid " as:" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2616 -msgid "" -"The supplied name is not valid; the following characters are not allowed:" +#: xs/src/slic3r/GUI/Tab.cpp:2634 xs/src/slic3r/GUI/Tab.cpp:2638 +msgid "The supplied name is not valid;" msgstr "" -#: xs/src/slic3r/GUI/Tab.cpp:2619 +#: xs/src/slic3r/GUI/Tab.cpp:2635 +msgid "the following characters are not allowed:" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2639 +msgid "the following postfix are not allowed:" +msgstr "" + +#: xs/src/slic3r/GUI/Tab.cpp:2642 msgid "The supplied name is not available." msgstr "" @@ -1407,21 +1429,21 @@ msgstr "" msgid "Save preset" msgstr "" -#: xs/src/slic3r/GUI/Field.cpp:72 +#: xs/src/slic3r/GUI/Field.cpp:82 msgid "default" msgstr "" -#: xs/src/slic3r/GUI/Field.cpp:102 +#: xs/src/slic3r/GUI/Field.cpp:112 #, possible-c-format msgid "%s doesn't support percentage" msgstr "" -#: xs/src/slic3r/GUI/Field.cpp:111 +#: xs/src/slic3r/GUI/Field.cpp:121 msgid "Input value is out of range" msgstr "" #: xs/src/slic3r/GUI/Preset.cpp:657 xs/src/slic3r/GUI/Preset.cpp:714 -#: xs/src/slic3r/GUI/PresetBundle.cpp:1177 lib/Slic3r/GUI/Plater.pm:574 +#: xs/src/slic3r/GUI/PresetBundle.cpp:1177 lib/Slic3r/GUI/Plater.pm:619 msgid "User presets" msgstr "" @@ -1834,19 +1856,35 @@ msgstr "" msgid "Show advanced settings" msgstr "" -#: xs/src/slic3r/Utils/OctoPrint.cpp:47 +#: xs/src/slic3r/Utils/OctoPrint.cpp:33 +msgid "Send G-Code to printer" +msgstr "" + +#: xs/src/slic3r/Utils/OctoPrint.cpp:33 +msgid "Upload to OctoPrint with the following filename:" +msgstr "" + +#: xs/src/slic3r/Utils/OctoPrint.cpp:35 +msgid "Start printing after upload" +msgstr "" + +#: xs/src/slic3r/Utils/OctoPrint.cpp:37 +msgid "Use forward slashes ( / ) as a directory separator if needed." +msgstr "" + +#: xs/src/slic3r/Utils/OctoPrint.cpp:98 msgid "Error while uploading to the OctoPrint server" msgstr "" -#: xs/src/slic3r/Utils/OctoPrint.cpp:51 lib/Slic3r/GUI/Plater.pm:1516 +#: xs/src/slic3r/Utils/OctoPrint.cpp:111 lib/Slic3r/GUI/Plater.pm:1559 msgid "Sending G-code file to the OctoPrint server..." msgstr "" -#: xs/src/slic3r/Utils/OctoPrint.cpp:120 +#: xs/src/slic3r/Utils/OctoPrint.cpp:192 msgid "Invalid API key" msgstr "" -#: xs/src/slic3r/Utils/PresetUpdater.cpp:514 +#: xs/src/slic3r/Utils/PresetUpdater.cpp:533 #, possible-c-format msgid "requires min. %s and max. %s" msgstr "" @@ -1893,11 +1931,11 @@ msgid "" "default extruder and bed temperature are reset using non-wait command; " "however if M104, M109, M140 or M190 are detected in this custom code, Slic3r " "will not add temperature commands. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 " -"S[first_layer_temperature]\" command wherever you want." +"variables for all Slic3r settings, so you can put a \"M109 S" +"[first_layer_temperature]\" command wherever you want." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:68 lib/Slic3r/GUI/MainFrame.pm:307 +#: xs/src/libslic3r/PrintConfig.cpp:68 lib/Slic3r/GUI/MainFrame.pm:309 msgid "Bottom" msgstr "" @@ -2226,7 +2264,7 @@ msgid "Extra perimeters if needed" msgstr "" #: xs/src/libslic3r/PrintConfig.cpp:328 -#, possible-c-format +#, no-c-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -2457,7 +2495,7 @@ msgstr "" msgid "Soluble material is most likely used for a soluble support." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:539 lib/Slic3r/GUI/Plater.pm:474 +#: xs/src/libslic3r/PrintConfig.cpp:539 lib/Slic3r/GUI/Plater.pm:519 msgid "Cost" msgstr "" @@ -2487,6 +2525,7 @@ msgid "Fill density" msgstr "" #: xs/src/libslic3r/PrintConfig.cpp:566 +#, no-c-format msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" @@ -2710,7 +2749,7 @@ msgid "This setting represents the maximum speed of your fan." msgstr "" #: xs/src/libslic3r/PrintConfig.cpp:867 -#, possible-c-format +#, no-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -3324,8 +3363,8 @@ msgid "" "detects M104, M109, M140 or M190 in your custom codes, such commands will " "not be prepended automatically so you're free to customize the order of " "heating commands and other custom actions. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 " -"S[first_layer_temperature]\" command wherever you want. If you have multiple " +"variables for all Slic3r settings, so you can put a \"M109 S" +"[first_layer_temperature]\" command wherever you want. If you have multiple " "extruders, the gcode is processed in extruder order." msgstr "" @@ -3580,7 +3619,7 @@ msgid "" "for auto." msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1744 lib/Slic3r/GUI/MainFrame.pm:306 +#: xs/src/libslic3r/PrintConfig.cpp:1744 lib/Slic3r/GUI/MainFrame.pm:308 msgid "Top" msgstr "" @@ -3592,7 +3631,8 @@ msgstr "" msgid "Top solid layers" msgstr "" -#: xs/src/libslic3r/PrintConfig.cpp:1753 lib/Slic3r/GUI/Plater/3DPreview.pm:105 +#: xs/src/libslic3r/PrintConfig.cpp:1753 +#: lib/Slic3r/GUI/Plater/3DPreview.pm:105 msgid "Travel" msgstr "" @@ -3803,7 +3843,7 @@ msgstr "" msgid "Tool" msgstr "" -#: lib/Slic3r/GUI.pm:308 +#: lib/Slic3r/GUI.pm:307 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" @@ -3816,891 +3856,898 @@ msgid "" " - Remember to check for updates at http://github.com/prusa3d/slic3r/releases" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:114 +#: lib/Slic3r/GUI/MainFrame.pm:116 msgid "Plater" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:116 +#: lib/Slic3r/GUI/MainFrame.pm:118 msgid "Controller" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:194 +#: lib/Slic3r/GUI/MainFrame.pm:196 msgid "Open STL/OBJ/AMF/3MF…\tCtrl+O" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:194 +#: lib/Slic3r/GUI/MainFrame.pm:196 msgid "Open a model" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:197 +#: lib/Slic3r/GUI/MainFrame.pm:199 msgid "&Load Config…\tCtrl+L" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:197 +#: lib/Slic3r/GUI/MainFrame.pm:199 msgid "Load exported configuration file" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:200 +#: lib/Slic3r/GUI/MainFrame.pm:202 msgid "&Export Config…\tCtrl+E" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:200 +#: lib/Slic3r/GUI/MainFrame.pm:202 msgid "Export current configuration to file" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:203 +#: lib/Slic3r/GUI/MainFrame.pm:205 msgid "&Load Config Bundle…" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:203 +#: lib/Slic3r/GUI/MainFrame.pm:205 msgid "Load presets from a bundle" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:206 +#: lib/Slic3r/GUI/MainFrame.pm:208 msgid "&Export Config Bundle…" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:206 +#: lib/Slic3r/GUI/MainFrame.pm:208 msgid "Export all presets to file" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:211 +#: lib/Slic3r/GUI/MainFrame.pm:213 msgid "Q&uick Slice…\tCtrl+U" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:211 +#: lib/Slic3r/GUI/MainFrame.pm:213 msgid "Slice a file into a G-code" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:217 +#: lib/Slic3r/GUI/MainFrame.pm:219 msgid "Quick Slice and Save &As…\tCtrl+Alt+U" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:217 +#: lib/Slic3r/GUI/MainFrame.pm:219 msgid "Slice a file into a G-code, save as" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:223 +#: lib/Slic3r/GUI/MainFrame.pm:225 msgid "&Repeat Last Quick Slice\tCtrl+Shift+U" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:223 +#: lib/Slic3r/GUI/MainFrame.pm:225 msgid "Repeat last quick slice" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:230 +#: lib/Slic3r/GUI/MainFrame.pm:232 msgid "Slice to SV&G…\tCtrl+G" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:230 +#: lib/Slic3r/GUI/MainFrame.pm:232 msgid "Slice file to a multi-layer SVG" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:234 +#: lib/Slic3r/GUI/MainFrame.pm:236 msgid "(&Re)Slice Now\tCtrl+S" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:234 +#: lib/Slic3r/GUI/MainFrame.pm:236 msgid "Start new slicing process" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:237 +#: lib/Slic3r/GUI/MainFrame.pm:239 msgid "Repair STL file…" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:237 +#: lib/Slic3r/GUI/MainFrame.pm:239 msgid "Automatically repair an STL file" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:241 +#: lib/Slic3r/GUI/MainFrame.pm:243 msgid "&Quit" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:241 +#: lib/Slic3r/GUI/MainFrame.pm:243 msgid "Quit Slic3r" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:251 +#: lib/Slic3r/GUI/MainFrame.pm:253 msgid "Export G-code..." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:251 +#: lib/Slic3r/GUI/MainFrame.pm:253 msgid "Export current plate as G-code" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:254 +#: lib/Slic3r/GUI/MainFrame.pm:256 msgid "Export plate as STL..." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:254 +#: lib/Slic3r/GUI/MainFrame.pm:256 msgid "Export current plate as STL" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:257 +#: lib/Slic3r/GUI/MainFrame.pm:259 msgid "Export plate as AMF..." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:257 +#: lib/Slic3r/GUI/MainFrame.pm:259 msgid "Export current plate as AMF" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:260 +#: lib/Slic3r/GUI/MainFrame.pm:262 msgid "Export plate as 3MF..." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:260 +#: lib/Slic3r/GUI/MainFrame.pm:262 msgid "Export current plate as 3MF" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:273 +#: lib/Slic3r/GUI/MainFrame.pm:275 msgid "Select &Plater Tab\tCtrl+1" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:273 +#: lib/Slic3r/GUI/MainFrame.pm:275 msgid "Show the plater" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:279 +#: lib/Slic3r/GUI/MainFrame.pm:281 msgid "Select &Controller Tab\tCtrl+T" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:279 +#: lib/Slic3r/GUI/MainFrame.pm:281 msgid "Show the printer controller" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:287 +#: lib/Slic3r/GUI/MainFrame.pm:289 msgid "Select P&rint Settings Tab\tCtrl+2" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:287 +#: lib/Slic3r/GUI/MainFrame.pm:289 msgid "Show the print settings" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:290 +#: lib/Slic3r/GUI/MainFrame.pm:292 msgid "Select &Filament Settings Tab\tCtrl+3" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:290 +#: lib/Slic3r/GUI/MainFrame.pm:292 msgid "Show the filament settings" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:293 +#: lib/Slic3r/GUI/MainFrame.pm:295 msgid "Select Print&er Settings Tab\tCtrl+4" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:293 +#: lib/Slic3r/GUI/MainFrame.pm:295 msgid "Show the printer settings" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:305 +#: lib/Slic3r/GUI/MainFrame.pm:307 msgid "Iso" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:305 +#: lib/Slic3r/GUI/MainFrame.pm:307 msgid "Iso View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:306 +#: lib/Slic3r/GUI/MainFrame.pm:308 msgid "Top View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:307 +#: lib/Slic3r/GUI/MainFrame.pm:309 msgid "Bottom View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:308 +#: lib/Slic3r/GUI/MainFrame.pm:310 msgid "Front" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:308 +#: lib/Slic3r/GUI/MainFrame.pm:310 msgid "Front View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:309 +#: lib/Slic3r/GUI/MainFrame.pm:311 msgid "Rear" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:309 +#: lib/Slic3r/GUI/MainFrame.pm:311 msgid "Rear View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:310 +#: lib/Slic3r/GUI/MainFrame.pm:312 msgid "Left" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:310 +#: lib/Slic3r/GUI/MainFrame.pm:312 msgid "Left View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:311 +#: lib/Slic3r/GUI/MainFrame.pm:313 msgid "Right" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:311 +#: lib/Slic3r/GUI/MainFrame.pm:313 msgid "Right View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:317 +#: lib/Slic3r/GUI/MainFrame.pm:319 msgid "Prusa 3D Drivers" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:317 +#: lib/Slic3r/GUI/MainFrame.pm:319 msgid "Open the Prusa3D drivers download page in your browser" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:320 +#: lib/Slic3r/GUI/MainFrame.pm:322 msgid "Prusa Edition Releases" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:320 +#: lib/Slic3r/GUI/MainFrame.pm:322 msgid "Open the Prusa Edition releases page in your browser" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:327 +#: lib/Slic3r/GUI/MainFrame.pm:329 msgid "Slic3r &Website" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:327 +#: lib/Slic3r/GUI/MainFrame.pm:329 msgid "Open the Slic3r website in your browser" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:330 +#: lib/Slic3r/GUI/MainFrame.pm:332 msgid "Slic3r &Manual" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:330 +#: lib/Slic3r/GUI/MainFrame.pm:332 msgid "Open the Slic3r manual in your browser" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:334 +#: lib/Slic3r/GUI/MainFrame.pm:336 msgid "System Info" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:334 +#: lib/Slic3r/GUI/MainFrame.pm:336 msgid "Show system information" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:337 +#: lib/Slic3r/GUI/MainFrame.pm:339 msgid "Show &Configuration Folder" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:337 +#: lib/Slic3r/GUI/MainFrame.pm:339 msgid "Show user configuration folder (datadir)" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:340 +#: lib/Slic3r/GUI/MainFrame.pm:342 msgid "Report an Issue" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:340 +#: lib/Slic3r/GUI/MainFrame.pm:342 msgid "Report an issue on the Slic3r Prusa Edition" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:343 +#: lib/Slic3r/GUI/MainFrame.pm:345 msgid "&About Slic3r" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:343 +#: lib/Slic3r/GUI/MainFrame.pm:345 msgid "Show about dialog" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:353 +#: lib/Slic3r/GUI/MainFrame.pm:355 msgid "&File" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:354 +#: lib/Slic3r/GUI/MainFrame.pm:356 msgid "&Plater" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:355 +#: lib/Slic3r/GUI/MainFrame.pm:357 msgid "&Object" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:356 +#: lib/Slic3r/GUI/MainFrame.pm:358 msgid "&Window" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:357 +#: lib/Slic3r/GUI/MainFrame.pm:359 msgid "&View" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:360 +#: lib/Slic3r/GUI/MainFrame.pm:362 msgid "&Help" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:391 +#: lib/Slic3r/GUI/MainFrame.pm:393 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:403 +#: lib/Slic3r/GUI/MainFrame.pm:405 msgid "No previously sliced file." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:404 lib/Slic3r/GUI/Plater.pm:1363 +#: lib/Slic3r/GUI/MainFrame.pm:406 lib/Slic3r/GUI/Plater.pm:1406 msgid "Error" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:408 +#: lib/Slic3r/GUI/MainFrame.pm:410 msgid "Previously sliced file (" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:408 +#: lib/Slic3r/GUI/MainFrame.pm:410 msgid ") not found." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:409 +#: lib/Slic3r/GUI/MainFrame.pm:411 msgid "File Not Found" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:448 +#: lib/Slic3r/GUI/MainFrame.pm:450 msgid "SVG" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:448 +#: lib/Slic3r/GUI/MainFrame.pm:450 msgid "G-code" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:448 lib/Slic3r/GUI/Plater.pm:1685 +#: lib/Slic3r/GUI/MainFrame.pm:450 lib/Slic3r/GUI/Plater.pm:1756 msgid " file as:" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:462 +#: lib/Slic3r/GUI/MainFrame.pm:464 msgid "Slicing…" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:462 +#: lib/Slic3r/GUI/MainFrame.pm:464 msgid "Processing " msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:482 +#: lib/Slic3r/GUI/MainFrame.pm:484 msgid " was successfully sliced." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:484 +#: lib/Slic3r/GUI/MainFrame.pm:486 msgid "Slicing Done!" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:500 +#: lib/Slic3r/GUI/MainFrame.pm:502 msgid "Select the STL file to repair:" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:514 +#: lib/Slic3r/GUI/MainFrame.pm:516 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:528 +#: lib/Slic3r/GUI/MainFrame.pm:530 msgid "Your file was repaired." msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:528 +#: lib/Slic3r/GUI/MainFrame.pm:530 msgid "Repair" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:539 +#: lib/Slic3r/GUI/MainFrame.pm:541 msgid "Save configuration as:" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:557 lib/Slic3r/GUI/MainFrame.pm:601 +#: lib/Slic3r/GUI/MainFrame.pm:559 lib/Slic3r/GUI/MainFrame.pm:603 msgid "Select configuration to load:" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:580 +#: lib/Slic3r/GUI/MainFrame.pm:582 msgid "Save presets bundle as:" msgstr "" -#: lib/Slic3r/GUI/MainFrame.pm:621 +#: lib/Slic3r/GUI/MainFrame.pm:623 #, possible-perl-format msgid "%d presets successfully imported." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:112 lib/Slic3r/GUI/Plater.pm:2188 +#: lib/Slic3r/GUI/Plater.pm:140 lib/Slic3r/GUI/Plater.pm:2282 msgid "3D" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:148 +#: lib/Slic3r/GUI/Plater.pm:180 msgid "2D" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:167 +#: lib/Slic3r/GUI/Plater.pm:199 msgid "Layers" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:187 lib/Slic3r/GUI/Plater.pm:205 +#: lib/Slic3r/GUI/Plater.pm:232 lib/Slic3r/GUI/Plater.pm:250 msgid "Add…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:189 lib/Slic3r/GUI/Plater.pm:207 +#: lib/Slic3r/GUI/Plater.pm:234 lib/Slic3r/GUI/Plater.pm:252 msgid "Delete All" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:190 lib/Slic3r/GUI/Plater.pm:208 +#: lib/Slic3r/GUI/Plater.pm:235 lib/Slic3r/GUI/Plater.pm:253 msgid "Arrange" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:192 +#: lib/Slic3r/GUI/Plater.pm:237 msgid "More" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:193 +#: lib/Slic3r/GUI/Plater.pm:238 msgid "Fewer" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:195 +#: lib/Slic3r/GUI/Plater.pm:240 msgid "45° ccw" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:196 +#: lib/Slic3r/GUI/Plater.pm:241 msgid "45° cw" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:197 lib/Slic3r/GUI/Plater.pm:213 +#: lib/Slic3r/GUI/Plater.pm:242 lib/Slic3r/GUI/Plater.pm:258 msgid "Scale…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:198 lib/Slic3r/GUI/Plater.pm:214 -#: lib/Slic3r/GUI/Plater.pm:2163 +#: lib/Slic3r/GUI/Plater.pm:243 lib/Slic3r/GUI/Plater.pm:259 +#: lib/Slic3r/GUI/Plater.pm:2252 msgid "Split" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:199 lib/Slic3r/GUI/Plater.pm:215 -#: lib/Slic3r/GUI/Plater.pm:2166 +#: lib/Slic3r/GUI/Plater.pm:244 lib/Slic3r/GUI/Plater.pm:260 +#: lib/Slic3r/GUI/Plater.pm:2255 msgid "Cut…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:201 lib/Slic3r/GUI/Plater.pm:216 -#: lib/Slic3r/GUI/Plater.pm:2170 +#: lib/Slic3r/GUI/Plater.pm:246 lib/Slic3r/GUI/Plater.pm:261 +#: lib/Slic3r/GUI/Plater.pm:2259 msgid "Settings…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:202 +#: lib/Slic3r/GUI/Plater.pm:247 msgid "Layer Editing" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:217 +#: lib/Slic3r/GUI/Plater.pm:262 msgid "Layer editing" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:240 +#: lib/Slic3r/GUI/Plater.pm:285 msgid "Name" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:241 lib/Slic3r/GUI/Plater.pm:963 +#: lib/Slic3r/GUI/Plater.pm:286 lib/Slic3r/GUI/Plater.pm:1007 msgid "Copies" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:242 lib/Slic3r/GUI/Plater.pm:1119 -#: lib/Slic3r/GUI/Plater.pm:1124 lib/Slic3r/GUI/Plater.pm:2132 +#: lib/Slic3r/GUI/Plater.pm:287 lib/Slic3r/GUI/Plater.pm:1163 +#: lib/Slic3r/GUI/Plater.pm:1168 lib/Slic3r/GUI/Plater.pm:2221 msgid "Scale" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:256 +#: lib/Slic3r/GUI/Plater.pm:301 msgid "Export G-code…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:257 +#: lib/Slic3r/GUI/Plater.pm:302 msgid "Slice now" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:258 +#: lib/Slic3r/GUI/Plater.pm:303 msgid "Print…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:259 +#: lib/Slic3r/GUI/Plater.pm:304 msgid "Send to printer" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:260 +#: lib/Slic3r/GUI/Plater.pm:305 msgid "Export STL…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:387 +#: lib/Slic3r/GUI/Plater.pm:432 msgid "Print settings" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:389 +#: lib/Slic3r/GUI/Plater.pm:434 msgid "Printer" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:422 +#: lib/Slic3r/GUI/Plater.pm:467 msgid "Info" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:433 +#: lib/Slic3r/GUI/Plater.pm:478 msgid "Volume" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:434 +#: lib/Slic3r/GUI/Plater.pm:479 msgid "Facets" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:435 +#: lib/Slic3r/GUI/Plater.pm:480 msgid "Materials" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:436 +#: lib/Slic3r/GUI/Plater.pm:481 msgid "Manifold" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:462 +#: lib/Slic3r/GUI/Plater.pm:507 msgid "Sliced Info" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:471 +#: lib/Slic3r/GUI/Plater.pm:516 msgid "Used Filament (m)" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:472 +#: lib/Slic3r/GUI/Plater.pm:517 msgid "Used Filament (mm³)" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:473 +#: lib/Slic3r/GUI/Plater.pm:518 msgid "Used Filament (g)" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:475 +#: lib/Slic3r/GUI/Plater.pm:520 msgid "Estimated printing time" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:683 +#: lib/Slic3r/GUI/Plater.pm:728 msgid "Loading…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:683 lib/Slic3r/GUI/Plater.pm:697 +#: lib/Slic3r/GUI/Plater.pm:728 lib/Slic3r/GUI/Plater.pm:742 msgid "Processing input file\n" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:720 +#: lib/Slic3r/GUI/Plater.pm:765 msgid "" "This file contains several objects positioned at multiple heights. Instead " "of considering them as multiple objects, should I consider\n" "this file as a single object having multiple parts?\n" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:723 lib/Slic3r/GUI/Plater.pm:740 +#: lib/Slic3r/GUI/Plater.pm:768 lib/Slic3r/GUI/Plater.pm:785 msgid "Multi-part object detected" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:737 +#: lib/Slic3r/GUI/Plater.pm:782 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" "these files to represent a single object having multiple parts?\n" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:749 +#: lib/Slic3r/GUI/Plater.pm:794 msgid "Loaded " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:807 +#: lib/Slic3r/GUI/Plater.pm:852 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:808 +#: lib/Slic3r/GUI/Plater.pm:853 msgid "Object too large?" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:963 +#: lib/Slic3r/GUI/Plater.pm:1007 msgid "Enter the number of copies of the selected object:" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:990 +#: lib/Slic3r/GUI/Plater.pm:1034 msgid "" "\n" "Non-positive value." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:991 +#: lib/Slic3r/GUI/Plater.pm:1035 msgid "" "\n" "Not a numeric value." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:992 +#: lib/Slic3r/GUI/Plater.pm:1036 msgid "Slic3r Error" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1093 +#: lib/Slic3r/GUI/Plater.pm:1057 +msgid "Enter the rotation angle:" +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:1057 +msgid "Rotate around " +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:1057 +msgid "Invalid rotation angle entered" +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:1137 #, possible-perl-format msgid "Enter the new size for the selected object (print bed: %smm):" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1094 lib/Slic3r/GUI/Plater.pm:1098 +#: lib/Slic3r/GUI/Plater.pm:1138 lib/Slic3r/GUI/Plater.pm:1142 msgid "Scale along " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1094 lib/Slic3r/GUI/Plater.pm:1098 -#: lib/Slic3r/GUI/Plater.pm:1119 lib/Slic3r/GUI/Plater.pm:1124 +#: lib/Slic3r/GUI/Plater.pm:1138 lib/Slic3r/GUI/Plater.pm:1142 +#: lib/Slic3r/GUI/Plater.pm:1163 lib/Slic3r/GUI/Plater.pm:1168 msgid "Invalid scaling value entered" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1098 lib/Slic3r/GUI/Plater.pm:1124 -#, possible-perl-format +#: lib/Slic3r/GUI/Plater.pm:1142 lib/Slic3r/GUI/Plater.pm:1168 +#, no-perl-format msgid "Enter the scale % for the selected object:" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1119 +#: lib/Slic3r/GUI/Plater.pm:1163 msgid "Enter the new max size for the selected object:" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1175 +#: lib/Slic3r/GUI/Plater.pm:1219 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1184 +#: lib/Slic3r/GUI/Plater.pm:1228 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1349 +#: lib/Slic3r/GUI/Plater.pm:1392 msgid "Slicing cancelled" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1363 +#: lib/Slic3r/GUI/Plater.pm:1406 msgid "Another export job is currently running." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1399 -msgid "Save G-code file as:" -msgstr "" - -#: lib/Slic3r/GUI/Plater.pm:1416 -msgid "Export cancelled" -msgstr "" - -#: lib/Slic3r/GUI/Plater.pm:1513 +#: lib/Slic3r/GUI/Plater.pm:1556 msgid "File added to print queue" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1519 +#: lib/Slic3r/GUI/Plater.pm:1562 msgid "G-code file exported to " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1522 +#: lib/Slic3r/GUI/Plater.pm:1565 msgid "Export failed" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1534 +#: lib/Slic3r/GUI/Plater.pm:1577 msgid "OctoPrint upload finished." msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1577 lib/Slic3r/GUI/Plater.pm:1619 +#: lib/Slic3r/GUI/Plater.pm:1620 lib/Slic3r/GUI/Plater.pm:1662 msgid "STL file exported to " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1630 +#: lib/Slic3r/GUI/Plater.pm:1701 msgid "AMF file exported to " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1634 +#: lib/Slic3r/GUI/Plater.pm:1705 msgid "Error exporting AMF file " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1646 +#: lib/Slic3r/GUI/Plater.pm:1717 msgid "3MF file exported to " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1650 +#: lib/Slic3r/GUI/Plater.pm:1721 msgid "Error exporting 3MF file " msgstr "" -#: lib/Slic3r/GUI/Plater.pm:1897 -msgid "" -"Please install the OpenGL modules to use this feature (see build " -"instructions)." -msgstr "" - -#: lib/Slic3r/GUI/Plater.pm:2010 +#: lib/Slic3r/GUI/Plater.pm:2099 #, possible-perl-format msgid "%d (%d shells)" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2012 +#: lib/Slic3r/GUI/Plater.pm:2101 #, possible-perl-format msgid "Auto-repaired (%d errors)" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2017 +#: lib/Slic3r/GUI/Plater.pm:2106 #, possible-perl-format msgid "" "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " "facets reversed, %d backwards edges" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2022 +#: lib/Slic3r/GUI/Plater.pm:2111 msgid "Yes" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2085 +#: lib/Slic3r/GUI/Plater.pm:2174 msgid "Remove the selected object" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2088 +#: lib/Slic3r/GUI/Plater.pm:2177 msgid "Increase copies" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2088 +#: lib/Slic3r/GUI/Plater.pm:2177 msgid "Place one more copy of the selected object" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2091 +#: lib/Slic3r/GUI/Plater.pm:2180 msgid "Decrease copies" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2091 +#: lib/Slic3r/GUI/Plater.pm:2180 msgid "Remove one copy of the selected object" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2094 +#: lib/Slic3r/GUI/Plater.pm:2183 msgid "Set number of copies…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2094 +#: lib/Slic3r/GUI/Plater.pm:2183 msgid "Change the number of copies of the selected object" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2098 +#: lib/Slic3r/GUI/Plater.pm:2187 msgid "Rotate 45° clockwise" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2098 +#: lib/Slic3r/GUI/Plater.pm:2187 msgid "Rotate the selected object by 45° clockwise" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2101 +#: lib/Slic3r/GUI/Plater.pm:2190 msgid "Rotate 45° counter-clockwise" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2101 +#: lib/Slic3r/GUI/Plater.pm:2190 msgid "Rotate the selected object by 45° counter-clockwise" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2106 +#: lib/Slic3r/GUI/Plater.pm:2195 msgid "Rotate" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2106 +#: lib/Slic3r/GUI/Plater.pm:2195 msgid "Rotate the selected object by an arbitrary angle" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2108 +#: lib/Slic3r/GUI/Plater.pm:2197 msgid "Around X axis…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2108 +#: lib/Slic3r/GUI/Plater.pm:2197 msgid "Rotate the selected object by an arbitrary angle around X axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2111 +#: lib/Slic3r/GUI/Plater.pm:2200 msgid "Around Y axis…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2111 +#: lib/Slic3r/GUI/Plater.pm:2200 msgid "Rotate the selected object by an arbitrary angle around Y axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2114 +#: lib/Slic3r/GUI/Plater.pm:2203 msgid "Around Z axis…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2114 +#: lib/Slic3r/GUI/Plater.pm:2203 msgid "Rotate the selected object by an arbitrary angle around Z axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2119 +#: lib/Slic3r/GUI/Plater.pm:2208 msgid "Mirror" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2119 +#: lib/Slic3r/GUI/Plater.pm:2208 msgid "Mirror the selected object" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2121 lib/Slic3r/GUI/Plater.pm:2137 -#: lib/Slic3r/GUI/Plater.pm:2153 +#: lib/Slic3r/GUI/Plater.pm:2210 lib/Slic3r/GUI/Plater.pm:2226 +#: lib/Slic3r/GUI/Plater.pm:2242 msgid "Along X axis…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2121 +#: lib/Slic3r/GUI/Plater.pm:2210 msgid "Mirror the selected object along the X axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2124 lib/Slic3r/GUI/Plater.pm:2140 -#: lib/Slic3r/GUI/Plater.pm:2156 +#: lib/Slic3r/GUI/Plater.pm:2213 lib/Slic3r/GUI/Plater.pm:2229 +#: lib/Slic3r/GUI/Plater.pm:2245 msgid "Along Y axis…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2124 +#: lib/Slic3r/GUI/Plater.pm:2213 msgid "Mirror the selected object along the Y axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2127 lib/Slic3r/GUI/Plater.pm:2143 -#: lib/Slic3r/GUI/Plater.pm:2159 +#: lib/Slic3r/GUI/Plater.pm:2216 lib/Slic3r/GUI/Plater.pm:2232 +#: lib/Slic3r/GUI/Plater.pm:2248 msgid "Along Z axis…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2127 +#: lib/Slic3r/GUI/Plater.pm:2216 msgid "Mirror the selected object along the Z axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2132 lib/Slic3r/GUI/Plater.pm:2148 +#: lib/Slic3r/GUI/Plater.pm:2221 lib/Slic3r/GUI/Plater.pm:2237 msgid "Scale the selected object along a single axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2134 lib/Slic3r/GUI/Plater.pm:2150 +#: lib/Slic3r/GUI/Plater.pm:2223 lib/Slic3r/GUI/Plater.pm:2239 msgid "Uniformly…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2134 lib/Slic3r/GUI/Plater.pm:2150 +#: lib/Slic3r/GUI/Plater.pm:2223 lib/Slic3r/GUI/Plater.pm:2239 msgid "Scale the selected object along the XYZ axes" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2137 lib/Slic3r/GUI/Plater.pm:2153 +#: lib/Slic3r/GUI/Plater.pm:2226 lib/Slic3r/GUI/Plater.pm:2242 msgid "Scale the selected object along the X axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2140 lib/Slic3r/GUI/Plater.pm:2156 +#: lib/Slic3r/GUI/Plater.pm:2229 lib/Slic3r/GUI/Plater.pm:2245 msgid "Scale the selected object along the Y axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2143 lib/Slic3r/GUI/Plater.pm:2159 +#: lib/Slic3r/GUI/Plater.pm:2232 lib/Slic3r/GUI/Plater.pm:2248 msgid "Scale the selected object along the Z axis" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2148 +#: lib/Slic3r/GUI/Plater.pm:2237 msgid "Scale to size" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2163 +#: lib/Slic3r/GUI/Plater.pm:2252 msgid "Split the selected object into individual parts" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2166 +#: lib/Slic3r/GUI/Plater.pm:2255 msgid "Open the 3D cutting tool" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2170 +#: lib/Slic3r/GUI/Plater.pm:2259 msgid "Open the object editor dialog" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2174 +#: lib/Slic3r/GUI/Plater.pm:2263 msgid "Reload from Disk" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2174 +#: lib/Slic3r/GUI/Plater.pm:2263 msgid "Reload the selected file from Disk" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2177 +#: lib/Slic3r/GUI/Plater.pm:2266 msgid "Export object as STL…" msgstr "" -#: lib/Slic3r/GUI/Plater.pm:2177 +#: lib/Slic3r/GUI/Plater.pm:2266 msgid "Export this single object as STL file" msgstr "" +#: lib/Slic3r/GUI/Plater.pm:2270 +msgid "Fix STL through Netfabb" +msgstr "" + +#: lib/Slic3r/GUI/Plater.pm:2270 +msgid "" +"Fix the model by sending it to a Netfabb cloud service through Windows 10 API" +msgstr "" + #: lib/Slic3r/GUI/Plater/2D.pm:131 msgid "What do you want to print today? ™" msgstr "" diff --git a/resources/localization/list.txt b/resources/localization/list.txt index 0fd528994..a4d07b617 100644 --- a/resources/localization/list.txt +++ b/resources/localization/list.txt @@ -6,6 +6,7 @@ xs/src/slic3r/GUI/ButtonsDescription.cpp xs/src/slic3r/GUI/ConfigSnapshotDialog.cpp xs/src/slic3r/GUI/ConfigWizard.cpp xs/src/slic3r/GUI/FirmwareDialog.cpp +xs/src/slic3r/GUI/GLCanvas3D.cpp xs/src/slic3r/GUI/GUI.cpp xs/src/slic3r/GUI/MsgDialog.cpp xs/src/slic3r/GUI/Tab.cpp diff --git a/xs/CMakeLists.txt b/xs/CMakeLists.txt index 3fb50d7ea..9b88b76f4 100644 --- a/xs/CMakeLists.txt +++ b/xs/CMakeLists.txt @@ -8,6 +8,7 @@ list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules/) if (CMAKE_SYSTEM_NAME STREQUAL "Linux") # Workaround for an old CMake, which does not understand CMAKE_CXX_STANDARD. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall" ) + find_package(PkgConfig REQUIRED) endif() if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUXX) @@ -581,6 +582,15 @@ if (SLIC3R_PRUSACONTROL) #add_compile_options(${AlienWx_CXX_FLAGS}) add_definitions(${AlienWx_DEFINITIONS}) set(wxWidgets_LIBRARIES ${AlienWx_LIBRARIES}) + # On Linux / gtk, we need to have a direct access to gtk+ for some workarounds. + if (AlienWx_GUI_TOOLKIT STREQUAL "gtk2") + pkg_check_modules(GTK2 gtk+-2.0) + include_directories(${GTK2_INCLUDE_DIRS}) + endif() + if (AlienWx_GUI_TOOLKIT STREQUAL "gtk3") + pkg_check_modules(GTK3 gtk+-3.0) + include_directories(${GTK3_INCLUDE_DIRS}) + endif() else () find_package(wxWidgets REQUIRED COMPONENTS base core adv html gl) include(${wxWidgets_USE_FILE}) diff --git a/xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp b/xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp index fbde83754..5aa6470a2 100644 --- a/xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp +++ b/xs/src/libslic3r/GCode/WipeTowerPrusaMM.cpp @@ -142,10 +142,10 @@ public: } m_gcode += "G1"; - if (std::abs(dx) > EPSILON) + if (std::abs(rot.x - rotated_current_pos.x) > EPSILON) m_gcode += set_format_X(rot.x); - if (std::abs(dy) > EPSILON) + if (std::abs(rot.y - rotated_current_pos.y) > EPSILON) m_gcode += set_format_Y(rot.y); if (e != 0.f) diff --git a/xs/src/libslic3r/libslic3r.h b/xs/src/libslic3r/libslic3r.h index fd6b56e3a..bc98a2d70 100644 --- a/xs/src/libslic3r/libslic3r.h +++ b/xs/src/libslic3r/libslic3r.h @@ -14,7 +14,7 @@ #include #define SLIC3R_FORK_NAME "Slic3r Prusa Edition" -#define SLIC3R_VERSION "1.40.0" +#define SLIC3R_VERSION "1.40.1-rc" #define SLIC3R_BUILD "UNKNOWN" typedef int32_t coord_t; diff --git a/xs/src/slic3r/GUI/3DScene.cpp b/xs/src/slic3r/GUI/3DScene.cpp index feae9312e..09e10ac28 100644 --- a/xs/src/slic3r/GUI/3DScene.cpp +++ b/xs/src/slic3r/GUI/3DScene.cpp @@ -1754,11 +1754,6 @@ bool _3DScene::init(wxGLCanvas* canvas) return s_canvas_mgr.init(canvas); } -void _3DScene::set_active(wxGLCanvas* canvas, bool active) -{ - s_canvas_mgr.set_active(canvas, active); -} - void _3DScene::set_as_dirty(wxGLCanvas* canvas) { s_canvas_mgr.set_as_dirty(canvas); diff --git a/xs/src/slic3r/GUI/3DScene.hpp b/xs/src/slic3r/GUI/3DScene.hpp index c317dba24..9016f984d 100644 --- a/xs/src/slic3r/GUI/3DScene.hpp +++ b/xs/src/slic3r/GUI/3DScene.hpp @@ -516,7 +516,6 @@ public: static bool init(wxGLCanvas* canvas); - static void set_active(wxGLCanvas* canvas, bool active); static void set_as_dirty(wxGLCanvas* canvas); static unsigned int get_volumes_count(wxGLCanvas* canvas); diff --git a/xs/src/slic3r/GUI/ConfigWizard.cpp b/xs/src/slic3r/GUI/ConfigWizard.cpp index ce06da853..2e315a70b 100644 --- a/xs/src/slic3r/GUI/ConfigWizard.cpp +++ b/xs/src/slic3r/GUI/ConfigWizard.cpp @@ -83,8 +83,11 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, cons const auto model_id = model.id; + bool default_variant = true; // Mark the first variant as default in the GUI for (const auto &variant : model.variants) { - const auto label = wxString::Format("%s %s %s", variant.name, _(L("mm")), _(L("nozzle"))); + const auto label = wxString::Format("%s %s %s %s", variant.name, _(L("mm")), _(L("nozzle")), + (default_variant ? _(L("(default)")) : wxString())); + default_variant = false; auto *cbox = new Checkbox(panel, label, model_id, variant.name); const size_t idx = cboxes.size(); cboxes.push_back(cbox); @@ -113,11 +116,6 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, cons sizer->Add(all_none_sizer, 0, wxEXPAND); SetSizer(sizer); - - if (cboxes.size() > 0) { - cboxes[0]->SetValue(true); - on_checkbox(cboxes[0], true); - } } void PrinterPicker::select_all(bool select) @@ -130,6 +128,14 @@ void PrinterPicker::select_all(bool select) } } +void PrinterPicker::select_one(size_t i, bool select) +{ + if (i < cboxes.size() && cboxes[i]->GetValue() != select) { + cboxes[i]->SetValue(select); + on_checkbox(cboxes[i], select); + } +} + void PrinterPicker::on_checkbox(const Checkbox *cbox, bool checked) { variants_checked += checked ? 1 : -1; @@ -232,6 +238,7 @@ PageWelcome::PageWelcome(ConfigWizard *parent) : AppConfig &appconfig_vendors = this->wizard_p()->appconfig_vendors; printer_picker = new PrinterPicker(this, vendor_prusa->second, appconfig_vendors); + printer_picker->select_one(0, true); // Select the default (first) model/variant on the Prusa vendor printer_picker->Bind(EVT_PRINTER_PICK, [this, &appconfig_vendors](const PrinterPickerEvent &evt) { appconfig_vendors.set_variant(evt.vendor_id, evt.model_id, evt.variant_name, evt.enable); this->on_variant_checked(); @@ -886,9 +893,9 @@ const wxString& ConfigWizard::name() { // A different naming convention is used for the Wizard on Windows vs. OSX & GTK. #if WIN32 - static const wxString config_wizard_name = _(L("Configuration Wizard")); + static const wxString config_wizard_name = L("Configuration Wizard"); #else - static const wxString config_wizard_name = _(L("Configuration Assistant")); + static const wxString config_wizard_name = L("Configuration Assistant"); #endif return config_wizard_name; } diff --git a/xs/src/slic3r/GUI/ConfigWizard_private.hpp b/xs/src/slic3r/GUI/ConfigWizard_private.hpp index 72cb88655..04319a1b4 100644 --- a/xs/src/slic3r/GUI/ConfigWizard_private.hpp +++ b/xs/src/slic3r/GUI/ConfigWizard_private.hpp @@ -56,6 +56,7 @@ struct PrinterPicker: wxPanel PrinterPicker(wxWindow *parent, const VendorProfile &vendor, const AppConfig &appconfig_vendors); void select_all(bool select); + void select_one(size_t i, bool select); void on_checkbox(const Checkbox *cbox, bool checked); }; diff --git a/xs/src/slic3r/GUI/Field.cpp b/xs/src/slic3r/GUI/Field.cpp index efff7b58e..bd393ce2c 100644 --- a/xs/src/slic3r/GUI/Field.cpp +++ b/xs/src/slic3r/GUI/Field.cpp @@ -12,10 +12,20 @@ namespace Slic3r { namespace GUI { wxString double_to_string(double const value) { - int precision = 10 * value - int(10 * value) == 0 ? 1 : 2; - return value - int(value) == 0 ? - wxString::Format(_T("%i"), int(value)) : - wxNumberFormatter::ToString(value, precision, wxNumberFormatter::Style_None); + if (value - int(value) == 0) + return wxString::Format(_T("%i"), int(value)); + else { + int precision = 4; + for (size_t p = 1; p < 4; p++) + { + double cur_val = pow(10, p)*value; + if (cur_val - int(cur_val) == 0) { + precision = p; + break; + } + } + return wxNumberFormatter::ToString(value, precision, wxNumberFormatter::Style_None); + } } void Field::PostInitialize(){ diff --git a/xs/src/slic3r/GUI/GLCanvas3D.cpp b/xs/src/slic3r/GUI/GLCanvas3D.cpp index b82586d31..7afa6c07a 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.cpp @@ -1408,15 +1408,14 @@ GLGizmoBase* GLCanvas3D::Gizmos::_get_current() const return (it != m_gizmos.end()) ? it->second : nullptr; } -GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context) +GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) : m_canvas(canvas) - , m_context(context) + , m_context(nullptr) , m_timer(nullptr) , m_config(nullptr) , m_print(nullptr) , m_model(nullptr) , m_dirty(true) - , m_active(true) , m_initialized(false) , m_use_VBOs(false) , m_force_zoom_to_bed_enabled(false) @@ -1434,7 +1433,10 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context) , m_reload_delayed(false) { if (m_canvas != nullptr) + { + m_context = new wxGLContext(m_canvas); m_timer = new wxTimer(m_canvas); + } } GLCanvas3D::~GLCanvas3D() @@ -1447,6 +1449,12 @@ GLCanvas3D::~GLCanvas3D() m_timer = nullptr; } + if (m_context != nullptr) + { + delete m_context; + m_context = nullptr; + } + _deregister_callbacks(); } @@ -1455,6 +1463,9 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl) if (m_initialized) return true; + if ((m_canvas == nullptr) || (m_context == nullptr)) + return false; + ::glClearColor(1.0f, 1.0f, 1.0f, 1.0f); ::glClearDepth(1.0f); @@ -1523,19 +1534,11 @@ bool GLCanvas3D::init(bool useVBOs, bool use_legacy_opengl) bool GLCanvas3D::set_current() { if ((m_canvas != nullptr) && (m_context != nullptr)) - { - m_canvas->SetCurrent(*m_context); - return true; - } + return m_canvas->SetCurrent(*m_context); return false; } -void GLCanvas3D::set_active(bool active) -{ - m_active = active; -} - void GLCanvas3D::set_as_dirty() { m_dirty = true; @@ -1548,8 +1551,13 @@ unsigned int GLCanvas3D::get_volumes_count() const void GLCanvas3D::reset_volumes() { - if (set_current()) + + if (!m_volumes.empty()) { + // ensures this canvas is current + if (!set_current()) + return; + m_volumes.release_geometry(); m_volumes.clear(); m_dirty = true; @@ -1653,6 +1661,8 @@ void GLCanvas3D::set_bed_shape(const Pointfs& shape) // Set the origin and size for painting of the coordinate system axes. m_axes.origin = Pointf3(0.0, 0.0, (coordf_t)GROUND_Z); set_axes_length(0.3f * (float)m_bed.get_bounding_box().max_size()); + + m_dirty = true; } void GLCanvas3D::set_auto_bed_shape() @@ -1847,7 +1857,7 @@ void GLCanvas3D::render() if (!_is_shown_on_screen()) return; - // ensures that the proper context is selected and that this canvas is initialized + // ensures this canvas is current and initialized if (!set_current() || !_3DScene::init(m_canvas)) return; @@ -1929,6 +1939,11 @@ void GLCanvas3D::reload_scene(bool force) return; reset_volumes(); + + // ensures this canvas is current + if (!set_current()) + return; + set_bed_shape(dynamic_cast(m_config->option("bed_shape"))->values); if (!m_canvas->IsShown() && !force) @@ -2000,6 +2015,10 @@ void GLCanvas3D::reload_scene(bool force) void GLCanvas3D::load_print_toolpaths() { + // ensures this canvas is current + if (!set_current()) + return; + if (m_print == nullptr) return; @@ -2364,7 +2383,7 @@ void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const { if ((m_canvas != nullptr) && (m_print != nullptr)) { - // ensures that the proper context is selected + // ensures that this canvas is current if (!set_current()) return; @@ -2985,7 +3004,7 @@ Point GLCanvas3D::get_local_mouse_position() const bool GLCanvas3D::_is_shown_on_screen() const { - return (m_canvas != nullptr) ? m_active && m_canvas->IsShownOnScreen() : false; + return (m_canvas != nullptr) ? m_canvas->IsShownOnScreen() : false; } void GLCanvas3D::_force_zoom_to_bed() @@ -2996,9 +3015,10 @@ void GLCanvas3D::_force_zoom_to_bed() void GLCanvas3D::_resize(unsigned int w, unsigned int h) { - if (m_context == nullptr) + if ((m_canvas == nullptr) && (m_context == nullptr)) return; + // ensures that this canvas is current set_current(); ::glViewport(0, 0, w, h); @@ -3585,9 +3605,11 @@ void GLCanvas3D::_perform_layer_editing_action(wxMouseEvent* evt) Pointf3 GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z) { - if (!set_current()) + if (m_canvas == nullptr) return Pointf3(DBL_MAX, DBL_MAX, DBL_MAX); + _camera_tranform(); + GLint viewport[4]; ::glGetIntegerv(GL_VIEWPORT, viewport); GLdouble modelview_matrix[16]; diff --git a/xs/src/slic3r/GUI/GLCanvas3D.hpp b/xs/src/slic3r/GUI/GLCanvas3D.hpp index 18011f497..b0706a05d 100644 --- a/xs/src/slic3r/GUI/GLCanvas3D.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3D.hpp @@ -401,9 +401,6 @@ private: Model* m_model; bool m_dirty; - // the active member has been introduced to overcome a bug in wxWidgets method IsShownOnScreen() which always return true - // when a window is inside a wxNotebook - bool m_active; bool m_initialized; bool m_use_VBOs; bool m_force_zoom_to_bed_enabled; @@ -444,14 +441,13 @@ private: PerlCallback m_on_gizmo_scale_uniformly_callback; public: - GLCanvas3D(wxGLCanvas* canvas, wxGLContext* context); + GLCanvas3D(wxGLCanvas* canvas); ~GLCanvas3D(); bool init(bool useVBOs, bool use_legacy_opengl); bool set_current(); - void set_active(bool active); void set_as_dirty(); unsigned int get_volumes_count() const; diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp index 81efe4408..f817e7739 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -114,19 +114,13 @@ std::string GLCanvas3DManager::GLInfo::to_string(bool format_as_html, bool exten } GLCanvas3DManager::GLCanvas3DManager() - : m_context(nullptr) + : m_current(nullptr) , m_gl_initialized(false) , m_use_legacy_opengl(false) , m_use_VBOs(false) { } -GLCanvas3DManager::~GLCanvas3DManager() -{ - if (m_context != nullptr) - delete m_context; -} - bool GLCanvas3DManager::add(wxGLCanvas* canvas) { if (canvas == nullptr) @@ -135,14 +129,7 @@ bool GLCanvas3DManager::add(wxGLCanvas* canvas) if (_get_canvas(canvas) != m_canvases.end()) return false; - if (m_context == nullptr) - { - m_context = new wxGLContext(canvas); - if (m_context == nullptr) - return false; - } - - GLCanvas3D* canvas3D = new GLCanvas3D(canvas, m_context); + GLCanvas3D* canvas3D = new GLCanvas3D(canvas); if (canvas3D == nullptr) return false; @@ -212,13 +199,6 @@ bool GLCanvas3DManager::init(wxGLCanvas* canvas) return false; } -void GLCanvas3DManager::set_active(wxGLCanvas* canvas, bool active) -{ - CanvasesMap::iterator it = _get_canvas(canvas); - if (it != m_canvases.end()) - it->second->set_active(active); -} - void GLCanvas3DManager::set_as_dirty(wxGLCanvas* canvas) { CanvasesMap::iterator it = _get_canvas(canvas); diff --git a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp index 8726eb0b1..9d9285601 100644 --- a/xs/src/slic3r/GUI/GLCanvas3DManager.hpp +++ b/xs/src/slic3r/GUI/GLCanvas3DManager.hpp @@ -43,8 +43,8 @@ class GLCanvas3DManager typedef std::map CanvasesMap; - wxGLContext* m_context; CanvasesMap m_canvases; + wxGLCanvas* m_current; GLInfo m_gl_info; bool m_gl_initialized; bool m_use_legacy_opengl; @@ -52,7 +52,6 @@ class GLCanvas3DManager public: GLCanvas3DManager(); - ~GLCanvas3DManager(); bool add(wxGLCanvas* canvas); bool remove(wxGLCanvas* canvas); @@ -69,7 +68,6 @@ public: bool init(wxGLCanvas* canvas); - void set_active(wxGLCanvas* canvas, bool active); void set_as_dirty(wxGLCanvas* canvas); unsigned int get_volumes_count(wxGLCanvas* canvas) const; diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index b2f5cb662..aec19ed7a 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -56,6 +56,7 @@ #include "../Utils/PresetUpdater.hpp" #include "../Config/Snapshot.hpp" +#include "3DScene.hpp" namespace Slic3r { namespace GUI { @@ -316,10 +317,11 @@ void add_config_menu(wxMenuBar *menu, int event_preferences_changed, int event_l auto local_menu = new wxMenu(); wxWindowID config_id_base = wxWindow::NewControlId((int)ConfigMenuCnt); - const auto config_wizard_tooltip = wxString::Format(_(L("Run %s")), ConfigWizard::name()); + auto config_wizard_name = _(ConfigWizard::name().wx_str()); + const auto config_wizard_tooltip = wxString::Format(_(L("Run %s")), config_wizard_name); // Cmd+, is standard on OS X - what about other operating systems? - local_menu->Append(config_id_base + ConfigMenuWizard, ConfigWizard::name() + dots, config_wizard_tooltip); - local_menu->Append(config_id_base + ConfigMenuSnapshots, _(L("Configuration Snapshots"))+dots, _(L("Inspect / activate configuration snapshots"))); + local_menu->Append(config_id_base + ConfigMenuWizard, config_wizard_name + dots, config_wizard_tooltip); + local_menu->Append(config_id_base + ConfigMenuSnapshots, _(L("Configuration Snapshots"))+dots, _(L("Inspect / activate configuration snapshots"))); local_menu->Append(config_id_base + ConfigMenuTakeSnapshot, _(L("Take Configuration Snapshot")), _(L("Capture a configuration snapshot"))); // local_menu->Append(config_id_base + ConfigMenuUpdate, _(L("Check for updates")), _(L("Check for configuration updates"))); local_menu->AppendSeparator(); @@ -378,6 +380,7 @@ void add_config_menu(wxMenuBar *menu, int event_preferences_changed, int event_l save_language(); show_info(g_wxTabPanel, _(L("Application will be restarted")), _(L("Attention!"))); if (event_language_change > 0) { + _3DScene::remove_all_canvases();// remove all canvas before recreate GUI wxCommandEvent event(event_language_change); g_wxApp->ProcessEvent(event); } diff --git a/xs/src/slic3r/GUI/OptionsGroup.cpp b/xs/src/slic3r/GUI/OptionsGroup.cpp index 3f988e29b..cd6ecb161 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.cpp +++ b/xs/src/slic3r/GUI/OptionsGroup.cpp @@ -150,8 +150,15 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** colored_Label/* // Build a label if we have it wxStaticText* label=nullptr; if (label_width != 0) { + long label_style = staticbox ? 0 : wxALIGN_RIGHT; +#ifdef __WXGTK__ + // workaround for correct text align of the StaticBox on Linux + // flags wxALIGN_RIGHT and wxALIGN_CENTRE don't work when Ellipsize flags are _not_ given. + // Text is properly aligned only when Ellipsize is checked. + label_style |= staticbox ? 0 : wxST_ELLIPSIZE_END; +#endif /* __WXGTK__ */ label = new wxStaticText(parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ":"), - wxDefaultPosition, wxSize(label_width, -1), staticbox ? 0 : wxALIGN_RIGHT); + wxDefaultPosition, wxSize(label_width, -1), label_style); label->SetFont(label_font); label->Wrap(label_width); // avoid a Linux/GTK bug grid_sizer->Add(label, 0, (staticbox ? 0 : wxALIGN_RIGHT | wxRIGHT) | wxALIGN_CENTER_VERTICAL, 5); diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 76d35f42d..9be7a9892 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -40,49 +40,30 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle) m_preset_bundle = preset_bundle; // Vertical sizer to hold the choice menu and the rest of the page. +#ifdef __WXOSX__ + auto *main_sizer = new wxBoxSizer(wxVERTICAL); + main_sizer->SetSizeHints(this); + this->SetSizer(main_sizer); + + // Create additional panel to Fit() it from OnActivate() + // It's needed for tooltip showing on OSX + m_tmp_panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL); + auto panel = m_tmp_panel; + auto sizer = new wxBoxSizer(wxVERTICAL); + m_tmp_panel->SetSizer(sizer); + m_tmp_panel->Layout(); + + main_sizer->Add(m_tmp_panel, 1, wxEXPAND | wxALL, 0); +#else Tab *panel = this; auto *sizer = new wxBoxSizer(wxVERTICAL); sizer->SetSizeHints(panel); panel->SetSizer(sizer); +#endif //__WXOSX__ // preset chooser m_presets_choice = new wxBitmapComboBox(panel, wxID_ANY, "", wxDefaultPosition, wxSize(270, -1), 0, 0,wxCB_READONLY); - /* - m_cc_presets_choice = new wxComboCtrl(panel, wxID_ANY, L(""), wxDefaultPosition, wxDefaultSize, wxCB_READONLY); - wxDataViewTreeCtrlComboPopup* popup = new wxDataViewTreeCtrlComboPopup; - if (popup != nullptr) - { - // FIXME If the following line is removed, the combo box popup list will not react to mouse clicks. - // On the other side, with this line the combo box popup cannot be closed by clicking on the combo button on Windows 10. -// m_cc_presets_choice->UseAltPopupWindow(); -// m_cc_presets_choice->EnablePopupAnimation(false); - m_cc_presets_choice->SetPopupControl(popup); - popup->SetStringValue(from_u8("Text1")); - - popup->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, [this, popup](wxCommandEvent& evt) - { - auto selected = popup->GetItemText(popup->GetSelection()); - if (selected != _(L("System presets")) && selected != _(L("Default presets"))) - { - m_cc_presets_choice->SetText(selected); - std::string selected_string = selected.ToUTF8().data(); -#ifdef __APPLE__ -#else - select_preset(selected_string); -#endif - } - }); - -// popup->Bind(wxEVT_KEY_DOWN, [popup](wxKeyEvent& evt) { popup->OnKeyEvent(evt); }); -// popup->Bind(wxEVT_KEY_UP, [popup](wxKeyEvent& evt) { popup->OnKeyEvent(evt); }); - - auto icons = new wxImageList(16, 16, true, 1); - popup->SetImageList(icons); - icons->Add(*new wxIcon(from_u8(Slic3r::var("flag-green-icon.png")), wxBITMAP_TYPE_PNG)); - icons->Add(*new wxIcon(from_u8(Slic3r::var("flag-red-icon.png")), wxBITMAP_TYPE_PNG)); - } -*/ auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); //buttons @@ -173,37 +154,6 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle) m_hsizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(m_hsizer, 1, wxEXPAND, 0); - -/* - - - //temporary left vertical sizer - m_left_sizer = new wxBoxSizer(wxVERTICAL); - m_hsizer->Add(m_left_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxBOTTOM, 3); - - // tree - m_presetctrl = new wxDataViewTreeCtrl(panel, wxID_ANY, wxDefaultPosition, wxSize(200, -1), wxDV_NO_HEADER); - m_left_sizer->Add(m_presetctrl, 1, wxEXPAND); - m_preset_icons = new wxImageList(16, 16, true, 1); - m_presetctrl->SetImageList(m_preset_icons); - m_preset_icons->Add(*new wxIcon(from_u8(Slic3r::var("flag-green-icon.png")), wxBITMAP_TYPE_PNG)); - m_preset_icons->Add(*new wxIcon(from_u8(Slic3r::var("flag-red-icon.png")), wxBITMAP_TYPE_PNG)); - - m_presetctrl->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, [this](wxCommandEvent& evt) - { - auto selected = m_presetctrl->GetItemText(m_presetctrl->GetSelection()); - if (selected != _(L("System presets")) && selected != _(L("Default presets"))) - { - std::string selected_string = selected.ToUTF8().data(); -#ifdef __APPLE__ -#else - select_preset(selected_string); -#endif - } - }); - -*/ - //left vertical sizer m_left_sizer = new wxBoxSizer(wxVERTICAL); m_hsizer->Add(m_left_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxBOTTOM, 3); @@ -279,7 +229,12 @@ PageShp Tab::add_options_page(const wxString& title, const std::string& icon, bo } } // Initialize the page. - PageShp page(new Page(this, title, icon_idx)); +#ifdef __WXOSX__ + auto panel = m_tmp_panel; +#else + auto panel = this; +#endif + PageShp page(new Page(panel, title, icon_idx)); page->SetScrollbars(1, 1, 1, 1); page->Hide(); m_hsizer->Add(page.get(), 1, wxEXPAND | wxLEFT, 5); @@ -290,6 +245,18 @@ PageShp Tab::add_options_page(const wxString& title, const std::string& icon, bo return page; } +void Tab::OnActivate() +{ +#ifdef __WXOSX__ + wxWindowUpdateLocker noUpdates(this); + + auto size = GetSizer()->GetSize(); + m_tmp_panel->GetSizer()->SetMinSize(size.x + m_size_move, size.y); + Fit(); + m_size_move *= -1; +#endif // __WXOSX__ +} + void Tab::update_labels_colour() { Freeze(); @@ -1266,6 +1233,7 @@ void TabPrint::OnActivate() { m_recommended_thin_wall_thickness_description_line->SetText( from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle))); + Tab::OnActivate(); } void TabFilament::build() @@ -1424,6 +1392,7 @@ void TabFilament::update() void TabFilament::OnActivate() { m_volumetric_speed_description_line->SetText(from_u8(PresetHints::maximum_volumetric_flow_description(*m_preset_bundle))); + Tab::OnActivate(); } wxSizer* Tab::description_line_widget(wxWindow* parent, ogStaticText* *StaticText) @@ -2638,14 +2607,24 @@ void SavePresetWindow::accept() if (!m_chosen_name.empty()) { const char* unusable_symbols = "<>:/\\|?*\""; bool is_unusable_symbol = false; + bool is_unusable_postfix = false; + const std::string unusable_postfix = "(modified)"; for (size_t i = 0; i < std::strlen(unusable_symbols); i++){ if (m_chosen_name.find_first_of(unusable_symbols[i]) != std::string::npos){ is_unusable_symbol = true; break; } } + if (m_chosen_name.find(unusable_postfix) != std::string::npos) + is_unusable_postfix = true; + if (is_unusable_symbol) { - show_error(this, _(L("The supplied name is not valid; the following characters are not allowed:"))+" <>:/\\|?*\""); + show_error(this,_(L("The supplied name is not valid;")) + "\n" + + _(L("the following characters are not allowed:")) + " <>:/\\|?*\""); + } + else if (is_unusable_postfix){ + show_error(this, _(L("The supplied name is not valid;")) + "\n" + + _(L("the following postfix are not allowed:")) + "\n\t" + unusable_postfix); } else if (m_chosen_name.compare("- default -") == 0) { show_error(this, _(L("The supplied name is not available."))); diff --git a/xs/src/slic3r/GUI/Tab.hpp b/xs/src/slic3r/GUI/Tab.hpp index d6bf2cf43..c755f91f1 100644 --- a/xs/src/slic3r/GUI/Tab.hpp +++ b/xs/src/slic3r/GUI/Tab.hpp @@ -102,6 +102,10 @@ using PageShp = std::shared_ptr; class Tab: public wxPanel { wxNotebook* m_parent; +#ifdef __WXOSX__ + wxPanel* m_tmp_panel; + int m_size_move = -1; +#endif // __WXOSX__ protected: std::string m_name; const wxString m_title; @@ -118,7 +122,6 @@ protected: wxButton* m_undo_btn; wxButton* m_undo_to_sys_btn; wxButton* m_question_btn; - wxComboCtrl* m_cc_presets_choice; wxDataViewTreeCtrl* m_presetctrl; wxImageList* m_preset_icons; @@ -198,7 +201,7 @@ public: Tab() {} Tab(wxNotebook* parent, const wxString& title, const char* name, bool no_controller) : m_parent(parent), m_title(title), m_name(name), m_no_controller(no_controller) { - Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL); + Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL, name); get_tabs_list().push_back(this); } ~Tab(){ @@ -242,7 +245,7 @@ public: PageShp add_options_page(const wxString& title, const std::string& icon, bool is_extruder_pages = false); - virtual void OnActivate(){} + virtual void OnActivate(); virtual void on_preset_loaded(){} virtual void build() = 0; virtual void update() = 0; diff --git a/xs/src/slic3r/Utils/Http.cpp b/xs/src/slic3r/Utils/Http.cpp index 47021d39f..37eb59a00 100644 --- a/xs/src/slic3r/Utils/Http.cpp +++ b/xs/src/slic3r/Utils/Http.cpp @@ -71,6 +71,7 @@ Http::priv::priv(const std::string &url) : form(nullptr), form_end(nullptr), headerlist(nullptr), + limit(0), cancel(false) { if (curl == nullptr) { @@ -201,7 +202,6 @@ std::string Http::priv::body_size_error() void Http::priv::http_perform() { - ::curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L); ::curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); ::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writecb); ::curl_easy_setopt(curl, CURLOPT_WRITEDATA, static_cast(this)); @@ -230,8 +230,6 @@ void Http::priv::http_perform() } CURLcode res = ::curl_easy_perform(curl); - long http_status = 0; - ::curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_status); if (res != CURLE_OK) { if (res == CURLE_ABORTED_BY_CALLBACK) { @@ -242,17 +240,22 @@ void Http::priv::http_perform() if (progressfn) { progressfn(dummyprogress, cancel); } } else { // The abort comes from the CURLOPT_READFUNCTION callback, which means reading file failed - if (errorfn) { errorfn(std::move(buffer), "Error reading file for file upload", http_status); } + if (errorfn) { errorfn(std::move(buffer), "Error reading file for file upload", 0); } } } else if (res == CURLE_WRITE_ERROR) { - if (errorfn) { errorfn(std::move(buffer), body_size_error(), http_status); } + if (errorfn) { errorfn(std::move(buffer), body_size_error(), 0); } } else { - if (errorfn) { errorfn(std::move(buffer), curl_error(res), http_status); } + if (errorfn) { errorfn(std::move(buffer), curl_error(res), 0); } }; } else { - if (completefn) { - completefn(std::move(buffer), http_status); + long http_status = 0; + ::curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_status); + + if (http_status >= 400) { + if (errorfn) { errorfn(std::move(buffer), std::string(), http_status); } + } else { + if (completefn) { completefn(std::move(buffer), http_status); } } } } diff --git a/xs/src/slic3r/Utils/Http.hpp b/xs/src/slic3r/Utils/Http.hpp index 73656bf88..ce4e438ca 100644 --- a/xs/src/slic3r/Utils/Http.hpp +++ b/xs/src/slic3r/Utils/Http.hpp @@ -29,7 +29,16 @@ public: typedef std::shared_ptr Ptr; typedef std::function CompleteFn; + + // A HTTP request may fail at various stages of completeness (URL parsing, DNS lookup, TCP connection, ...). + // If the HTTP request could not be made or failed before completion, the `error` arg contains a description + // of the error and `http_status` is zero. + // If the HTTP request was completed but the response HTTP code is >= 400, `error` is empty and `http_status` contains the response code. + // In either case there may or may not be a body. typedef std::function ErrorFn; + + // See the Progress struct above. + // Writing true to the `cancel` reference cancels the request in progress. typedef std::function ProgressFn; Http(Http &&other); @@ -46,7 +55,8 @@ public: Http& operator=(const Http &) = delete; Http& operator=(Http &&) = delete; - // Sets a maximum size of the data that can be received. The default is 5MB. + // Sets a maximum size of the data that can be received. + // A value of zero sets the default limit, which is is 5MB. Http& size_limit(size_t sizeLimit); // Sets a HTTP header field. Http& header(std::string name, const std::string &value); diff --git a/xs/src/slic3r/Utils/OctoPrint.cpp b/xs/src/slic3r/Utils/OctoPrint.cpp index 86049de16..97b4123d4 100644 --- a/xs/src/slic3r/Utils/OctoPrint.cpp +++ b/xs/src/slic3r/Utils/OctoPrint.cpp @@ -78,10 +78,10 @@ bool OctoPrint::test(wxString &msg) const auto http = Http::get(std::move(url)); set_auth(http); - http.on_error([&](std::string, std::string error, unsigned status) { - BOOST_LOG_TRIVIAL(error) << boost::format("Octoprint: Error getting version: %1% (HTTP %2%)") % error % status; + http.on_error([&](std::string body, std::string error, unsigned status) { + BOOST_LOG_TRIVIAL(error) << boost::format("Octoprint: Error getting version: %1%, HTTP %2%, body: `%3%`") % error % status % body; res = false; - msg = format_error(error, status); + msg = format_error(body, error, status); }) .on_complete([&](std::string body, unsigned) { BOOST_LOG_TRIVIAL(debug) << boost::format("Octoprint: Got version: %1%") % body; @@ -140,8 +140,8 @@ bool OctoPrint::send_gcode(const std::string &filename) const progress_dialog.Update(PROGRESS_RANGE); }) .on_error([&](std::string body, std::string error, unsigned status) { - BOOST_LOG_TRIVIAL(error) << boost::format("Octoprint: Error uploading file: %1% (HTTP %2%)") % error % status; - auto errormsg = wxString::Format("%s: %s", errortitle, format_error(error, status)); + BOOST_LOG_TRIVIAL(error) << boost::format("Octoprint: Error uploading file: %1%, HTTP %2%, body: `%3%`") % error % status % body; + auto errormsg = wxString::Format("%s: %s", errortitle, format_error(body, error, status)); GUI::show_error(&progress_dialog, std::move(errormsg)); res = false; }) @@ -183,15 +183,13 @@ std::string OctoPrint::make_url(const std::string &path) const } } -wxString OctoPrint::format_error(const std::string &error, unsigned status) +wxString OctoPrint::format_error(const std::string &body, const std::string &error, unsigned status) { - auto wxerror = wxString::FromUTF8(error.data()); - if (status != 0) { - return wxString::Format("HTTP %u: %s", status, - (status == 401 ? _(L("Invalid API key")) : wxerror)); + auto wxbody = wxString::FromUTF8(body.data()); + return wxString::Format("HTTP %u: %s", status, wxbody); } else { - return wxerror; + return wxString::FromUTF8(error.data()); } } diff --git a/xs/src/slic3r/Utils/OctoPrint.hpp b/xs/src/slic3r/Utils/OctoPrint.hpp index a8599faa9..1e2098ae3 100644 --- a/xs/src/slic3r/Utils/OctoPrint.hpp +++ b/xs/src/slic3r/Utils/OctoPrint.hpp @@ -26,7 +26,7 @@ private: void set_auth(Http &http) const; std::string make_url(const std::string &path) const; - static wxString format_error(const std::string &error, unsigned status); + static wxString format_error(const std::string &body, const std::string &error, unsigned status); }; diff --git a/xs/src/slic3r/Utils/PresetUpdater.cpp b/xs/src/slic3r/Utils/PresetUpdater.cpp index 8159a75e2..1ce814b89 100644 --- a/xs/src/slic3r/Utils/PresetUpdater.cpp +++ b/xs/src/slic3r/Utils/PresetUpdater.cpp @@ -537,15 +537,15 @@ bool PresetUpdater::config_update() const incompats_map.emplace(std::make_pair(std::move(vendor), std::move(restrictions))); } + p->had_config_update = true; // This needs to be done before a dialog is shown because of OnIdle() + CallAfter() in Perl + GUI::MsgDataIncompatible dlg(std::move(incompats_map)); const auto res = dlg.ShowModal(); if (res == wxID_REPLACE) { BOOST_LOG_TRIVIAL(info) << "User wants to re-configure..."; p->perform_updates(std::move(updates)); GUI::ConfigWizard wizard(nullptr, GUI::ConfigWizard::RR_DATA_INCOMPAT); - if (wizard.run(GUI::get_preset_bundle(), this)) { - p->had_config_update = true; - } else { + if (! wizard.run(GUI::get_preset_bundle(), this)) { return false; } } else { @@ -566,6 +566,8 @@ bool PresetUpdater::config_update() const updates_map.emplace(std::make_pair(std::move(vendor), std::move(ver_str))); } + p->had_config_update = true; // Ditto, see above + GUI::MsgUpdateConfig dlg(std::move(updates_map)); const auto res = dlg.ShowModal(); @@ -581,8 +583,6 @@ bool PresetUpdater::config_update() const } else { BOOST_LOG_TRIVIAL(info) << "User refused the update"; } - - p->had_config_update = true; } else { BOOST_LOG_TRIVIAL(info) << "No configuration updates available."; } diff --git a/xs/xsp/BoundingBox.xsp b/xs/xsp/BoundingBox.xsp index df8e6baea..ebeb17822 100644 --- a/xs/xsp/BoundingBox.xsp +++ b/xs/xsp/BoundingBox.xsp @@ -29,6 +29,10 @@ int x_max() %code{% RETVAL = THIS->max.x; %}; int y_min() %code{% RETVAL = THIS->min.y; %}; int y_max() %code{% RETVAL = THIS->max.y; %}; + void set_x_min(double val) %code{% THIS->min.x = val; %}; + void set_x_max(double val) %code{% THIS->max.x = val; %}; + void set_y_min(double val) %code{% THIS->min.y = val; %}; + void set_y_max(double val) %code{% THIS->max.y = val; %}; std::string serialize() %code{% char buf[2048]; sprintf(buf, "%ld,%ld;%ld,%ld", THIS->min.x, THIS->min.y, THIS->max.x, THIS->max.y); RETVAL = buf; %}; bool defined() %code{% RETVAL = THIS->defined; %}; diff --git a/xs/xsp/GCode.xsp b/xs/xsp/GCode.xsp index 36b43271c..c1856ccf7 100644 --- a/xs/xsp/GCode.xsp +++ b/xs/xsp/GCode.xsp @@ -31,7 +31,7 @@ try { THIS->do_export(print, path, preview_data); } catch (std::exception& e) { - croak(e.what()); + croak("%s\n", e.what()); } %}; diff --git a/xs/xsp/GUI_3DScene.xsp b/xs/xsp/GUI_3DScene.xsp index d46c06120..48bd30cd1 100644 --- a/xs/xsp/GUI_3DScene.xsp +++ b/xs/xsp/GUI_3DScene.xsp @@ -190,13 +190,6 @@ remove_all_canvases() CODE: _3DScene::remove_all_canvases(); -void -set_active(canvas, active) - SV *canvas; - bool active; - CODE: - _3DScene::set_active((wxGLCanvas*)wxPli_sv_2_object(aTHX_ canvas, "Wx::GLCanvas"), active); - void set_as_dirty(canvas) SV *canvas;