mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-11-02 20:51:23 -07:00
3D object positioning
This commit is contained in:
parent
a82f95e903
commit
fcfb3b98bc
16 changed files with 217 additions and 91 deletions
|
|
@ -213,7 +213,6 @@ sub mouse_event {
|
|||
} elsif ($event->LeftUp) {
|
||||
$self->{on_instance_moved}->(@{ $self->{drag_object} })
|
||||
if $self->{drag_object};
|
||||
$self->Refresh;
|
||||
$self->{drag_start_pos} = undef;
|
||||
$self->{drag_object} = undef;
|
||||
$self->SetCursor(wxSTANDARD_CURSOR);
|
||||
|
|
|
|||
|
|
@ -16,11 +16,13 @@ sub new {
|
|||
|
||||
my $self = $class->SUPER::new($parent);
|
||||
$self->enable_picking(1);
|
||||
$self->enable_moving(1);
|
||||
|
||||
$self->{objects} = $objects;
|
||||
$self->{model} = $model;
|
||||
$self->{config} = $config;
|
||||
$self->{on_select_object} = sub {};
|
||||
$self->{on_instance_moved} = sub {};
|
||||
|
||||
$self->on_select(sub {
|
||||
my ($volume_idx) = @_;
|
||||
|
|
@ -40,6 +42,21 @@ sub new {
|
|||
my $obj_idx = $self->{_volumes_inv}{$volume_idx};
|
||||
$self->volumes->[$_]->hover(1) for @{$self->{_volumes}{$obj_idx}};
|
||||
});
|
||||
$self->on_move(sub {
|
||||
my ($volume_idx) = @_;
|
||||
|
||||
my $volume = $self->volumes->[$volume_idx];
|
||||
my $obj_idx = $self->{_volumes_inv}{$volume_idx};
|
||||
my $model_object = $self->{model}->get_object($obj_idx);
|
||||
$model_object
|
||||
->instances->[$volume->instance_idx]
|
||||
->offset
|
||||
->translate($volume->origin->x, $volume->origin->y); #))
|
||||
$model_object->invalidate_bounding_box;
|
||||
|
||||
$self->{on_instance_moved}->($obj_idx, $volume->instance_idx)
|
||||
if $self->{on_instance_moved};
|
||||
});
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
|
@ -61,12 +78,7 @@ sub set_on_right_click {
|
|||
|
||||
sub set_on_instance_moved {
|
||||
my ($self, $cb) = @_;
|
||||
$self->on_instance_moved(sub {
|
||||
my ($volume_idx, $instance_idx) = @_;
|
||||
|
||||
my $obj_idx = $self->{_volumes_inv}{$volume_idx};
|
||||
return $cb->($obj_idx, $instance_idx);
|
||||
});
|
||||
$self->{on_instance_moved} = $cb;
|
||||
}
|
||||
|
||||
sub update {
|
||||
|
|
@ -75,10 +87,8 @@ sub update {
|
|||
$self->{_volumes} = {}; # obj_idx => [ volume_idx, volume_idx ]
|
||||
$self->{_volumes_inv} = {}; # volume_idx => obj_idx
|
||||
$self->reset_objects;
|
||||
return if $self->{model}->objects_count == 0;
|
||||
|
||||
$self->set_bounding_box($self->{model}->bounding_box);
|
||||
$self->set_bed_shape($self->{config}->bed_shape);
|
||||
$self->update_bed_size;
|
||||
|
||||
foreach my $obj_idx (0..$#{$self->{model}->objects}) {
|
||||
my $model_object = $self->{model}->get_object($obj_idx);
|
||||
|
|
@ -94,4 +104,9 @@ sub update {
|
|||
}
|
||||
}
|
||||
|
||||
sub update_bed_size {
|
||||
my ($self) = @_;
|
||||
$self->set_bed_shape($self->{config}->bed_shape);
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
@ -88,10 +88,10 @@ sub new {
|
|||
if ($Slic3r::GUI::have_OpenGL) {
|
||||
$canvas = $self->{canvas} = Slic3r::GUI::PreviewCanvas->new($self);
|
||||
$canvas->load_object($self->{model_object});
|
||||
$canvas->set_bounding_box($self->{model_object}->bounding_box);
|
||||
$canvas->set_auto_bed_shape;
|
||||
$canvas->SetSize([500,500]);
|
||||
$canvas->SetMinSize($canvas->GetSize);
|
||||
$canvas->zoom_to_volumes;
|
||||
}
|
||||
|
||||
$self->{sizer} = Wx::BoxSizer->new(wxHORIZONTAL);
|
||||
|
|
|
|||
|
|
@ -70,9 +70,9 @@ sub new {
|
|||
if ($Slic3r::GUI::have_OpenGL) {
|
||||
$canvas = $self->{canvas} = Slic3r::GUI::PreviewCanvas->new($self);
|
||||
$canvas->load_object($self->{model_object});
|
||||
$canvas->set_bounding_box($self->{model_object}->bounding_box);
|
||||
$canvas->set_auto_bed_shape;
|
||||
$canvas->SetSize([500,500]);
|
||||
$canvas->zoom_to_volumes;
|
||||
}
|
||||
|
||||
$self->{sizer} = Wx::BoxSizer->new(wxHORIZONTAL);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue