Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit d1f58cb

Browse files
committedDec 13, 2014
Objects can be selected in 3D preview now. Double click and right click work as well
1 parent b0aa126 commit d1f58cb

File tree

7 files changed

+190
-44
lines changed

7 files changed

+190
-44
lines changed
 

‎lib/Slic3r/GUI/Plater.pm

+39-23
Original file line numberDiff line numberDiff line change
@@ -68,27 +68,25 @@ sub new {
6868
# Initialize preview notebook
6969
$self->{preview_notebook} = Wx::Notebook->new($self, -1, wxDefaultPosition, [335,335], wxNB_BOTTOM);
7070

71-
# Initialize 2D preview canvas
72-
$self->{canvas} = Slic3r::GUI::Plater::2D->new($self->{preview_notebook}, wxDefaultSize, $self->{objects}, $self->{model}, $self->{config});
73-
$self->{preview_notebook}->AddPage($self->{canvas}, '2D');
74-
$self->{canvas}->on_select_object(sub {
71+
# Initialize handlers for canvases
72+
my $on_select_object = sub {
7573
my ($obj_idx) = @_;
7674
$self->select_object($obj_idx);
77-
});
78-
$self->{canvas}->on_double_click(sub {
75+
};
76+
my $on_double_click = sub {
7977
$self->object_settings_dialog if $self->selected_object;
80-
});
81-
$self->{canvas}->on_right_click(sub {
82-
my ($click_pos) = @_;
78+
};
79+
my $on_right_click = sub {
80+
my ($canvas, $click_pos) = @_;
8381

8482
my ($obj_idx, $object) = $self->selected_object;
8583
return if !defined $obj_idx;
8684

8785
my $menu = $self->object_menu;
88-
$self->{canvas}->PopupMenu($menu, $click_pos);
86+
$canvas->PopupMenu($menu, $click_pos);
8987
$menu->Destroy;
90-
});
91-
$self->{canvas}->on_instance_moved(sub {
88+
};
89+
my $on_instance_moved = sub {
9290
my ($obj_idx, $instance_idx) = @_;
9391

9492
$self->update;
@@ -100,12 +98,24 @@ sub new {
10098
} else {
10199
$self->resume_background_process;
102100
}
103-
});
101+
};
102+
103+
# Initialize 2D preview canvas
104+
$self->{canvas} = Slic3r::GUI::Plater::2D->new($self->{preview_notebook}, wxDefaultSize, $self->{objects}, $self->{model}, $self->{config});
105+
$self->{preview_notebook}->AddPage($self->{canvas}, '2D');
106+
$self->{canvas}->on_select_object($on_select_object);
107+
$self->{canvas}->on_double_click($on_double_click);
108+
$self->{canvas}->on_right_click(sub { $on_right_click->($self->{canvas}, @_); });
109+
$self->{canvas}->on_instance_moved($on_instance_moved);
104110

105111
# Initialize 3D preview and toolpaths preview
106112
if ($Slic3r::GUI::have_OpenGL) {
107113
$self->{canvas3D} = Slic3r::GUI::Plater::3D->new($self->{preview_notebook}, $self->{objects}, $self->{model}, $self->{config});
108114
$self->{preview_notebook}->AddPage($self->{canvas3D}, '3D');
115+
$self->{canvas3D}->set_on_select_object($on_select_object);
116+
$self->{canvas3D}->set_on_double_click($on_double_click);
117+
$self->{canvas3D}->set_on_right_click(sub { $on_right_click->($self->{canvas3D}, @_); });
118+
$self->{canvas3D}->set_on_instance_moved($on_instance_moved);
109119

110120
$self->{toolpaths2D} = Slic3r::GUI::Plater::2DToolpaths->new($self->{preview_notebook}, $self->{print});
111121
$self->{preview_notebook}->AddPage($self->{toolpaths2D}, 'Preview');
@@ -233,7 +243,7 @@ sub new {
233243
}
234244

235245
$_->SetDropTarget(Slic3r::GUI::Plater::DropTarget->new($self))
236-
for $self, $self->{canvas}, $self->{list};
246+
for grep defined($_), $self, $self->{canvas}, $self->{canvas3D}, $self->{list};
237247

238248
EVT_COMMAND($self, -1, $THUMBNAIL_DONE_EVENT, sub {
239249
my ($self, $event) = @_;
@@ -655,7 +665,7 @@ sub rotate {
655665

656666
$self->selection_changed; # refresh info (size etc.)
657667
$self->update;
658-
$self->{canvas}->Refresh;
668+
$self->refresh_canvases;
659669
}
660670

661671
sub flip {
@@ -684,7 +694,7 @@ sub flip {
684694

685695
$self->selection_changed; # refresh info (size etc.)
686696
$self->update;
687-
$self->{canvas}->Refresh;
697+
$self->refresh_canvases;
688698
}
689699

690700
sub changescale {
@@ -739,7 +749,7 @@ sub changescale {
739749

740750
$self->selection_changed(1); # refresh info (size, volume etc.)
741751
$self->update;
742-
$self->{canvas}->Refresh;
752+
$self->refresh_canvases;
743753
}
744754

745755
sub arrange {
@@ -765,7 +775,7 @@ sub arrange {
765775
} else {
766776
$self->resume_background_process;
767777
}
768-
$self->{canvas}->Refresh;
778+
$self->refresh_canvases;
769779
}
770780

771781
sub split_object {
@@ -1146,7 +1156,7 @@ sub on_thumbnail_made {
11461156

11471157
$self->{objects}[$obj_idx]->transform_thumbnail($self->{model}, $obj_idx);
11481158
$self->update;
1149-
$self->{canvas}->Refresh;
1159+
$self->refresh_canvases;
11501160
}
11511161

11521162
# this method gets called whenever print center is changed or the objects' bounding box changes
@@ -1158,8 +1168,7 @@ sub update {
11581168
$self->{model}->center_instances_around_point($self->bed_centerf);
11591169
}
11601170

1161-
$self->{canvas}->Refresh;
1162-
$self->{canvas3D}->update if $self->{canvas3D};
1171+
$self->refresh_canvases;
11631172
}
11641173

11651174
sub on_extruders_change {
@@ -1207,7 +1216,7 @@ sub list_item_deselected {
12071216

12081217
if ($self->{list}->GetFirstSelected == -1) {
12091218
$self->select_object(undef);
1210-
$self->{canvas}->Refresh;
1219+
$self->refresh_canvases;
12111220
}
12121221
}
12131222

@@ -1217,7 +1226,7 @@ sub list_item_selected {
12171226

12181227
my $obj_idx = $event->GetIndex;
12191228
$self->select_object($obj_idx);
1220-
$self->{canvas}->Refresh;
1229+
$self->refresh_canvases;
12211230
}
12221231

12231232
sub list_item_activated {
@@ -1385,6 +1394,13 @@ sub selected_object {
13851394
return ($obj_idx, $self->{objects}[$obj_idx]),
13861395
}
13871396

1397+
sub refresh_canvases {
1398+
my ($self) = @_;
1399+
1400+
$self->{canvas}->Refresh;
1401+
$self->{canvas3D}->update if $self->{canvas3D};
1402+
}
1403+
13881404
sub validate_config {
13891405
my $self = shift;
13901406

‎lib/Slic3r/GUI/Plater/2D.pm

+2-2
Original file line numberDiff line numberDiff line change
@@ -210,14 +210,14 @@ sub mouse_event {
210210
}
211211
}
212212
$self->Refresh;
213-
} elsif ($event->ButtonUp(&Wx::wxMOUSE_BTN_LEFT)) {
213+
} elsif ($event->LeftUp) {
214214
$self->{on_instance_moved}->(@{ $self->{drag_object} })
215215
if $self->{drag_object};
216216
$self->Refresh;
217217
$self->{drag_start_pos} = undef;
218218
$self->{drag_object} = undef;
219219
$self->SetCursor(wxSTANDARD_CURSOR);
220-
} elsif ($event->ButtonDClick) {
220+
} elsif ($event->LeftDClick) {
221221
$self->{on_double_click}->();
222222
} elsif ($event->Dragging) {
223223
return if !$self->{drag_start_pos}; # concurrency problems

‎lib/Slic3r/GUI/Plater/3D.pm

+46-5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ sub new {
1515
my ($parent, $objects, $model, $config) = @_;
1616

1717
my $self = $class->SUPER::new($parent);
18+
$self->enable_picking(1);
1819

1920
$self->{objects} = $objects;
2021
$self->{model} = $model;
@@ -24,23 +25,63 @@ sub new {
2425
$self->{on_right_click} = sub {};
2526
$self->{on_instance_moved} = sub {};
2627

27-
28-
2928
return $self;
3029
}
3130

31+
sub set_on_select_object {
32+
my ($self, $cb) = @_;
33+
$self->on_select_object(sub {
34+
my ($volume_idx) = @_;
35+
36+
return $cb->(undef) if $volume_idx == -1;
37+
my $obj_idx = $self->{_volumes_inv}{$volume_idx};
38+
return $cb->($obj_idx);
39+
});
40+
}
41+
42+
sub set_on_double_click {
43+
my ($self, $cb) = @_;
44+
$self->on_double_click($cb);
45+
}
46+
47+
sub set_on_right_click {
48+
my ($self, $cb) = @_;
49+
$self->on_right_click($cb);
50+
}
51+
52+
sub set_on_instance_moved {
53+
my ($self, $cb) = @_;
54+
$self->on_instance_moved(sub {
55+
my ($volume_idx, $instance_idx) = @_;
56+
57+
my $obj_idx = $self->{_volumes_inv}{$volume_idx};
58+
return $cb->($obj_idx, $instance_idx);
59+
});
60+
}
61+
3262
sub update {
3363
my ($self) = @_;
3464

65+
$self->{_volumes} = {}; # obj_idx => [ volume_idx, volume_idx ]
66+
$self->{_volumes_inv} = {}; # volume_idx => obj_idx
3567
$self->reset_objects;
3668
return if $self->{model}->objects_count == 0;
3769

3870
$self->set_bounding_box($self->{model}->bounding_box);
3971
$self->set_bed_shape($self->{config}->bed_shape);
4072

41-
foreach my $model_object (@{$self->{model}->objects}) {
42-
$self->load_object($model_object, 1);
73+
foreach my $obj_idx (0..$#{$self->{model}->objects}) {
74+
my $model_object = $self->{model}->get_object($obj_idx);
75+
my @volume_idxs = $self->load_object($model_object, 1);
76+
77+
# store mapping between canvas volumes and model objects
78+
$self->{_volumes}{$obj_idx} = [ @volume_idxs ];
79+
$self->{_volumes_inv}{$_} = $obj_idx for @volume_idxs;
80+
81+
if ($self->{objects}[$obj_idx]{selected}) {
82+
$self->select_volume($_) for @volume_idxs;
83+
}
4384
}
4485
}
4586

46-
1;
87+
1;
There was a problem loading the remainder of the diff.

0 commit comments

Comments
 (0)
Failed to load comments.