mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-13 09:47:58 -06:00
FDM snug supports: New parameter "closing radius", inspired by Cura's
support_join_distance
This commit is contained in:
parent
1bf5654231
commit
dbd1c09523
8 changed files with 32 additions and 6 deletions
|
@ -1967,8 +1967,9 @@ public:
|
||||||
int opt_int(const t_config_option_key &opt_key, unsigned int idx) const { return dynamic_cast<const ConfigOptionInts*>(this->option(opt_key))->get_at(idx); }
|
int opt_int(const t_config_option_key &opt_key, unsigned int idx) const { return dynamic_cast<const ConfigOptionInts*>(this->option(opt_key))->get_at(idx); }
|
||||||
|
|
||||||
// In ConfigManipulation::toggle_print_fff_options, it is called on option with type ConfigOptionEnumGeneric* and also ConfigOptionEnum*.
|
// In ConfigManipulation::toggle_print_fff_options, it is called on option with type ConfigOptionEnumGeneric* and also ConfigOptionEnum*.
|
||||||
|
// Thus the virtual method getInt() is used to retrieve the enum value.
|
||||||
template<typename ENUM>
|
template<typename ENUM>
|
||||||
ENUM opt_enum(const t_config_option_key &opt_key) const { return this->option<ConfigOptionEnum<ENUM>>(opt_key)->value; }
|
ENUM opt_enum(const t_config_option_key &opt_key) const { return static_cast<ENUM>(this->option(opt_key)->getInt()); }
|
||||||
|
|
||||||
bool opt_bool(const t_config_option_key &opt_key) const { return this->option<ConfigOptionBool>(opt_key)->value != 0; }
|
bool opt_bool(const t_config_option_key &opt_key) const { return this->option<ConfigOptionBool>(opt_key)->value != 0; }
|
||||||
bool opt_bool(const t_config_option_key &opt_key, unsigned int idx) const { return this->option<ConfigOptionBools>(opt_key)->get_at(idx) != 0; }
|
bool opt_bool(const t_config_option_key &opt_key, unsigned int idx) const { return this->option<ConfigOptionBools>(opt_key)->get_at(idx) != 0; }
|
||||||
|
|
|
@ -427,7 +427,7 @@ const std::vector<std::string>& Preset::print_options()
|
||||||
"bridge_acceleration", "first_layer_acceleration", "default_acceleration", "skirts", "skirt_distance", "skirt_height", "draft_shield",
|
"bridge_acceleration", "first_layer_acceleration", "default_acceleration", "skirts", "skirt_distance", "skirt_height", "draft_shield",
|
||||||
"min_skirt_length", "brim_width", "brim_offset", "brim_type", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers",
|
"min_skirt_length", "brim_width", "brim_offset", "brim_type", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers",
|
||||||
"raft_layers", "raft_first_layer_density", "raft_first_layer_expansion", "raft_contact_distance", "raft_expansion",
|
"raft_layers", "raft_first_layer_density", "raft_first_layer_expansion", "raft_contact_distance", "raft_expansion",
|
||||||
"support_material_pattern", "support_material_with_sheath", "support_material_spacing", "support_material_style",
|
"support_material_pattern", "support_material_with_sheath", "support_material_spacing", "support_material_closing_radius", "support_material_style",
|
||||||
"support_material_synchronize_layers", "support_material_angle", "support_material_interface_layers", "support_material_bottom_interface_layers",
|
"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_interface_pattern", "support_material_interface_spacing", "support_material_interface_contact_loops",
|
||||||
"support_material_contact_distance", "support_material_bottom_contact_distance",
|
"support_material_contact_distance", "support_material_bottom_contact_distance",
|
||||||
|
|
|
@ -2366,6 +2366,16 @@ void PrintConfigDef::init_fff_params()
|
||||||
def->mode = comAdvanced;
|
def->mode = comAdvanced;
|
||||||
def->set_default_value(new ConfigOptionInt(-1));
|
def->set_default_value(new ConfigOptionInt(-1));
|
||||||
|
|
||||||
|
def = this->add("support_material_closing_radius", coFloat);
|
||||||
|
def->label = L("Closing radius");
|
||||||
|
def->category = L("Support material");
|
||||||
|
def->tooltip = L("For snug supports, the support regions will be merged using morphological closing operation."
|
||||||
|
" Gaps smaller than the closing radius will be filled in.");
|
||||||
|
def->sidetext = L("mm");
|
||||||
|
def->min = 0;
|
||||||
|
def->mode = comAdvanced;
|
||||||
|
def->set_default_value(new ConfigOptionFloat(2));
|
||||||
|
|
||||||
def = this->add("support_material_interface_spacing", coFloat);
|
def = this->add("support_material_interface_spacing", coFloat);
|
||||||
def->label = L("Interface pattern spacing");
|
def->label = L("Interface pattern spacing");
|
||||||
def->category = L("Support material");
|
def->category = L("Support material");
|
||||||
|
|
|
@ -530,6 +530,8 @@ public:
|
||||||
ConfigOptionFloatOrPercent support_material_interface_speed;
|
ConfigOptionFloatOrPercent support_material_interface_speed;
|
||||||
ConfigOptionEnum<SupportMaterialPattern> support_material_pattern;
|
ConfigOptionEnum<SupportMaterialPattern> support_material_pattern;
|
||||||
ConfigOptionEnum<SupportMaterialInterfacePattern> support_material_interface_pattern;
|
ConfigOptionEnum<SupportMaterialInterfacePattern> support_material_interface_pattern;
|
||||||
|
// Morphological closing of support areas. Only used for "sung" supports.
|
||||||
|
ConfigOptionFloat support_material_closing_radius;
|
||||||
// Spacing between support material lines (the hatching distance).
|
// Spacing between support material lines (the hatching distance).
|
||||||
ConfigOptionFloat support_material_spacing;
|
ConfigOptionFloat support_material_spacing;
|
||||||
ConfigOptionFloat support_material_speed;
|
ConfigOptionFloat support_material_speed;
|
||||||
|
@ -579,6 +581,7 @@ protected:
|
||||||
OPT_PTR(support_material_interface_extruder);
|
OPT_PTR(support_material_interface_extruder);
|
||||||
OPT_PTR(support_material_interface_layers);
|
OPT_PTR(support_material_interface_layers);
|
||||||
OPT_PTR(support_material_bottom_interface_layers);
|
OPT_PTR(support_material_bottom_interface_layers);
|
||||||
|
OPT_PTR(support_material_closing_radius);
|
||||||
OPT_PTR(support_material_interface_spacing);
|
OPT_PTR(support_material_interface_spacing);
|
||||||
OPT_PTR(support_material_interface_speed);
|
OPT_PTR(support_material_interface_speed);
|
||||||
OPT_PTR(support_material_pattern);
|
OPT_PTR(support_material_pattern);
|
||||||
|
|
|
@ -591,6 +591,7 @@ bool PrintObject::invalidate_state_by_config_options(
|
||||||
|| opt_key == "support_material_style"
|
|| opt_key == "support_material_style"
|
||||||
|| opt_key == "support_material_xy_spacing"
|
|| opt_key == "support_material_xy_spacing"
|
||||||
|| opt_key == "support_material_spacing"
|
|| opt_key == "support_material_spacing"
|
||||||
|
|| opt_key == "support_material_closing_radius"
|
||||||
|| opt_key == "support_material_synchronize_layers"
|
|| opt_key == "support_material_synchronize_layers"
|
||||||
|| opt_key == "support_material_threshold"
|
|| opt_key == "support_material_threshold"
|
||||||
|| opt_key == "support_material_with_sheath"
|
|| opt_key == "support_material_with_sheath"
|
||||||
|
|
|
@ -672,6 +672,7 @@ struct SupportGridParams {
|
||||||
grid_resolution(object_config.support_material_spacing.value + support_material_flow.spacing()),
|
grid_resolution(object_config.support_material_spacing.value + support_material_flow.spacing()),
|
||||||
support_angle(Geometry::deg2rad(object_config.support_material_angle.value)),
|
support_angle(Geometry::deg2rad(object_config.support_material_angle.value)),
|
||||||
extrusion_width(support_material_flow.spacing()),
|
extrusion_width(support_material_flow.spacing()),
|
||||||
|
support_material_closing_radius(object_config.support_material_closing_radius.value),
|
||||||
expansion_to_slice(coord_t(support_material_flow.scaled_spacing() / 2 + 5)),
|
expansion_to_slice(coord_t(support_material_flow.scaled_spacing() / 2 + 5)),
|
||||||
expansion_to_propagate(-3) {}
|
expansion_to_propagate(-3) {}
|
||||||
|
|
||||||
|
@ -679,6 +680,7 @@ struct SupportGridParams {
|
||||||
double grid_resolution;
|
double grid_resolution;
|
||||||
double support_angle;
|
double support_angle;
|
||||||
double extrusion_width;
|
double extrusion_width;
|
||||||
|
double support_material_closing_radius;
|
||||||
coord_t expansion_to_slice;
|
coord_t expansion_to_slice;
|
||||||
coord_t expansion_to_propagate;
|
coord_t expansion_to_propagate;
|
||||||
};
|
};
|
||||||
|
@ -694,7 +696,9 @@ public:
|
||||||
const SupportGridParams ¶ms) :
|
const SupportGridParams ¶ms) :
|
||||||
m_style(params.style),
|
m_style(params.style),
|
||||||
m_support_polygons(support_polygons), m_trimming_polygons(trimming_polygons),
|
m_support_polygons(support_polygons), m_trimming_polygons(trimming_polygons),
|
||||||
m_support_spacing(params.grid_resolution), m_support_angle(params.support_angle)
|
m_support_spacing(params.grid_resolution), m_support_angle(params.support_angle),
|
||||||
|
m_extrusion_width(params.extrusion_width),
|
||||||
|
m_support_material_closing_radius(params.support_material_closing_radius)
|
||||||
{
|
{
|
||||||
switch (m_style) {
|
switch (m_style) {
|
||||||
case smsGrid:
|
case smsGrid:
|
||||||
|
@ -878,9 +882,10 @@ public:
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
case smsSnug:
|
case smsSnug:
|
||||||
// Just close the gaps.
|
// Merge the support polygons by applying morphological closing and inwards smoothing.
|
||||||
float thr = scaled<float>(0.5);
|
auto closing_distance = scaled<float>(m_support_material_closing_radius);
|
||||||
return smooth_outward(offset(offset_ex(*m_support_polygons, thr), - thr), thr);
|
auto smoothing_distance = scaled<float>(m_extrusion_width);
|
||||||
|
return smooth_outward(offset(offset_ex(*m_support_polygons, closing_distance), - closing_distance), smoothing_distance);
|
||||||
}
|
}
|
||||||
assert(false);
|
assert(false);
|
||||||
return Polygons();
|
return Polygons();
|
||||||
|
@ -1128,6 +1133,9 @@ private:
|
||||||
coordf_t m_support_angle;
|
coordf_t m_support_angle;
|
||||||
// X spacing of the support lines parallel with the Y axis.
|
// X spacing of the support lines parallel with the Y axis.
|
||||||
coordf_t m_support_spacing;
|
coordf_t m_support_spacing;
|
||||||
|
coordf_t m_extrusion_width;
|
||||||
|
// For snug supports: Morphological closing of support areas.
|
||||||
|
coordf_t m_support_material_closing_radius;
|
||||||
|
|
||||||
#ifdef SUPPORT_USE_AGG_RASTERIZER
|
#ifdef SUPPORT_USE_AGG_RASTERIZER
|
||||||
Vec2i m_grid_size;
|
Vec2i m_grid_size;
|
||||||
|
|
|
@ -278,6 +278,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
|
||||||
bool have_support_material_auto = have_support_material && config->opt_bool("support_material_auto");
|
bool have_support_material_auto = have_support_material && config->opt_bool("support_material_auto");
|
||||||
bool have_support_interface = config->opt_int("support_material_interface_layers") > 0;
|
bool have_support_interface = config->opt_int("support_material_interface_layers") > 0;
|
||||||
bool have_support_soluble = have_support_material && config->opt_float("support_material_contact_distance") == 0;
|
bool have_support_soluble = have_support_material && config->opt_float("support_material_contact_distance") == 0;
|
||||||
|
auto support_material_style = config->opt_enum<SupportMaterialStyle>("support_material_style");
|
||||||
for (auto el : { "support_material_style", "support_material_pattern", "support_material_with_sheath",
|
for (auto el : { "support_material_style", "support_material_pattern", "support_material_with_sheath",
|
||||||
"support_material_spacing", "support_material_angle",
|
"support_material_spacing", "support_material_angle",
|
||||||
"support_material_interface_pattern", "support_material_interface_layers",
|
"support_material_interface_pattern", "support_material_interface_layers",
|
||||||
|
@ -286,6 +287,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
|
||||||
toggle_field(el, have_support_material);
|
toggle_field(el, have_support_material);
|
||||||
toggle_field("support_material_threshold", have_support_material_auto);
|
toggle_field("support_material_threshold", have_support_material_auto);
|
||||||
toggle_field("support_material_bottom_contact_distance", have_support_material && ! have_support_soluble);
|
toggle_field("support_material_bottom_contact_distance", have_support_material && ! have_support_soluble);
|
||||||
|
toggle_field("support_material_closing_radius", have_support_material && support_material_style == smsSnug);
|
||||||
|
|
||||||
for (auto el : { "support_material_bottom_interface_layers", "support_material_interface_spacing", "support_material_interface_extruder",
|
for (auto el : { "support_material_bottom_interface_layers", "support_material_interface_spacing", "support_material_interface_extruder",
|
||||||
"support_material_interface_speed", "support_material_interface_contact_loops" })
|
"support_material_interface_speed", "support_material_interface_contact_loops" })
|
||||||
|
|
|
@ -1515,6 +1515,7 @@ void TabPrint::build()
|
||||||
optgroup->append_single_option_line("support_material_with_sheath", category_path + "with-sheath-around-the-support");
|
optgroup->append_single_option_line("support_material_with_sheath", category_path + "with-sheath-around-the-support");
|
||||||
optgroup->append_single_option_line("support_material_spacing", category_path + "pattern-spacing-0-inf");
|
optgroup->append_single_option_line("support_material_spacing", category_path + "pattern-spacing-0-inf");
|
||||||
optgroup->append_single_option_line("support_material_angle", category_path + "pattern-angle");
|
optgroup->append_single_option_line("support_material_angle", category_path + "pattern-angle");
|
||||||
|
optgroup->append_single_option_line("support_material_closing_radius", category_path + "pattern-angle");
|
||||||
optgroup->append_single_option_line("support_material_interface_layers", category_path + "interface-layers");
|
optgroup->append_single_option_line("support_material_interface_layers", category_path + "interface-layers");
|
||||||
optgroup->append_single_option_line("support_material_bottom_interface_layers", category_path + "interface-layers");
|
optgroup->append_single_option_line("support_material_bottom_interface_layers", category_path + "interface-layers");
|
||||||
optgroup->append_single_option_line("support_material_interface_pattern", category_path + "interface-pattern");
|
optgroup->append_single_option_line("support_material_interface_pattern", category_path + "interface-pattern");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue