mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Fixed rotations, allow both dot and dash as decimal separators,
correctly report invalid numeric values for rotation.
This commit is contained in:
		
							parent
							
								
									1b3c651643
								
							
						
					
					
						commit
						1770d031b4
					
				
					 1 changed files with 21 additions and 14 deletions
				
			
		|  | @ -267,8 +267,8 @@ sub new { | |||
|         EVT_TOOL($self, TB_ARRANGE, sub { $self->arrange; }); | ||||
|         EVT_TOOL($self, TB_MORE, sub { $self->increase; }); | ||||
|         EVT_TOOL($self, TB_FEWER, sub { $self->decrease; }); | ||||
|         EVT_TOOL($self, TB_45CW, sub { $_[0]->rotate(-45) }); | ||||
|         EVT_TOOL($self, TB_45CCW, sub { $_[0]->rotate(45) }); | ||||
|         EVT_TOOL($self, TB_45CW, sub { $_[0]->rotate(-45, Z, 'relative') }); | ||||
|         EVT_TOOL($self, TB_45CCW, sub { $_[0]->rotate(45, Z, 'relative') }); | ||||
|         EVT_TOOL($self, TB_SCALE, sub { $self->changescale(undef); }); | ||||
|         EVT_TOOL($self, TB_SPLIT, sub { $self->split_object; }); | ||||
|         EVT_TOOL($self, TB_CUT, sub { $_[0]->object_cut_dialog }); | ||||
|  | @ -285,8 +285,8 @@ sub new { | |||
|         EVT_BUTTON($self, $self->{btn_arrange}, sub { $self->arrange; }); | ||||
|         EVT_BUTTON($self, $self->{btn_increase}, sub { $self->increase; }); | ||||
|         EVT_BUTTON($self, $self->{btn_decrease}, sub { $self->decrease; }); | ||||
|         EVT_BUTTON($self, $self->{btn_rotate45cw}, sub { $_[0]->rotate(-45) }); | ||||
|         EVT_BUTTON($self, $self->{btn_rotate45ccw}, sub { $_[0]->rotate(45) }); | ||||
|         EVT_BUTTON($self, $self->{btn_rotate45cw}, sub { $_[0]->rotate(-45, Z, 'relative') }); | ||||
|         EVT_BUTTON($self, $self->{btn_rotate45ccw}, sub { $_[0]->rotate(45, Z, 'relative') }); | ||||
|         EVT_BUTTON($self, $self->{btn_changescale}, sub { $self->changescale(undef); }); | ||||
|         EVT_BUTTON($self, $self->{btn_split}, sub { $self->split_object; }); | ||||
|         EVT_BUTTON($self, $self->{btn_cut}, sub { $_[0]->object_cut_dialog }); | ||||
|  | @ -881,10 +881,11 @@ sub set_number_of_copies { | |||
| 
 | ||||
| sub rotate { | ||||
|     my $self = shift; | ||||
|     my ($angle, $axis) = @_; | ||||
|      | ||||
|     # angle is in degrees | ||||
|     $axis //= Z; | ||||
|     my ($angle, $axis, $relative_key) = @_; | ||||
|     $relative_key //= 'absolute'; # relative or absolute coordinates | ||||
|     $axis //= Z; # angle is in degrees | ||||
| 
 | ||||
|     my $relative = $relative_key eq 'relative';     | ||||
|      | ||||
|     my ($obj_idx, $object) = $self->selected_object; | ||||
|     return if !defined $obj_idx; | ||||
|  | @ -899,16 +900,22 @@ sub rotate { | |||
|         my $axis_name = $axis == X ? 'X' : $axis == Y ? 'Y' : 'Z'; | ||||
|         my $default = $axis == Z ? rad2deg($model_instance->rotation) : 0; | ||||
|         # Wx::GetNumberFromUser() does not support decimal numbers | ||||
|         $angle = Wx::GetTextFromUser("Enter the rotation angle:", "Rotate around $axis_name axis", | ||||
|             $default, $self); | ||||
|         return if !$angle || $angle !~ /^-?\d*(?:\.\d*)?$/ || $angle == -1; | ||||
|         for (;;) { | ||||
|             $angle = Wx::GetTextFromUser("Enter the rotation angle:", "Rotate around $axis_name axis", $default, $self); | ||||
|             $angle =~ s/,/./; | ||||
|             # Validate a numeric value. | ||||
|             return if $angle eq ''; | ||||
|             last if ($angle =~ /^-?\d*(?:\.\d*)?$/); | ||||
|             Wx::MessageBox("Invalid rotation angle entered: $angle\nNot a numeric value.", "Slic3r Error", wxOK | wxICON_EXCLAMATION, $self); | ||||
|             $default = $angle; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     $self->stop_background_process; | ||||
|      | ||||
|     if ($axis == Z) { | ||||
|         my $new_angle = deg2rad($angle); | ||||
|         $_->set_rotation($new_angle) for @{ $model_object->instances }; | ||||
|         $_->set_rotation(($relative ? $_->rotation : 0.) + $new_angle) for @{ $model_object->instances }; | ||||
|         $object->transform_thumbnail($self->{model}, $obj_idx); | ||||
|     } else { | ||||
|         # rotation around X and Y needs to be performed on mesh | ||||
|  | @ -1981,10 +1988,10 @@ sub object_menu { | |||
|     }, undef, 'textfield.png'); | ||||
|     $menu->AppendSeparator(); | ||||
|     $frame->_append_menu_item($menu, "Rotate 45° clockwise", 'Rotate the selected object by 45° clockwise', sub { | ||||
|         $self->rotate(-45); | ||||
|         $self->rotate(-45, Z, 'relative'); | ||||
|     }, undef, 'arrow_rotate_clockwise.png'); | ||||
|     $frame->_append_menu_item($menu, "Rotate 45° counter-clockwise", 'Rotate the selected object by 45° counter-clockwise', sub { | ||||
|         $self->rotate(+45); | ||||
|         $self->rotate(+45, Z, 'relative'); | ||||
|     }, undef, 'arrow_rotate_anticlockwise.png'); | ||||
|      | ||||
|     my $rotateMenu = Wx::Menu->new; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bubnikv
						bubnikv