mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Merge branch 'master' into sender
Conflicts: Build.PL lib/Slic3r/GUI/MainFrame.pm
This commit is contained in:
		
						commit
						13b7316807
					
				
					 74 changed files with 1260 additions and 553 deletions
				
			
		| 
						 | 
				
			
			@ -196,6 +196,7 @@ sub export {
 | 
			
		|||
                if ($finished_objects > 0) {
 | 
			
		||||
                    $gcodegen->set_origin(Slic3r::Pointf->new(map unscale $copy->[$_], X,Y));
 | 
			
		||||
                    $gcodegen->enable_cooling_markers(0);  # we're not filtering these moves through CoolingBuffer
 | 
			
		||||
                    $gcodegen->avoid_crossing_perimeters->use_external_mp_once(1);
 | 
			
		||||
                    print $fh $gcodegen->retract;
 | 
			
		||||
                    print $fh $gcodegen->travel_to(
 | 
			
		||||
                        Slic3r::Point->new(0,0),
 | 
			
		||||
| 
						 | 
				
			
			@ -203,6 +204,9 @@ sub export {
 | 
			
		|||
                        'move to origin position for next object',
 | 
			
		||||
                    );
 | 
			
		||||
                    $gcodegen->enable_cooling_markers(1);
 | 
			
		||||
                    
 | 
			
		||||
                    # disable motion planner when traveling to first object point
 | 
			
		||||
                    $gcodegen->avoid_crossing_perimeters->disable_once(1);
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                my @layers = sort { $a->print_z <=> $b->print_z } @{$object->layers}, @{$object->support_layers};
 | 
			
		||||
| 
						 | 
				
			
			@ -305,8 +309,8 @@ sub process_layer {
 | 
			
		|||
            ($layer->id > 0 || $self->print->config->brim_width == 0)
 | 
			
		||||
                && ($layer->id >= $self->print->config->skirt_height && !$self->print->has_infinite_skirt)
 | 
			
		||||
                && !defined(first { $_->config->bottom_solid_layers > $layer->id } @{$layer->regions})
 | 
			
		||||
                && !defined(first { @{$_->perimeters} > 1 } @{$layer->regions})
 | 
			
		||||
                && !defined(first { @{$_->fills} > 0 } @{$layer->regions})
 | 
			
		||||
                && !defined(first { $_->perimeters->items_count > 1 } @{$layer->regions})
 | 
			
		||||
                && !defined(first { $_->fills->items_count > 0 } @{$layer->regions})
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
| 
						 | 
				
			
			@ -326,19 +330,20 @@ sub process_layer {
 | 
			
		|||
    
 | 
			
		||||
    # set new layer - this will change Z and force a retraction if retract_layer_change is enabled
 | 
			
		||||
    $gcode .= $self->_gcodegen->placeholder_parser->process($self->print->config->before_layer_gcode, {
 | 
			
		||||
        layer_num => $layer->id,
 | 
			
		||||
        layer_num => $self->_gcodegen->layer_index + 1,
 | 
			
		||||
        layer_z   => $layer->print_z,
 | 
			
		||||
    }) . "\n" if $self->print->config->before_layer_gcode;
 | 
			
		||||
    $gcode .= $self->_gcodegen->change_layer($layer);
 | 
			
		||||
    $gcode .= $self->_gcodegen->change_layer($layer);  # this will increase $self->_gcodegen->layer_index
 | 
			
		||||
    $gcode .= $self->_gcodegen->placeholder_parser->process($self->print->config->layer_gcode, {
 | 
			
		||||
        layer_num => $layer->id,
 | 
			
		||||
        layer_num => $self->_gcodegen->layer_index,
 | 
			
		||||
        layer_z   => $layer->print_z,
 | 
			
		||||
    }) . "\n" if $self->print->config->layer_gcode;
 | 
			
		||||
    
 | 
			
		||||
    # extrude skirt
 | 
			
		||||
    # extrude skirt along raft layers and normal object layers
 | 
			
		||||
    # (not along interlaced support material layers)
 | 
			
		||||
    if (((values %{$self->_skirt_done}) < $self->print->config->skirt_height || $self->print->has_infinite_skirt)
 | 
			
		||||
        && !$self->_skirt_done->{$layer->print_z}
 | 
			
		||||
        && !$layer->isa('Slic3r::Layer::Support')) {
 | 
			
		||||
        && (!$layer->isa('Slic3r::Layer::Support') || $layer->id < $object->config->raft_layers)) {
 | 
			
		||||
        $self->_gcodegen->set_origin(Slic3r::Pointf->new(0,0));
 | 
			
		||||
        $self->_gcodegen->avoid_crossing_perimeters->use_external_mp(1);
 | 
			
		||||
        my @extruder_ids = map { $_->id } @{$self->_gcodegen->writer->extruders};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,16 +57,36 @@ sub slice {
 | 
			
		|||
            # plus the extra distance required by the support material logic
 | 
			
		||||
            my $first_layer_height = $self->config->get_value('first_layer_height');
 | 
			
		||||
            $print_z += $first_layer_height;
 | 
			
		||||
            $print_z += $self->config->layer_height * ($self->config->raft_layers - 1);
 | 
			
		||||
            
 | 
			
		||||
            # use a large height
 | 
			
		||||
            my $support_material_layer_height;
 | 
			
		||||
            {
 | 
			
		||||
                my @nozzle_diameters = (
 | 
			
		||||
                    map $self->print->config->get_at('nozzle_diameter', $_),
 | 
			
		||||
                        $self->config->support_material_extruder,
 | 
			
		||||
                        $self->config->support_material_interface_extruder,
 | 
			
		||||
                );
 | 
			
		||||
                $support_material_layer_height = 0.75 * min(@nozzle_diameters);
 | 
			
		||||
            }
 | 
			
		||||
            $print_z += $support_material_layer_height * ($self->config->raft_layers - 1);
 | 
			
		||||
        
 | 
			
		||||
            # at this stage we don't know which nozzles are actually used for the first layer
 | 
			
		||||
            # so we compute the average of all of them
 | 
			
		||||
            my $nozzle_diameter = sum(@{$self->print->config->nozzle_diameter})/@{$self->print->config->nozzle_diameter};
 | 
			
		||||
            my $distance = $self->_support_material->contact_distance($first_layer_height, $nozzle_diameter);
 | 
			
		||||
            # compute the average of all nozzles used for printing the object
 | 
			
		||||
            my $nozzle_diameter;
 | 
			
		||||
            {
 | 
			
		||||
                my @nozzle_diameters = (
 | 
			
		||||
                    map $self->print->config->get_at('nozzle_diameter', $_), @{$self->print->object_extruders}
 | 
			
		||||
                );
 | 
			
		||||
                $nozzle_diameter = sum(@nozzle_diameters)/@nozzle_diameters;
 | 
			
		||||
            }
 | 
			
		||||
            my $distance = $self->_support_material->contact_distance($self->config->layer_height, $nozzle_diameter);
 | 
			
		||||
        
 | 
			
		||||
            # force first layer print_z according to the contact distance
 | 
			
		||||
            # (the loop below will raise print_z by such height)
 | 
			
		||||
            $first_object_layer_height = $nozzle_diameter;
 | 
			
		||||
            if ($self->config->support_material_contact_distance == 0) {
 | 
			
		||||
                $first_object_layer_height = $distance;
 | 
			
		||||
            } else {
 | 
			
		||||
                $first_object_layer_height = $nozzle_diameter;
 | 
			
		||||
            }
 | 
			
		||||
            $first_object_layer_distance = $distance;
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue