FIX: add clumping detect area parameter

1. add wrapping detect area parameter
2. fix spiral retract bug
3. modify the enable parameter to print config
4. close clumping detect for manual cali mode
jira: STUDIO-13761 & STUDIO-13766

Change-Id: Ib597ca48a0342a8ae3930f5e790085987f252374
(cherry picked from commit 698a5e6bc0b281ba77fc1fd7692daec09cb440b4)
This commit is contained in:
zhimin.zeng 2025-08-01 19:19:18 +08:00 committed by Noisyfox
parent b39bc5bf8f
commit 89c58fb4d9
20 changed files with 56 additions and 78 deletions

View file

@ -24,7 +24,6 @@
"0x0,325x0,325x320,0x320",
"25x0,350x0,350x320,25x320"
],
"enable_wrapping_detection": "1",
"hotend_heating_rate": "3.6",
"machine_load_filament_time": "30",
"machine_max_speed_e": [

View file

@ -28,7 +28,6 @@
"extruder_offset": [
"0x0"
],
"enable_wrapping_detection": "0",
"gcode_flavor": "marlin",
"grab_length": [
"0"

View file

@ -23,6 +23,7 @@
"enable_prime_tower": "1",
"enable_support": "0",
"enable_circle_compensation": "0",
"enable_wrapping_detection": "0",
"filename_format": "{input_filename_base}_{filament_type[0]}_{print_time}.gcode",
"gap_infill_speed": "30",
"infill_combination": "0",

View file

@ -4,6 +4,7 @@
"inherits": "fdm_process_common",
"from": "system",
"instantiation": "false",
"enable_wrapping_detection": "1",
"bridge_speed": "50",
"default_acceleration": "10000",
"enable_overhang_speed":"1",

View file

@ -4740,7 +4740,7 @@ LayerResult GCode::process_layer(
}
}
if (!has_insert_wrapping_detection_gcode) {
if (print.config().enable_wrapping_detection && !has_insert_wrapping_detection_gcode) {
gcode += this->retract(false, false, auto_lift_type);
gcode += insert_wrapping_detection_gcode();
has_insert_wrapping_detection_gcode = true;
@ -4758,7 +4758,7 @@ LayerResult GCode::process_layer(
has_insert_timelapse_gcode = true;
}
if (!has_insert_wrapping_detection_gcode) {
if (print.config().enable_wrapping_detection && !has_insert_wrapping_detection_gcode) {
gcode += this->retract(false, false, auto_lift_type);
gcode += insert_wrapping_detection_gcode();
has_insert_wrapping_detection_gcode = true;

View file

@ -75,33 +75,4 @@ int get_index_for_extruder_parameter(const DynamicPrintConfig &config, const std
return variant_index;
}
std::vector<Vec2d> get_wrapping_detection_area(const std::vector<Vec2d> &wrapping_detection_path, double avoidance_radius)
{
if (wrapping_detection_path.empty())
return std::vector<Vec2d>();
double min_x = wrapping_detection_path[0](0);
double max_x = wrapping_detection_path[0](0);
double min_y = wrapping_detection_path[0](1);
double max_y = wrapping_detection_path[0](1);
for (const Vec2d& pt : wrapping_detection_path) {
if (pt(0) < min_x)
min_x = pt(0);
if (pt(0) > max_x)
max_x = pt(0);
if (pt(1) < min_y)
min_y = pt(1);
if (pt(1) > max_y)
max_y = pt(1);
}
min_x = min_x - avoidance_radius;
min_y = min_y - avoidance_radius;
max_x = max_x + avoidance_radius;
max_y = max_y + avoidance_radius;
return {{min_x, min_y}, {max_x, min_y}, {max_x, max_y}, {min_x, max_y}};
}
}; // namespace Slic3r

View file

@ -11,8 +11,6 @@ std::vector<LayerPrintSequence> get_other_layers_print_sequence(int sequence_num
void get_other_layers_print_sequence(const std::vector<LayerPrintSequence> &customize_sequences, int &sequence_nums, std::vector<int> &sequence);
extern int get_index_for_extruder_parameter(const DynamicPrintConfig &config, const std::string &opt_key, int cur_extruder_id, ExtruderType extruder_type, NozzleVolumeType nozzle_volume_type);
extern std::vector<Vec2d> get_wrapping_detection_area(const std::vector<Vec2d> &wrapping_detection_path, double avoidance_radius);
} // namespace Slic3r
#endif // slic3r_Parameter_Utils_hpp_

View file

@ -942,6 +942,7 @@ static std::vector<std::string> s_Preset_print_options {
"wipe_tower_rotation_angle", "tree_support_branch_distance_organic", "tree_support_branch_diameter_organic", "tree_support_branch_angle_organic",
"hole_to_polyhole", "hole_to_polyhole_threshold", "hole_to_polyhole_twisted", "mmu_segmented_region_max_width", "mmu_segmented_region_interlocking_depth",
"small_area_infill_flow_compensation", "small_area_infill_flow_compensation_model",
"enable_wrapping_detection",
"seam_slope_type", "seam_slope_conditional", "scarf_angle_threshold", "scarf_joint_speed", "scarf_joint_flow_ratio", "seam_slope_start_height", "seam_slope_entire_loop", "seam_slope_min_length", "seam_slope_steps", "seam_slope_inner_walls", "scarf_overhang_threshold",
"interlocking_beam", "interlocking_orientation", "interlocking_beam_layer_count", "interlocking_depth", "interlocking_boundary_avoidance", "interlocking_beam_width","calib_flowrate_topinfill_special_order",
};
@ -1003,7 +1004,7 @@ static std::vector<std::string> s_Preset_printer_options {
"nozzle_height", "master_extruder_id",
"default_print_profile", "inherits",
"silent_mode",
"scan_first_layer", "enable_wrapping_detection", "wrapping_detection_layers", "wrapping_detection_path", "machine_load_filament_time", "machine_unload_filament_time", "machine_tool_change_time", "time_cost", "machine_pause_gcode", "template_custom_gcode",
"scan_first_layer", "enable_wrapping_detection", "wrapping_detection_layers", "wrapping_exclude_area", "machine_load_filament_time", "machine_unload_filament_time", "machine_tool_change_time", "time_cost", "machine_pause_gcode", "template_custom_gcode",
"nozzle_type", "nozzle_hrc","auxiliary_fan", "nozzle_volume","upward_compatible_machine", "z_hop_types", "travel_slope", "retract_lift_enforce","support_chamber_temp_control","support_air_filtration","printer_structure",
"best_object_pos", "head_wrap_detect_zone",
"host_type", "print_host", "printhost_apikey", "bbl_use_printhost",
@ -2897,7 +2898,7 @@ inline t_config_option_keys deep_diff(const ConfigBase &config_this, const Confi
if (this_opt != nullptr && other_opt != nullptr && *this_opt != *other_opt)
{
//BBS: add bed_exclude_area
if (opt_key == "printable_area" || opt_key == "bed_exclude_area" || opt_key == "compatible_prints" || opt_key == "compatible_printers" || opt_key == "thumbnails") {
if (opt_key == "printable_area" || opt_key == "bed_exclude_area" || opt_key == "compatible_prints" || opt_key == "compatible_printers" || opt_key == "thumbnails" || opt_key == "wrapping_exclude_area") {
// Scalar variable, or a vector variable, which is independent from number of extruders,
// thus the vector is presented to the user as a single input.
diff.emplace_back(opt_key);

View file

@ -137,7 +137,6 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n
"inner_wall_acceleration",
"initial_layer_acceleration",
"top_surface_acceleration",
"enable_wrapping_detection",
"bridge_acceleration",
"travel_acceleration",
"sparse_infill_acceleration",
@ -302,6 +301,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n
|| opt_key == "hot_plate_temp"
|| opt_key == "textured_plate_temp"
|| opt_key == "enable_prime_tower"
|| opt_key == "enable_wrapping_detection"
|| opt_key == "prime_tower_enable_framework"
|| opt_key == "prime_tower_width"
|| opt_key == "prime_tower_brim_width"
@ -922,7 +922,7 @@ static StringObjectException layered_print_cleareance_valid(const Print &print,
std::for_each(exclude_polys.begin(), exclude_polys.end(),
[&print_origin](Polygon& p) { p.translate(scale_(print_origin.x()), scale_(print_origin.y())); });
Pointfs wrapping_detection_area = get_wrapping_detection_area(print_config.wrapping_detection_path.values, print_config.extruder_clearance_radius.value / 2);
Pointfs wrapping_detection_area = print_config.wrapping_exclude_area.values;
Polygon wrapping_poly;
for (size_t i = 0; i < wrapping_detection_area.size(); ++i) {
auto pt = wrapping_detection_area[i];

View file

@ -3576,11 +3576,12 @@ void PrintConfigDef::init_fff_params()
def->mode = comDevelop;
def->set_default_value(new ConfigOptionInt(20));
def = this->add("wrapping_detection_path", coPoints);
//def->label = L("Clumping detection position");
//def->tooltip = L("Clumping detection position.");
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionPoints{Vec2d(197.5, 326), Vec2d(207.5, 326)});
def = this->add("wrapping_exclude_area", coPoints);
def->label = L("Probing exclude area of clumping");
def->tooltip = L("Probing exclude area of clumping.");
def->mode = comAdvanced;
def->gui_type = ConfigOptionDef::GUIType::one_string;
def->set_default_value(new ConfigOptionPoints{Vec2d(145, 326), Vec2d(145, 310), Vec2d(256, 310), Vec2d(256, 326)});
def = this->add("sparse_infill_filament", coInt);
def->gui_type = ConfigOptionDef::GUIType::i_enum_open;

View file

@ -1250,7 +1250,7 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionBool, scan_first_layer))
((ConfigOptionBool, enable_wrapping_detection))
((ConfigOptionInt, wrapping_detection_layers))
((ConfigOptionPoints, wrapping_detection_path))
((ConfigOptionPoints, wrapping_exclude_area))
((ConfigOptionPoints, thumbnail_size))
// ((ConfigOptionBool, spaghetti_detector))
((ConfigOptionBool, gcode_add_line_number))

View file

@ -323,6 +323,7 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
new_conf.set_key_value("overhang_reverse", new ConfigOptionBool(false));
new_conf.set_key_value("wall_direction", new ConfigOptionEnum<WallDirection>(WallDirection::Auto));
new_conf.set_key_value("timelapse_type", new ConfigOptionEnum<TimelapseType>(tlTraditional));
new_conf.set_key_value("enable_wrapping_detection", new ConfigOptionBool(false));
sparse_infill_density = 0;
timelapse_type = TimelapseType::tlTraditional;
support = false;
@ -976,7 +977,7 @@ void ConfigManipulation::toggle_print_sla_options(DynamicPrintConfig* config)
int ConfigManipulation::show_spiral_mode_settings_dialog(bool is_object_config)
{
wxString msg_text = _(L("Spiral mode only works when wall loops is 1, support is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional."));
wxString msg_text = _(L("Spiral mode only works when wall loops is 1, support is disabled, clumping detection by probing is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional."));
auto printer_structure_opt = wxGetApp().preset_bundle->printers.get_edited_preset().config.option<ConfigOptionEnum<PrinterStructure>>("printer_structure");
if (printer_structure_opt && printer_structure_opt->value == PrinterStructure::psI3) {
msg_text += _(L(" But machines with I3 structure will not generate timelapse videos."));

View file

@ -2910,9 +2910,8 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
auto timelapse_type = dconfig.option<ConfigOptionEnum<TimelapseType>>("timelapse_type");
bool need_wipe_tower = timelapse_type ? (timelapse_type->value == TimelapseType::tlSmooth) : false;
const DynamicPrintConfig & printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config;
if (printer_config.has("enable_wrapping_detection")) {
need_wipe_tower |= dynamic_cast<const ConfigOptionBool*>(printer_config.option("enable_wrapping_detection"))->value;
if (dconfig.has("enable_wrapping_detection")) {
need_wipe_tower |= dynamic_cast<const ConfigOptionBool*>(dconfig.option("enable_wrapping_detection"))->value;
}
if (wt && (need_wipe_tower || filaments_count > 1) && !wxGetApp().plater()->only_gcode_mode() && !wxGetApp().plater()->is_gcode_3mf()) {
@ -2943,7 +2942,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
const DynamicPrintConfig &print_cfg = wxGetApp().preset_bundle->prints.get_edited_preset().config;
double wipe_vol = get_max_element(v);
int nozzle_nums = wxGetApp().preset_bundle->get_printer_extruder_count();
Vec3d wipe_tower_size = ppl.get_plate(plate_id)->estimate_wipe_tower_size(print_cfg, w, wipe_vol, nozzle_nums, 0, false, dynamic_cast<const ConfigOptionBool*>(printer_config.option("enable_wrapping_detection"))->value);
Vec3d wipe_tower_size = ppl.get_plate(plate_id)->estimate_wipe_tower_size(print_cfg, w, wipe_vol, nozzle_nums, 0, false, dynamic_cast<const ConfigOptionBool*>(dconfig.option("enable_wrapping_detection"))->value);
{
const float margin = WIPE_TOWER_MARGIN + brim_width;

View file

@ -214,7 +214,7 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt
}
break;
case coPoints:{
if (opt_key == "printable_area" || opt_key == "bed_exclude_area" || opt_key == "thumbnails") {
if (opt_key == "printable_area" || opt_key == "bed_exclude_area" || opt_key == "thumbnails" || opt_key == "wrapping_exclude_area" ) {
config.option<ConfigOptionPoints>(opt_key)->values = boost::any_cast<std::vector<Vec2d>>(value);
break;
}

View file

@ -957,9 +957,10 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config
double val = opt->type == coFloats ?
config.option<ConfigOptionFloatsNullable>(opt_key)->get_at(idx) :
config.option<ConfigOptionPercentsNullable>(opt_key)->get_at(idx);
ret = double_to_string(val); }
ret = double_to_string(val);
}
break;
}
case coFloatsOrPercents: {
if (opt_index < 0 ? config.option(opt_key)->is_nil() : dynamic_cast<ConfigOptionVectorBase const*>(config.option(opt_key))->is_nil(opt_index))
ret = _(L("N/A"));
@ -1095,7 +1096,7 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config
ret = get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
else if (opt_key == "bed_exclude_area")
ret = get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
else if (opt_key == "wrapping_detection_path")
else if (opt_key == "wrapping_exclude_area")
ret = get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
else
ret = config.option<ConfigOptionPoints>(opt_key)->get_at(idx);
@ -1232,7 +1233,7 @@ boost::any ConfigOptionsGroup::get_config_value2(const DynamicPrintConfig& confi
ret = get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
else if (opt_key == "bed_exclude_area")
ret = get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
else if (opt_key == "wrapping_detection_path")
else if (opt_key == "wrapping_exclude_area")
ret = get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
else
ret = config.option<ConfigOptionPoints>(opt_key)->get_at(idx);

View file

@ -349,12 +349,11 @@ bool PartPlate::get_spiral_vase_mode() const
std::vector<Vec2d> PartPlate::get_plate_wrapping_detection_area() const
{
DynamicPrintConfig gconfig = wxGetApp().preset_bundle->printers.get_edited_preset().config;
ConfigOptionPoints *wrapping_path_opt = gconfig.option<ConfigOptionPoints>("wrapping_detection_path");
ConfigOptionFloat *clearance_max_radius_opt = gconfig.option<ConfigOptionFloat>("extruder_clearance_radius");
if (wrapping_path_opt && clearance_max_radius_opt) {
std::vector<Vec2d> wrapping_area = get_wrapping_detection_area(wrapping_path_opt->values, clearance_max_radius_opt->value / 2);
for (Vec2d &pt : wrapping_area) {
DynamicPrintConfig gconfig = wxGetApp().preset_bundle->printers.get_edited_preset().config;
ConfigOptionPoints *wrapping_exclude_area_opt = gconfig.option<ConfigOptionPoints>("wrapping_exclude_area");
if (wrapping_exclude_area_opt) {
std::vector<Vec2d> wrapping_area = wrapping_exclude_area_opt->values;
for (Vec2d& pt : wrapping_area) {
pt += Vec2d(m_origin.x(), m_origin.y());
}
return wrapping_area;

View file

@ -4946,8 +4946,8 @@ std::map<std::string, std::string> Plater::get_bed_texture_maps()
bool Plater::get_enable_wrapping_detection()
{
const DynamicPrintConfig & printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config;
const ConfigOptionBool * wrapping_detection = printer_config.option<ConfigOptionBool>("enable_wrapping_detection");
const DynamicPrintConfig & print_config = wxGetApp().preset_bundle->prints.get_edited_preset().config;
const ConfigOptionBool * wrapping_detection = print_config.option<ConfigOptionBool>("enable_wrapping_detection");
return (wrapping_detection != nullptr) && wrapping_detection->value;
}
@ -11588,10 +11588,10 @@ void Plater::_calib_pa_pattern(const Calib_Params& params)
);
}
print_config.set_key_value(
SuggestedConfigCalibPAPattern().brim_pair.first,
new ConfigOptionEnum<BrimType>(SuggestedConfigCalibPAPattern().brim_pair.second)
);
print_config.set_key_value(SuggestedConfigCalibPAPattern().brim_pair.first,
new ConfigOptionEnum<BrimType>(SuggestedConfigCalibPAPattern().brim_pair.second));
print_config.set_key_value("enable_wrapping_detection", new ConfigOptionBool(false));
// Orca: Set the outer wall speed to the optimal speed for the test, cap it with max volumetric speed
if (speeds.empty()) {
@ -11778,6 +11778,7 @@ void Plater::_calib_pa_tower(const Calib_Params& params) {
const double nozzle_diameter = printer_config->option<ConfigOptionFloats>("nozzle_diameter")->get_at(0);
print_config.set_key_value("enable_wrapping_detection", new ConfigOptionBool(false));
filament_config->set_key_value("slow_down_layer_time", new ConfigOptionFloats{ 1.0f });
@ -11942,7 +11943,7 @@ void adjust_settings_for_flowrate_calib(ModelObjectPtrs& objects, bool linear, i
print_config->set_key_value("alternate_extra_wall", new ConfigOptionBool(false));
print_config->set_key_value("initial_layer_print_height", new ConfigOptionFloat(first_layer_height));
print_config->set_key_value("reduce_crossing_wall", new ConfigOptionBool(true));
print_config->set_key_value("enable_wrapping_detection", new ConfigOptionBool(false));
wxGetApp().get_tab(Preset::TYPE_PRINT)->update_dirty();
wxGetApp().get_tab(Preset::TYPE_FILAMENT)->update_dirty();
@ -12015,6 +12016,9 @@ void Plater::calib_temp(const Calib_Params& params) {
model().objects[0]->config.set_key_value("alternate_extra_wall", new ConfigOptionBool(false));
model().objects[0]->config.set_key_value("seam_slope_type", new ConfigOptionEnum<SeamScarfType>(SeamScarfType::None));
auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config;
print_config->set_key_value("enable_wrapping_detection", new ConfigOptionBool(false));
changed_objects({ 0 });
wxGetApp().get_tab(Preset::TYPE_PRINT)->update_dirty();
wxGetApp().get_tab(Preset::TYPE_FILAMENT)->update_dirty();
@ -12095,6 +12099,7 @@ void Plater::calib_max_vol_speed(const Calib_Params& params)
print_config->set_key_value("timelapse_type", new ConfigOptionEnum<TimelapseType>(tlTraditional));
print_config->set_key_value("spiral_mode", new ConfigOptionBool(true));
print_config->set_key_value("max_volumetric_extrusion_rate_slope", new ConfigOptionFloat(0));
print_config->set_key_value("enable_wrapping_detection", new ConfigOptionBool(false));
changed_objects({ 0 });
wxGetApp().get_tab(Preset::TYPE_PRINT)->update_dirty();
@ -12135,6 +12140,8 @@ void Plater::calib_retraction(const Calib_Params& params)
auto printer_config = &wxGetApp().preset_bundle->printers.get_edited_preset().config;
auto obj = model().objects[0];
print_config->set_key_value("enable_wrapping_detection", new ConfigOptionBool(false));
double layer_height = 0.2;
auto max_lh = printer_config->option<ConfigOptionFloats>("max_layer_height");
@ -12187,6 +12194,7 @@ void Plater::calib_VFA(const Calib_Params& params)
print_config->set_key_value("overhang_reverse", new ConfigOptionBool(false));
print_config->set_key_value("detect_thin_wall", new ConfigOptionBool(false));
print_config->set_key_value("spiral_mode", new ConfigOptionBool(true));
print_config->set_key_value("enable_wrapping_detection", new ConfigOptionBool(false));
model().objects[0]->config.set_key_value("brim_type", new ConfigOptionEnum<BrimType>(btOuterOnly));
model().objects[0]->config.set_key_value("brim_width", new ConfigOptionFloat(3.0));
model().objects[0]->config.set_key_value("brim_object_gap", new ConfigOptionFloat(0.0));

View file

@ -956,8 +956,7 @@ void Tab::init_options_list()
for (const std::string& opt_key : m_config->keys())
{
if (opt_key == "printable_area" || opt_key == "bed_exclude_area" || opt_key == "compatible_prints" || opt_key == "compatible_printers" || opt_key == "thumbnails"
|| opt_key == "wrapping_detection_path") {
if (opt_key == "printable_area" || opt_key == "bed_exclude_area" || opt_key == "compatible_prints" || opt_key == "compatible_printers" || opt_key == "thumbnails" || opt_key == "wrapping_exclude_area") {
m_options_list.emplace(opt_key, m_opt_status_value);
continue;
}
@ -1584,7 +1583,7 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value)
set_enable_prime_tower = true;
}
}
bool enable_wrapping = m_preset_bundle->printers.get_edited_preset().config.option<ConfigOptionBool>("enable_wrapping_detection")->value;
bool enable_wrapping = m_config->option<ConfigOptionBool>("enable_wrapping_detection")->value;
if (enable_wrapping && !set_enable_prime_tower) {
MessageDialog dlg(wxGetApp().plater(),
_L("A prime tower is required for clumping detection. There may be flaws on the model without prime tower. Are you sure you want to disable prime tower?"),
@ -1613,7 +1612,7 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value)
}
if (opt_key == "enable_wrapping_detection") {
bool wipe_tower_enabled = m_preset_bundle->prints.get_edited_preset().config.option<ConfigOptionBool>("enable_prime_tower")->value;
bool wipe_tower_enabled = m_config->option<ConfigOptionBool>("enable_prime_tower")->value;
if (boost::any_cast<bool>(value) && !wipe_tower_enabled) {
MessageDialog dlg(wxGetApp().plater(),
_L("Prime tower is required for clumping detection. There may be flaws on the model without prime tower. Do you still want to enable clumping detection?"),
@ -2656,6 +2655,7 @@ optgroup->append_single_option_line("skirt_loops", "others_settings_skirt#loops"
optgroup->append_single_option_line("spiral_finishing_flow_ratio", "others_settings_special_mode#spiral-finishing-flow-ratio");
optgroup->append_single_option_line("timelapse_type", "others_settings_special_mode#timelapse");
optgroup->append_single_option_line("enable_wrapping_detection");
optgroup = page->new_optgroup(L("Fuzzy Skin"), L"fuzzy_skin");
optgroup->append_single_option_line("fuzzy_skin", "others_settings_fuzzy_skin");
@ -4199,8 +4199,9 @@ void TabPrinter::build_fff()
optgroup->append_single_option_line("bbl_use_printhost");
optgroup->append_single_option_line("scan_first_layer");
optgroup->append_single_option_line("enable_wrapping_detection");
//optgroup->append_single_option_line("wrapping_detection_layers");
//optgroup->append_single_option_line("wrapping_detection_path");
option = optgroup->get_option("wrapping_exclude_area");
option.opt.full_width = true;
optgroup->append_single_option_line(option);
optgroup->append_single_option_line("disable_m73");
option = optgroup->get_option("thumbnails");
option.opt.full_width = true;
@ -5025,10 +5026,6 @@ void TabPrinter::toggle_options()
// SoftFever: hide non-BBL settings
for (auto el : {"use_firmware_retraction", "use_relative_e_distances", "support_multi_bed_types", "pellet_modded_printer", "bed_mesh_max", "bed_mesh_min", "bed_mesh_probe_distance", "adaptive_bed_mesh_margin", "thumbnails"})
toggle_line(el, !is_BBL_printer);
PresetBundle *preset_bundle = wxGetApp().preset_bundle;
std::string printer_type = preset_bundle->printers.get_edited_preset().get_printer_type(preset_bundle);
toggle_line("enable_wrapping_detection", DevPrinterConfigUtil::support_wrapping_detection(printer_type));
}
if (m_active_page->title() == L("Machine G-code")) {

View file

@ -1363,7 +1363,7 @@ static wxString get_string_value(std::string opt_key, const DynamicPrintConfig&
else if (opt_key == "head_wrap_detect_zone") {
return get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
}
else if (opt_key == "wrapping_detection_path") {
else if (opt_key == "wrapping_exclude_area") {
return get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
}
Vec2d val = config.opt<ConfigOptionPoints>(opt_key)->get_at(opt_idx);

View file

@ -720,6 +720,7 @@ bool CalibUtils::calib_flowrate(int pass, const CalibInfo &calib_info, wxString
full_config.apply(printer_config);
full_config.set_key_value("filament_ids", new ConfigOptionStrings({calib_info.filament_prest->filament_id}));
full_config.set_key_value("enable_wrapping_detection", new ConfigOptionBool(false));
init_multi_extruder_params_for_cali(full_config, calib_info);
@ -833,6 +834,7 @@ bool CalibUtils::calib_generic_PA(const CalibInfo &calib_info, wxString &error_m
full_config.apply(printer_config);
full_config.set_key_value("filament_ids", new ConfigOptionStrings({calib_info.filament_prest->filament_id}));
full_config.set_key_value("enable_wrapping_detection", new ConfigOptionBool(false));
init_multi_extruder_params_for_cali(full_config, calib_info);