mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	FIX: tree support crashes when there is no overhang
Default infill pattern is lightning now, which has a crash bug when no overhang is provided. Change-Id: I1e70b8458d1eef670a78d698c68b21d7f48bc3eb (cherry picked from commit 777af3aa1dbb9869209945f3a6dbcc07cba0b84a)
This commit is contained in:
		
							parent
							
								
									ec66e7750f
								
							
						
					
					
						commit
						65766ba30a
					
				
					 3 changed files with 9 additions and 5 deletions
				
			
		|  | @ -213,6 +213,8 @@ void Generator::generateTrees(const PrintObject &print_object) | ||||||
| 
 | 
 | ||||||
| void Generator::generateTreesforSupport(std::vector<Polygons>& contours) | void Generator::generateTreesforSupport(std::vector<Polygons>& contours) | ||||||
| { | { | ||||||
|  |     if (contours.empty()) return; | ||||||
|  | 
 | ||||||
|     m_lightning_layers.resize(contours.size()); |     m_lightning_layers.resize(contours.size()); | ||||||
|     bboxs.resize(contours.size()); |     bboxs.resize(contours.size()); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -821,8 +821,7 @@ void TreeSupport::detect_object_overhangs() | ||||||
|             region2clusterInd.emplace(®ion, regionClusters.size() - 1); |             region2clusterInd.emplace(®ion, regionClusters.size() - 1); | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
| 
 |     // main part of sharptail detections
 | ||||||
|     has_sharp_tail = false; |  | ||||||
|     if (std::set<SupportType>{stTreeAuto, stHybridAuto, stTree}.count(stype))// == stTreeAuto || stype == stHybridAuto || stype == stTree)
 |     if (std::set<SupportType>{stTreeAuto, stHybridAuto, stTree}.count(stype))// == stTreeAuto || stype == stHybridAuto || stype == stTree)
 | ||||||
|     { |     { | ||||||
|         double threshold_rad = (config.support_threshold_angle.value < EPSILON ? 30 : config.support_threshold_angle.value+1) * M_PI / 180.; |         double threshold_rad = (config.support_threshold_angle.value < EPSILON ? 30 : config.support_threshold_angle.value+1) * M_PI / 180.; | ||||||
|  | @ -902,7 +901,6 @@ void TreeSupport::detect_object_overhangs() | ||||||
|                     overhangs_sharp_tail = diff_ex(overhangs_sharp_tail, overhang_areas); |                     overhangs_sharp_tail = diff_ex(overhangs_sharp_tail, overhang_areas); | ||||||
|                 } |                 } | ||||||
|                 if (!overhangs_sharp_tail.empty()) { |                 if (!overhangs_sharp_tail.empty()) { | ||||||
|                     has_sharp_tail = true; |  | ||||||
|                     append(layer->sharp_tails, overhangs_sharp_tail); |                     append(layer->sharp_tails, overhangs_sharp_tail); | ||||||
|                     overhang_areas = union_ex(overhang_areas, overhangs_sharp_tail); |                     overhang_areas = union_ex(overhang_areas, overhangs_sharp_tail); | ||||||
|             } |             } | ||||||
|  | @ -971,7 +969,6 @@ void TreeSupport::detect_object_overhangs() | ||||||
|                     } while (0); |                     } while (0); | ||||||
| 
 | 
 | ||||||
|                     if (is_sharp_tail) { |                     if (is_sharp_tail) { | ||||||
|                         has_sharp_tail      = true; |  | ||||||
|                         ExPolygons overhang = diff_ex({expoly}, lower_layer->lslices); |                         ExPolygons overhang = diff_ex({expoly}, lower_layer->lslices); | ||||||
|                         layer->sharp_tails.push_back(expoly); |                         layer->sharp_tails.push_back(expoly); | ||||||
|                         layer->sharp_tails_height.insert({ &expoly, accum_height }); |                         layer->sharp_tails_height.insert({ &expoly, accum_height }); | ||||||
|  | @ -1136,6 +1133,7 @@ void TreeSupport::detect_object_overhangs() | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     has_overhangs = false; | ||||||
|     for (int layer_nr = 0; layer_nr < m_object->layer_count(); layer_nr++) { |     for (int layer_nr = 0; layer_nr < m_object->layer_count(); layer_nr++) { | ||||||
|         if (m_object->print()->canceled()) |         if (m_object->print()->canceled()) | ||||||
|             break; |             break; | ||||||
|  | @ -1171,6 +1169,8 @@ void TreeSupport::detect_object_overhangs() | ||||||
|                 ts_layer->overhang_types.emplace(&ts_layer->overhang_areas.back(), TreeSupportLayer::Enforced); |                 ts_layer->overhang_types.emplace(&ts_layer->overhang_areas.back(), TreeSupportLayer::Enforced); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         if (!ts_layer->overhang_areas.empty()) has_overhangs = true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| #ifdef SUPPORT_TREE_DEBUG_TO_SVG | #ifdef SUPPORT_TREE_DEBUG_TO_SVG | ||||||
|  | @ -1893,6 +1893,8 @@ void TreeSupport::generate_support_areas() | ||||||
|     detect_object_overhangs(); |     detect_object_overhangs(); | ||||||
|     profiler.stage_finish(STAGE_DETECT_OVERHANGS); |     profiler.stage_finish(STAGE_DETECT_OVERHANGS); | ||||||
| 
 | 
 | ||||||
|  |     if (!has_overhangs) return; | ||||||
|  | 
 | ||||||
|     // Generate contact points of tree support
 |     // Generate contact points of tree support
 | ||||||
|     profiler.stage_start(STAGE_GENERATE_CONTACT_NODES); |     profiler.stage_start(STAGE_GENERATE_CONTACT_NODES); | ||||||
|     m_object->print()->set_status(56, _L("Support: generate contact points")); |     m_object->print()->set_status(56, _L("Support: generate contact points")); | ||||||
|  |  | ||||||
|  | @ -351,7 +351,7 @@ public: | ||||||
| 
 | 
 | ||||||
|     int  avg_node_per_layer = 0; |     int  avg_node_per_layer = 0; | ||||||
|     float nodes_angle       = 0; |     float nodes_angle       = 0; | ||||||
|     bool            has_sharp_tail; |     bool  has_overhangs = false; | ||||||
| 
 | 
 | ||||||
|     std::unique_ptr<FillLightning::Generator> generator; |     std::unique_ptr<FillLightning::Generator> generator; | ||||||
|     std::unordered_map<double, size_t> printZ_to_lightninglayer; |     std::unordered_map<double, size_t> printZ_to_lightninglayer; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Arthur
						Arthur