From 50b52367a2ca70dc2119efffbf0ce1f34308e39c Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci <aar@cpan.org> Date: Sat, 5 Dec 2015 19:37:57 +0100 Subject: [PATCH] New "Scale to size" command(s). #2711 --- lib/Slic3r/GUI/Plater.pm | 47 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 8afc185fa..ec9ea2e14 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -822,7 +822,7 @@ sub mirror { } sub changescale { - my ($self, $axis) = @_; + my ($self, $axis, $tosize) = @_; my ($obj_idx, $object) = $self->selected_object; return if !defined $obj_idx; @@ -833,9 +833,22 @@ sub changescale { # we need thumbnail to be computed before allowing scaling return if !$object->thumbnail; + my $object_size = $model_object->bounding_box->size; + my $bed_size = Slic3r::Polygon->new_scale(@{$self->{config}->bed_shape})->bounding_box->size; + if (defined $axis) { my $axis_name = $axis == X ? 'X' : $axis == Y ? 'Y' : 'Z'; - my $scale = Wx::GetNumberFromUser("", "Enter the scale % for the selected object:", "Scale along $axis_name", 100, 0, 100000, $self); + my $scale; + if ($tosize) { + my $cursize = $object_size->[$axis]; + my $newsize = Wx::GetNumberFromUser("", "Enter the new size for the selected object:", "Scale along $axis_name", + $cursize, 0, $bed_size->[$axis], $self); + return if !$newsize || $newsize < 0; + $scale = $newsize / $cursize * 100; + } else { + $scale = Wx::GetNumberFromUser("", "Enter the scale % for the selected object:", "Scale along $axis_name", + 100, 0, 100000, $self); + } return if !$scale || $scale < 0; # apply Z rotation before scaling @@ -850,8 +863,18 @@ sub changescale { # object was already aligned to Z = 0, so no need to realign it $self->make_thumbnail($obj_idx); } else { - # max scale factor should be above 2540 to allow importing files exported in inches - my $scale = Wx::GetNumberFromUser("", "Enter the scale % for the selected object:", 'Scale', $model_instance->scaling_factor*100, 0, 100000, $self); + my $scale; + if ($tosize) { + my $cursize = max(@$object_size); + my $newsize = Wx::GetNumberFromUser("", "Enter the new max size for the selected object:", "Scale", + $cursize, 0, max(@$bed_size), $self); + return if !$newsize || $newsize < 0; + $scale = $newsize / $cursize * 100; + } else { + # max scale factor should be above 2540 to allow importing files exported in inches + $scale = Wx::GetNumberFromUser("", "Enter the scale % for the selected object:", 'Scale', + $model_instance->scaling_factor*100, 0, 100000, $self); + } return if !$scale || $scale < 0; $self->{list}->SetItem($obj_idx, 2, "$scale%"); @@ -1755,6 +1778,22 @@ sub object_menu { $self->changescale(Z); }, undef, 'bullet_blue.png'); + my $scaleToSizeMenu = Wx::Menu->new; + my $scaleToSizeMenuItem = $menu->AppendSubMenu($scaleToSizeMenu, "Scale to size", 'Scale the selected object along a single axis'); + $frame->_set_menu_item_icon($scaleToSizeMenuItem, 'arrow_out.png'); + $frame->_append_menu_item($scaleToSizeMenu, "Uniformly…", 'Scale the selected object along the XYZ axes', sub { + $self->changescale(undef, 1); + }); + $frame->_append_menu_item($scaleToSizeMenu, "Along X axis…", 'Scale the selected object along the X axis', sub { + $self->changescale(X, 1); + }, undef, 'bullet_red.png'); + $frame->_append_menu_item($scaleToSizeMenu, "Along Y axis…", 'Scale the selected object along the Y axis', sub { + $self->changescale(Y, 1); + }, undef, 'bullet_green.png'); + $frame->_append_menu_item($scaleToSizeMenu, "Along Z axis…", 'Scale the selected object along the Z axis', sub { + $self->changescale(Z, 1); + }, undef, 'bullet_blue.png'); + $frame->_append_menu_item($menu, "Split", 'Split the selected object into individual parts', sub { $self->split_object; }, undef, 'shape_ungroup.png');