From 4284d2ddb0cdea37a748ebca27b3297edd4f1e05 Mon Sep 17 00:00:00 2001 From: "zhimin.zeng" Date: Fri, 16 Dec 2022 18:06:28 +0800 Subject: [PATCH] ENH: generate wipe tower when custom change gcode filament Change-Id: Ia0c81453f09457a9d1d56fbcdce79112953c0208 --- src/libslic3r/Print.cpp | 10 +++++++++- src/libslic3r/Print.hpp | 2 +- src/libslic3r/PrintApply.cpp | 5 +++-- src/libslic3r/PrintConfig.cpp | 2 +- src/slic3r/GUI/3DScene.cpp | 2 +- src/slic3r/GUI/MainFrame.cpp | 2 ++ src/slic3r/GUI/PartPlate.cpp | 11 +++++++++-- src/slic3r/GUI/PartPlate.hpp | 2 +- src/slic3r/GUI/Plater.cpp | 28 +++++++++++++++++++++++++++- src/slic3r/GUI/Plater.hpp | 5 ++++- 10 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 6f527bd81..ec2368668 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -327,10 +327,18 @@ std::vector Print::support_material_extruders() const } // returns 0-based indices of used extruders -std::vector Print::extruders() const +std::vector Print::extruders(bool conside_custom_gcode) const { std::vector extruders = this->object_extruders(); append(extruders, this->support_material_extruders()); + + if (conside_custom_gcode) { + for (auto item : m_model.custom_gcode_per_print_z.gcodes) { + if (item.type == CustomGCode::Type::ToolChange) + extruders.push_back((unsigned int)item.extruder); + } + } + sort_remove_duplicates(extruders); return extruders; } diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 8c6339a8d..3a6b431de 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -660,7 +660,7 @@ public: std::vector object_extruders() const; std::vector support_material_extruders() const; - std::vector extruders() const; + std::vector extruders(bool conside_custom_gcode = false) const; double max_allowed_layer_height() const; bool has_support_material() const; // Make sure the background processing has no access to this model_object during this call! diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index c43c9111e..ea5f1f281 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -1020,7 +1020,8 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ new_full_config.option("filament_settings_id", true); new_full_config.option("printer_settings_id", true); // BBS - int used_filaments = this->extruders().size(); + int used_filaments = this->extruders(true).size(); + //new_full_config.normalize_fdm(used_filaments); new_full_config.normalize_fdm_1(); t_config_option_keys changed_keys = new_full_config.normalize_fdm_2(used_filaments); @@ -1413,7 +1414,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ } //BBS: check the config again - int new_used_filaments = this->extruders().size(); + int new_used_filaments = this->extruders(true).size(); t_config_option_keys new_changed_keys = new_full_config.normalize_fdm_2(new_used_filaments); if (new_changed_keys.size() > 0) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", got new_changed_keys, size=%1%")%new_changed_keys.size(); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index ba77f529e..8777882c0 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2883,7 +2883,7 @@ void PrintConfigDef::init_fff_params() //def->sidetext = L("mm"); def->mode = comDevelop; // BBS: change data type to floats to add partplate logic - def->set_default_value(new ConfigOptionFloats{ 240. }); + def->set_default_value(new ConfigOptionFloats{ 220. }); def = this->add("prime_tower_width", coFloat); def->label = L("Width"); diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index e8786bf86..d22ac5506 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -1149,7 +1149,7 @@ int GLVolumeCollection::load_wipe_tower_preview( std::vector> extruder_colors = get_extruders_colors(); std::vector> colors; GUI::PartPlateList& ppl = GUI::wxGetApp().plater()->get_partplate_list(); - std::vector plate_extruders = ppl.get_plate(plate_idx)->get_extruders(); + std::vector plate_extruders = ppl.get_plate(plate_idx)->get_extruders(true); TriangleMesh wipe_tower_shell = make_cube(width, depth, height); for (int extruder_id : plate_extruders) { if (extruder_id <= extruder_colors.size()) diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 0ef2c4f67..4cfb7dcf3 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -692,6 +692,8 @@ void MainFrame::update_layout() { // jump to 3deditor under preview_only mode if (evt.GetId() == tp3DEditor){ + m_plater->update(true); + if (!preview_only_hint()) return; } diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index 96bf83b81..ce35bded2 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -1136,7 +1136,7 @@ void PartPlate::release_opengl_resource() } } -std::vector PartPlate::get_extruders() const +std::vector PartPlate::get_extruders(bool conside_custom_gcode) const { std::vector plate_extruders; // if gcode.3mf file @@ -1192,6 +1192,13 @@ std::vector PartPlate::get_extruders() const plate_extruders.push_back(glb_support_extr); } + if (conside_custom_gcode) { + for (auto item : m_model->custom_gcode_per_print_z.gcodes) { + if (item.type == CustomGCode::Type::ToolChange) + plate_extruders.push_back(item.extruder); + } + } + std::sort(plate_extruders.begin(), plate_extruders.end()); auto it_end = std::unique(plate_extruders.begin(), plate_extruders.end()); plate_extruders.resize(std::distance(plate_extruders.begin(), it_end)); @@ -1223,7 +1230,7 @@ std::vector PartPlate::get_used_extruders() Vec3d PartPlate::estimate_wipe_tower_size(const double w, const double wipe_volume) const { Vec3d wipe_tower_size; - std::vector plate_extruders = get_extruders(); + std::vector plate_extruders = get_extruders(true); double layer_height = 0.08f; // hard code layer height double max_height = 0.f; wipe_tower_size.setZero(); diff --git a/src/slic3r/GUI/PartPlate.hpp b/src/slic3r/GUI/PartPlate.hpp index f53b049b6..327df2aac 100644 --- a/src/slic3r/GUI/PartPlate.hpp +++ b/src/slic3r/GUI/PartPlate.hpp @@ -258,7 +258,7 @@ public: Vec3d get_origin() { return m_origin; } Vec3d estimate_wipe_tower_size(const double w, const double wipe_volume) const; - std::vector get_extruders() const; + std::vector get_extruders(bool conside_custom_gcode = false) const; std::vector get_used_extruders(); /* instance related operations*/ diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 7b713e766..9caaa76e9 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1659,6 +1659,8 @@ struct Plater::priv bool m_is_slicing {false}; bool m_is_publishing {false}; int m_cur_slice_plate; + + bool m_need_update{false}; //BBS: add popup object table logic //ObjectTableDialog* m_popup_table{ nullptr }; @@ -1770,6 +1772,9 @@ struct Plater::priv priv(Plater *q, MainFrame *main_frame); ~priv(); + bool need_update() const { return m_need_update; } + void set_need_update(bool need_update) { m_need_update = need_update; } + bool is_project_dirty() const { return dirty_state.is_dirty(); } bool is_presets_dirty() const { return dirty_state.is_presets_dirty(); } void update_project_dirty_from_presets() @@ -2401,6 +2406,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) // update slice and print button wxGetApp().mainframe->update_slice_print_status(MainFrame::SlicePrintEventType::eEventSliceUpdate, true, false); + set_need_update(true); }); } if (wxGetApp().is_gcode_viewer()) @@ -8628,7 +8634,17 @@ void Plater::add_file() } } -void Plater::update() { p->update(); } +void Plater::update(bool conside_update_flag) +{ + if (conside_update_flag) { + if (need_update()) { + p->update(); + p->set_need_update(false); + } + } + else + p->update(); +} void Plater::object_list_changed() { p->object_list_changed(); } @@ -11353,6 +11369,16 @@ void Plater::bring_instance_forward() p->bring_instance_forward(); } +bool Plater::need_update() const +{ + return p->need_update(); +} + +void Plater::set_need_update(bool need_update) +{ + p->set_need_update(need_update); +} + // BBS //BBS: add popup logic for table object bool Plater::PopupObjectTable(int object_id, int volume_id, const wxPoint& position) diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 1b930a0fd..935929dac 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -256,7 +256,7 @@ public: const wxString& get_last_loaded_gcode() const { return m_last_loaded_gcode; } - void update(); + void update(bool conside_update_flag = false); //BBS void object_list_changed(); void stop_jobs(); @@ -558,6 +558,9 @@ public: void bring_instance_forward(); + bool need_update() const; + void set_need_update(bool need_update); + // ROII wrapper for suppressing the Undo / Redo snapshot to be taken. class SuppressSnapshots {