From ee4b9ab82f1c11cfd08c9748f43a9d11764b7214 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 5 Oct 2016 14:13:07 +0200 Subject: [PATCH] Select standard camera views (left / right / top / bottom / front / rear / default) by menu. --- lib/Slic3r/GUI/3DScene.pm | 44 +++++++++++++++++++++++++++++++++++++ lib/Slic3r/GUI/MainFrame.pm | 21 ++++++++++++++++++ lib/Slic3r/GUI/Plater.pm | 14 ++++++++++++ 3 files changed, 79 insertions(+) diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index d6ee6103b9..d72679b3e4 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -73,6 +73,15 @@ use constant SELECTED_COLOR => [0,1,0,1]; # For mesh selection: Mouse hovers over the object, but object not selected yet - dark green. use constant HOVER_COLOR => [0.4,0.9,0,1]; +# phi / theta angles to orient the camera. +use constant VIEW_DEFAULT => [45.0,45.0]; +use constant VIEW_LEFT => [90.0,90.0]; +use constant VIEW_RIGHT => [-90.0,90.0]; +use constant VIEW_TOP => [0.0,0.0]; +use constant VIEW_BOTTOM => [0.0,180.0]; +use constant VIEW_FRONT => [0.0,90.0]; +use constant VIEW_REAR => [180.0,90.0]; + # make OpenGL::Array thread-safe { no warnings 'redefine'; @@ -321,6 +330,41 @@ sub set_viewport_from_scene { $self->_dirty(1); } +# Set the camera to a default orientation, +# zoom to volumes. +sub select_view { + my ($self, $direction) = @_; + my $dirvec; + if (ref($direction)) { + $dirvec = $direction; + } else { + if ($direction eq 'default') { + $dirvec = VIEW_DEFAULT; + } elsif ($direction eq 'left') { + $dirvec = VIEW_LEFT; + } elsif ($direction eq 'right') { + $dirvec = VIEW_RIGHT; + } elsif ($direction eq 'top') { + $dirvec = VIEW_TOP; + } elsif ($direction eq 'bottom') { + $dirvec = VIEW_BOTTOM; + } elsif ($direction eq 'front') { + $dirvec = VIEW_FRONT; + } elsif ($direction eq 'rear') { + $dirvec = VIEW_REAR; + } + } + $self->_sphi($dirvec->[0]); + $self->_stheta($dirvec->[1]); + # Avoid gimball lock. + $self->_stheta(150) if $self->_stheta > 150; + $self->_stheta(0) if $self->_stheta < 0; + # View everything. + $self->zoom_to_volumes; + $self->on_viewport_changed->() if $self->on_viewport_changed; + $self->Refresh; +} + sub zoom_to_bounding_box { my ($self, $bb) = @_; diff --git a/lib/Slic3r/GUI/MainFrame.pm b/lib/Slic3r/GUI/MainFrame.pm index 24368fe633..6a367b8073 100644 --- a/lib/Slic3r/GUI/MainFrame.pm +++ b/lib/Slic3r/GUI/MainFrame.pm @@ -274,6 +274,18 @@ sub _init_menubar { $self->select_tab($tab_offset+2); }, undef, 'printer_empty.png'); } + + # View menu + if (!$self->{no_plater}) { + $self->{viewMenu} = Wx::Menu->new; + $self->_append_menu_item($self->{viewMenu}, "Default", 'Default View', sub { $self->select_view('default'); }); + $self->_append_menu_item($self->{viewMenu}, "Top" , 'Top View' , sub { $self->select_view('top' ); }); + $self->_append_menu_item($self->{viewMenu}, "Bottom" , 'Bottom View' , sub { $self->select_view('bottom' ); }); + $self->_append_menu_item($self->{viewMenu}, "Front" , 'Front View' , sub { $self->select_view('front' ); }); + $self->_append_menu_item($self->{viewMenu}, "Rear" , 'Rear View' , sub { $self->select_view('rear' ); }); + $self->_append_menu_item($self->{viewMenu}, "Left" , 'Left View' , sub { $self->select_view('left' ); }); + $self->_append_menu_item($self->{viewMenu}, "Right" , 'Right View' , sub { $self->select_view('right' ); }); + } # Help menu my $helpMenu = Wx::Menu->new; @@ -307,6 +319,7 @@ sub _init_menubar { $menubar->Append($self->{plater_menu}, "&Plater") if $self->{plater_menu}; $menubar->Append($self->{object_menu}, "&Object") if $self->{object_menu}; $menubar->Append($windowMenu, "&Window"); + $menubar->Append($self->{viewMenu}, "&View") if $self->{viewMenu}; $menubar->Append($helpMenu, "&Help"); $self->SetMenuBar($menubar); } @@ -775,6 +788,14 @@ sub select_tab { $self->{tabpanel}->SetSelection($tab); } +# Set a camera direction, zoom to all objects. +sub select_view { + my ($self, $direction) = @_; + if (! $self->{no_plater}) { + $self->{plater}->select_view($direction); + } +} + sub _append_menu_item { my ($self, $menu, $string, $description, $cb, $id, $icon) = @_; diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 55e6f03c8e..dcc26c5e78 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -1827,6 +1827,20 @@ sub object_menu { return $menu; } +# Set a camera direction, zoom to all objects. +sub select_view { + my ($self, $direction) = @_; + my $idx_page = $self->{preview_notebook}->GetSelection; + my $page = ($idx_page == &Wx::wxNOT_FOUND) ? '3D' : $self->{preview_notebook}->GetPageText($idx_page); + if ($page eq 'Preview') { + $self->{preview3D}->canvas->select_view($direction); + $self->{canvas3D}->set_viewport_from_scene($self->{preview3D}->canvas); + } else { + $self->{canvas3D}->select_view($direction); + $self->{preview3D}->canvas->set_viewport_from_scene($self->{canvas3D}); + } +} + package Slic3r::GUI::Plater::DropTarget; use Wx::DND; use base 'Wx::FileDropTarget';