Code clean in Tab.cpp and Fixed couple of Mac-warnings in :
GUI.cpp GUI_App.cpp GUI_ObjectList.cpp MainFrame.hpp Plater.cpp PresetBundle.cpp PresetHints.cpp Tab.cpp Tab.hpp wxExtensions.cpp wxExtensions.hpp
This commit is contained in:
parent
b89d9c7aff
commit
c960c2cf27
@ -262,7 +262,7 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt
|
|||||||
}
|
}
|
||||||
catch (const std::exception & /* e */)
|
catch (const std::exception & /* e */)
|
||||||
{
|
{
|
||||||
int i = 0;//no reason, just experiment
|
// int i = 0;//no reason, just experiment
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -909,11 +909,13 @@ bool GUI_App::check_unsaved_changes(const wxString &header)
|
|||||||
wxString dirty;
|
wxString dirty;
|
||||||
PrinterTechnology printer_technology = preset_bundle->printers.get_edited_preset().printer_technology();
|
PrinterTechnology printer_technology = preset_bundle->printers.get_edited_preset().printer_technology();
|
||||||
for (Tab *tab : tabs_list)
|
for (Tab *tab : tabs_list)
|
||||||
if (tab->supports_printer_technology(printer_technology) && tab->current_preset_is_dirty())
|
if (tab->supports_printer_technology(printer_technology) && tab->current_preset_is_dirty()) {
|
||||||
if (dirty.empty())
|
if (dirty.empty())
|
||||||
dirty = tab->title();
|
dirty = tab->title();
|
||||||
else
|
else
|
||||||
dirty += wxString(", ") + tab->title();
|
dirty += wxString(", ") + tab->title();
|
||||||
|
}
|
||||||
|
|
||||||
if (dirty.empty())
|
if (dirty.empty())
|
||||||
// No changes, the application may close or reload presets.
|
// No changes, the application may close or reload presets.
|
||||||
return true;
|
return true;
|
||||||
|
@ -3402,7 +3402,7 @@ void ObjectList::instances_to_separated_object(const int obj_idx, const std::set
|
|||||||
|
|
||||||
// create new object from selected instance
|
// create new object from selected instance
|
||||||
ModelObject* model_object = (*m_objects)[obj_idx]->get_model()->add_object(*(*m_objects)[obj_idx]);
|
ModelObject* model_object = (*m_objects)[obj_idx]->get_model()->add_object(*(*m_objects)[obj_idx]);
|
||||||
for (int inst_idx = model_object->instances.size() - 1; inst_idx >= 0; inst_idx--)
|
for (int inst_idx = int(model_object->instances.size()) - 1; inst_idx >= 0; inst_idx--)
|
||||||
{
|
{
|
||||||
if (find(inst_idxs.begin(), inst_idxs.end(), inst_idx) != inst_idxs.end())
|
if (find(inst_idxs.begin(), inst_idxs.end(), inst_idx) != inst_idxs.end())
|
||||||
continue;
|
continue;
|
||||||
|
@ -50,8 +50,9 @@ class MainFrame : public DPIFrame
|
|||||||
wxString m_qs_last_input_file = wxEmptyString;
|
wxString m_qs_last_input_file = wxEmptyString;
|
||||||
wxString m_qs_last_output_file = wxEmptyString;
|
wxString m_qs_last_output_file = wxEmptyString;
|
||||||
wxString m_last_config = wxEmptyString;
|
wxString m_last_config = wxEmptyString;
|
||||||
|
#if 0
|
||||||
wxMenuItem* m_menu_item_repeat { nullptr };
|
wxMenuItem* m_menu_item_repeat { nullptr }; // doesn't used now
|
||||||
|
#endif
|
||||||
wxMenuItem* m_menu_item_reslice_now { nullptr };
|
wxMenuItem* m_menu_item_reslice_now { nullptr };
|
||||||
|
|
||||||
PrintHostQueueDialog *m_printhost_queue_dlg;
|
PrintHostQueueDialog *m_printhost_queue_dlg;
|
||||||
|
@ -1075,8 +1075,6 @@ void Sidebar::show_info_sizer()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ModelInstance* model_instance = !model_object->instances.empty() ? model_object->instances.front() : nullptr;
|
|
||||||
|
|
||||||
auto size = model_object->bounding_box().size();
|
auto size = model_object->bounding_box().size();
|
||||||
p->object_info->info_size->SetLabel(wxString::Format("%.2f x %.2f x %.2f",size(0), size(1), size(2)));
|
p->object_info->info_size->SetLabel(wxString::Format("%.2f x %.2f x %.2f",size(0), size(1), size(2)));
|
||||||
p->object_info->info_materials->SetLabel(wxString::Format("%d", static_cast<int>(model_object->materials_count())));
|
p->object_info->info_materials->SetLabel(wxString::Format("%d", static_cast<int>(model_object->materials_count())));
|
||||||
@ -2287,20 +2285,20 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
|
|||||||
|
|
||||||
if (! is_project_file) {
|
if (! is_project_file) {
|
||||||
if (model.looks_like_multipart_object()) {
|
if (model.looks_like_multipart_object()) {
|
||||||
wxMessageDialog dlg(q, _(L(
|
wxMessageDialog msg_dlg(q, _(L(
|
||||||
"This file contains several objects positioned at multiple heights. "
|
"This file contains several objects positioned at multiple heights. "
|
||||||
"Instead of considering them as multiple objects, should I consider\n"
|
"Instead of considering them as multiple objects, should I consider\n"
|
||||||
"this file as a single object having multiple parts?\n"
|
"this file as a single object having multiple parts?\n"
|
||||||
)), _(L("Multi-part object detected")), wxICON_WARNING | wxYES | wxNO);
|
)), _(L("Multi-part object detected")), wxICON_WARNING | wxYES | wxNO);
|
||||||
if (dlg.ShowModal() == wxID_YES) {
|
if (msg_dlg.ShowModal() == wxID_YES) {
|
||||||
model.convert_multipart_object(nozzle_dmrs->values.size());
|
model.convert_multipart_object(nozzle_dmrs->values.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((wxGetApp().get_mode() == comSimple) && (type_3mf || type_any_amf) && model_has_advanced_features(model)) {
|
else if ((wxGetApp().get_mode() == comSimple) && (type_3mf || type_any_amf) && model_has_advanced_features(model)) {
|
||||||
wxMessageDialog dlg(q, _(L("This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?\n")),
|
wxMessageDialog msg_dlg(q, _(L("This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?\n")),
|
||||||
_(L("Detected advanced data")), wxICON_WARNING | wxYES | wxNO);
|
_(L("Detected advanced data")), wxICON_WARNING | wxYES | wxNO);
|
||||||
if (dlg.ShowModal() == wxID_YES)
|
if (msg_dlg.ShowModal() == wxID_YES)
|
||||||
{
|
{
|
||||||
Slic3r::GUI::wxGetApp().save_mode(comAdvanced);
|
Slic3r::GUI::wxGetApp().save_mode(comAdvanced);
|
||||||
view3D->set_as_dirty();
|
view3D->set_as_dirty();
|
||||||
@ -2339,12 +2337,12 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (new_model != nullptr && new_model->objects.size() > 1) {
|
if (new_model != nullptr && new_model->objects.size() > 1) {
|
||||||
wxMessageDialog dlg(q, _(L(
|
wxMessageDialog msg_dlg(q, _(L(
|
||||||
"Multiple objects were loaded for a multi-material printer.\n"
|
"Multiple objects were loaded for a multi-material printer.\n"
|
||||||
"Instead of considering them as multiple objects, should I consider\n"
|
"Instead of considering them as multiple objects, should I consider\n"
|
||||||
"these files to represent a single object having multiple parts?\n"
|
"these files to represent a single object having multiple parts?\n"
|
||||||
)), _(L("Multi-part object detected")), wxICON_WARNING | wxYES | wxNO);
|
)), _(L("Multi-part object detected")), wxICON_WARNING | wxYES | wxNO);
|
||||||
if (dlg.ShowModal() == wxID_YES) {
|
if (msg_dlg.ShowModal() == wxID_YES) {
|
||||||
new_model->convert_multipart_object(nozzle_dmrs->values.size());
|
new_model->convert_multipart_object(nozzle_dmrs->values.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3263,6 +3261,7 @@ void Plater::priv::on_slicing_update(SlicingStatusEvent &evt)
|
|||||||
else
|
else
|
||||||
this->update_sla_scene();
|
this->update_sla_scene();
|
||||||
break;
|
break;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
} else if (evt.status.flags & PrintBase::SlicingStatus::RELOAD_SLA_PREVIEW) {
|
} else if (evt.status.flags & PrintBase::SlicingStatus::RELOAD_SLA_PREVIEW) {
|
||||||
// Update the SLA preview. Only called if not RELOAD_SLA_SUPPORT_POINTS, as the block above will refresh the preview anyways.
|
// Update the SLA preview. Only called if not RELOAD_SLA_SUPPORT_POINTS, as the block above will refresh the preview anyways.
|
||||||
@ -3282,6 +3281,7 @@ void Plater::priv::on_slicing_completed(wxCommandEvent &)
|
|||||||
else
|
else
|
||||||
this->update_sla_scene();
|
this->update_sla_scene();
|
||||||
break;
|
break;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3328,6 +3328,7 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt)
|
|||||||
else
|
else
|
||||||
this->update_sla_scene();
|
this->update_sla_scene();
|
||||||
break;
|
break;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (canceled) {
|
if (canceled) {
|
||||||
|
@ -697,6 +697,7 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool
|
|||||||
config.option<ConfigOptionString>("default_sla_print_profile", true);
|
config.option<ConfigOptionString>("default_sla_print_profile", true);
|
||||||
config.option<ConfigOptionString>("default_sla_material_profile", true);
|
config.option<ConfigOptionString>("default_sla_material_profile", true);
|
||||||
break;
|
break;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1) Create a name from the file name.
|
// 1) Create a name from the file name.
|
||||||
@ -805,6 +806,7 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool
|
|||||||
load_preset(this->sla_materials, 1, "sla_material_settings_id");
|
load_preset(this->sla_materials, 1, "sla_material_settings_id");
|
||||||
load_preset(this->printers, 2, "printer_settings_id");
|
load_preset(this->printers, 2, "printer_settings_id");
|
||||||
break;
|
break;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->update_compatible(false);
|
this->update_compatible(false);
|
||||||
@ -1349,6 +1351,7 @@ void PresetBundle::update_compatible(bool select_other_if_incompatible)
|
|||||||
[&prefered_sla_material_profile](const std::string& profile_name){ return profile_name == prefered_sla_material_profile; });
|
[&prefered_sla_material_profile](const std::string& profile_name){ return profile_name == prefered_sla_material_profile; });
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ std::string PresetHints::maximum_volumetric_flow_description(const PresetBundle
|
|||||||
double bridge_flow_ratio = print_config.opt_float("bridge_flow_ratio");
|
double bridge_flow_ratio = print_config.opt_float("bridge_flow_ratio");
|
||||||
double perimeter_speed = print_config.opt_float("perimeter_speed");
|
double perimeter_speed = print_config.opt_float("perimeter_speed");
|
||||||
double external_perimeter_speed = print_config.get_abs_value("external_perimeter_speed", perimeter_speed);
|
double external_perimeter_speed = print_config.get_abs_value("external_perimeter_speed", perimeter_speed);
|
||||||
double gap_fill_speed = print_config.opt_float("gap_fill_speed");
|
// double gap_fill_speed = print_config.opt_float("gap_fill_speed");
|
||||||
double infill_speed = print_config.opt_float("infill_speed");
|
double infill_speed = print_config.opt_float("infill_speed");
|
||||||
double small_perimeter_speed = print_config.get_abs_value("small_perimeter_speed", perimeter_speed);
|
double small_perimeter_speed = print_config.get_abs_value("small_perimeter_speed", perimeter_speed);
|
||||||
double solid_infill_speed = print_config.get_abs_value("solid_infill_speed", infill_speed);
|
double solid_infill_speed = print_config.get_abs_value("solid_infill_speed", infill_speed);
|
||||||
@ -123,7 +123,7 @@ std::string PresetHints::maximum_volumetric_flow_description(const PresetBundle
|
|||||||
// Current filament values
|
// Current filament values
|
||||||
double filament_diameter = filament_config.opt_float("filament_diameter", 0);
|
double filament_diameter = filament_config.opt_float("filament_diameter", 0);
|
||||||
double filament_crossection = M_PI * 0.25 * filament_diameter * filament_diameter;
|
double filament_crossection = M_PI * 0.25 * filament_diameter * filament_diameter;
|
||||||
double extrusion_multiplier = filament_config.opt_float("extrusion_multiplier", 0);
|
// double extrusion_multiplier = filament_config.opt_float("extrusion_multiplier", 0);
|
||||||
// The following value will be annotated by this hint, so it does not take part in the calculation.
|
// The following value will be annotated by this hint, so it does not take part in the calculation.
|
||||||
// double filament_max_volumetric_speed = filament_config.opt_float("filament_max_volumetric_speed", 0);
|
// double filament_max_volumetric_speed = filament_config.opt_float("filament_max_volumetric_speed", 0);
|
||||||
|
|
||||||
|
@ -992,6 +992,7 @@ void Tab::update_preset_description_line()
|
|||||||
description_line += "\n\n\t" + _(L("default SLA print profile")) + ": \n\t\t" + default_sla_print_profile;
|
description_line += "\n\n\t" + _(L("default SLA print profile")) + ": \n\t\t" + default_sla_print_profile;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1260,251 +1261,9 @@ void TabPrint::update()
|
|||||||
if (m_preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA)
|
if (m_preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA)
|
||||||
return; // ys_FIXME
|
return; // ys_FIXME
|
||||||
|
|
||||||
/*
|
|
||||||
// #ys_FIXME_to_delete
|
|
||||||
//! Temporary workaround for the correct updates of the TextCtrl (like "layer_height"):
|
|
||||||
// KillFocus() for the wxSpinCtrl use CallAfter function. So,
|
|
||||||
// to except the duplicate call of the update() after dialog->ShowModal(),
|
|
||||||
// let check if this process is already started.
|
|
||||||
if (is_msg_dlg_already_exist)
|
|
||||||
return;
|
|
||||||
*/
|
|
||||||
|
|
||||||
m_update_cnt++;
|
m_update_cnt++;
|
||||||
// Freeze();
|
// Freeze();
|
||||||
|
|
||||||
/* #ys_FIXME_delete_after_testing (refactoring)
|
|
||||||
*
|
|
||||||
// layer_height shouldn't be equal to zero
|
|
||||||
if (m_config->opt_float("layer_height") < EPSILON)
|
|
||||||
{
|
|
||||||
const wxString msg_text = _(L("Zero layer height is not valid.\n\nThe layer height will be reset to 0.01."));
|
|
||||||
wxMessageDialog dialog(parent(), msg_text, _(L("Layer height")), wxICON_WARNING | wxOK);
|
|
||||||
DynamicPrintConfig new_conf = *m_config;
|
|
||||||
is_msg_dlg_already_exist = true;
|
|
||||||
dialog.ShowModal();
|
|
||||||
new_conf.set_key_value("layer_height", new ConfigOptionFloat(0.01));
|
|
||||||
load_config(new_conf);
|
|
||||||
is_msg_dlg_already_exist = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fabs(m_config->option<ConfigOptionFloatOrPercent>("first_layer_height")->value - 0) < EPSILON)
|
|
||||||
{
|
|
||||||
const wxString msg_text = _(L("Zero first layer height is not valid.\n\nThe first layer height will be reset to 0.01."));
|
|
||||||
wxMessageDialog dialog(parent(), msg_text, _(L("First layer height")), wxICON_WARNING | wxOK);
|
|
||||||
DynamicPrintConfig new_conf = *m_config;
|
|
||||||
is_msg_dlg_already_exist = true;
|
|
||||||
dialog.ShowModal();
|
|
||||||
new_conf.set_key_value("first_layer_height", new ConfigOptionFloatOrPercent(0.01, false));
|
|
||||||
load_config(new_conf);
|
|
||||||
is_msg_dlg_already_exist = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
double fill_density = m_config->option<ConfigOptionPercent>("fill_density")->value;
|
|
||||||
|
|
||||||
if (m_config->opt_bool("spiral_vase") &&
|
|
||||||
!(m_config->opt_int("perimeters") == 1 && m_config->opt_int("top_solid_layers") == 0 &&
|
|
||||||
fill_density == 0)) {
|
|
||||||
wxString msg_text = _(L("The Spiral Vase mode requires:\n"
|
|
||||||
"- one perimeter\n"
|
|
||||||
"- no top solid layers\n"
|
|
||||||
"- 0% fill density\n"
|
|
||||||
"- no support material\n"
|
|
||||||
"- no ensure_vertical_shell_thickness\n"
|
|
||||||
"\nShall I adjust those settings in order to enable Spiral Vase?"));
|
|
||||||
wxMessageDialog dialog(parent(), msg_text, _(L("Spiral Vase")), wxICON_WARNING | wxYES | wxNO);
|
|
||||||
DynamicPrintConfig new_conf = *m_config;
|
|
||||||
if (dialog.ShowModal() == wxID_YES) {
|
|
||||||
new_conf.set_key_value("perimeters", new ConfigOptionInt(1));
|
|
||||||
new_conf.set_key_value("top_solid_layers", new ConfigOptionInt(0));
|
|
||||||
new_conf.set_key_value("fill_density", new ConfigOptionPercent(0));
|
|
||||||
new_conf.set_key_value("support_material", new ConfigOptionBool(false));
|
|
||||||
new_conf.set_key_value("support_material_enforce_layers", new ConfigOptionInt(0));
|
|
||||||
new_conf.set_key_value("ensure_vertical_shell_thickness", new ConfigOptionBool(false));
|
|
||||||
fill_density = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
new_conf.set_key_value("spiral_vase", new ConfigOptionBool(false));
|
|
||||||
}
|
|
||||||
load_config(new_conf);
|
|
||||||
on_value_change("fill_density", fill_density);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_config->opt_bool("wipe_tower") && m_config->opt_bool("support_material") &&
|
|
||||||
m_config->opt_float("support_material_contact_distance") > 0. &&
|
|
||||||
(m_config->opt_int("support_material_extruder") != 0 || m_config->opt_int("support_material_interface_extruder") != 0)) {
|
|
||||||
wxString msg_text = _(L("The Wipe Tower currently supports the non-soluble supports only\n"
|
|
||||||
"if they are printed with the current extruder without triggering a tool change.\n"
|
|
||||||
"(both support_material_extruder and support_material_interface_extruder need to be set to 0).\n"
|
|
||||||
"\nShall I adjust those settings in order to enable the Wipe Tower?"));
|
|
||||||
wxMessageDialog dialog(parent(), msg_text, _(L("Wipe Tower")), wxICON_WARNING | wxYES | wxNO);
|
|
||||||
DynamicPrintConfig new_conf = *m_config;
|
|
||||||
if (dialog.ShowModal() == wxID_YES) {
|
|
||||||
new_conf.set_key_value("support_material_extruder", new ConfigOptionInt(0));
|
|
||||||
new_conf.set_key_value("support_material_interface_extruder", new ConfigOptionInt(0));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
new_conf.set_key_value("wipe_tower", new ConfigOptionBool(false));
|
|
||||||
load_config(new_conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_config->opt_bool("wipe_tower") && m_config->opt_bool("support_material") &&
|
|
||||||
m_config->opt_float("support_material_contact_distance") == 0 &&
|
|
||||||
!m_config->opt_bool("support_material_synchronize_layers")) {
|
|
||||||
wxString msg_text = _(L("For the Wipe Tower to work with the soluble supports, the support layers\n"
|
|
||||||
"need to be synchronized with the object layers.\n"
|
|
||||||
"\nShall I synchronize support layers in order to enable the Wipe Tower?"));
|
|
||||||
wxMessageDialog dialog(parent(), msg_text, _(L("Wipe Tower")), wxICON_WARNING | wxYES | wxNO);
|
|
||||||
DynamicPrintConfig new_conf = *m_config;
|
|
||||||
if (dialog.ShowModal() == wxID_YES) {
|
|
||||||
new_conf.set_key_value("support_material_synchronize_layers", new ConfigOptionBool(true));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
new_conf.set_key_value("wipe_tower", new ConfigOptionBool(false));
|
|
||||||
load_config(new_conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_config->opt_bool("support_material")) {
|
|
||||||
// Ask only once.
|
|
||||||
if (!m_support_material_overhangs_queried) {
|
|
||||||
m_support_material_overhangs_queried = true;
|
|
||||||
if (!m_config->opt_bool("overhangs")/* != 1* /) {
|
|
||||||
wxString msg_text = _(L("Supports work better, if the following feature is enabled:\n"
|
|
||||||
"- Detect bridging perimeters\n"
|
|
||||||
"\nShall I adjust those settings for supports?"));
|
|
||||||
wxMessageDialog dialog(parent(), msg_text, _(L("Support Generator")), wxICON_WARNING | wxYES | wxNO | wxCANCEL);
|
|
||||||
DynamicPrintConfig new_conf = *m_config;
|
|
||||||
auto answer = dialog.ShowModal();
|
|
||||||
if (answer == wxID_YES) {
|
|
||||||
// Enable "detect bridging perimeters".
|
|
||||||
new_conf.set_key_value("overhangs", new ConfigOptionBool(true));
|
|
||||||
} else if (answer == wxID_NO) {
|
|
||||||
// Do nothing, leave supports on and "detect bridging perimeters" off.
|
|
||||||
} else if (answer == wxID_CANCEL) {
|
|
||||||
// Disable supports.
|
|
||||||
new_conf.set_key_value("support_material", new ConfigOptionBool(false));
|
|
||||||
m_support_material_overhangs_queried = false;
|
|
||||||
}
|
|
||||||
load_config(new_conf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_support_material_overhangs_queried = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_config->option<ConfigOptionPercent>("fill_density")->value == 100) {
|
|
||||||
auto fill_pattern = m_config->option<ConfigOptionEnum<InfillPattern>>("fill_pattern")->value;
|
|
||||||
std::string str_fill_pattern = "";
|
|
||||||
t_config_enum_values map_names = m_config->option<ConfigOptionEnum<InfillPattern>>("fill_pattern")->get_enum_values();
|
|
||||||
for (auto it : map_names) {
|
|
||||||
if (fill_pattern == it.second) {
|
|
||||||
str_fill_pattern = it.first;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!str_fill_pattern.empty()) {
|
|
||||||
const std::vector<std::string> &external_fill_pattern = m_config->def()->get("top_fill_pattern")->enum_values;
|
|
||||||
bool correct_100p_fill = false;
|
|
||||||
for (const std::string &fill : external_fill_pattern)
|
|
||||||
{
|
|
||||||
if (str_fill_pattern == fill)
|
|
||||||
correct_100p_fill = true;
|
|
||||||
}
|
|
||||||
// get fill_pattern name from enum_labels for using this one at dialog_msg
|
|
||||||
str_fill_pattern = _utf8(m_config->def()->get("fill_pattern")->enum_labels[fill_pattern]);
|
|
||||||
if (!correct_100p_fill) {
|
|
||||||
wxString msg_text = GUI::from_u8((boost::format(_utf8(L("The %1% infill pattern is not supposed to work at 100%% density.\n\n"
|
|
||||||
"Shall I switch to rectilinear fill pattern?"))) % str_fill_pattern).str());
|
|
||||||
wxMessageDialog dialog(parent(), msg_text, _(L("Infill")), wxICON_WARNING | wxYES | wxNO);
|
|
||||||
DynamicPrintConfig new_conf = *m_config;
|
|
||||||
if (dialog.ShowModal() == wxID_YES) {
|
|
||||||
new_conf.set_key_value("fill_pattern", new ConfigOptionEnum<InfillPattern>(ipRectilinear));
|
|
||||||
fill_density = 100;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
fill_density = m_presets->get_selected_preset().config.option<ConfigOptionPercent>("fill_density")->value;
|
|
||||||
new_conf.set_key_value("fill_density", new ConfigOptionPercent(fill_density));
|
|
||||||
load_config(new_conf);
|
|
||||||
on_value_change("fill_density", fill_density);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool have_perimeters = m_config->opt_int("perimeters") > 0;
|
|
||||||
for (auto el : {"extra_perimeters", "ensure_vertical_shell_thickness", "thin_walls", "overhangs",
|
|
||||||
"seam_position", "external_perimeters_first", "external_perimeter_extrusion_width",
|
|
||||||
"perimeter_speed", "small_perimeter_speed", "external_perimeter_speed" })
|
|
||||||
get_field(el)->toggle(have_perimeters);
|
|
||||||
|
|
||||||
bool have_infill = m_config->option<ConfigOptionPercent>("fill_density")->value > 0;
|
|
||||||
// infill_extruder uses the same logic as in Print::extruders()
|
|
||||||
for (auto el : {"fill_pattern", "infill_every_layers", "infill_only_where_needed",
|
|
||||||
"solid_infill_every_layers", "solid_infill_below_area", "infill_extruder" })
|
|
||||||
get_field(el)->toggle(have_infill);
|
|
||||||
|
|
||||||
bool have_solid_infill = m_config->opt_int("top_solid_layers") > 0 || m_config->opt_int("bottom_solid_layers") > 0;
|
|
||||||
// solid_infill_extruder uses the same logic as in Print::extruders()
|
|
||||||
for (auto el : {"top_fill_pattern", "bottom_fill_pattern", "infill_first", "solid_infill_extruder",
|
|
||||||
"solid_infill_extrusion_width", "solid_infill_speed" })
|
|
||||||
get_field(el)->toggle(have_solid_infill);
|
|
||||||
|
|
||||||
for (auto el : {"fill_angle", "bridge_angle", "infill_extrusion_width",
|
|
||||||
"infill_speed", "bridge_speed" })
|
|
||||||
get_field(el)->toggle(have_infill || have_solid_infill);
|
|
||||||
|
|
||||||
get_field("gap_fill_speed")->toggle(have_perimeters && have_infill);
|
|
||||||
|
|
||||||
bool have_top_solid_infill = m_config->opt_int("top_solid_layers") > 0;
|
|
||||||
for (auto el : { "top_infill_extrusion_width", "top_solid_infill_speed" })
|
|
||||||
get_field(el)->toggle(have_top_solid_infill);
|
|
||||||
|
|
||||||
bool have_default_acceleration = m_config->opt_float("default_acceleration") > 0;
|
|
||||||
for (auto el : {"perimeter_acceleration", "infill_acceleration",
|
|
||||||
"bridge_acceleration", "first_layer_acceleration" })
|
|
||||||
get_field(el)->toggle(have_default_acceleration);
|
|
||||||
|
|
||||||
bool have_skirt = m_config->opt_int("skirts") > 0 || m_config->opt_float("min_skirt_length") > 0;
|
|
||||||
for (auto el : { "skirt_distance", "skirt_height" })
|
|
||||||
get_field(el)->toggle(have_skirt);
|
|
||||||
|
|
||||||
bool have_brim = m_config->opt_float("brim_width") > 0;
|
|
||||||
// perimeter_extruder uses the same logic as in Print::extruders()
|
|
||||||
get_field("perimeter_extruder")->toggle(have_perimeters || have_brim);
|
|
||||||
|
|
||||||
bool have_raft = m_config->opt_int("raft_layers") > 0;
|
|
||||||
bool have_support_material = m_config->opt_bool("support_material") || have_raft;
|
|
||||||
bool have_support_material_auto = have_support_material && m_config->opt_bool("support_material_auto");
|
|
||||||
bool have_support_interface = m_config->opt_int("support_material_interface_layers") > 0;
|
|
||||||
bool have_support_soluble = have_support_material && m_config->opt_float("support_material_contact_distance") == 0;
|
|
||||||
for (auto el : {"support_material_pattern", "support_material_with_sheath",
|
|
||||||
"support_material_spacing", "support_material_angle", "support_material_interface_layers",
|
|
||||||
"dont_support_bridges", "support_material_extrusion_width", "support_material_contact_distance",
|
|
||||||
"support_material_xy_spacing" })
|
|
||||||
get_field(el)->toggle(have_support_material);
|
|
||||||
get_field("support_material_threshold")->toggle(have_support_material_auto);
|
|
||||||
|
|
||||||
for (auto el : {"support_material_interface_spacing", "support_material_interface_extruder",
|
|
||||||
"support_material_interface_speed", "support_material_interface_contact_loops" })
|
|
||||||
get_field(el)->toggle(have_support_material && have_support_interface);
|
|
||||||
get_field("support_material_synchronize_layers")->toggle(have_support_soluble);
|
|
||||||
|
|
||||||
get_field("perimeter_extrusion_width")->toggle(have_perimeters || have_skirt || have_brim);
|
|
||||||
get_field("support_material_extruder")->toggle(have_support_material || have_skirt);
|
|
||||||
get_field("support_material_speed")->toggle(have_support_material || have_brim || have_skirt);
|
|
||||||
|
|
||||||
bool have_sequential_printing = m_config->opt_bool("complete_objects");
|
|
||||||
for (auto el : { "extruder_clearance_radius", "extruder_clearance_height" })
|
|
||||||
get_field(el)->toggle(have_sequential_printing);
|
|
||||||
|
|
||||||
bool have_ooze_prevention = m_config->opt_bool("ooze_prevention");
|
|
||||||
get_field("standby_temperature_delta")->toggle(have_ooze_prevention);
|
|
||||||
|
|
||||||
bool have_wipe_tower = m_config->opt_bool("wipe_tower");
|
|
||||||
for (auto el : { "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_bridging"})
|
|
||||||
get_field(el)->toggle(have_wipe_tower);
|
|
||||||
*/
|
|
||||||
|
|
||||||
m_config_manipulation.update_print_fff_config(m_config, true);
|
m_config_manipulation.update_print_fff_config(m_config, true);
|
||||||
|
|
||||||
m_recommended_thin_wall_thickness_description_line->SetText(
|
m_recommended_thin_wall_thickness_description_line->SetText(
|
||||||
@ -3823,84 +3582,6 @@ void TabSLAPrint::update()
|
|||||||
|
|
||||||
m_update_cnt++;
|
m_update_cnt++;
|
||||||
|
|
||||||
/* #ys_FIXME_delete_after_testing (refactoring)
|
|
||||||
*
|
|
||||||
bool supports_en = m_config->opt_bool("supports_enable");
|
|
||||||
|
|
||||||
get_field("support_head_front_diameter")->toggle(supports_en);
|
|
||||||
get_field("support_head_penetration")->toggle(supports_en);
|
|
||||||
get_field("support_head_width")->toggle(supports_en);
|
|
||||||
get_field("support_pillar_diameter")->toggle(supports_en);
|
|
||||||
get_field("support_pillar_connection_mode")->toggle(supports_en);
|
|
||||||
get_field("support_buildplate_only")->toggle(supports_en);
|
|
||||||
get_field("support_base_diameter")->toggle(supports_en);
|
|
||||||
get_field("support_base_height")->toggle(supports_en);
|
|
||||||
get_field("support_base_safety_distance")->toggle(supports_en);
|
|
||||||
get_field("support_critical_angle")->toggle(supports_en);
|
|
||||||
get_field("support_max_bridge_length")->toggle(supports_en);
|
|
||||||
get_field("support_max_pillar_link_distance")->toggle(supports_en);
|
|
||||||
get_field("support_points_density_relative")->toggle(supports_en);
|
|
||||||
get_field("support_points_minimal_distance")->toggle(supports_en);
|
|
||||||
|
|
||||||
bool pad_en = m_config->opt_bool("pad_enable");
|
|
||||||
|
|
||||||
get_field("pad_wall_thickness")->toggle(pad_en);
|
|
||||||
get_field("pad_wall_height")->toggle(pad_en);
|
|
||||||
get_field("pad_max_merge_distance")->toggle(pad_en);
|
|
||||||
// get_field("pad_edge_radius")->toggle(supports_en);
|
|
||||||
get_field("pad_wall_slope")->toggle(pad_en);
|
|
||||||
get_field("pad_around_object")->toggle(pad_en);
|
|
||||||
|
|
||||||
double head_penetration = m_config->opt_float("support_head_penetration");
|
|
||||||
double head_width = m_config->opt_float("support_head_width");
|
|
||||||
if (head_penetration > head_width) {
|
|
||||||
wxString msg_text = _(
|
|
||||||
L("Head penetration should not be greater than the head width."));
|
|
||||||
|
|
||||||
wxMessageDialog dialog(parent(),
|
|
||||||
msg_text,
|
|
||||||
_(L("Invalid Head penetration")),
|
|
||||||
wxICON_WARNING | wxOK);
|
|
||||||
|
|
||||||
DynamicPrintConfig new_conf = *m_config;
|
|
||||||
if (dialog.ShowModal() == wxID_OK) {
|
|
||||||
new_conf.set_key_value("support_head_penetration",
|
|
||||||
new ConfigOptionFloat(head_width));
|
|
||||||
}
|
|
||||||
|
|
||||||
load_config(new_conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
double pinhead_d = m_config->opt_float("support_head_front_diameter");
|
|
||||||
double pillar_d = m_config->opt_float("support_pillar_diameter");
|
|
||||||
if (pinhead_d > pillar_d) {
|
|
||||||
wxString msg_text = _(L(
|
|
||||||
"Pinhead diameter should be smaller than the pillar diameter."));
|
|
||||||
|
|
||||||
wxMessageDialog dialog (parent(),
|
|
||||||
msg_text,
|
|
||||||
_(L("Invalid pinhead diameter")),
|
|
||||||
wxICON_WARNING | wxOK);
|
|
||||||
|
|
||||||
DynamicPrintConfig new_conf = *m_config;
|
|
||||||
if (dialog.ShowModal() == wxID_OK) {
|
|
||||||
new_conf.set_key_value("support_head_front_diameter",
|
|
||||||
new ConfigOptionFloat(pillar_d / 2.0));
|
|
||||||
}
|
|
||||||
|
|
||||||
load_config(new_conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool has_suppad = pad_en && supports_en;
|
|
||||||
bool zero_elev = m_config->opt_bool("pad_around_object") && has_suppad;
|
|
||||||
|
|
||||||
get_field("support_object_elevation")->toggle(supports_en && !zero_elev);
|
|
||||||
get_field("pad_object_gap")->toggle(zero_elev);
|
|
||||||
get_field("pad_object_connector_stride")->toggle(zero_elev);
|
|
||||||
get_field("pad_object_connector_width")->toggle(zero_elev);
|
|
||||||
get_field("pad_object_connector_penetration")->toggle(zero_elev);
|
|
||||||
*/
|
|
||||||
|
|
||||||
m_config_manipulation.update_print_sla_config(m_config, true);
|
m_config_manipulation.update_print_sla_config(m_config, true);
|
||||||
m_update_cnt--;
|
m_update_cnt--;
|
||||||
|
|
||||||
|
@ -321,7 +321,6 @@ protected:
|
|||||||
|
|
||||||
class TabPrint : public Tab
|
class TabPrint : public Tab
|
||||||
{
|
{
|
||||||
bool is_msg_dlg_already_exist {false};
|
|
||||||
public:
|
public:
|
||||||
TabPrint(wxNotebook* parent) :
|
TabPrint(wxNotebook* parent) :
|
||||||
// Tab(parent, _(L("Print Settings")), L("print")) {}
|
// Tab(parent, _(L("Print Settings")), L("print")) {}
|
||||||
|
@ -752,7 +752,7 @@ static bool append_root_node(ObjectDataViewModelNode *parent_node,
|
|||||||
|
|
||||||
if (inst_root_id < 0) {
|
if (inst_root_id < 0) {
|
||||||
if ((root_type&itInstanceRoot) ||
|
if ((root_type&itInstanceRoot) ||
|
||||||
(root_type&itLayerRoot) && get_root_idx(parent_node, itInstanceRoot)<0)
|
( (root_type&itLayerRoot) && get_root_idx(parent_node, itInstanceRoot)<0) )
|
||||||
parent_node->Append(*root_node);
|
parent_node->Append(*root_node);
|
||||||
else if (root_type&itLayerRoot)
|
else if (root_type&itLayerRoot)
|
||||||
parent_node->Insert(*root_node, static_cast<unsigned int>(get_root_idx(parent_node, itInstanceRoot)));
|
parent_node->Insert(*root_node, static_cast<unsigned int>(get_root_idx(parent_node, itInstanceRoot)));
|
||||||
@ -1379,7 +1379,12 @@ void ObjectDataViewModel::GetItemInfo(const wxDataViewItem& item, ItemType& type
|
|||||||
type = itUndef;
|
type = itUndef;
|
||||||
|
|
||||||
ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
|
ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
|
||||||
if (!node || node->GetIdx() <-1 || node->GetIdx() == -1 && !(node->GetType() & (itObject | itSettings | itInstanceRoot | itLayerRoot/* | itLayer*/)))
|
if (!node ||
|
||||||
|
node->GetIdx() <-1 ||
|
||||||
|
( node->GetIdx() == -1 &&
|
||||||
|
!(node->GetType() & (itObject | itSettings | itInstanceRoot | itLayerRoot/* | itLayer*/))
|
||||||
|
)
|
||||||
|
)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
idx = node->GetIdx();
|
idx = node->GetIdx();
|
||||||
@ -2342,7 +2347,8 @@ wxString DoubleSlider::get_label(const SelectedSlider& selection) const
|
|||||||
|
|
||||||
void DoubleSlider::draw_thumb_text(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) const
|
void DoubleSlider::draw_thumb_text(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) const
|
||||||
{
|
{
|
||||||
if ((m_is_one_layer || m_higher_value==m_lower_value) && selection != m_selection || !selection)
|
if ( selection == ssUndef ||
|
||||||
|
((m_is_one_layer || m_higher_value==m_lower_value) && selection != m_selection) )
|
||||||
return;
|
return;
|
||||||
wxCoord text_width, text_height;
|
wxCoord text_width, text_height;
|
||||||
const wxString label = get_label(selection);
|
const wxString label = get_label(selection);
|
||||||
@ -2674,7 +2680,7 @@ void DoubleSlider::correct_lower_value()
|
|||||||
else if (m_lower_value > m_max_value)
|
else if (m_lower_value > m_max_value)
|
||||||
m_lower_value = m_max_value;
|
m_lower_value = m_max_value;
|
||||||
|
|
||||||
if (m_lower_value >= m_higher_value && m_lower_value <= m_max_value || m_is_one_layer)
|
if ((m_lower_value >= m_higher_value && m_lower_value <= m_max_value) || m_is_one_layer)
|
||||||
m_higher_value = m_lower_value;
|
m_higher_value = m_lower_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2685,7 +2691,7 @@ void DoubleSlider::correct_higher_value()
|
|||||||
else if (m_higher_value < m_min_value)
|
else if (m_higher_value < m_min_value)
|
||||||
m_higher_value = m_min_value;
|
m_higher_value = m_min_value;
|
||||||
|
|
||||||
if (m_higher_value <= m_lower_value && m_higher_value >= m_min_value || m_is_one_layer)
|
if ((m_higher_value <= m_lower_value && m_higher_value >= m_min_value) || m_is_one_layer)
|
||||||
m_lower_value = m_higher_value;
|
m_lower_value = m_higher_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,9 +385,9 @@ class ObjectDataViewModel :public wxDataViewModel
|
|||||||
{
|
{
|
||||||
std::vector<ObjectDataViewModelNode*> m_objects;
|
std::vector<ObjectDataViewModelNode*> m_objects;
|
||||||
std::vector<wxBitmap*> m_volume_bmps;
|
std::vector<wxBitmap*> m_volume_bmps;
|
||||||
wxBitmap* m_warning_bmp;
|
wxBitmap* m_warning_bmp { nullptr };
|
||||||
|
|
||||||
wxDataViewCtrl* m_ctrl{ nullptr };
|
wxDataViewCtrl* m_ctrl { nullptr };
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ObjectDataViewModel();
|
ObjectDataViewModel();
|
||||||
|
Loading…
Reference in New Issue
Block a user