mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Lay flat - rotation is now done in one go directly about the necessary axis
This commit is contained in:
		
							parent
							
								
									d197a5149a
								
							
						
					
					
						commit
						86b67bbd42
					
				
					 8 changed files with 62 additions and 27 deletions
				
			
		| 
						 | 
				
			
			@ -140,10 +140,16 @@ sub new {
 | 
			
		|||
    };
 | 
			
		||||
    
 | 
			
		||||
    # callback to react to gizmo rotate
 | 
			
		||||
    # omitting last three parameters means rotation around Z
 | 
			
		||||
    # otherwise they are the components of the rotation axis vector
 | 
			
		||||
    my $on_gizmo_rotate = sub {
 | 
			
		||||
        my ($angle_z, $angle_y) = @_;
 | 
			
		||||
        $self->rotate(rad2deg($angle_z), Z, 'absolute');
 | 
			
		||||
        $self->rotate(rad2deg($angle_y), Y, 'absolute') if $angle_y != 0;
 | 
			
		||||
        my ($angle, $axis_x, $axis_y, $axis_z) = @_;
 | 
			
		||||
	if (!defined $axis_x) {
 | 
			
		||||
            $self->rotate(rad2deg($angle), Z, 'absolute');
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            $self->rotate(rad2deg($angle), undef, 'absolute', $axis_x, $axis_y, $axis_z) if $angle != 0;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # callback to update object's geometry info while using gizmos
 | 
			
		||||
| 
						 | 
				
			
			@ -1031,28 +1037,40 @@ sub _get_number_from_user {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
sub rotate {
 | 
			
		||||
    my ($self, $angle, $axis, $relative_key) = @_;
 | 
			
		||||
    my ($self, $angle, $axis, $relative_key, $axis_x, $axis_y, $axis_z) = @_;
 | 
			
		||||
    $relative_key //= 'absolute'; # relative or absolute coordinates
 | 
			
		||||
    $axis //= Z; # angle is in degrees
 | 
			
		||||
 | 
			
		||||
    $axis_x //= 0;
 | 
			
		||||
    $axis_y //= 0;
 | 
			
		||||
    $axis_z //= 0;
 | 
			
		||||
    my $relative = $relative_key eq 'relative';    
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my ($obj_idx, $object) = $self->selected_object;
 | 
			
		||||
    return if !defined $obj_idx;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    my $model_object = $self->{model}->objects->[$obj_idx];
 | 
			
		||||
    my $model_instance = $model_object->instances->[0];
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    if (!defined $angle) {
 | 
			
		||||
        my $axis_name = $axis == X ? 'X' : $axis == Y ? 'Y' : 'Z';
 | 
			
		||||
        my $default = $axis == Z ? rad2deg($model_instance->rotation) : 0;
 | 
			
		||||
        $angle = $self->_get_number_from_user(L("Enter the rotation angle:"), L("Rotate around ").$axis_name.(" axis"), L("Invalid rotation angle entered"), $default);
 | 
			
		||||
        return if $angle eq '';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # Let's calculate vector of rotation axis (if we don't have it already)
 | 
			
		||||
    # The minus is there so that the direction is the same as was established
 | 
			
		||||
    if (defined $axis) {
 | 
			
		||||
        if ($axis == X) {
 | 
			
		||||
            $axis_x = -1;
 | 
			
		||||
        }
 | 
			
		||||
        if ($axis == Y) {
 | 
			
		||||
            $axis_y = -1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    $self->stop_background_process;
 | 
			
		||||
    
 | 
			
		||||
    if ($axis == Z) {
 | 
			
		||||
    if (defined $axis && $axis == Z) {
 | 
			
		||||
        my $new_angle = deg2rad($angle);
 | 
			
		||||
        foreach my $inst (@{ $model_object->instances }) {
 | 
			
		||||
            my $rotation = ($relative ? $inst->rotation : 0.) + $new_angle;
 | 
			
		||||
| 
						 | 
				
			
			@ -1067,13 +1085,15 @@ sub rotate {
 | 
			
		|||
        }
 | 
			
		||||
#        $object->transform_thumbnail($self->{model}, $obj_idx);
 | 
			
		||||
    } else {
 | 
			
		||||
        # rotation around X and Y needs to be performed on mesh
 | 
			
		||||
        # so we first apply any Z rotation
 | 
			
		||||
        if ($model_instance->rotation != 0) {
 | 
			
		||||
            $model_object->rotate($model_instance->rotation, Z);
 | 
			
		||||
            $_->set_rotation(0) for @{ $model_object->instances };
 | 
			
		||||
        if (defined $axis) {
 | 
			
		||||
            # rotation around X and Y needs to be performed on mesh
 | 
			
		||||
            # so we first apply any Z rotation
 | 
			
		||||
            if ($model_instance->rotation != 0) {
 | 
			
		||||
                $model_object->rotate($model_instance->rotation, Slic3r::Pointf3->new(0, 0, -1));
 | 
			
		||||
                $_->set_rotation(0) for @{ $model_object->instances };
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        $model_object->rotate(deg2rad($angle), $axis);
 | 
			
		||||
        $model_object->rotate(deg2rad($angle), Slic3r::Pointf3->new($axis_x, $axis_y, $axis_z));
 | 
			
		||||
        
 | 
			
		||||
#        # realign object to Z = 0
 | 
			
		||||
#        $model_object->center_around_origin;
 | 
			
		||||
| 
						 | 
				
			
			@ -1099,7 +1119,7 @@ sub mirror {
 | 
			
		|||
    
 | 
			
		||||
    # apply Z rotation before mirroring
 | 
			
		||||
    if ($model_instance->rotation != 0) {
 | 
			
		||||
        $model_object->rotate($model_instance->rotation, Z);
 | 
			
		||||
        $model_object->rotate($model_instance->rotation, Slic3r::Pointf3->new(0, 0, 1));
 | 
			
		||||
        $_->set_rotation(0) for @{ $model_object->instances };
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
| 
						 | 
				
			
			@ -1146,7 +1166,7 @@ sub changescale {
 | 
			
		|||
        
 | 
			
		||||
        # apply Z rotation before scaling
 | 
			
		||||
        if ($model_instance->rotation != 0) {
 | 
			
		||||
            $model_object->rotate($model_instance->rotation, Z);
 | 
			
		||||
            $model_object->rotate($model_instance->rotation, Slic3r::Pointf3->new(0, 0, 1));
 | 
			
		||||
            $_->set_rotation(0) for @{ $model_object->instances };
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue