ENH: generate wipe tower when custom change gcode filament

Change-Id: Ia0c81453f09457a9d1d56fbcdce79112953c0208
This commit is contained in:
zhimin.zeng 2022-12-16 18:06:28 +08:00 committed by Lane.Wei
parent 75c5d7b267
commit 4284d2ddb0
10 changed files with 58 additions and 11 deletions

View file

@ -327,10 +327,18 @@ std::vector<unsigned int> Print::support_material_extruders() const
}
// returns 0-based indices of used extruders
std::vector<unsigned int> Print::extruders() const
std::vector<unsigned int> Print::extruders(bool conside_custom_gcode) const
{
std::vector<unsigned int> 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;
}

View file

@ -660,7 +660,7 @@ public:
std::vector<unsigned int> object_extruders() const;
std::vector<unsigned int> support_material_extruders() const;
std::vector<unsigned int> extruders() const;
std::vector<unsigned int> 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!

View file

@ -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();

View file

@ -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");

View file

@ -1149,7 +1149,7 @@ int GLVolumeCollection::load_wipe_tower_preview(
std::vector<std::array<float, 4>> extruder_colors = get_extruders_colors();
std::vector<std::array<float, 4>> colors;
GUI::PartPlateList& ppl = GUI::wxGetApp().plater()->get_partplate_list();
std::vector<int> plate_extruders = ppl.get_plate(plate_idx)->get_extruders();
std::vector<int> 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())

View file

@ -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;
}

View file

@ -1136,7 +1136,7 @@ void PartPlate::release_opengl_resource()
}
}
std::vector<int> PartPlate::get_extruders() const
std::vector<int> PartPlate::get_extruders(bool conside_custom_gcode) const
{
std::vector<int> plate_extruders;
// if gcode.3mf file
@ -1192,6 +1192,13 @@ std::vector<int> 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<int> PartPlate::get_used_extruders()
Vec3d PartPlate::estimate_wipe_tower_size(const double w, const double wipe_volume) const
{
Vec3d wipe_tower_size;
std::vector<int> plate_extruders = get_extruders();
std::vector<int> plate_extruders = get_extruders(true);
double layer_height = 0.08f; // hard code layer height
double max_height = 0.f;
wipe_tower_size.setZero();

View file

@ -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<int> get_extruders() const;
std::vector<int> get_extruders(bool conside_custom_gcode = false) const;
std::vector<int> get_used_extruders();
/* instance related operations*/

View file

@ -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)

View file

@ -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
{