From 1828e3b98fe981df9074c6679ab1c81aa9915bc8 Mon Sep 17 00:00:00 2001 From: "jiangkai.zhao" Date: Mon, 10 Mar 2025 17:20:26 +0800 Subject: [PATCH] ENH: adjust estimate_wipe_tower_size jira: STUDIO-10540 Change-Id: I552acf16a1f02f2d6feb783327a0a9a83ac4673a (cherry picked from commit 1522fe5ff2ffa176dc045d343ef2985c0e7533f8) --- src/slic3r/GUI/GLCanvas3D.cpp | 8 +++----- src/slic3r/GUI/PartPlate.cpp | 24 ++++++++++++++++++++---- src/slic3r/GUI/PartPlate.hpp | 2 +- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 41d066d4c4..c1f720d65d 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2919,22 +2919,20 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re float y = dynamic_cast(proj_cfg.option("wipe_tower_y"))->get_at(plate_id); float w = dynamic_cast(m_config->option("prime_tower_width"))->value; float a = dynamic_cast(proj_cfg.option("wipe_tower_rotation_angle"))->value; - float tower_brim_width = dynamic_cast(m_config->option("prime_tower_brim_width"))->value; // BBS std::vector v = dynamic_cast(m_config->option("filament_prime_volume"))->values; Vec3d plate_origin = ppl.get_plate(plate_id)->get_origin(); const Print* print = m_process->fff_print(); const Print* current_print = part_plate->fff_print(); - const auto& wipe_tower_data = print->wipe_tower_data(filaments_count); - float brim_width = wipe_tower_data.brim_width; + float brim_width = print->wipe_tower_data(filaments_count).brim_width; 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_tower_data.depth, nozzle_nums); + Vec3d wipe_tower_size = ppl.get_plate(plate_id)->estimate_wipe_tower_size(print_cfg, w, wipe_vol, nozzle_nums); { - const float margin = WIPE_TOWER_MARGIN + tower_brim_width; + const float margin = WIPE_TOWER_MARGIN + brim_width; BoundingBoxf3 plate_bbox = part_plate->get_bounding_box(); BoundingBoxf plate_bbox_2d(Vec2d(plate_bbox.min(0), plate_bbox.min(1)), Vec2d(plate_bbox.max(0), plate_bbox.max(1))); const std::vector &extruder_areas = part_plate->get_extruder_areas(); diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index b6e21f54b6..e793b94786 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -1829,7 +1829,7 @@ bool PartPlate::check_mixture_of_pla_and_petg(const DynamicPrintConfig &config) return wipe_tower_size; }*/ -Vec3d PartPlate::estimate_wipe_tower_size(const DynamicPrintConfig & config, const double w, const double d, int extruder_count, int plate_extruder_size, bool use_global_objects) const +Vec3d PartPlate::estimate_wipe_tower_size(const DynamicPrintConfig & config, const double w, const double wipe_volume, int extruder_count, int plate_extruder_size, bool use_global_objects) const { Vec3d wipe_tower_size; double layer_height = 0.08f; // hard code layer height @@ -1857,24 +1857,40 @@ Vec3d PartPlate::estimate_wipe_tower_size(const DynamicPrintConfig & config, con max_height = std::max(bbox.size().z(), max_height); } wipe_tower_size(2) = max_height; - //const DynamicPrintConfig &dconfig = wxGetApp().preset_bundle->prints.get_edited_preset().config; auto timelapse_type = config.option>("timelapse_type"); bool timelapse_enabled = timelapse_type ? (timelapse_type->value == TimelapseType::tlSmooth) : false; double extra_spacing = config.option("prime_tower_infill_gap")->getFloat() / 100.; const ConfigOptionBool* use_rib_wall_opt = config.option("prime_tower_rib_wall"); bool use_rib_wall = use_rib_wall_opt ? use_rib_wall_opt->value: true; + double rib_width = config.option("prime_tower_rib_width")->getFloat(); double depth; + double filament_change_volume=0.; + { + std::vector filament_change_lengths; + auto filament_change_lengths_opt = m_print->config().option("filament_change_length"); + if (filament_change_lengths_opt) filament_change_lengths = filament_change_lengths_opt->values; + double length = filament_change_lengths.empty() ? 0 : *std::max_element(filament_change_lengths.begin(), filament_change_lengths.end()); + double diameter = 1.75; + std::vector diameters; + auto filament_diameter_opt = m_print->config().option("filament_diameter"); + if (filament_diameter_opt) diameters = filament_diameter_opt->values; + diameter = diameters.empty() ? diameter : *std::max_element(diameters.begin(), diameters.end()); + filament_change_volume = length * PI * diameter * diameter / 4.; + } + double volume = wipe_volume * (extruder_count == 2 ? plate_extruder_size : (plate_extruder_size - 1)); + if (extruder_count == 2) volume += filament_change_volume * (int) (plate_extruder_size / 2); if (use_rib_wall) { - depth = std::sqrt(d * w * (extruder_count == 2 ? plate_extruder_size : (plate_extruder_size - 1)) * extra_spacing); + depth = std::sqrt(volume / layer_height * extra_spacing); if (timelapse_enabled || plate_extruder_size > 1) { float min_wipe_tower_depth = WipeTower::get_limit_depth_by_height(max_height); depth = std::max((double) min_wipe_tower_depth, depth); + depth += rib_width / std::sqrt(2) + m_print->config().prime_tower_extra_rib_length.value; wipe_tower_size(0) = wipe_tower_size(1) = depth; } } else { - depth = plate_extruder_size == 1 ? 0 : d*extra_spacing; + depth = volume/ (layer_height * w) *extra_spacing; if (timelapse_enabled || depth > EPSILON) { float min_wipe_tower_depth = WipeTower::get_limit_depth_by_height(max_height); depth = std::max((double)min_wipe_tower_depth, depth); diff --git a/src/slic3r/GUI/PartPlate.hpp b/src/slic3r/GUI/PartPlate.hpp index 854408c9c9..67759502b2 100644 --- a/src/slic3r/GUI/PartPlate.hpp +++ b/src/slic3r/GUI/PartPlate.hpp @@ -322,7 +322,7 @@ public: Vec3d get_origin() { return m_origin; } //Vec3d calculate_wipe_tower_size(const DynamicPrintConfig &config, const double w, const double wipe_volume, int plate_extruder_size = 0, bool use_global_objects = false) const; - Vec3d estimate_wipe_tower_size(const DynamicPrintConfig & config, const double w, const double d, int extruder_count = 1, int plate_extruder_size = 0, bool use_global_objects = false) const; + Vec3d estimate_wipe_tower_size(const DynamicPrintConfig & config, const double w, const double wipe_volume, int extruder_count = 1, int plate_extruder_size = 0, bool use_global_objects = false) const; arrangement::ArrangePolygon estimate_wipe_tower_polygon(const DynamicPrintConfig & config, int plate_index, Vec3d& wt_pos, Vec3d& wt_size, int extruder_count = 1, int plate_extruder_size = 0, bool use_global_objects = false) const; bool check_objects_empty_and_gcode3mf(std::vector &result) const; // get used filaments from config, 1 based idx