mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Merge remote-tracking branch 'remotes/origin/scene_manipulators'
This commit is contained in:
		
						commit
						306d77559e
					
				
					 11 changed files with 112 additions and 90 deletions
				
			
		| 
						 | 
				
			
			@ -1401,7 +1401,7 @@ sub Render {
 | 
			
		|||
        if ($self->enable_picking) {
 | 
			
		||||
            $self->mark_volumes_for_layer_height;
 | 
			
		||||
            $self->volumes->set_print_box($self->bed_bounding_box->x_min, $self->bed_bounding_box->y_min, 0.0, $self->bed_bounding_box->x_max, $self->bed_bounding_box->y_max, $self->{config}->get('max_print_height'));
 | 
			
		||||
            $self->volumes->update_outside_state($self->{config}, 0);
 | 
			
		||||
            $self->volumes->check_outside_state($self->{config});
 | 
			
		||||
            # do not cull backfaces to show broken geometry, if any
 | 
			
		||||
            glDisable(GL_CULL_FACE);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -2192,10 +2192,8 @@ sub reset_legend_texture {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
sub get_current_print_zs {
 | 
			
		||||
    my ($self) = @_;
 | 
			
		||||
    
 | 
			
		||||
    my $count = $self->volumes->get_current_print_zs();
 | 
			
		||||
    return $count;
 | 
			
		||||
    my ($self, $active_only) = @_;
 | 
			
		||||
    return $self->volumes->get_current_print_zs($active_only);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1973,7 +1973,7 @@ sub object_list_changed {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    my $export_in_progress = $self->{export_gcode_output_file} || $self->{send_gcode_file};
 | 
			
		||||
    my $model_fits = $self->{model}->fits_print_volume($self->{config});
 | 
			
		||||
    my $model_fits = $self->{canvas3D} ? $self->{canvas3D}->volumes->check_outside_state($self->{config}) : 1;
 | 
			
		||||
    my $method = ($have_objects && ! $export_in_progress && $model_fits) ? 'Enable' : 'Disable';
 | 
			
		||||
    $self->{"btn_$_"}->$method
 | 
			
		||||
        for grep $self->{"btn_$_"}, qw(reslice export_gcode print send_gcode);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -237,13 +237,14 @@ sub reload_scene {
 | 
			
		|||
    # checks for geometry outside the print volume to render it accordingly
 | 
			
		||||
    if (scalar @{$self->volumes} > 0)
 | 
			
		||||
    {
 | 
			
		||||
        if (!$self->{model}->fits_print_volume($self->{config})) {
 | 
			
		||||
        my $contained = $self->volumes->check_outside_state($self->{config});
 | 
			
		||||
        if (!$contained) {
 | 
			
		||||
            $self->set_warning_enabled(1);
 | 
			
		||||
            Slic3r::GUI::_3DScene::generate_warning_texture(L("Detected object outside print volume"));
 | 
			
		||||
            $self->on_enable_action_buttons->(0) if ($self->on_enable_action_buttons);
 | 
			
		||||
        } else {
 | 
			
		||||
            $self->set_warning_enabled(0);
 | 
			
		||||
            $self->volumes->update_outside_state($self->{config}, 1);
 | 
			
		||||
            $self->volumes->reset_outside_state();
 | 
			
		||||
            Slic3r::GUI::_3DScene::reset_warning_texture();
 | 
			
		||||
            $self->on_enable_action_buttons->(scalar @{$self->{model}->objects} > 0) if ($self->on_enable_action_buttons);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -328,22 +328,12 @@ sub load_print {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    if ($n_layers == 0) {
 | 
			
		||||
        $self->enabled(0);
 | 
			
		||||
        $self->set_z_range(0,0);
 | 
			
		||||
        $self->slider_low->Hide;
 | 
			
		||||
        $self->slider_high->Hide;
 | 
			
		||||
        $self->{z_label_low}->SetLabel("");
 | 
			
		||||
        $self->{z_label_high}->SetLabel("");
 | 
			
		||||
        $self->{z_label_low_idx}->SetLabel("");
 | 
			
		||||
        $self->{z_label_high_idx}->SetLabel("");
 | 
			
		||||
        $self->reset_sliders;
 | 
			
		||||
        $self->canvas->reset_legend_texture();
 | 
			
		||||
        $self->canvas->Refresh;  # clears canvas
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    # used to set the sliders to the extremes of the current zs range
 | 
			
		||||
    $self->{force_sliders_full_range} = 0;
 | 
			
		||||
    
 | 
			
		||||
    if ($self->{preferred_color_mode} eq 'tool_or_feature') {
 | 
			
		||||
        # It is left to Slic3r to decide whether the print shall be colored by the tool or by the feature.
 | 
			
		||||
        # Color by feature if it is a single extruder print.
 | 
			
		||||
| 
						 | 
				
			
			@ -369,6 +359,9 @@ sub load_print {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    if ($self->IsShown) {
 | 
			
		||||
        # used to set the sliders to the extremes of the current zs range
 | 
			
		||||
        $self->{force_sliders_full_range} = 0;
 | 
			
		||||
 | 
			
		||||
        if ($self->gcode_preview_data->empty) {
 | 
			
		||||
            # load skirt and brim
 | 
			
		||||
            $self->canvas->load_print_toolpaths($self->print, \@colors);
 | 
			
		||||
| 
						 | 
				
			
			@ -387,15 +380,32 @@ sub load_print {
 | 
			
		|||
            $self->show_hide_ui_elements('full');
 | 
			
		||||
 | 
			
		||||
            # recalculates zs and update sliders accordingly
 | 
			
		||||
            $self->{layers_z} = $self->canvas->get_current_print_zs();
 | 
			
		||||
            $self->{layers_z} = $self->canvas->get_current_print_zs(1);
 | 
			
		||||
            $n_layers = scalar(@{$self->{layers_z}});            
 | 
			
		||||
        }
 | 
			
		||||
            if ($n_layers == 0) {
 | 
			
		||||
                # all layers filtered out
 | 
			
		||||
                $self->reset_sliders;
 | 
			
		||||
                $self->canvas->Refresh;  # clears canvas
 | 
			
		||||
            }
 | 
			
		||||
       }
 | 
			
		||||
 | 
			
		||||
        $self->update_sliders($n_layers);
 | 
			
		||||
        $self->update_sliders($n_layers) if ($n_layers > 0);
 | 
			
		||||
        $self->_loaded(1);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub reset_sliders {
 | 
			
		||||
    my ($self) = @_;
 | 
			
		||||
    $self->enabled(0);
 | 
			
		||||
    $self->set_z_range(0,0);
 | 
			
		||||
    $self->slider_low->Hide;
 | 
			
		||||
    $self->slider_high->Hide;
 | 
			
		||||
    $self->{z_label_low}->SetLabel("");
 | 
			
		||||
    $self->{z_label_high}->SetLabel("");
 | 
			
		||||
    $self->{z_label_low_idx}->SetLabel("");
 | 
			
		||||
    $self->{z_label_high_idx}->SetLabel("");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub update_sliders
 | 
			
		||||
{
 | 
			
		||||
    my ($self, $n_layers) = @_;
 | 
			
		||||
| 
						 | 
				
			
			@ -410,18 +420,32 @@ sub update_sliders
 | 
			
		|||
        $z_idx_low = 0;
 | 
			
		||||
        $z_idx_high = $n_layers - 1;
 | 
			
		||||
    } elsif ($z_idx_high < $n_layers && ($self->single_layer || $z_idx_high != 0)) {
 | 
			
		||||
        # use $z_idx
 | 
			
		||||
    } else {
 | 
			
		||||
        # search new indices for nearest z (size of $self->{layers_z} may change in dependence of what is shown)
 | 
			
		||||
        if (defined($self->{z_low})) {
 | 
			
		||||
            for (my $i = scalar(@{$self->{layers_z}}) - 1; $i >= 0; $i -= 1) {
 | 
			
		||||
                if ($self->{layers_z}[$i] <= $self->{z_low}) {
 | 
			
		||||
                    $z_idx_low = $i;
 | 
			
		||||
                    last;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (defined($self->{z_high})) {
 | 
			
		||||
            for (my $i = scalar(@{$self->{layers_z}}) - 1; $i >= 0; $i -= 1) {
 | 
			
		||||
                if ($self->{layers_z}[$i] <= $self->{z_high}) {
 | 
			
		||||
                    $z_idx_high = $i;
 | 
			
		||||
                    last;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    } elsif ($z_idx_high >= $n_layers) {
 | 
			
		||||
        # Out of range. Disable 'single layer' view.
 | 
			
		||||
        $self->single_layer(0);
 | 
			
		||||
        $self->{checkbox_singlelayer}->SetValue(0);
 | 
			
		||||
        $z_idx_low = 0;
 | 
			
		||||
        $z_idx_high = $n_layers - 1;
 | 
			
		||||
    }
 | 
			
		||||
    if ($self->single_layer) {
 | 
			
		||||
        $z_idx_low = $z_idx_high;
 | 
			
		||||
    } elsif ($z_idx_low > $z_idx_high) {
 | 
			
		||||
    } else {
 | 
			
		||||
        $z_idx_low = 0;
 | 
			
		||||
        $z_idx_high = $n_layers - 1;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    $self->slider_low->SetValue($z_idx_low);
 | 
			
		||||
| 
						 | 
				
			
			@ -437,12 +461,25 @@ sub set_z_range
 | 
			
		|||
    my ($self, $z_low, $z_high) = @_;
 | 
			
		||||
    
 | 
			
		||||
    return if !$self->enabled;
 | 
			
		||||
    $self->{z_low} = $z_low;
 | 
			
		||||
    $self->{z_high} = $z_high;
 | 
			
		||||
    $self->{z_label_low}->SetLabel(sprintf '%.2f', $z_low);
 | 
			
		||||
    $self->{z_label_high}->SetLabel(sprintf '%.2f', $z_high);
 | 
			
		||||
    my $z_idx_low = 1 + $self->slider_low->GetValue;
 | 
			
		||||
    my $z_idx_high = 1 + $self->slider_high->GetValue;
 | 
			
		||||
    $self->{z_label_low_idx}->SetLabel(sprintf '%d', $z_idx_low);
 | 
			
		||||
    $self->{z_label_high_idx}->SetLabel(sprintf '%d', $z_idx_high);
 | 
			
		||||
    
 | 
			
		||||
    my $layers_z = $self->canvas->get_current_print_zs(0);
 | 
			
		||||
    for (my $i = 0; $i < scalar(@{$layers_z}); $i += 1) {
 | 
			
		||||
        if (($z_low - 1e-6 < @{$layers_z}[$i]) && (@{$layers_z}[$i] < $z_low + 1e-6)) {
 | 
			
		||||
            $self->{z_label_low_idx}->SetLabel(sprintf '%d', $i + 1);
 | 
			
		||||
            last;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    for (my $i = 0; $i < scalar(@{$layers_z}); $i += 1) {
 | 
			
		||||
        if (($z_high - 1e-6 < @{$layers_z}[$i]) && (@{$layers_z}[$i] < $z_high + 1e-6)) {
 | 
			
		||||
            $self->{z_label_high_idx}->SetLabel(sprintf '%d', $i + 1);
 | 
			
		||||
            last;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $self->canvas->set_toolpaths_range($z_low - 1e-6, $z_high + 1e-6);
 | 
			
		||||
    $self->canvas->Refresh if $self->IsShown;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue