mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Bugfix: when using low layer heights and support material, the contact regions were generated with a negative height. #1013
This commit is contained in:
		
							parent
							
								
									3eedd4bbed
								
							
						
					
					
						commit
						504962712b
					
				
					 3 changed files with 42 additions and 18 deletions
				
			
		|  | @ -64,7 +64,16 @@ sub support_material_contact_height { | |||
|      | ||||
|     # TODO: check what upper region applies instead of considering the first one | ||||
|     my $upper_layer = $self->object->layers->[ $self->id + 1 ] // $self; | ||||
|     return 2*$self->height - $upper_layer->regions->[0]->infill_flow->bridge_width; | ||||
|     my $h = ($self->height + $upper_layer->height) - $upper_layer->regions->[0]->infill_flow->bridge_width; | ||||
|      | ||||
|     # If layer height is less than half the bridge width then we'll get a negative height for contact area. | ||||
|     # The optimal solution would be to skip some layers during support material generation, but for now | ||||
|     # we'll apply a (dirty) workaround that should still work. | ||||
|     if ($h <= 0) { | ||||
|         $h = $self->height; | ||||
|     } | ||||
|      | ||||
|     return $h; | ||||
| } | ||||
| 
 | ||||
| # Z used for printing support material contact in scaled coordinates | ||||
|  |  | |||
|  | @ -15,30 +15,34 @@ my %cuboids = ( | |||
|     '2x20x10'   => [2, 20,10], | ||||
| ); | ||||
| 
 | ||||
| sub init_print { | ||||
|     my ($model_name, %params) = @_; | ||||
| sub model { | ||||
|     my ($model_name) = @_; | ||||
|      | ||||
|     my ($vertices, $facets); | ||||
|     if ($cuboids{$model_name}) { | ||||
|         my ($x, $y, $z) = @{ $cuboids{$model_name} }; | ||||
|         $vertices = [ | ||||
|             [$x,$y,0], [$x,0,0], [0,0,0], [0,$y,0], [$x,$y,$z], [0,$y,$z], [0,0,$z], [$x,0,$z], | ||||
|         ]; | ||||
|         $facets = [ | ||||
|             [0,1,2], [0,2,3], [4,5,6], [4,6,7], [0,4,7], [0,7,1], [1,7,6], [1,6,2], [2,6,5], [2,5,3], [4,0,3], [4,3,5], | ||||
|         ], | ||||
|     } | ||||
|      | ||||
|     my $model = Slic3r::Model->new; | ||||
|     { | ||||
|         my ($vertices, $facets); | ||||
|         if ($cuboids{$model_name}) { | ||||
|             my ($x, $y, $z) = @{ $cuboids{$model_name} }; | ||||
|             $vertices = [ | ||||
|                 [$x,$y,0], [$x,0,0], [0,0,0], [0,$y,0], [$x,$y,$z], [0,$y,$z], [0,0,$z], [$x,0,$z], | ||||
|             ]; | ||||
|             $facets = [ | ||||
|                 [0,1,2], [0,2,3], [4,5,6], [4,6,7], [0,4,7], [0,7,1], [1,7,6], [1,6,2], [2,6,5], [2,5,3], [4,0,3], [4,3,5], | ||||
|             ], | ||||
|         } | ||||
|         $model->add_object(vertices => $vertices)->add_volume(facets => $facets); | ||||
|     } | ||||
|     $model->add_object(vertices => $vertices)->add_volume(facets => $facets); | ||||
|     return $model; | ||||
| } | ||||
| 
 | ||||
| sub init_print { | ||||
|     my ($model_name, %params) = @_; | ||||
|      | ||||
|     my $config = Slic3r::Config->new_from_defaults; | ||||
|     $config->apply($params{config}) if $params{config}; | ||||
|     $config->set('gcode_comments', 1) if $ENV{SLIC3R_TESTS_GCODE}; | ||||
|      | ||||
|     my $print = Slic3r::Print->new(config => $config); | ||||
|     $print->add_model($model); | ||||
|     $print->add_model(model($model_name)); | ||||
|     $print->validate; | ||||
|      | ||||
|     return $print; | ||||
|  |  | |||
							
								
								
									
										13
									
								
								t/layers.t
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								t/layers.t
									
										
									
									
									
								
							|  | @ -1,4 +1,4 @@ | |||
| use Test::More tests => 4; | ||||
| use Test::More tests => 5; | ||||
| use strict; | ||||
| use warnings; | ||||
| 
 | ||||
|  | @ -55,4 +55,15 @@ ok $test->(), "positive Z offset"; | |||
| $config->set('z_offset', -0.8); | ||||
| ok $test->(), "negative Z offset"; | ||||
| 
 | ||||
| { | ||||
|     my $config = Slic3r::Config->new_from_defaults; | ||||
|     $config->set('nozzle_diameter', [0.35]); | ||||
|     $config->set('layer_height', 0.1333); | ||||
|      | ||||
|     my $print = Slic3r::Test::init_print('2x20x10', config => $config); | ||||
|     $print->init_extruders; | ||||
|     $_->region(0) for @{$print->objects->[0]->layers};  # init layer regions | ||||
|     ok $print->objects->[0]->layers->[1]->support_material_contact_height > 0, 'support_material_contact_height is positive'; | ||||
| } | ||||
| 
 | ||||
| __END__ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci