mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	ENH: tree support style default to Tree Hybrid
1. tree support style default to Tree Hybrid
2. fix an assert bug with MedialAxis::build:
    assert(polyline.width.size() == polyline.points.size() * 2 - 2)
  This is caused by the incorrect clear function of ThickPolyline.
Change-Id: I8d6507ad366d253493e2749e0cbac8d3d837ee8a
(cherry picked from commit bd31e962c11e82005944bef40b17471075e79898)
			
			
This commit is contained in:
		
							parent
							
								
									d7364900dd
								
							
						
					
					
						commit
						617cb5490b
					
				
					 4 changed files with 16 additions and 13 deletions
				
			
		| 
						 | 
					@ -234,6 +234,10 @@ public:
 | 
				
			||||||
        std::reverse(this->width.begin(), this->width.end());
 | 
					        std::reverse(this->width.begin(), this->width.end());
 | 
				
			||||||
        std::swap(this->endpoints.first, this->endpoints.second);
 | 
					        std::swap(this->endpoints.first, this->endpoints.second);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    void clear() {
 | 
				
			||||||
 | 
					        Polyline::clear();
 | 
				
			||||||
 | 
					        width.clear();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    std::vector<coordf_t> width;
 | 
					    std::vector<coordf_t> width;
 | 
				
			||||||
    std::pair<bool,bool>  endpoints;
 | 
					    std::pair<bool,bool>  endpoints;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -117,7 +117,7 @@ inline bool is_tree(SupportType stype)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
inline bool is_tree_slim(SupportType type, SupportMaterialStyle style)
 | 
					inline bool is_tree_slim(SupportType type, SupportMaterialStyle style)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return is_tree(type) && (style==smsDefault || style==smsTreeSlim);
 | 
					    return is_tree(type) && style==smsTreeSlim;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
inline bool is_auto(SupportType stype)
 | 
					inline bool is_auto(SupportType stype)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,6 @@
 | 
				
			||||||
#define _L(s) Slic3r::I18N::translate(s)
 | 
					#define _L(s) Slic3r::I18N::translate(s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define USE_PLAN_LAYER_HEIGHTS 1
 | 
					#define USE_PLAN_LAYER_HEIGHTS 1
 | 
				
			||||||
#define HEIGHT_TO_SWITCH_INFILL_DIRECTION 30 // change infill direction every 20mm
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef M_PI
 | 
					#ifndef M_PI
 | 
				
			||||||
#define M_PI 3.1415926535897932384626433832795
 | 
					#define M_PI 3.1415926535897932384626433832795
 | 
				
			||||||
| 
						 | 
					@ -686,9 +685,12 @@ TreeSupport::TreeSupport(PrintObject& object, const SlicingParameters &slicing_p
 | 
				
			||||||
    : m_object(&object), m_slicing_params(slicing_params), m_object_config(&object.config())
 | 
					    : m_object(&object), m_slicing_params(slicing_params), m_object_config(&object.config())
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_raft_layers = slicing_params.base_raft_layers + slicing_params.interface_raft_layers;
 | 
					    m_raft_layers = slicing_params.base_raft_layers + slicing_params.interface_raft_layers;
 | 
				
			||||||
        
 | 
					    support_type = m_object_config->support_type;
 | 
				
			||||||
 | 
					    support_style = m_object_config->support_style;
 | 
				
			||||||
 | 
					    if (support_style == smsDefault)
 | 
				
			||||||
 | 
					        support_style = smsTreeHybrid;
 | 
				
			||||||
    SupportMaterialPattern support_pattern  = m_object_config->support_base_pattern;
 | 
					    SupportMaterialPattern support_pattern  = m_object_config->support_base_pattern;
 | 
				
			||||||
    if (m_object_config->support_style == smsTreeHybrid && support_pattern == smpDefault) support_pattern = smpRectilinear;
 | 
					    if (support_style == smsTreeHybrid && support_pattern == smpDefault) support_pattern = smpRectilinear;
 | 
				
			||||||
    m_support_params.base_fill_pattern      = 
 | 
					    m_support_params.base_fill_pattern      = 
 | 
				
			||||||
        support_pattern == smpLightning ? ipLightning :
 | 
					        support_pattern == smpLightning ? ipLightning :
 | 
				
			||||||
        support_pattern == smpHoneycomb ? ipHoneycomb :
 | 
					        support_pattern == smpHoneycomb ? ipHoneycomb :
 | 
				
			||||||
| 
						 | 
					@ -701,8 +703,7 @@ TreeSupport::TreeSupport(PrintObject& object, const SlicingParameters &slicing_p
 | 
				
			||||||
                                                  ipConcentric :
 | 
					                                                  ipConcentric :
 | 
				
			||||||
                                                  (m_support_params.interface_density > 0.95 ? ipRectilinear : ipSupportBase);
 | 
					                                                  (m_support_params.interface_density > 0.95 ? ipRectilinear : ipSupportBase);
 | 
				
			||||||
    m_support_params.support_extrusion_width = m_object_config->support_line_width.value > 0 ? m_object_config->support_line_width : m_object_config->line_width;
 | 
					    m_support_params.support_extrusion_width = m_object_config->support_line_width.value > 0 ? m_object_config->support_line_width : m_object_config->line_width;
 | 
				
			||||||
    support_type                             = m_object_config->support_type;
 | 
					    is_slim                                  = is_tree_slim(support_type, support_style);
 | 
				
			||||||
    is_slim                                  = is_tree_slim(support_type, m_object_config->support_style);
 | 
					 | 
				
			||||||
    MAX_BRANCH_RADIUS                        = 10.0;
 | 
					    MAX_BRANCH_RADIUS                        = 10.0;
 | 
				
			||||||
    tree_support_branch_diameter_angle       = 5.0;//is_slim ? 10.0 : 5.0;
 | 
					    tree_support_branch_diameter_angle       = 5.0;//is_slim ? 10.0 : 5.0;
 | 
				
			||||||
    // by default tree support needs no infill, unless it's tree hybrid which contains normal nodes.
 | 
					    // by default tree support needs no infill, unless it's tree hybrid which contains normal nodes.
 | 
				
			||||||
| 
						 | 
					@ -915,7 +916,7 @@ void TreeSupport::detect_overhangs(bool detect_first_sharp_tail_only)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (max_bridge_length > 0 && overhang_areas.size() > 0) {
 | 
					                if (max_bridge_length > 0 && overhang_areas.size() > 0) {
 | 
				
			||||||
                    // do not break bridge for normal part in TreeHybrid
 | 
					                    // do not break bridge for normal part in TreeHybrid
 | 
				
			||||||
                    bool break_bridge = !(config.support_style == smsTreeHybrid && area(overhang_areas) > m_support_params.thresh_big_overhang);
 | 
					                    bool break_bridge = !(support_style == smsTreeHybrid && area(overhang_areas) > m_support_params.thresh_big_overhang);
 | 
				
			||||||
                    m_object->remove_bridges_from_contacts(lower_layer, layer, extrusion_width_scaled, &overhang_areas, max_bridge_length, break_bridge);
 | 
					                    m_object->remove_bridges_from_contacts(lower_layer, layer, extrusion_width_scaled, &overhang_areas, max_bridge_length, break_bridge);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1503,9 +1504,6 @@ void TreeSupport::generate_toolpaths()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    BoundingBox bbox_object(Point(-scale_(1.), -scale_(1.0)), Point(scale_(1.), scale_(1.)));
 | 
					    BoundingBox bbox_object(Point(-scale_(1.), -scale_(1.0)), Point(scale_(1.), scale_(1.)));
 | 
				
			||||||
    auto obj_size = m_object->size();
 | 
					 | 
				
			||||||
    bool obj_is_vertical = obj_size.x() < obj_size.y();
 | 
					 | 
				
			||||||
    int num_layers_to_change_infill_direction = int(HEIGHT_TO_SWITCH_INFILL_DIRECTION / object_config.layer_height.value);  // change direction every 30mm
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    std::shared_ptr<Fill> filler_interface = std::shared_ptr<Fill>(Fill::new_from_type(m_support_params.contact_fill_pattern));
 | 
					    std::shared_ptr<Fill> filler_interface = std::shared_ptr<Fill>(Fill::new_from_type(m_support_params.contact_fill_pattern));
 | 
				
			||||||
    std::shared_ptr<Fill> filler_Roof1stLayer = std::shared_ptr<Fill>(Fill::new_from_type(ipRectilinear));
 | 
					    std::shared_ptr<Fill> filler_Roof1stLayer = std::shared_ptr<Fill>(Fill::new_from_type(ipRectilinear));
 | 
				
			||||||
| 
						 | 
					@ -1513,7 +1511,7 @@ void TreeSupport::generate_toolpaths()
 | 
				
			||||||
    filler_interface->set_bounding_box(bbox_object);
 | 
					    filler_interface->set_bounding_box(bbox_object);
 | 
				
			||||||
    filler_Roof1stLayer->set_bounding_box(bbox_object);
 | 
					    filler_Roof1stLayer->set_bounding_box(bbox_object);
 | 
				
			||||||
    filler_support->set_bounding_box(bbox_object);
 | 
					    filler_support->set_bounding_box(bbox_object);
 | 
				
			||||||
    filler_interface->angle = Geometry::deg2rad(object_config.support_angle.value + 90.);//(1 - obj_is_vertical) * M_PI_2;//((1-obj_is_vertical) + int(layer_id / num_layers_to_change_infill_direction)) * M_PI_2;;//layer_id % 2 ? 0 : M_PI_2;
 | 
					    filler_interface->angle = Geometry::deg2rad(object_config.support_angle.value + 90.);
 | 
				
			||||||
    filler_Roof1stLayer->angle = Geometry::deg2rad(object_config.support_angle.value + 90.);
 | 
					    filler_Roof1stLayer->angle = Geometry::deg2rad(object_config.support_angle.value + 90.);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // generate tree support tool paths
 | 
					    // generate tree support tool paths
 | 
				
			||||||
| 
						 | 
					@ -1585,7 +1583,7 @@ void TreeSupport::generate_toolpaths()
 | 
				
			||||||
                        // base_areas
 | 
					                        // base_areas
 | 
				
			||||||
                        filler_support->spacing = support_flow.spacing();
 | 
					                        filler_support->spacing = support_flow.spacing();
 | 
				
			||||||
                        Flow flow               = (layer_id == 0 && m_raft_layers == 0) ? m_object->print()->brim_flow() : support_flow;
 | 
					                        Flow flow               = (layer_id == 0 && m_raft_layers == 0) ? m_object->print()->brim_flow() : support_flow;
 | 
				
			||||||
                        if (layer_id>0 && area_group.dist_to_top < 10 && !with_infill && m_object_config->support_style!=smsTreeHybrid) {
 | 
					                        if (layer_id>0 && area_group.dist_to_top < 10 && !with_infill && support_style!=smsTreeHybrid) {
 | 
				
			||||||
                            if (area_group.dist_to_top < 5)  // 1 wall at the top <5mm
 | 
					                            if (area_group.dist_to_top < 5)  // 1 wall at the top <5mm
 | 
				
			||||||
                                make_perimeter_and_inner_brim(ts_layer->support_fills.entities, poly, 1, flow, erSupportMaterial);
 | 
					                                make_perimeter_and_inner_brim(ts_layer->support_fills.entities, poly, 1, flow, erSupportMaterial);
 | 
				
			||||||
                            else // at least 2 walls for range [5,10)
 | 
					                            else // at least 2 walls for range [5,10)
 | 
				
			||||||
| 
						 | 
					@ -3325,7 +3323,7 @@ void TreeSupport::generate_contact_points(std::vector<std::vector<TreeSupport::N
 | 
				
			||||||
        for (const ExPolygon &overhang_part : overhang)
 | 
					        for (const ExPolygon &overhang_part : overhang)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            BoundingBox overhang_bounds = get_extents(overhang_part);
 | 
					            BoundingBox overhang_bounds = get_extents(overhang_part);
 | 
				
			||||||
            if (config.support_style.value==smsTreeHybrid && overhang_part.area() > m_support_params.thresh_big_overhang) {
 | 
					            if (support_style==smsTreeHybrid && overhang_part.area() > m_support_params.thresh_big_overhang) {
 | 
				
			||||||
                Point candidate = overhang_bounds.center();
 | 
					                Point candidate = overhang_bounds.center();
 | 
				
			||||||
                if (!overhang_part.contains(candidate))
 | 
					                if (!overhang_part.contains(candidate))
 | 
				
			||||||
                    move_inside_expoly(overhang_part, candidate);
 | 
					                    move_inside_expoly(overhang_part, candidate);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -381,6 +381,7 @@ public:
 | 
				
			||||||
    bool  has_sharp_tails = false;
 | 
					    bool  has_sharp_tails = false;
 | 
				
			||||||
    bool  has_cantilever = false;
 | 
					    bool  has_cantilever = false;
 | 
				
			||||||
    SupportType support_type;
 | 
					    SupportType support_type;
 | 
				
			||||||
 | 
					    SupportMaterialStyle support_style;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    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