mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	ENH: fix overflow which is caused by wrong spacing
Disable the spacing adjustment by bounding box before fixing, to avoid overflow in some cases. Signed-off-by: salt.wei <salt.wei@bambulab.com> Change-Id: I13c751c8d46040156d79c1fdfc513f22f5e40fe2
This commit is contained in:
		
							parent
							
								
									444ab79087
								
							
						
					
					
						commit
						099e72b885
					
				
					 1 changed files with 17 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -3099,6 +3099,8 @@ void FillMonotonicLineWGapFill::fill_surface_extrusion(const Surface* surface, c
 | 
			
		|||
    FillParams params2 = params;
 | 
			
		||||
    params2.monotonic = true;
 | 
			
		||||
    params2.anchor_length_max = 0.0f;
 | 
			
		||||
    //BBS: always don't adjust the spacing of top surface infill
 | 
			
		||||
    params2.dont_adjust = true;
 | 
			
		||||
 | 
			
		||||
    //BBS: always use no overlap expolygons to avoid overflow in top surface
 | 
			
		||||
    for (const ExPolygon &rectilinear_area : this->no_overlap_expolygons) {
 | 
			
		||||
| 
						 | 
				
			
			@ -3188,14 +3190,14 @@ void FillMonotonicLineWGapFill::fill_surface_by_lines(const Surface* surface, co
 | 
			
		|||
    std::pair<float, Point> rotate_vector = this->_infill_direction(surface);
 | 
			
		||||
 | 
			
		||||
    assert(params.full_infill());
 | 
			
		||||
    coord_t line_spacing = coord_t(scale_(this->spacing));
 | 
			
		||||
    coord_t line_spacing = params.flow.scaled_spacing();
 | 
			
		||||
 | 
			
		||||
    // On the polygons of poly_with_offset, the infill lines will be connected.
 | 
			
		||||
    ExPolygonWithOffset poly_with_offset(
 | 
			
		||||
        surface->expolygon,
 | 
			
		||||
        - rotate_vector.first, 
 | 
			
		||||
        float(scale_(0 - (0.5 - INFILL_OVERLAP_OVER_SPACING) * this->spacing)),
 | 
			
		||||
        float(scale_(0 - 0.5f * this->spacing)));
 | 
			
		||||
        float(scale_(0 - (0.5 - INFILL_OVERLAP_OVER_SPACING) * params.flow.spacing())),
 | 
			
		||||
        float(scale_(0 - 0.5f * params.flow.spacing())));
 | 
			
		||||
    if (poly_with_offset.n_contours_inner == 0) {
 | 
			
		||||
        // Not a single infill line fits.
 | 
			
		||||
        //FIXME maybe one shall trigger the gap fill here?
 | 
			
		||||
| 
						 | 
				
			
			@ -3205,9 +3207,18 @@ void FillMonotonicLineWGapFill::fill_surface_by_lines(const Surface* surface, co
 | 
			
		|||
    BoundingBox bounding_box = poly_with_offset.bounding_box_src();
 | 
			
		||||
 | 
			
		||||
    // define flow spacing according to requested density
 | 
			
		||||
    assert(!params.dont_adjust);
 | 
			
		||||
    line_spacing = this->_adjust_solid_spacing(bounding_box.size()(0), line_spacing);
 | 
			
		||||
    this->spacing = unscale<double>(line_spacing);
 | 
			
		||||
    if (params.full_infill() && !params.dont_adjust) {
 | 
			
		||||
        line_spacing = this->_adjust_solid_spacing(bounding_box.size()(0), line_spacing);
 | 
			
		||||
        this->spacing = unscale<double>(line_spacing);
 | 
			
		||||
    } else {
 | 
			
		||||
        // extend bounding box so that our pattern will be aligned with other layers
 | 
			
		||||
        // Transform the reference point to the rotated coordinate system.
 | 
			
		||||
        Point refpt = rotate_vector.second.rotated(-rotate_vector.first);
 | 
			
		||||
        bounding_box.merge(align_to_grid(
 | 
			
		||||
            bounding_box.min,
 | 
			
		||||
            Point(line_spacing, line_spacing),
 | 
			
		||||
            refpt));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Intersect a set of euqally spaced vertical lines wiht expolygon.
 | 
			
		||||
    size_t  n_vlines = (bounding_box.max(0) - bounding_box.min(0) + line_spacing - 1) / line_spacing;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue