diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 53eca40c6..d2f5256f9 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -450,7 +450,9 @@ static std::vector s_Preset_print_options { "support_material_synchronize_layers", "support_material_angle", "support_material_interface_layers", "support_material_bottom_interface_layers", "support_material_interface_pattern", "support_material_interface_spacing", "support_material_interface_contact_loops", "support_material_contact_distance", "support_material_bottom_contact_distance", - "support_material_buildplate_only", "dont_support_bridges", "thick_bridges", "notes", "complete_objects", "extruder_clearance_radius", + "support_material_buildplate_only", + "support_tree_angle", "support_tree_angle_slow", "support_tree_branch_diameter", "support_tree_branch_diameter_angle", "support_tree_top_rate", "support_tree_tip_diameter", + "dont_support_bridges", "thick_bridges", "notes", "complete_objects", "extruder_clearance_radius", "extruder_clearance_height", "gcode_comments", "gcode_label_objects", "output_filename_format", "post_process", "gcode_substitutions", "perimeter_extruder", "infill_extruder", "solid_infill_extruder", "support_material_extruder", "support_material_interface_extruder", "ooze_prevention", "standby_temperature_delta", "interface_shells", "extrusion_width", "first_layer_extrusion_width", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index c19722a14..c6f0eeab5 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2876,6 +2876,71 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert; def->set_default_value(new ConfigOptionBool(true)); + def = this->add("support_tree_angle", coFloat); + def->label = L("Tree Support Maximum Branch Angle"); + def->category = L("Support material"); + def->tooltip = L("The maximum angle of the branches, when the branches have to avoid the model. " + "Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach."); + def->sidetext = L("°"); + def->min = 0; + def->max = 85; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(40)); + + def = this->add("support_tree_angle_slow", coFloat); + def->label = L("Tree Support Preferred Branch Angle"); + def->category = L("Support material"); + def->tooltip = L("The preferred angle of the branches, when they do not have to avoid the model. " + "Use a lower angle to make them more vertical and more stable. Use a higher angle for branches to merge faster."); + def->sidetext = L("°"); + def->min = 10; + def->max = 85; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(25)); + + def = this->add("support_tree_tip_diameter", coFloat); + def->label = L("Tree Support Tip Diameter"); + def->category = L("Support material"); + def->tooltip = L("The diameter of the top of the tip of the branches of tree support."); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(0.8)); + + def = this->add("support_tree_branch_diameter", coFloat); + def->label = L("Tree Support Branch Diameter"); + def->category = L("Support material"); + def->tooltip = L("The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. " + "Branches towards the base will be thicker than this."); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(2)); + + def = this->add("support_tree_branch_diameter_angle", coFloat); + def->label = L("Tree Support Branch Diameter Angle"); + def->category = L("Support material"); + def->tooltip = L("The angle of the branches' diameter as they gradually become thicker towards the bottom. " + "An angle of 0 will cause the branches to have uniform thickness over their length. " + "A bit of an angle can increase stability of the tree support."); + def->sidetext = L("°"); + def->min = 0; + def->max = 15; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(5)); + + def = this->add("support_tree_top_rate", coPercent); + def->label = L("Tree Support Branch Density"); + def->category = L("Support material"); + def->tooltip = L("Adjusts the density of the support structure used to generate the tips of the branches. " + "A higher value results in better overhangs, but the supports are harder to remove. " + "Use Support Roof for very high values or ensure support density is similarly high at the top."); + def->sidetext = L("%"); + def->min = 5; + def->max_literal = 35; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionPercent(30)); + def = this->add("temperature", coInts); def->label = L("Other layers"); def->tooltip = L("Nozzle temperature for layers after the first one. Set this to zero to disable " diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 85c2ca794..eed5df626 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -547,6 +547,14 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionInt, support_material_threshold)) ((ConfigOptionBool, support_material_with_sheath)) ((ConfigOptionFloatOrPercent, support_material_xy_spacing)) + // Tree supports + ((ConfigOptionFloat, support_tree_angle)) + ((ConfigOptionFloat, support_tree_angle_slow)) + ((ConfigOptionFloat, support_tree_branch_diameter)) + ((ConfigOptionFloat, support_tree_branch_diameter_angle)) + ((ConfigOptionPercent, support_tree_top_rate)) + ((ConfigOptionFloat, support_tree_tip_diameter)) + // The rest ((ConfigOptionBool, thick_bridges)) ((ConfigOptionFloat, xy_size_compensation)) ((ConfigOptionBool, wipe_into_objects)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index abbf0fb93..dc75fb8a3 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -657,6 +657,12 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "support_material_synchronize_layers" || opt_key == "support_material_threshold" || opt_key == "support_material_with_sheath" + || opt_key == "support_tree_angle" + || opt_key == "support_tree_angle_slow" + || opt_key == "support_tree_branch_diameter" + || opt_key == "support_tree_branch_diameter_angle" + || opt_key == "support_tree_top_rate" + || opt_key == "support_tree_tip_diameter" || opt_key == "raft_expansion" || opt_key == "raft_first_layer_density" || opt_key == "raft_first_layer_expansion" diff --git a/src/libslic3r/TreeModelVolumes.cpp b/src/libslic3r/TreeModelVolumes.cpp index e8ab377d7..bcd071767 100644 --- a/src/libslic3r/TreeModelVolumes.cpp +++ b/src/libslic3r/TreeModelVolumes.cpp @@ -54,6 +54,7 @@ TreeSupportMeshGroupSettings::TreeSupportMeshGroupSettings(const PrintObject &pr this->layer_height = scaled(config.layer_height.value); this->resolution = scaled(print_config.gcode_resolution.value); + // Arache feature this->min_feature_size = scaled(config.min_feature_size.value); // +1 makes the threshold inclusive this->support_angle = 0.5 * M_PI - std::clamp((config.support_material_threshold + 1) * M_PI / 180., 0., 0.5 * M_PI); @@ -88,6 +89,14 @@ TreeSupportMeshGroupSettings::TreeSupportMeshGroupSettings(const PrintObject &pr // this->minimum_support_area = // this->minimum_bottom_area = // this->support_offset = +// this->support_tree_branch_distance = 2.5 * line_width ?? + this->support_tree_angle = std::clamp(config.support_tree_angle * M_PI / 180., 0., 0.5 * M_PI - EPSILON); + this->support_tree_angle_slow = std::clamp(config.support_tree_angle_slow * M_PI / 180., 0., this->support_tree_angle - EPSILON); + this->support_tree_branch_diameter = scaled(config.support_tree_branch_diameter.value); + this->support_tree_branch_diameter_angle = std::clamp(config.support_tree_branch_diameter_angle * M_PI / 180., 0., 0.5 * M_PI - EPSILON); + this->support_tree_top_rate = config.support_tree_top_rate.value; // percent +// this->support_tree_tip_diameter = this->support_line_width; + this->support_tree_tip_diameter = std::clamp(scaled(config.support_tree_tip_diameter.value), 0, this->support_tree_branch_diameter); } //FIXME Machine border is currently ignored. diff --git a/src/libslic3r/TreeModelVolumes.hpp b/src/libslic3r/TreeModelVolumes.hpp index 0ced2f422..99f5797d2 100644 --- a/src/libslic3r/TreeModelVolumes.hpp +++ b/src/libslic3r/TreeModelVolumes.hpp @@ -11,7 +11,6 @@ #include #include -#include #include @@ -43,7 +42,7 @@ struct TreeSupportMeshGroupSettings { // the print will be less accurate, but the g-code will be smaller. Maximum Deviation is a limit for Maximum Resolution, // so if the two conflict the Maximum Deviation will always be held true. coord_t resolution { scaled(0.025) }; - // Minimum Feature Size (aka minimum line width) + // Minimum Feature Size (aka minimum line width) - Arachne specific // Minimum thickness of thin features. Model features that are thinner than this value will not be printed, while features thicker // than the Minimum Feature Size will be widened to the Minimum Wall Line Width. coord_t min_feature_size { scaled(0.1) }; @@ -183,7 +182,7 @@ struct TreeSupportMeshGroupSettings { // 5%-35% double support_tree_top_rate { 15. }; // Tree Support Tip Diameter - // The diameter of the top of the tip of the branches of tree support." + // The diameter of the top of the tip of the branches of tree support. // minimum: min_wall_line_width, minimum warning: min_wall_line_width+0.05, maximum_value: support_tree_branch_diameter, value: support_line_width coord_t support_tree_tip_diameter { scaled(0.4) }; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 6e43afc3c..7d91f689d 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1526,6 +1526,14 @@ void TabPrint::build() optgroup->append_single_option_line("dont_support_bridges", category_path + "dont-support-bridges"); optgroup->append_single_option_line("support_material_synchronize_layers", category_path + "synchronize-with-object-layers"); + optgroup = page->new_optgroup(L("Tree supports")); + optgroup->append_single_option_line("support_tree_angle", category_path + "tree_angle"); + optgroup->append_single_option_line("support_tree_angle_slow", category_path + "tree_angle_slow"); + optgroup->append_single_option_line("support_tree_branch_diameter", category_path + "tree_branch_diameter"); + optgroup->append_single_option_line("support_tree_branch_diameter_angle", category_path + "tree_branch_diameter_angle"); + optgroup->append_single_option_line("support_tree_tip_diameter", category_path + "tree_tip_diameter"); + optgroup->append_single_option_line("support_tree_top_rate", category_path + "tree_top_rate"); + page = add_options_page(L("Speed"), "time"); optgroup = page->new_optgroup(L("Speed for print moves")); optgroup->append_single_option_line("perimeter_speed");