diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index 0bef735e3c..6c0c726efe 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -910,7 +910,10 @@ sub UseVBOs { if (! defined ($self->{use_VBOs})) { # This is a special path for wxWidgets on GTK, where an OpenGL context is initialized # first when an OpenGL widget is shown for the first time. How ugly. - return 0 if (! $self->init && $^O eq 'linux'); + # It seems like the wipe tower configuration fills in the VBOs before the window is created. + # Therefore it is safer to wait for the first screen refresh on Windows and OSX as well. +# return 0 if (! $self->init && $^O eq 'linux'); + return 0 if (! $self->init); # Don't use VBOs if anything fails. $self->{use_VBOs} = 0; if ($self->GetContext) { diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 9c75f99aea..5d3fe25bad 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -107,6 +107,13 @@ sub new { $self->{canvas3D}->set_on_double_click($on_double_click); $self->{canvas3D}->set_on_right_click(sub { $on_right_click->($self->{canvas3D}, @_); }); $self->{canvas3D}->set_on_instances_moved($on_instances_moved); + $self->{canvas3D}->set_on_wipe_tower_moved(sub { + my ($new_pos_3f) = @_; + my $cfg = Slic3r::Config->new; + $cfg->set('wipe_tower_x', $new_pos_3f->x); + $cfg->set('wipe_tower_y', $new_pos_3f->y); + $self->GetFrame->{options_tabs}{print}->load_config($cfg); + }); $self->{canvas3D}->set_on_model_update(sub { if ($Slic3r::GUI::Settings->{_}{background_processing}) { $self->{apply_config_timer}->Stop if defined $self->{apply_config_timer}; @@ -1713,8 +1720,7 @@ sub on_config_change { $self->{preview3D}->set_bed_shape($self->{config}->bed_shape) if $self->{preview3D}; $update_scheduled = 1; - } elsif ($opt_key =~ '^wipe_tower' || $opt_key == 'single_extruder_multi_material') { - #$self->{canvas3D}->reload_scene if $self->{canvas3D}; + } elsif ($opt_key =~ '^wipe_tower' || $opt_key eq 'single_extruder_multi_material') { $update_scheduled = 1; } elsif ($opt_key eq 'serial_port') { if ($config->get('serial_port')) { diff --git a/lib/Slic3r/GUI/Plater/3D.pm b/lib/Slic3r/GUI/Plater/3D.pm index 40bfb99352..c5f5d962f0 100644 --- a/lib/Slic3r/GUI/Plater/3D.pm +++ b/lib/Slic3r/GUI/Plater/3D.pm @@ -26,6 +26,7 @@ sub new { $self->{config} = $config; $self->{on_select_object} = sub {}; $self->{on_instances_moved} = sub {}; + $self->{on_wipe_tower_moved} = sub {}; $self->on_select(sub { my ($volume_idx) = @_; @@ -36,6 +37,8 @@ sub new { my @volume_idxs = @_; my %done = (); # prevent moving instances twice + my $object_moved; + my $wipe_tower_moved; foreach my $volume_idx (@volume_idxs) { my $volume = $self->volumes->[$volume_idx]; my $obj_idx = $volume->object_idx; @@ -50,13 +53,17 @@ sub new { ->offset ->translate($volume->origin->x, $volume->origin->y); #)) $model_object->invalidate_bounding_box; + $object_moved = 1; } elsif ($obj_idx == 1000) { # Move a wipe tower proxy. + $wipe_tower_moved = $volume->origin; } } $self->{on_instances_moved}->() - if $self->{on_instances_moved}; + if $object_moved && $self->{on_instances_moved}; + $self->{on_wipe_tower_moved}->($wipe_tower_moved) + if $wipe_tower_moved && $self->{on_wipe_tower_moved}; }); return $self; @@ -82,6 +89,11 @@ sub set_on_instances_moved { $self->{on_instances_moved} = $cb; } +sub set_on_wipe_tower_moved { + my ($self, $cb) = @_; + $self->{on_wipe_tower_moved} = $cb; +} + sub set_on_model_update { my ($self, $cb) = @_; $self->on_model_update($cb); @@ -90,14 +102,6 @@ sub set_on_model_update { sub reload_scene { my ($self) = @_; - if (0) { - my $i = 1; - print STDERR "3D::reload_scene - Stack Trace:\n"; - while ( (my @call_details = (caller($i++))) ){ - print STDERR $call_details[1].":".$call_details[2]." in function ".$call_details[3]."\n"; - } - } - $self->reset_objects; $self->update_bed_size; @@ -107,10 +111,6 @@ sub reload_scene { $self->select_volume($_) for @volume_idxs; } } - if (0) { - print "Config: $self->{config}\n"; - $self->{config}->save('d:\temp\cfg.ini'); - } if (defined $self->{config}->nozzle_diameter) { # Should the wipe tower be visualized? my $extruders_count = scalar @{ $self->{config}->nozzle_diameter }; diff --git a/lib/Slic3r/GUI/Tab.pm b/lib/Slic3r/GUI/Tab.pm index 9953887231..3652fb74e6 100644 --- a/lib/Slic3r/GUI/Tab.pm +++ b/lib/Slic3r/GUI/Tab.pm @@ -390,13 +390,17 @@ sub update_tree { sub update_dirty { my $self = shift; + my $list_updated; foreach my $i ($self->{default_suppressed}..$#{$self->{presets}}) { my $preset = $self->get_preset($i); - $self->{presets_choice}->SetString( - $i - $self->{default_suppressed}, - ($i == $self->current_preset && $self->is_dirty) ? $preset->name . " (modified)" : $preset->name); + my $label = ($i == $self->current_preset && $self->is_dirty) ? $preset->name . " (modified)" : $preset->name; + my $idx = $i - $self->{default_suppressed}; + if ($self->{presets_choice}->GetString($idx) ne $label) { + $self->{presets_choice}->SetString($idx, $label); + $list_updated = 1; + } } - $self->{presets_choice}->SetSelection($self->current_preset - $self->{default_suppressed}); # http://trac.wxwidgets.org/ticket/13769 + $self->{presets_choice}->SetSelection($self->current_preset - $self->{default_suppressed}) if ($list_updated); # http://trac.wxwidgets.org/ticket/13769 $self->_on_presets_changed; } @@ -473,11 +477,13 @@ sub load_config { foreach my $opt_key (@{$self->{config}->diff($config)}) { $self->{config}->set($opt_key, $config->get($opt_key)); $keys_modified{$opt_key} = 1; - $self->update_dirty; } - # Initialize UI components with the config values. - $self->reload_config; - $self->_update(\%keys_modified); + if (keys(%keys_modified)) { + $self->update_dirty; + # Initialize UI components with the config values. + $self->reload_config; + $self->_update(\%keys_modified); + } } sub get_preset_config { @@ -1444,8 +1450,11 @@ sub _extruders_count_changed { $self->_on_value_change('extruders_count', $extruders_count); } -sub _extruder_options { qw(nozzle_diameter min_layer_height max_layer_height extruder_offset retract_length retract_lift retract_lift_above retract_lift_below retract_speed deretract_speed retract_before_wipe retract_restart_extra retract_before_travel wipe - retract_layer_change retract_length_toolchange retract_restart_extra_toolchange) } +sub _extruder_options { + qw(nozzle_diameter min_layer_height max_layer_height extruder_offset + retract_length retract_lift retract_lift_above retract_lift_below retract_speed deretract_speed + retract_before_wipe retract_restart_extra retract_before_travel wipe + retract_layer_change retract_length_toolchange retract_restart_extra_toolchange) } sub _build_extruder_pages { my $self = shift; diff --git a/slic3r.pl b/slic3r.pl index 060f69016e..a6eee48819 100755 --- a/slic3r.pl +++ b/slic3r.pl @@ -442,6 +442,7 @@ $j Retraction options: --retract-length Length of retraction in mm when pausing extrusion (default: $config->{retract_length}[0]) --retract-speed Speed for retraction in mm/s (default: $config->{retract_speed}[0]) + --deretract-speed Speed for deretraction (loading of filament after a retract) in mm/s (default: $config->{retract_speed}[0]) --retract-restart-extra Additional amount of filament in mm to push after compensating retraction (default: $config->{retract_restart_extra}[0])