mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	support_material_synchronize_layers implementation
This commit is contained in:
		
							parent
							
								
									556204fddc
								
							
						
					
					
						commit
						38cb2842ac
					
				
					 2 changed files with 38 additions and 26 deletions
				
			
		|  | @ -45,6 +45,7 @@ sub generate { | |||
|     # We now know the upper and lower boundaries for our support material object | ||||
|     # (@$contact_z and @$top_z), so we can generate intermediate layers. | ||||
|     my $support_z = $self->support_layers_z( | ||||
|         $object, | ||||
|         [ sort keys %$contact ], | ||||
|         [ sort keys %$top ], | ||||
|         max(map $_->height, @{$object->layers}) | ||||
|  | @ -384,7 +385,7 @@ sub object_top { | |||
| } | ||||
| 
 | ||||
| sub support_layers_z { | ||||
|     my ($self, $contact_z, $top_z, $max_object_layer_height) = @_; | ||||
|     my ($self, $object, $contact_z, $top_z, $max_object_layer_height) = @_; | ||||
|      | ||||
|     # quick table to check whether a given Z is a top surface | ||||
|     my %top = map { $_ => 1 } @$top_z; | ||||
|  | @ -397,13 +398,18 @@ sub support_layers_z { | |||
|     my $contact_distance = $self->contact_distance($support_material_height, $nozzle_diameter); | ||||
|      | ||||
|     # initialize known, fixed, support layers | ||||
|     my @z = sort { $a <=> $b } | ||||
|         @$contact_z, | ||||
|         # TODO: why we have this? | ||||
|         # Vojtech: To detect the bottom interface layers by finding a Z value in the $top_z. | ||||
|         @$top_z, | ||||
|         # Top surfaces of the bottom interface layers. | ||||
|         (map $_ + $contact_distance, @$top_z); | ||||
|     my @z = @$contact_z; | ||||
|     my $synchronize = $self->object_config->support_material_synchronize_layers; | ||||
|     if (! $synchronize) { | ||||
|         push @z,  | ||||
|             # TODO: why we have this? | ||||
|             # Vojtech: To detect the bottom interface layers by finding a Z value in the $top_z. | ||||
|             @$top_z; | ||||
|         push @z, | ||||
|             # Top surfaces of the bottom interface layers. | ||||
|             (map $_ + $contact_distance, @$top_z); | ||||
|     } | ||||
|     @z = sort { $a <=> $b } @z; | ||||
|      | ||||
|     # enforce first layer height | ||||
|     my $first_layer_height = $self->object_config->get_value('first_layer_height'); | ||||
|  | @ -423,23 +429,29 @@ sub support_layers_z { | |||
|             1..($self->object_config->raft_layers - 2); | ||||
|     } | ||||
|      | ||||
|     # create other layers (skip raft layers as they're already done and use thicker layers) | ||||
|     for (my $i = $#z; $i >= $self->object_config->raft_layers; $i--) { | ||||
|         my $target_height = $support_material_height; | ||||
|         if ($i > 0 && $top{ $z[$i-1] }) { | ||||
|             # Bridge flow? | ||||
|             #FIXME We want to enforce not only the bridge flow height, but also the interface gap! | ||||
|             # This will introduce an additional layer if the gap is set to an extreme value! | ||||
|             $target_height = $nozzle_diameter; | ||||
|         } | ||||
|          | ||||
|         # enforce first layer height | ||||
|         #FIXME better to split the layers regularly, than to bite a constant height one at a time,  | ||||
|         # and then be left with a very thin layer at the end. | ||||
|         if (($i == 0 && $z[$i] > $target_height + $first_layer_height) | ||||
|             || ($z[$i] - $z[$i-1] > $target_height + Slic3r::Geometry::epsilon)) { | ||||
|             splice @z, $i, 0, ($z[$i] - $target_height); | ||||
|             $i++; | ||||
|     if ($synchronize) { | ||||
|         @z = splice @z, $self->object_config->raft_layers; | ||||
| #            if ($self->object_config->raft_layers > scalar(@z)); | ||||
|         push @z, map $_->print_z, @{$object->layers}; | ||||
|     } else { | ||||
|         # create other layers (skip raft layers as they're already done and use thicker layers) | ||||
|         for (my $i = $#z; $i >= $self->object_config->raft_layers; $i--) { | ||||
|             my $target_height = $support_material_height; | ||||
|             if ($i > 0 && $top{ $z[$i-1] }) { | ||||
|                 # Bridge flow? | ||||
|                 #FIXME We want to enforce not only the bridge flow height, but also the interface gap! | ||||
|                 # This will introduce an additional layer if the gap is set to an extreme value! | ||||
|                 $target_height = $nozzle_diameter; | ||||
|             } | ||||
|              | ||||
|             # enforce first layer height | ||||
|             #FIXME better to split the layers regularly, than to bite a constant height one at a time,  | ||||
|             # and then be left with a very thin layer at the end. | ||||
|             if (($i == 0 && $z[$i] > $target_height + $first_layer_height) | ||||
|                 || ($z[$i] - $z[$i-1] > $target_height + Slic3r::Geometry::epsilon)) { | ||||
|                 splice @z, $i, 0, ($z[$i] - $target_height); | ||||
|                 $i++; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|      | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bubnikv
						bubnikv