Select standard camera views (left / right / top / bottom / front / rear / default)
by menu.
This commit is contained in:
parent
5268574ade
commit
ee4b9ab82f
3 changed files with 79 additions and 0 deletions
|
@ -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) = @_;
|
||||
|
||||
|
|
|
@ -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) = @_;
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
Loading…
Add table
Reference in a new issue