mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 12:41:20 -06:00 
			
		
		
		
	Fixed recent regression causing a spike when avoid_crossing_perimeters was used on split objects
This commit is contained in:
		
							parent
							
								
									da36df65a4
								
							
						
					
					
						commit
						655d528d92
					
				
					 4 changed files with 50 additions and 17 deletions
				
			
		|  | @ -719,11 +719,11 @@ sub make_model { | |||
|         $new_model_object->scale($plater_object->scale); | ||||
|         $new_model_object->add_instance( | ||||
|             rotation    => $plater_object->rotate,  # around center point | ||||
|             offset      => [ @$_ ], | ||||
|             offset      => Slic3r::Point->new($_), | ||||
|         ) for @{$plater_object->instances}; | ||||
|         $new_model_object->align_to_origin; | ||||
|     } | ||||
|      | ||||
|     $model->align_to_origin; | ||||
|     return $model; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -164,14 +164,19 @@ sub vertices { | |||
|     return [ map @{$_->vertices}, @{$self->objects} ]; | ||||
| } | ||||
| 
 | ||||
| sub used_vertices { | ||||
|     my $self = shift; | ||||
|     return [ map @{$_->used_vertices}, @{$self->objects} ]; | ||||
| } | ||||
| 
 | ||||
| sub size { | ||||
|     my $self = shift; | ||||
|     return [ Slic3r::Geometry::size_3D($self->vertices) ]; | ||||
|     return [ Slic3r::Geometry::size_3D($self->used_vertices) ]; | ||||
| } | ||||
| 
 | ||||
| sub extents { | ||||
|     my $self = shift; | ||||
|     return Slic3r::Geometry::bounding_box_3D($self->vertices); | ||||
|     return Slic3r::Geometry::bounding_box_3D($self->used_vertices); | ||||
| } | ||||
| 
 | ||||
