mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Display skirt and brim in toolpaths preview. Also take support material margin into account when sizing the window. #2169
This commit is contained in:
		
							parent
							
								
									70fb381ecf
								
							
						
					
					
						commit
						86bad17abb
					
				
					 5 changed files with 95 additions and 19 deletions
				
			
		| 
						 | 
					@ -109,7 +109,7 @@ sub new {
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    my $self = $class->SUPER::new($parent);
 | 
					    my $self = $class->SUPER::new($parent);
 | 
				
			||||||
    $self->print($print);
 | 
					    $self->print($print);
 | 
				
			||||||
    $self->bb($self->print->bounding_box);
 | 
					    $self->bb($self->print->total_bounding_box);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    EVT_PAINT($self, sub {
 | 
					    EVT_PAINT($self, sub {
 | 
				
			||||||
        my $dc = Wx::PaintDC->new($self);
 | 
					        my $dc = Wx::PaintDC->new($self);
 | 
				
			||||||
| 
						 | 
					@ -187,9 +187,24 @@ sub Render {
 | 
				
			||||||
    glClearColor(1, 1, 1, 0);
 | 
					    glClearColor(1, 1, 1, 0);
 | 
				
			||||||
    glClear(GL_COLOR_BUFFER_BIT);
 | 
					    glClear(GL_COLOR_BUFFER_BIT);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    my $skirt_drawn = 0;
 | 
				
			||||||
 | 
					    my $brim_drawn = 0;
 | 
				
			||||||
    foreach my $layer (@{$self->layers}) {
 | 
					    foreach my $layer (@{$self->layers}) {
 | 
				
			||||||
        my $object = $layer->object;
 | 
					        my $object = $layer->object;
 | 
				
			||||||
        my $print_z = $layer->print_z;
 | 
					        my $print_z = $layer->print_z;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        # draw brim
 | 
				
			||||||
 | 
					        if ($layer->id == 0 && !$brim_drawn) {
 | 
				
			||||||
 | 
					            $self->color([0, 0, 0]);
 | 
				
			||||||
 | 
					            $self->_draw(undef, $print_z, $_) for @{$self->print->brim};
 | 
				
			||||||
 | 
					            $brim_drawn = 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (($self->print->config->skirt_height == -1 || $self->print->config->skirt_height >= $layer->id) && !$skirt_drawn) {
 | 
				
			||||||
 | 
					            $self->color([0, 0, 0]);
 | 
				
			||||||
 | 
					            $self->_draw(undef, $print_z, $_) for @{$self->print->skirt};
 | 
				
			||||||
 | 
					            $skirt_drawn = 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        foreach my $layerm (@{$layer->regions}) {
 | 
					        foreach my $layerm (@{$layer->regions}) {
 | 
				
			||||||
            $self->color([0.7, 0, 0]);
 | 
					            $self->color([0.7, 0, 0]);
 | 
				
			||||||
            $self->_draw($object, $print_z, $_) for @{$layerm->perimeters};
 | 
					            $self->_draw($object, $print_z, $_) for @{$layerm->perimeters};
 | 
				
			||||||
| 
						 | 
					@ -231,9 +246,19 @@ sub _draw_path {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    glLineWidth(1);
 | 
					    glLineWidth(1);
 | 
				
			||||||
    foreach my $copy (@{ $object->_shifted_copies }) {
 | 
					    
 | 
				
			||||||
 | 
					    if (defined $object) {
 | 
				
			||||||
 | 
					        foreach my $copy (@{ $object->_shifted_copies }) {
 | 
				
			||||||
 | 
					            foreach my $line (@{$path->polyline->lines}) {
 | 
				
			||||||
 | 
					                $line->translate(@$copy);
 | 
				
			||||||
 | 
					                glBegin(GL_LINES);
 | 
				
			||||||
 | 
					                glVertex2f(@{$line->a});
 | 
				
			||||||
 | 
					                glVertex2f(@{$line->b});
 | 
				
			||||||
 | 
					                glEnd();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
        foreach my $line (@{$path->polyline->lines}) {
 | 
					        foreach my $line (@{$path->polyline->lines}) {
 | 
				
			||||||
            $line->translate(@$copy);
 | 
					 | 
				
			||||||
            glBegin(GL_LINES);
 | 
					            glBegin(GL_LINES);
 | 
				
			||||||
            glVertex2f(@{$line->a});
 | 
					            glVertex2f(@{$line->a});
 | 
				
			||||||
            glVertex2f(@{$line->b});
 | 
					            glVertex2f(@{$line->b});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -356,6 +356,8 @@ sub max_layer_height {
 | 
				
			||||||
    return max(@{$self->config->nozzle_diameter});
 | 
					    return max(@{$self->config->nozzle_diameter});
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# the bounding box of objects placed in copies position
 | 
				
			||||||
 | 
					# (without taking skirt/brim/support material into account)
 | 
				
			||||||
sub bounding_box {
 | 
					sub bounding_box {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
| 
						 | 
					@ -370,6 +372,30 @@ sub bounding_box {
 | 
				
			||||||
    return Slic3r::Geometry::BoundingBox->new_from_points([ map Slic3r::Point->new(@$_), @points ]);
 | 
					    return Slic3r::Geometry::BoundingBox->new_from_points([ map Slic3r::Point->new(@$_), @points ]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# the total bounding box of extrusions, including skirt/brim/support material
 | 
				
			||||||
 | 
					sub total_bounding_box {
 | 
				
			||||||
 | 
					    my ($self) = @_;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # get objects bounding box
 | 
				
			||||||
 | 
					    my $bb = $self->bounding_box;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # check how much we need to increase it
 | 
				
			||||||
 | 
					    my $extra = 0;
 | 
				
			||||||
 | 
					    if ($self->has_support_material) {
 | 
				
			||||||
 | 
					        $extra = &Slic3r::Print::SupportMaterial::MARGIN;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if ($self->config->skirts > 0) {
 | 
				
			||||||
 | 
					        my $skirt_flow = $self->skirt_flow;
 | 
				
			||||||
 | 
					        $extra = max($extra, $self->config->skirt_distance + ($self->config->skirts * $skirt_flow->spacing));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    $extra = max($extra, $self->config->brim_width);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if ($extra > 0) {
 | 
				
			||||||
 | 
					        $bb->offset(scale $extra);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return $bb;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub size {
 | 
					sub size {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
    return $self->bounding_box->size;
 | 
					    return $self->bounding_box->size;
 | 
				
			||||||
| 
						 | 
					@ -602,14 +628,8 @@ sub make_skirt {
 | 
				
			||||||
    # skirt may be printed on several layers, having distinct layer heights,
 | 
					    # skirt may be printed on several layers, having distinct layer heights,
 | 
				
			||||||
    # but loops must be aligned so can't vary width/spacing
 | 
					    # but loops must be aligned so can't vary width/spacing
 | 
				
			||||||
    # TODO: use each extruder's own flow
 | 
					    # TODO: use each extruder's own flow
 | 
				
			||||||
    my $first_layer_height = $self->objects->[0]->config->get_value('first_layer_height');
 | 
					    my $first_layer_height = $self->skirt_first_layer_height;
 | 
				
			||||||
    my $flow = Slic3r::Flow->new_from_width(
 | 
					    my $flow = $self->skirt_flow;
 | 
				
			||||||
        width               => ($self->config->first_layer_extrusion_width || $self->regions->[0]->config->perimeter_extrusion_width),
 | 
					 | 
				
			||||||
        role                => FLOW_ROLE_PERIMETER,
 | 
					 | 
				
			||||||
        nozzle_diameter     => $self->config->nozzle_diameter->[0],
 | 
					 | 
				
			||||||
        layer_height        => $first_layer_height,
 | 
					 | 
				
			||||||
        bridge_flow_ratio   => 0,
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
    my $spacing = $flow->spacing;
 | 
					    my $spacing = $flow->spacing;
 | 
				
			||||||
    my $mm3_per_mm = $flow->mm3_per_mm;
 | 
					    my $mm3_per_mm = $flow->mm3_per_mm;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
| 
						 | 
					@ -677,14 +697,8 @@ sub make_brim {
 | 
				
			||||||
    $self->status_cb->(88, "Generating brim");
 | 
					    $self->status_cb->(88, "Generating brim");
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    # brim is only printed on first layer and uses support material extruder
 | 
					    # brim is only printed on first layer and uses support material extruder
 | 
				
			||||||
    my $first_layer_height = $self->objects->[0]->config->get_abs_value('first_layer_height');
 | 
					    my $first_layer_height = $self->skirt_first_layer_height;
 | 
				
			||||||
    my $flow = Slic3r::Flow->new_from_width(
 | 
					    my $flow = $self->skirt_flow;
 | 
				
			||||||
        width               => ($self->config->first_layer_extrusion_width || $self->regions->[0]->config->perimeter_extrusion_width),
 | 
					 | 
				
			||||||
        role                => FLOW_ROLE_PERIMETER,
 | 
					 | 
				
			||||||
        nozzle_diameter     => $self->config->get_at('nozzle_diameter', $self->objects->[0]->config->support_material_extruder-1),
 | 
					 | 
				
			||||||
        layer_height        => $first_layer_height,
 | 
					 | 
				
			||||||
        bridge_flow_ratio   => 0,
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
    my $mm3_per_mm = $flow->mm3_per_mm;
 | 
					    my $mm3_per_mm = $flow->mm3_per_mm;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    my $grow_distance = $flow->scaled_width / 2;
 | 
					    my $grow_distance = $flow->scaled_width / 2;
 | 
				
			||||||
| 
						 | 
					@ -738,6 +752,23 @@ sub make_brim {
 | 
				
			||||||
    $self->set_step_done(STEP_BRIM);
 | 
					    $self->set_step_done(STEP_BRIM);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub skirt_first_layer_height {
 | 
				
			||||||
 | 
					    my ($self) = @_;
 | 
				
			||||||
 | 
					    return $self->objects->[0]->config->get_abs_value('first_layer_height');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub skirt_flow {
 | 
				
			||||||
 | 
					    my ($self) = @_;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return Slic3r::Flow->new_from_width(
 | 
				
			||||||
 | 
					        width               => ($self->config->first_layer_extrusion_width || $self->regions->[0]->config->perimeter_extrusion_width),
 | 
				
			||||||
 | 
					        role                => FLOW_ROLE_PERIMETER,
 | 
				
			||||||
 | 
					        nozzle_diameter     => $self->config->get_at('nozzle_diameter', $self->objects->[0]->config->support_material_extruder-1),
 | 
				
			||||||
 | 
					        layer_height        => $self->skirt_first_layer_height,
 | 
				
			||||||
 | 
					        bridge_flow_ratio   => 0,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub write_gcode {
 | 
					sub write_gcode {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
    my ($file) = @_;
 | 
					    my ($file) = @_;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -141,6 +141,23 @@ BoundingBox3Base<PointClass>::translate(coordf_t x, coordf_t y, coordf_t z)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
template void BoundingBox3Base<Pointf3>::translate(coordf_t x, coordf_t y, coordf_t z);
 | 
					template void BoundingBox3Base<Pointf3>::translate(coordf_t x, coordf_t y, coordf_t z);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <class PointClass> void
 | 
				
			||||||
 | 
					BoundingBoxBase<PointClass>::offset(coordf_t delta)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    this->min.translate(-delta, -delta);
 | 
				
			||||||
 | 
					    this->max.translate(delta, delta);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					template void BoundingBoxBase<Point>::offset(coordf_t delta);
 | 
				
			||||||
 | 
					template void BoundingBoxBase<Pointf>::offset(coordf_t delta);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <class PointClass> void
 | 
				
			||||||
 | 
					BoundingBox3Base<PointClass>::offset(coordf_t delta)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    this->min.translate(-delta, -delta, -delta);
 | 
				
			||||||
 | 
					    this->max.translate(delta, delta, delta);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					template void BoundingBox3Base<Pointf3>::offset(coordf_t delta);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <class PointClass> PointClass
 | 
					template <class PointClass> PointClass
 | 
				
			||||||
BoundingBoxBase<PointClass>::center() const
 | 
					BoundingBoxBase<PointClass>::center() const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +26,7 @@ class BoundingBoxBase
 | 
				
			||||||
    void scale(double factor);
 | 
					    void scale(double factor);
 | 
				
			||||||
    PointClass size() const;
 | 
					    PointClass size() const;
 | 
				
			||||||
    void translate(coordf_t x, coordf_t y);
 | 
					    void translate(coordf_t x, coordf_t y);
 | 
				
			||||||
 | 
					    void offset(coordf_t delta);
 | 
				
			||||||
    PointClass center() const;
 | 
					    PointClass center() const;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,6 +40,7 @@ class BoundingBox3Base : public BoundingBoxBase<PointClass>
 | 
				
			||||||
    void merge(const BoundingBox3Base<PointClass> &bb);
 | 
					    void merge(const BoundingBox3Base<PointClass> &bb);
 | 
				
			||||||
    PointClass size() const;
 | 
					    PointClass size() const;
 | 
				
			||||||
    void translate(coordf_t x, coordf_t y, coordf_t z);
 | 
					    void translate(coordf_t x, coordf_t y, coordf_t z);
 | 
				
			||||||
 | 
					    void offset(coordf_t delta);
 | 
				
			||||||
    PointClass center() const;
 | 
					    PointClass center() const;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,6 +14,7 @@
 | 
				
			||||||
    void merge_point(Point* point) %code{% THIS->merge(*point); %};
 | 
					    void merge_point(Point* point) %code{% THIS->merge(*point); %};
 | 
				
			||||||
    void scale(double factor);
 | 
					    void scale(double factor);
 | 
				
			||||||
    void translate(double x, double y);
 | 
					    void translate(double x, double y);
 | 
				
			||||||
 | 
					    void offset(double delta);
 | 
				
			||||||
    Polygon* polygon()
 | 
					    Polygon* polygon()
 | 
				
			||||||
        %code{% RETVAL = new Polygon(); THIS->polygon(RETVAL); %};
 | 
					        %code{% RETVAL = new Polygon(); THIS->polygon(RETVAL); %};
 | 
				
			||||||
    Clone<Point> size();
 | 
					    Clone<Point> size();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue