From 807f380d3f0e9ba1c87ffc0720d18150a3f66bec Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 31 Mar 2022 14:34:53 +0200 Subject: [PATCH 1/5] Fix for #8091 - Design bug: Yes/No response to save dialogue --- src/slic3r/GUI/MsgDialog.hpp | 21 +++++++++++---------- src/slic3r/GUI/Plater.cpp | 1 + 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/MsgDialog.hpp b/src/slic3r/GUI/MsgDialog.hpp index 874629343..4ccc90792 100644 --- a/src/slic3r/GUI/MsgDialog.hpp +++ b/src/slic3r/GUI/MsgDialog.hpp @@ -160,8 +160,8 @@ public: // customization of the message box buttons virtual bool SetYesNoLabels(const wxMD::ButtonLabel& yes, const wxMD::ButtonLabel& no) { - DoSetCustomLabel(m_yes, yes); - DoSetCustomLabel(m_no, no); + DoSetCustomLabel(m_yes, yes, wxID_YES); + DoSetCustomLabel(m_no, no, wxID_NO); return true; } @@ -169,29 +169,29 @@ public: const wxMD::ButtonLabel& no, const wxMD::ButtonLabel& cancel) { - DoSetCustomLabel(m_yes, yes); - DoSetCustomLabel(m_no, no); - DoSetCustomLabel(m_cancel, cancel); + DoSetCustomLabel(m_yes, yes, wxID_YES); + DoSetCustomLabel(m_no, no, wxID_NO); + DoSetCustomLabel(m_cancel, cancel, wxID_CANCEL); return true; } virtual bool SetOKLabel(const wxMD::ButtonLabel& ok) { - DoSetCustomLabel(m_ok, ok); + DoSetCustomLabel(m_ok, ok, wxID_OK); return true; } virtual bool SetOKCancelLabels(const wxMD::ButtonLabel& ok, const wxMD::ButtonLabel& cancel) { - DoSetCustomLabel(m_ok, ok); - DoSetCustomLabel(m_cancel, cancel); + DoSetCustomLabel(m_ok, ok, wxID_OK); + DoSetCustomLabel(m_cancel, cancel, wxID_CANCEL); return true; } virtual bool SetHelpLabel(const wxMD::ButtonLabel& help) { - DoSetCustomLabel(m_help, help); + DoSetCustomLabel(m_help, help, wxID_HELP); return true; } // test if any custom labels were set @@ -230,9 +230,10 @@ protected: // the value to var with possibly some transformation (e.g. Cocoa version // currently uses this to remove any accelerators from the button strings // while GTK+ one handles stock items specifically here) - void DoSetCustomLabel(wxString& var, const wxMD::ButtonLabel& label) + void DoSetCustomLabel(wxString& var, const wxMD::ButtonLabel& label, wxWindowID btn_id) { var = label.GetAsString(); + SetButtonLabel(btn_id, var); } // these functions return the custom label or empty string and should be diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 59a90d4c4..4218c9393 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1692,6 +1692,7 @@ struct Plater::priv std::string act = wxGetApp().app_config->get(act_key); if (act.empty()) { RichMessageDialog dialog(mainframe, reason + "\n" + format_wxstr(_L("Do you want to save the changes to \"%1%\"?"), suggested_project_name), wxString(SLIC3R_APP_NAME), wxYES_NO | wxCANCEL); + dialog.SetYesNoLabels(_L("Save"), _L("Discard")); dialog.ShowCheckBox(_L("Remember my choice")); res = dialog.ShowModal(); if (res != wxID_CANCEL) From 96a6c8538f7839510830dd24c74585e2fad3938c Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 16 Apr 2021 14:44:36 +0200 Subject: [PATCH 2/5] Some refactoring and fixes based on static source code analysis --- src/libslic3r/Arrange.cpp | 2 +- src/libslic3r/Config.cpp | 4 ++-- src/libslic3r/CustomGCode.cpp | 2 +- src/libslic3r/Fill/FillBase.hpp | 2 +- src/libslic3r/Layer.hpp | 2 +- src/libslic3r/Model.cpp | 2 +- src/libslic3r/Preset.cpp | 6 +++--- src/libslic3r/Preset.hpp | 2 +- src/libslic3r/PresetBundle.cpp | 2 +- src/libslic3r/utils.cpp | 4 +++- 10 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp index bf2a219d0..8124b23e3 100644 --- a/src/libslic3r/Arrange.cpp +++ b/src/libslic3r/Arrange.cpp @@ -552,7 +552,7 @@ static CircleBed to_circle(const Point ¢er, const Points& points) { std::vector vertex_distances; double avg_dist = 0; - for (auto pt : points) + for (const Point& pt : points) { double distance = distance_to(center, pt); vertex_distances.push_back(distance); diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index 18b97665d..0297a8d42 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -306,7 +306,7 @@ ConfigOptionDef* ConfigDef::add_nullable(const t_config_option_key &opt_key, Con std::ostream& ConfigDef::print_cli_help(std::ostream& out, bool show_defaults, std::function filter) const { // prepare a function for wrapping text - auto wrap = [](std::string text, size_t line_length) -> std::string { + auto wrap = [](const std::string& text, size_t line_length) -> std::string { std::istringstream words(text); std::ostringstream wrapped; std::string word; @@ -335,7 +335,7 @@ std::ostream& ConfigDef::print_cli_help(std::ostream& out, bool show_defaults, s categories.insert(def.category); } - for (auto category : categories) { + for (const std::string& category : categories) { if (category != "") { out << category << ":" << std::endl; } else if (categories.size() > 1) { diff --git a/src/libslic3r/CustomGCode.cpp b/src/libslic3r/CustomGCode.cpp index 193235bf8..213437782 100644 --- a/src/libslic3r/CustomGCode.cpp +++ b/src/libslic3r/CustomGCode.cpp @@ -41,7 +41,7 @@ extern void check_mode_for_custom_gcode_per_print_z(Info& info) return; bool is_single_extruder = true; - for (auto item : info.gcodes) + for (const Item& item : info.gcodes) { if (item.type == ToolChange) { info.mode = MultiAsSingle; diff --git a/src/libslic3r/Fill/FillBase.hpp b/src/libslic3r/Fill/FillBase.hpp index 6c57a64bf..9ba060b85 100644 --- a/src/libslic3r/Fill/FillBase.hpp +++ b/src/libslic3r/Fill/FillBase.hpp @@ -125,7 +125,7 @@ protected: unsigned int /* thickness_layers */, const std::pair & /* direction */, ExPolygon /* expolygon */, - Polylines & /* polylines_out */) {}; + Polylines & /* polylines_out */) {} virtual float _layer_angle(size_t idx) const { return (idx & 1) ? float(M_PI/2.) : 0; } diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index a308ac0b6..0fe4952f4 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -18,7 +18,7 @@ class PrintObject; namespace FillAdaptive { struct Octree; -}; +} namespace FillLightning { class Generator; diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 67450fb11..3376cc888 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -903,7 +903,7 @@ indexed_triangle_set ModelObject::raw_indexed_triangle_set() const size_t j = out.indices.size(); append(out.vertices, v->mesh().its.vertices); append(out.indices, v->mesh().its.indices); - auto m = v->get_matrix(); + const Transform3d& m = v->get_matrix(); for (; i < out.vertices.size(); ++ i) out.vertices[i] = (m * out.vertices[i].cast()).cast().eval(); if (v->is_left_handed()) { diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 2e630b9c8..f3a1c15b3 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1498,7 +1498,7 @@ void PhysicalPrinter::update_preset_names_in_config() if (!preset_names.empty()) { std::vector& values = config.option("preset_names")->values; values.clear(); - for (auto preset : preset_names) + for (const std::string& preset : preset_names) values.push_back(preset); // temporary workaround for compatibility with older Slicer @@ -1571,7 +1571,7 @@ void PhysicalPrinter::set_name(const std::string& name) this->name = name; } -std::string PhysicalPrinter::get_full_name(std::string preset_name) const +std::string PhysicalPrinter::get_full_name(const std::string& preset_name) const { return name + separator() + preset_name; } @@ -1888,7 +1888,7 @@ std::vector PhysicalPrinterCollection::get_printers_with_only_prese { std::vector printers; - for (auto printer : m_printers) + for (const PhysicalPrinter& printer : m_printers) if (printer.preset_names.size() == 1 && *printer.preset_names.begin() == preset_name) printers.emplace_back(printer.name); diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp index 25ae37484..58ab57cfd 100644 --- a/src/libslic3r/Preset.hpp +++ b/src/libslic3r/Preset.hpp @@ -675,7 +675,7 @@ public: bool operator<(const PhysicalPrinter& other) const { return this->name < other.name; } // get full printer name included a name of the preset - std::string get_full_name(std::string preset_name) const; + std::string get_full_name(const std::string &preset_name) const; // get printer name from the full name uncluded preset name static std::string get_short_name(std::string full_name); diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 874b775cd..85bcd69ba 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -267,7 +267,7 @@ PresetsConfigSubstitutions PresetBundle::load_presets(AppConfig &config, Forward std::string errors_cummulative; std::tie(substitutions, errors_cummulative) = this->load_system_presets(substitution_rule); - const std::string dir_user_presets = data_dir() + const std::string& dir_user_presets = data_dir() #ifdef SLIC3R_PROFILE_USE_PRESETS_SUBDIR // Store the print/filament/printer presets into a "presets" directory. + "/presets" diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index e00b6e71c..ddc9a4081 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -961,9 +961,11 @@ std::string string_printf(const char *format, ...) buffer.resize(size_t(bufflen) + 1); ::vsnprintf(buffer.data(), buffer.size(), format, args2); } + + va_end(args1); + va_end(args2); buffer.resize(bufflen); - return buffer; } From e01d32d01afec11dd1b149fc983a15f2875a36d4 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 17 Sep 2021 16:04:27 +0200 Subject: [PATCH 3/5] Fixed several std::moves that had no effect, moved GCode data to heap --- src/libslic3r/ExPolygon.hpp | 10 +++++----- src/libslic3r/ExtrusionEntity.hpp | 2 +- src/libslic3r/Model.hpp | 2 +- src/libslic3r/Polygon.hpp | 6 +++--- src/libslic3r/Polyline.hpp | 2 +- src/libslic3r/Print.cpp | 6 +++--- src/libslic3r/Surface.hpp | 10 +++++----- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/libslic3r/ExPolygon.hpp b/src/libslic3r/ExPolygon.hpp index 6f3884673..c0dcac105 100644 --- a/src/libslic3r/ExPolygon.hpp +++ b/src/libslic3r/ExPolygon.hpp @@ -169,10 +169,10 @@ inline Polylines to_polylines(ExPolygon &&src) Polyline &pl = polylines[idx ++]; pl.points = std::move(src.contour.points); pl.points.push_back(pl.points.front()); - for (Polygons::const_iterator ith = src.holes.begin(); ith != src.holes.end(); ++ith) { + for (auto ith = src.holes.begin(); ith != src.holes.end(); ++ith) { Polyline &pl = polylines[idx ++]; pl.points = std::move(ith->points); - pl.points.push_back(ith->points.front()); + pl.points.push_back(p1.points.front()); } assert(idx == polylines.size()); return polylines; @@ -183,14 +183,14 @@ inline Polylines to_polylines(ExPolygons &&src) Polylines polylines; polylines.assign(number_polygons(src), Polyline()); size_t idx = 0; - for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++it) { + for (auto it = src.begin(); it != src.end(); ++it) { Polyline &pl = polylines[idx ++]; pl.points = std::move(it->contour.points); pl.points.push_back(pl.points.front()); - for (Polygons::const_iterator ith = it->holes.begin(); ith != it->holes.end(); ++ith) { + for (auto ith = it->holes.begin(); ith != it->holes.end(); ++ith) { Polyline &pl = polylines[idx ++]; pl.points = std::move(ith->points); - pl.points.push_back(ith->points.front()); + pl.points.push_back(pl.points.front()); } } assert(idx == polylines.size()); diff --git a/src/libslic3r/ExtrusionEntity.hpp b/src/libslic3r/ExtrusionEntity.hpp index 1c990f5ea..5e6a51d20 100644 --- a/src/libslic3r/ExtrusionEntity.hpp +++ b/src/libslic3r/ExtrusionEntity.hpp @@ -242,7 +242,7 @@ public: ExtrusionLoop(ExtrusionPaths &&paths, ExtrusionLoopRole role = elrDefault) : paths(std::move(paths)), m_loop_role(role) {} ExtrusionLoop(const ExtrusionPath &path, ExtrusionLoopRole role = elrDefault) : m_loop_role(role) { this->paths.push_back(path); } - ExtrusionLoop(const ExtrusionPath &&path, ExtrusionLoopRole role = elrDefault) : m_loop_role(role) + ExtrusionLoop(ExtrusionPath &&path, ExtrusionLoopRole role = elrDefault) : m_loop_role(role) { this->paths.emplace_back(std::move(path)); } bool is_loop() const override{ return true; } bool can_reverse() const override { return false; } diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 7a1cf206e..14d063155 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -817,7 +817,7 @@ private: this->set_material_id(other.material_id()); } // Providing a new mesh, therefore this volume will get a new unique ID assigned. - ModelVolume(ModelObject *object, const ModelVolume &other, const TriangleMesh &&mesh) : + ModelVolume(ModelObject *object, const ModelVolume &other, TriangleMesh &&mesh) : name(other.name), source(other.source), m_mesh(new TriangleMesh(std::move(mesh))), config(other.config), m_type(other.m_type), object(object), m_transformation(other.m_transformation) { assert(this->id().valid()); diff --git a/src/libslic3r/Polygon.hpp b/src/libslic3r/Polygon.hpp index d24540339..089820565 100644 --- a/src/libslic3r/Polygon.hpp +++ b/src/libslic3r/Polygon.hpp @@ -220,10 +220,10 @@ inline Polylines to_polylines(Polygons &&polys) Polylines polylines; polylines.assign(polys.size(), Polyline()); size_t idx = 0; - for (Polygons::const_iterator it = polys.begin(); it != polys.end(); ++ it) { + for (auto it = polys.begin(); it != polys.end(); ++ it) { Polyline &pl = polylines[idx ++]; pl.points = std::move(it->points); - pl.points.push_back(it->points.front()); + pl.points.push_back(pl.points.front()); } assert(idx == polylines.size()); return polylines; @@ -242,7 +242,7 @@ inline Polygons to_polygons(std::vector &&paths) { Polygons out; out.reserve(paths.size()); - for (const Points &path : paths) + for (Points &path : paths) out.emplace_back(std::move(path)); return out; } diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp index 5766d9671..256dca28c 100644 --- a/src/libslic3r/Polyline.hpp +++ b/src/libslic3r/Polyline.hpp @@ -139,7 +139,7 @@ inline Polylines to_polylines(std::vector &&paths) { Polylines out; out.reserve(paths.size()); - for (const Points &path : paths) + for (Points &path : paths) out.emplace_back(std::move(path)); return out; } diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 85246df31..c521393df 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -885,9 +885,9 @@ std::string Print::export_gcode(const std::string& path_template, GCodeProcessor message = L("Generating G-code"); this->set_status(90, message); - // The following line may die for multiple reasons. - GCode gcode; - gcode.do_export(this, path.c_str(), result, thumbnail_cb); + // Create GCode on heap, it has quite a lot of data. + std::unique_ptr gcode(new GCode); + gcode->do_export(this, path.c_str(), result, thumbnail_cb); return path.c_str(); } diff --git a/src/libslic3r/Surface.hpp b/src/libslic3r/Surface.hpp index 4920efbbf..ef1de30e9 100644 --- a/src/libslic3r/Surface.hpp +++ b/src/libslic3r/Surface.hpp @@ -58,11 +58,11 @@ public: thickness(rhs.thickness), thickness_layers(rhs.thickness_layers), bridge_angle(rhs.bridge_angle), extra_perimeters(rhs.extra_perimeters) {}; - Surface(SurfaceType _surface_type, const ExPolygon &&_expolygon) + Surface(SurfaceType _surface_type, ExPolygon &&_expolygon) : surface_type(_surface_type), expolygon(std::move(_expolygon)), thickness(-1), thickness_layers(1), bridge_angle(-1), extra_perimeters(0) {}; - Surface(const Surface &other, const ExPolygon &&_expolygon) + Surface(const Surface &other, ExPolygon &&_expolygon) : surface_type(other.surface_type), expolygon(std::move(_expolygon)), thickness(other.thickness), thickness_layers(other.thickness_layers), bridge_angle(other.bridge_angle), extra_perimeters(other.extra_perimeters) @@ -159,7 +159,7 @@ inline ExPolygons to_expolygons(Surfaces &&src) { ExPolygons expolygons; expolygons.reserve(src.size()); - for (Surfaces::const_iterator it = src.begin(); it != src.end(); ++it) + for (auto it = src.begin(); it != src.end(); ++it) expolygons.emplace_back(ExPolygon(std::move(it->expolygon))); src.clear(); return expolygons; @@ -260,8 +260,8 @@ inline void surfaces_append(Surfaces &dst, ExPolygons &&src, SurfaceType surface inline void surfaces_append(Surfaces &dst, ExPolygons &&src, const Surface &surfaceTempl) { dst.reserve(dst.size() + number_polygons(src)); - for (ExPolygons::const_iterator it = src.begin(); it != src.end(); ++ it) - dst.emplace_back(Surface(surfaceTempl, std::move(*it))); + for (ExPolygon& explg : src) + dst.emplace_back(Surface(surfaceTempl, std::move(explg))); src.clear(); } From aa2a8178f8088fae4a25fb7b782ab725bd252461 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 31 Mar 2022 15:57:19 +0200 Subject: [PATCH 4/5] Fixed some compiler warnings --- src/slic3r/GUI/DoubleSlider.cpp | 2 +- src/slic3r/GUI/GUI.cpp | 3 --- src/slic3r/GUI/UpdateDialogs.cpp | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index d2f0e89aa..760f5fe0a 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -1084,7 +1084,7 @@ void Control::Ruler::update(const std::vector& values, double scroll_ste { if (!m_parent || values.empty() || // check if need to update ruler in respect to input values - values.front() == m_min_val && values.back() == m_max_val && m_scroll_step == scroll_step && max_values.size() == m_max_values_cnt) + (values.front() == m_min_val && values.back() == m_max_val && m_scroll_step == scroll_step && max_values.size() == m_max_values_cnt)) return; m_min_val = values.front(); diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index 4c1ad0acf..5886be028 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -530,9 +530,6 @@ wxExecuteEnv get_appimage_exec_env() } // namespace void desktop_execute(const char* argv[]) { - if (sizeof(argv) == 0) - return; - // Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, // because they may mess up the environment expected by the file manager. // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index 0441e866f..e8edd5798 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -207,7 +207,7 @@ bool AppUpdateDownloadDialog::run_after_download() const boost::filesystem::path AppUpdateDownloadDialog::get_download_path() const { - return std::move(boost::filesystem::path(txtctrl_path->GetValue().ToUTF8().data())); + return boost::filesystem::path(txtctrl_path->GetValue().ToUTF8().data()); } // MsgUpdateConfig From 9b5d17dfbd0a105def3bf9176c2fd3356aec67a2 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 1 Apr 2022 08:28:58 +0200 Subject: [PATCH 5/5] Follow-up of e01d32d01afec11dd1b149fc983a15f2875a36d4 - Fixed typo --- src/libslic3r/ExPolygon.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/ExPolygon.hpp b/src/libslic3r/ExPolygon.hpp index c0dcac105..cbf6b1c1a 100644 --- a/src/libslic3r/ExPolygon.hpp +++ b/src/libslic3r/ExPolygon.hpp @@ -172,7 +172,7 @@ inline Polylines to_polylines(ExPolygon &&src) for (auto ith = src.holes.begin(); ith != src.holes.end(); ++ith) { Polyline &pl = polylines[idx ++]; pl.points = std::move(ith->points); - pl.points.push_back(p1.points.front()); + pl.points.push_back(pl.points.front()); } assert(idx == polylines.size()); return polylines;