mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-20 07:11:12 -06:00 
			
		
		
		
	Fix for issue #661 (ExPolygons generation)
This commit is contained in:
		
							parent
							
								
									bcc68ca450
								
							
						
					
					
						commit
						0ec68eb35b
					
				
					 1 changed files with 38 additions and 29 deletions
				
			
		|  | @ -1186,40 +1186,46 @@ void TriangleMeshSlicer::make_expolygons(const Polygons &loops, ExPolygons* slic | ||||||
|         loops correctly in some edge cases when original model had overlapping facets |         loops correctly in some edge cases when original model had overlapping facets | ||||||
|     */ |     */ | ||||||
| 
 | 
 | ||||||
|     std::vector<double> area; |     /* The following lines are commented out because they can generate wrong polygons,
 | ||||||
|     std::vector<size_t> sorted_area;  // vector of indices
 |        see for example issue #661 */ | ||||||
|     for (Polygons::const_iterator loop = loops.begin(); loop != loops.end(); ++ loop) { |  | ||||||
|         area.push_back(loop->area()); |  | ||||||
|         sorted_area.push_back(loop - loops.begin()); |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     // outer first
 |     //std::vector<double> area;
 | ||||||
|     std::sort(sorted_area.begin(), sorted_area.end(), |     //std::vector<size_t> sorted_area;  // vector of indices
 | ||||||
|         [&area](size_t a, size_t b) { return std::abs(area[a]) > std::abs(area[b]); }); |     //for (Polygons::const_iterator loop = loops.begin(); loop != loops.end(); ++ loop) {
 | ||||||
|  |     //    area.push_back(loop->area());
 | ||||||
|  |     //    sorted_area.push_back(loop - loops.begin());
 | ||||||
|  |     //}
 | ||||||
|  |     //
 | ||||||
|  |     //// outer first
 | ||||||
|  |     //std::sort(sorted_area.begin(), sorted_area.end(),
 | ||||||
|  |     //    [&area](size_t a, size_t b) { return std::abs(area[a]) > std::abs(area[b]); });
 | ||||||
| 
 | 
 | ||||||
|     // we don't perform a safety offset now because it might reverse cw loops
 |     //// we don't perform a safety offset now because it might reverse cw loops
 | ||||||
|     Polygons p_slices; |     //Polygons p_slices;
 | ||||||
|     for (std::vector<size_t>::const_iterator loop_idx = sorted_area.begin(); loop_idx != sorted_area.end(); ++ loop_idx) { |     //for (std::vector<size_t>::const_iterator loop_idx = sorted_area.begin(); loop_idx != sorted_area.end(); ++ loop_idx) {
 | ||||||
|         /* we rely on the already computed area to determine the winding order
 |     //    /* we rely on the already computed area to determine the winding order
 | ||||||
|            of the loops, since the Orientation() function provided by Clipper |     //       of the loops, since the Orientation() function provided by Clipper
 | ||||||
|            would do the same, thus repeating the calculation */ |     //       would do the same, thus repeating the calculation */
 | ||||||
|         Polygons::const_iterator loop = loops.begin() + *loop_idx; |     //    Polygons::const_iterator loop = loops.begin() + *loop_idx;
 | ||||||
|         if (area[*loop_idx] > +EPSILON) |     //    if (area[*loop_idx] > +EPSILON)
 | ||||||
|             p_slices.push_back(*loop); |     //        p_slices.push_back(*loop);
 | ||||||
|         else if (area[*loop_idx] < -EPSILON) |     //    else if (area[*loop_idx] < -EPSILON)
 | ||||||
|             //FIXME This is arbitrary and possibly very slow.
 |     //        //FIXME This is arbitrary and possibly very slow.
 | ||||||
|             // If the hole is inside a polygon, then there is no need to diff.
 |     //        // If the hole is inside a polygon, then there is no need to diff.
 | ||||||
|             // If the hole intersects a polygon boundary, then diff it, but then
 |     //        // If the hole intersects a polygon boundary, then diff it, but then
 | ||||||
|             // there is no guarantee of an ordering of the loops.
 |     //        // there is no guarantee of an ordering of the loops.
 | ||||||
|             // Maybe we can test for the intersection before running the expensive diff algorithm?
 |     //        // Maybe we can test for the intersection before running the expensive diff algorithm?
 | ||||||
|             p_slices = diff(p_slices, *loop); |     //        p_slices = diff(p_slices, *loop);
 | ||||||
|     } |     //}
 | ||||||
| 
 | 
 | ||||||
|     // perform a safety offset to merge very close facets (TODO: find test case for this)
 |     // perform a safety offset to merge very close facets (TODO: find test case for this)
 | ||||||
|     double safety_offset = scale_(0.0499); |     double safety_offset = scale_(0.0499); | ||||||
| //FIXME see https://github.com/prusa3d/Slic3r/issues/520
 | //FIXME see https://github.com/prusa3d/Slic3r/issues/520
 | ||||||
| //    double safety_offset = scale_(0.0001);
 | //    double safety_offset = scale_(0.0001);
 | ||||||
|     ExPolygons ex_slices = offset2_ex(p_slices, +safety_offset, -safety_offset); | 
 | ||||||
|  |     /* The following line is commented out because it can generate wrong polygons,
 | ||||||
|  |        see for example issue #661 */ | ||||||
|  |     //ExPolygons ex_slices = offset2_ex(p_slices, +safety_offset, -safety_offset);
 | ||||||
|      |      | ||||||
|     #ifdef SLIC3R_TRIANGLEMESH_DEBUG |     #ifdef SLIC3R_TRIANGLEMESH_DEBUG | ||||||
|     size_t holes_count = 0; |     size_t holes_count = 0; | ||||||
|  | @ -1230,7 +1236,10 @@ void TriangleMeshSlicer::make_expolygons(const Polygons &loops, ExPolygons* slic | ||||||
|     #endif |     #endif | ||||||
|      |      | ||||||
|     // append to the supplied collection
 |     // append to the supplied collection
 | ||||||
|     expolygons_append(*slices, ex_slices); |     /* Fix for issue #661 { */ | ||||||
|  |     expolygons_append(*slices, offset2_ex(union_(loops, false), +safety_offset, -safety_offset)); | ||||||
|  |     //expolygons_append(*slices, ex_slices);
 | ||||||
|  |     /* } */ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void TriangleMeshSlicer::make_expolygons(std::vector<IntersectionLine> &lines, ExPolygons* slices) const | void TriangleMeshSlicer::make_expolygons(std::vector<IntersectionLine> &lines, ExPolygons* slices) const | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Enrico Turri
						Enrico Turri