mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	This fixes #2326 and potentially other performance issues when overhang extra perimeter is turned on for complicated multi-part models.
This commit is contained in:
		
						commit
						5d75a95dc3
					
				
					 2 changed files with 4 additions and 8 deletions
				
			
		|  | @ -1265,15 +1265,11 @@ std::tuple<std::vector<ExtrusionPaths>, Polygons> generate_extra_perimeters_over | ||||||
|     return {extra_perims, diff(inset_overhang_area, inset_overhang_area_left_unfilled)}; |     return {extra_perims, diff(inset_overhang_area, inset_overhang_area_left_unfilled)}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void PerimeterGenerator::apply_extra_perimeters() | void PerimeterGenerator::apply_extra_perimeters(ExPolygons &infill_area) | ||||||
| { | { | ||||||
|     if (this->lower_slices != nullptr && this->config->detect_overhang_wall && this->config->extra_perimeters_on_overhangs && |     if (this->lower_slices != nullptr && this->config->detect_overhang_wall && this->config->extra_perimeters_on_overhangs && | ||||||
|         this->config->wall_loops > 0 && this->layer_id > this->object_config->raft_layers) { |         this->config->wall_loops > 0 && this->layer_id > this->object_config->raft_layers) { | ||||||
|         // Generate extra perimeters on overhang areas, and cut them to these parts only, to save print time and material
 |         // Generate extra perimeters on overhang areas, and cut them to these parts only, to save print time and material
 | ||||||
|         ExPolygons infill_area; |  | ||||||
|         for (const auto &internal_surface : this->fill_surfaces->surfaces) { |  | ||||||
|             infill_area.push_back(internal_surface.expolygon); |  | ||||||
|         } |  | ||||||
|         auto [extra_perimeters, filled_area] = generate_extra_perimeters_over_overhangs(infill_area, this->lower_slices_polygons(), |         auto [extra_perimeters, filled_area] = generate_extra_perimeters_over_overhangs(infill_area, this->lower_slices_polygons(), | ||||||
|                                                                                         this->config->wall_loops, this->overhang_flow, |                                                                                         this->config->wall_loops, this->overhang_flow, | ||||||
|                                                                                         this->m_scaled_resolution, *this->object_config, |                                                                                         this->m_scaled_resolution, *this->object_config, | ||||||
|  | @ -1708,7 +1704,7 @@ void PerimeterGenerator::process_classic() | ||||||
|         } |         } | ||||||
|         this->fill_surfaces->append(infill_exp, stInternal); |         this->fill_surfaces->append(infill_exp, stInternal); | ||||||
| 
 | 
 | ||||||
|         apply_extra_perimeters(); |         apply_extra_perimeters(infill_exp); | ||||||
| 
 | 
 | ||||||
|         // BBS: get the no-overlap infill expolygons
 |         // BBS: get the no-overlap infill expolygons
 | ||||||
|         { |         { | ||||||
|  | @ -2167,7 +2163,7 @@ void PerimeterGenerator::process_arachne() | ||||||
|         } |         } | ||||||
|         this->fill_surfaces->append(infill_exp, stInternal); |         this->fill_surfaces->append(infill_exp, stInternal); | ||||||
| 
 | 
 | ||||||
|         apply_extra_perimeters(); |         apply_extra_perimeters(infill_exp); | ||||||
| 
 | 
 | ||||||
|         // BBS: get the no-overlap infill expolygons
 |         // BBS: get the no-overlap infill expolygons
 | ||||||
|         { |         { | ||||||
|  |  | ||||||
|  | @ -79,7 +79,7 @@ public: | ||||||
| private: | private: | ||||||
|     std::map<int, Polygons> generate_lower_polygons_series(float width); |     std::map<int, Polygons> generate_lower_polygons_series(float width); | ||||||
|     void split_top_surfaces(const ExPolygons &orig_polygons, ExPolygons &top_fills, ExPolygons &non_top_polygons, ExPolygons &fill_clip) const; |     void split_top_surfaces(const ExPolygons &orig_polygons, ExPolygons &top_fills, ExPolygons &non_top_polygons, ExPolygons &fill_clip) const; | ||||||
|     void apply_extra_perimeters(); |     void apply_extra_perimeters(ExPolygons& infill_area); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     bool        m_spiral_vase; |     bool        m_spiral_vase; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 SoftFever
						SoftFever