mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 12:11:15 -06:00 
			
		
		
		
	Added manual projection control
This commit is contained in:
		
							parent
							
								
									2efc759a74
								
							
						
					
					
						commit
						0af289ed78
					
				
					 1 changed files with 85 additions and 22 deletions
				
			
		|  | @ -2,7 +2,7 @@ package Slic3r::GUI::Projector; | |||
| use strict; | ||||
| use warnings; | ||||
| use Wx qw(:dialog :id :misc :sizer :systemsettings :bitmap :button :icon wxTheApp); | ||||
| use Wx::Event qw(EVT_BUTTON EVT_TEXT_ENTER); | ||||
| use Wx::Event qw(EVT_BUTTON EVT_TEXT_ENTER EVT_SPINCTRL EVT_SLIDER); | ||||
| use base qw(Wx::Dialog Class::Accessor); | ||||
| 
 | ||||
| __PACKAGE__->mk_accessors(qw(config config2 screen controller)); | ||||
|  | @ -264,15 +264,15 @@ sub new { | |||
|     } | ||||
|      | ||||
|     { | ||||
|         my $buttons = Wx::BoxSizer->new(wxHORIZONTAL); | ||||
|         $sizer->Add($buttons, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10); | ||||
|         my $sizer1 = Wx::BoxSizer->new(wxHORIZONTAL); | ||||
|         $sizer->Add($sizer1, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10); | ||||
|          | ||||
|         { | ||||
|             my $btn = $self->{btn_manual_control} = Wx::Button->new($self, -1, 'Manual Control', wxDefaultPosition, wxDefaultSize); | ||||
|             if ($Slic3r::GUI::have_button_icons) { | ||||
|                 $btn->SetBitmap(Wx::Bitmap->new("$Slic3r::var/cog.png", wxBITMAP_TYPE_PNG)); | ||||
|             } | ||||
|             $buttons->Add($btn, 0); | ||||
|             $sizer1->Add($btn, 0); | ||||
|             EVT_BUTTON($self, $btn, sub { | ||||
|                 my $sender = Slic3r::GCode::Sender->new; | ||||
|                 my $res = $sender->connect( | ||||
|  | @ -296,7 +296,7 @@ sub new { | |||
|             if ($Slic3r::GUI::have_button_icons) { | ||||
|                 $btn->SetBitmap(Wx::Bitmap->new("$Slic3r::var/control_play.png", wxBITMAP_TYPE_PNG)); | ||||
|             } | ||||
|             $buttons->Add($btn, 0); | ||||
|             $sizer1->Add($btn, 0); | ||||
|             EVT_BUTTON($self, $btn, sub { | ||||
|                 $self->controller->start_print; | ||||
|                 $self->_update_buttons; | ||||
|  | @ -304,11 +304,11 @@ sub new { | |||
|             }); | ||||
|         } | ||||
|         { | ||||
|             my $btn = $self->{btn_stop} = Wx::Button->new($self, -1, 'Stop', wxDefaultPosition, wxDefaultSize); | ||||
|             my $btn = $self->{btn_stop} = Wx::Button->new($self, -1, 'Stop/Black', wxDefaultPosition, wxDefaultSize); | ||||
|             if ($Slic3r::GUI::have_button_icons) { | ||||
|                 $btn->SetBitmap(Wx::Bitmap->new("$Slic3r::var/control_stop.png", wxBITMAP_TYPE_PNG)); | ||||
|             } | ||||
|             $buttons->Add($btn, 0); | ||||
|             $sizer1->Add($btn, 0); | ||||
|             EVT_BUTTON($self, $btn, sub { | ||||
|                 $self->controller->stop_print; | ||||
|                 $self->_update_buttons; | ||||
|  | @ -316,8 +316,50 @@ sub new { | |||
|             }); | ||||
|         } | ||||
|          | ||||
|         $self->{status_text} = Wx::StaticText->new($self, -1, "", wxDefaultPosition, [200,-1]); | ||||
|         $buttons->Add($self->{status_text}, 0); | ||||
|         { | ||||
|             { | ||||
|                 my $text = Wx::StaticText->new($self, -1, "Layer:", wxDefaultPosition, wxDefaultSize); | ||||
|                 $text->SetFont($Slic3r::GUI::small_font); | ||||
|                 $sizer1->Add($text, 0, wxEXPAND | wxLEFT, 10); | ||||
|             } | ||||
|             { | ||||
|                 my $spin = $self->{layers_spinctrl} = Wx::SpinCtrl->new($self, -1, 0, wxDefaultPosition, [60,-1], | ||||
|                     0, 0, 300, 0); | ||||
|                 $sizer1->Add($spin, 0); | ||||
|                 EVT_SPINCTRL($self, $spin, sub { | ||||
|                     my $value = $spin->GetValue; | ||||
|                     $self->{layers_slider}->SetValue($value); | ||||
|                     $self->controller->project_layer($value); | ||||
|                     $self->_update_buttons; | ||||
|                 }); | ||||
|             } | ||||
|             { | ||||
|                 my $slider = $self->{layers_slider} = Wx::Slider->new( | ||||
|                     $self, -1, | ||||
|                     0,           # default | ||||
|                     0,           # min | ||||
|                     300,         # max | ||||
|                     wxDefaultPosition, | ||||
|                     wxDefaultSize, | ||||
|                 ); | ||||
|                 $sizer1->Add($slider, 1); | ||||
|                 EVT_SLIDER($self, $slider, sub { | ||||
|                     my $value = $slider->GetValue; | ||||
|                     $self->{layers_spinctrl}->SetValue($value); | ||||
|                     $self->controller->project_layer($value); | ||||
|                     $self->_update_buttons; | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         my $sizer2 = Wx::BoxSizer->new(wxHORIZONTAL); | ||||
|         $sizer->Add($sizer2, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10); | ||||
|          | ||||
|         { | ||||
|             $self->{status_text} = Wx::StaticText->new($self, -1, "", wxDefaultPosition, wxDefaultSize); | ||||
|             $self->{status_text}->SetFont($Slic3r::GUI::small_font); | ||||
|             $sizer2->Add($self->{status_text}, 1 | wxEXPAND); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     { | ||||
|  | @ -351,6 +393,8 @@ sub new { | |||
|         screen  => $self->screen, | ||||
|         on_project_layer => sub { | ||||
|             my ($layer_num) = @_; | ||||
|              | ||||
|             $self->{layers_spinctrl}->SetValue($layer_num); | ||||
|             $self->_set_status(sprintf "Printing layer %d/%d (z = %.2f)", | ||||
|                 $layer_num, $self->controller->layer_count, | ||||
|                 $self->controller->current_layer_height); | ||||
|  | @ -360,6 +404,7 @@ sub new { | |||
|             $self->_set_status(''); | ||||
|         }, | ||||
|     )); | ||||
|     #$self->{layers_spinctrl}->SetMax($self->controller->layer_count); | ||||
|      | ||||
|     $self->_update_buttons; | ||||
|      | ||||
|  | @ -370,9 +415,11 @@ sub _update_buttons { | |||
|     my ($self) = @_; | ||||
|      | ||||
|     my $is_printing = $self->controller->is_printing; | ||||
|     my $is_projecting = $self->controller->is_projecting; | ||||
|     $self->{btn_manual_control}->Show(!$is_printing); | ||||
|     $self->{btn_print}->Show(!$is_printing); | ||||
|     $self->{btn_stop}->Show($is_printing); | ||||
|     $self->{btn_print}->Show(!$is_printing && !$is_projecting); | ||||
|     $self->{btn_stop}->Show($is_printing || $is_projecting); | ||||
|     $self->{layers_spinctrl}->Enable(!$is_printing); | ||||
|     $self->Layout; | ||||
| } | ||||
| 
 | ||||
|  | @ -436,6 +483,7 @@ has 'on_project_layer'      => (is => 'rw'); | |||
| has 'on_print_completed'    => (is => 'rw'); | ||||
| has 'sender'                => (is => 'rw'); | ||||
| has 'timer'                 => (is => 'rw'); | ||||
| has 'is_printing'           => (is => 'rw', default => sub { 0 }); | ||||
| has '_print'                => (is => 'rw'); | ||||
| has '_layers'               => (is => 'rw'); | ||||
| has '_heights'              => (is => 'rw'); | ||||
|  | @ -464,12 +512,6 @@ sub delay { | |||
|     $self->timer->Start($wait * 1000, wxTIMER_ONE_SHOT); | ||||
| } | ||||
| 
 | ||||
| sub is_printing { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|     return $self->timer->IsRunning; | ||||
| } | ||||
| 
 | ||||
| sub set_print { | ||||
|     my ($self, $print) = @_; | ||||
|      | ||||
|  | @ -531,9 +573,11 @@ sub start_print { | |||
|             $self->config2->{z_lift}, $self->config2->{z_lift_speed}*60), 1); | ||||
|     } | ||||
|      | ||||
|     $self->is_printing(1); | ||||
|      | ||||
|     # TODO: block until the G1 command has been performed | ||||
|     # we could do this with M400 + M115 but maybe it's not portable | ||||
|     $self->delay(2, sub { | ||||
|     $self->delay(5, sub { | ||||
|         # start with black | ||||
|         Slic3r::debugf "starting black projection\n"; | ||||
|         $self->_layer_num(-1); | ||||
|  | @ -547,6 +591,7 @@ sub start_print { | |||
| sub stop_print { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|     $self->is_printing(0); | ||||
|     $self->timer->Stop; | ||||
|     $self->_timer_cb(undef); | ||||
|     $self->screen->project_layers(undef); | ||||
|  | @ -556,13 +601,32 @@ sub stop_print { | |||
|     $self->sender->disconnect if $self->sender; | ||||
| } | ||||
| 
 | ||||
| sub is_projecting { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|     return defined $self->screen->layers; | ||||
| } | ||||
| 
 | ||||
| sub project_layer { | ||||
|     my ($self, $layer_num) = @_; | ||||
|      | ||||
|     if (!defined $layer_num || $layer_num >= $self->layer_count) { | ||||
|         $self->screen->project_layers(undef); | ||||
|         return; | ||||
|     } | ||||
|      | ||||
|     my @layers = @{ $self->_layers->{ $self->_heights->[$layer_num] } }; | ||||
|     $self->screen->project_layers([ @layers ]); | ||||
| } | ||||
| 
 | ||||
| sub project_next_layer { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|     Slic3r::debugf "projecting next layer\n"; | ||||
|     $self->_layer_num($self->_layer_num + 1); | ||||
|     Slic3r::debugf "projecting layer %d\n", $self->_layer_num; | ||||
|     if ($self->_layer_num >= $self->layer_count) { | ||||
|         $self->on_print_completed->() if $self->on_print_completed; | ||||
|         $self->on_print_completed->() | ||||
|             if $self->is_printing && $self->on_print_completed; | ||||
|         return; | ||||
|     } | ||||
|      | ||||
|  | @ -580,8 +644,7 @@ sub project_next_layer { | |||
|     # TODO: we should block until G1 commands have been performed, see note below | ||||
|     # TODO: subtract this waiting time from the settle_time | ||||
|     $self->delay(2, sub { | ||||
|         my @layers = @{ $self->_layers->{ $self->_heights->[$self->_layer_num] } }; | ||||
|         $self->screen->project_layers([ @layers ]); | ||||
|         $self->project_layer($self->_layer_num); | ||||
|          | ||||
|         # get exposure time | ||||
|         my $time = $self->config2->{exposure_time}; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci