From fb29325b1421f5fcd87c5fb5392e27c0309b0b41 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Tue, 5 Jan 2021 12:26:05 +0100 Subject: [PATCH] Fix of G-code Viewer not loading .gco files #5536 ".gcode", ".gco", ".g" and ".ngc" were considered to be G-code file extensions by the G-code import / export file dialogs, but not by various other functions. Now the G-code extension is tested by a single function is_gcode_file(string). --- src/PrusaSlicer.cpp | 12 ++++-------- src/libslic3r/Config.cpp | 2 +- src/libslic3r/PresetBundle.cpp | 2 +- src/libslic3r/Utils.hpp | 1 + src/libslic3r/utils.cpp | 6 ++++++ src/slic3r/GUI/GUI_App.cpp | 9 +++------ src/slic3r/GUI/Plater.cpp | 4 +--- 7 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index f7350dace..60f3a1321 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -150,15 +150,11 @@ int CLI::run(int argc, char **argv) } // Read input file(s) if any. - for (const std::string& file : m_input_files) { - std::string ext = boost::filesystem::path(file).extension().string(); - if (ext == ".gcode" || ext == ".g") { - if (boost::filesystem::exists(file)) { - start_as_gcodeviewer = true; - break; - } + for (const std::string& file : m_input_files) + if (is_gcode_file(file) && boost::filesystem::exists(file)) { + start_as_gcodeviewer = true; + break; } - } if (!start_as_gcodeviewer) { for (const std::string& file : m_input_files) { if (!boost::filesystem::exists(file)) { diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index b6b496ae9..ea6c78f7c 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -589,7 +589,7 @@ void ConfigBase::setenv_() const void ConfigBase::load(const std::string &file) { - if (boost::iends_with(file, ".gcode") || boost::iends_with(file, ".g")) + if (is_gcode_file(file)) this->load_from_gcode_file(file); else this->load_from_ini(file); diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 1f1d11866..b31ee6664 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -667,7 +667,7 @@ DynamicPrintConfig PresetBundle::full_sla_config() const // If the file is loaded successfully, its print / filament / printer profiles will be activated. void PresetBundle::load_config_file(const std::string &path) { - if (boost::iends_with(path, ".gcode") || boost::iends_with(path, ".g")) { + if (is_gcode_file(path)) { DynamicPrintConfig config; config.apply(FullPrintConfig::defaults()); config.load_from_gcode_file(path); diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp index 28976064b..b797c7c19 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -90,6 +90,7 @@ extern CopyFileResult check_copy(const std::string& origin, const std::string& c extern bool is_plain_file(const boost::filesystem::directory_entry &path); extern bool is_ini_file(const boost::filesystem::directory_entry &path); extern bool is_idx_file(const boost::filesystem::directory_entry &path); +extern bool is_gcode_file(const std::string &path); // File path / name / extension splitting utilities, working with UTF-8, // to be published to Perl. diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index 3c1416936..2a1d12c1d 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -522,6 +522,12 @@ bool is_idx_file(const boost::filesystem::directory_entry &dir_entry) return is_plain_file(dir_entry) && strcasecmp(dir_entry.path().extension().string().c_str(), ".idx") == 0; } +bool is_gcode_file(const std::string &path) +{ + return boost::iends_with(path, ".gcode") || boost::iends_with(path, ".gco") || + boost::iends_with(path, ".g") || boost::iends_with(path, ".ngc"); +} + } // namespace Slic3r #ifdef WIN32 diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index ef2565108..5de7af5d0 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1866,11 +1866,9 @@ bool GUI_App::OnExceptionInMainLoop() void GUI_App::OSXStoreOpenFiles(const wxArrayString &fileNames) { size_t num_gcodes = 0; - for (const wxString &filename : fileNames) { - wxString fn = filename.Upper(); - if (fn.EndsWith(".G") || fn.EndsWith(".GCODE")) + for (const wxString &filename : fileNames) + if (is_gcode_file(into_u8(filename))) ++ num_gcodes; - } if (fileNames.size() == num_gcodes) { // Opening PrusaSlicer by drag & dropping a G-Code onto PrusaSlicer icon in Finder, // just G-codes were passed. Switch to G-code viewer mode. @@ -1890,8 +1888,7 @@ void GUI_App::MacOpenFiles(const wxArrayString &fileNames) std::vector gcode_files; std::vector non_gcode_files; for (const auto& filename : fileNames) { - wxString fn = filename.Upper(); - if (fn.EndsWith(".G") || fn.EndsWith(".GCODE")) + if (is_gcode_file(into_u8(filename))) gcode_files.emplace_back(filename); else { files.emplace_back(into_u8(filename)); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index cb7066630..7824dcfdf 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -4847,9 +4847,7 @@ void Plater::load_gcode() void Plater::load_gcode(const wxString& filename) { - if (filename.empty() || - (!filename.Lower().EndsWith(".gcode") && !filename.Lower().EndsWith(".g")) || - m_last_loaded_gcode == filename) + if (! is_gcode_file(into_u8(filename)) || m_last_loaded_gcode == filename) return; m_last_loaded_gcode = filename;