| sub align_to_origin { | ||||
|  | @ -179,8 +184,17 @@ sub align_to_origin { | |||
|      | ||||
|     # calculate the displacements needed to  | ||||
|     # have lowest value for each axis at coordinate 0 | ||||
|     my @extents = $self->extents; | ||||
|     $self->move(map -$extents[$_][MIN], X,Y,Z); | ||||
|     { | ||||
|         my @extents = $self->extents; | ||||
|         $self->move(map -$extents[$_][MIN], X,Y,Z); | ||||
|     } | ||||
|      | ||||
|     # align all instances to 0,0 as well | ||||
|     { | ||||
|         my @instances = map @{$_->instances}, @{$self->objects}; | ||||
|         my @extents = Slic3r::Geometry::bounding_box_3D([ map $_->offset, @instances ]); | ||||
|         $_->offset->translate(-$extents[X][MIN], -$extents[Y][MIN]) for @instances; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| sub move { | ||||
|  | @ -260,7 +274,7 @@ package Slic3r::Model::Object; | |||
| use Moo; | ||||
| 
 | ||||
| use List::Util qw(first); | ||||
| use Slic3r::Geometry qw(X Y Z MIN move_points_3D); | ||||
| use Slic3r::Geometry qw(X Y Z MIN move_points move_points_3D); | ||||
| use Storable qw(dclone); | ||||
| 
 | ||||
| has 'input_file' => (is => 'rw'); | ||||
|  | @ -309,14 +323,19 @@ sub mesh { | |||
|     ); | ||||
| } | ||||
| 
 | ||||
| sub used_vertices { | ||||
|     my $self = shift; | ||||
|     return [ map $self->vertices->[$_], map @$_, map @{$_->facets}, @{$self->volumes} ]; | ||||
| } | ||||
| 
 | ||||
| sub size { | ||||
|     my $self = shift; | ||||
|     return [ Slic3r::Geometry::size_3D($self->vertices) ]; | ||||
|     return [ Slic3r::Geometry::size_3D($self->used_vertices) ]; | ||||
| } | ||||
| 
 | ||||
| sub extents { | ||||
|     my $self = shift; | ||||
|     return Slic3r::Geometry::bounding_box_3D($self->vertices); | ||||
|     return Slic3r::Geometry::bounding_box_3D($self->used_vertices); | ||||
| } | ||||
| 
 | ||||
| sub align_to_origin { | ||||
|  | @ -391,6 +410,6 @@ use Moo; | |||
| 
 | ||||
| has 'object'    => (is => 'ro', weak_ref => 1, required => 1); | ||||
| has 'rotation'  => (is => 'rw', default => sub { 0 });  # around mesh center point | ||||
| has 'offset'    => (is => 'rw'); | ||||
| has 'offset'    => (is => 'rw');  # must be Slic3r::Point object | ||||
| 
 | ||||
| 1; | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ use File::Spec; | |||
| use List::Util qw(max first); | ||||
| use Math::ConvexHull::MonotoneChain qw(convex_hull); | ||||
| use Slic3r::ExtrusionPath ':roles'; | ||||
| use Slic3r::Geometry qw(X Y Z X1 Y1 X2 Y2 MIN PI scale unscale move_points nearest_point); | ||||
| use Slic3r::Geometry qw(X Y Z X1 Y1 X2 Y2 MIN MAX PI scale unscale move_points nearest_point); | ||||
| use Slic3r::Geometry::Clipper qw(diff_ex union_ex union_pt intersection_ex offset | ||||
|     offset2 traverse_pt JT_ROUND JT_SQUARE PFT_EVENODD); | ||||
| use Time::HiRes qw(gettimeofday tv_interval); | ||||
|  | @ -116,8 +116,7 @@ sub add_model { | |||
|                 : $mesh; | ||||
|         } | ||||
|          | ||||
|         foreach my $mesh (@meshes) { | ||||
|             next unless $mesh; | ||||
|         foreach my $mesh (grep $_, @meshes) { | ||||
|             $mesh->check_manifoldness; | ||||
|              | ||||
|             # we ignore the per-instance rotation currently and only  | ||||
|  | @ -127,12 +126,22 @@ sub add_model { | |||
|             $mesh->scale(1 / &Slic3r::SCALING_FACTOR); | ||||
|         } | ||||
|          | ||||
|         # align the object to origin; not sure this is required by the toolpath generation | ||||
|         # algorithms, but it's good practice to avoid negative coordinates; it probably  | ||||
|         # provides also some better performance in infill generation | ||||
|         my @extents = Slic3r::Geometry::bounding_box_3D([ map @{$_->used_vertices}, grep $_, @meshes ]); | ||||
|         foreach my $mesh (grep $_, @meshes) { | ||||
|             $mesh->move(map -$extents[$_][MIN], X,Y,Z); | ||||
|         } | ||||
|          | ||||
|         # initialize print object | ||||
|         push @{$self->objects}, Slic3r::Print::Object->new( | ||||
|             print       => $self, | ||||
|             meshes      => [ @meshes ], | ||||
|             copies      => [ map [ scale $_->offset->[X], scale $_->offset->[Y] ], @{$object->instances} ], | ||||
|             size        => [ map scale $_, @{ $object->size } ], | ||||
|             copies      => [ | ||||
|                 map [ (scale $_->offset->[X]) + $extents[X][MIN], (scale $_->offset->[Y]) + $extents[Y][MIN] ], @{$object->instances}, | ||||
|             ], | ||||
|             size        => [ map $extents[$_][MAX] - $extents[$_][MIN], (X,Y,Z) ], | ||||
|             input_file  => $object->input_file, | ||||
|             layer_height_ranges => $object->layer_height_ranges, | ||||
|         ); | ||||
|  |  | |||
|  | @ -398,14 +398,19 @@ sub duplicate { | |||
|     $self->BUILD; | ||||
| } | ||||
| 
 | ||||
| sub used_vertices { | ||||
|     my $self = shift; | ||||
|     return [ map $self->vertices->[$_], map @$_, @{$self->facets} ]; | ||||
| } | ||||
| 
 | ||||
| sub extents { | ||||
|     my $self = shift; | ||||
|     return Slic3r::Geometry::bounding_box_3D($self->vertices); | ||||
|     return Slic3r::Geometry::bounding_box_3D($self->used_vertices); | ||||
| } | ||||
| 
 | ||||
| sub size { | ||||
|     my $self = shift; | ||||
|     return Slic3r::Geometry::size_3D($self->vertices); | ||||
|     return Slic3r::Geometry::size_3D($self->used_vertices); | ||||
| } | ||||
| 
 | ||||
| sub slice_facet { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci