From 08580a9b1800c30f0673bacc7c8049278dace7ff Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 1 Sep 2020 16:56:12 +0200 Subject: [PATCH] WIP: prusa-gcodeviewer command line wrapper to start the PrusaSlicer in standalone G-code viewer mode. Linux and OSX stuff will follow. --- resources/icons/PrusaSlicer-gcodeviewer.ico | Bin 0 -> 113976 bytes src/CMakeLists.txt | 13 ++++++++- src/PrusaSlicer.cpp | 4 +++ src/PrusaSlicer_app_msvc.cpp | 5 ++++ src/libslic3r/PrintConfig.cpp | 6 +++++ .../msw/PrusaSlicer-gcodeviewer.rc.in | 25 ++++++++++++++++++ 6 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 resources/icons/PrusaSlicer-gcodeviewer.ico create mode 100644 src/platform/msw/PrusaSlicer-gcodeviewer.rc.in diff --git a/resources/icons/PrusaSlicer-gcodeviewer.ico b/resources/icons/PrusaSlicer-gcodeviewer.ico new file mode 100644 index 0000000000000000000000000000000000000000..2c9272369fd5617beefe7847ab2264a40f033ab4 GIT binary patch literal 113976 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:/DEBUG>") + target_link_options(PrusaSlicer_app_console PUBLIC "$<$:/DEBUG>") endif () target_compile_definitions(PrusaSlicer_app_console PRIVATE -DSLIC3R_WRAPPER_CONSOLE) add_dependencies(PrusaSlicer_app_console PrusaSlicer) set_target_properties(PrusaSlicer_app_console PROPERTIES OUTPUT_NAME "prusa-slicer-console") target_link_libraries(PrusaSlicer_app_console PRIVATE boost_headeronly) + + add_executable(PrusaSlicer_app_gcodeviewer WIN32 PrusaSlicer_app_msvc.cpp ${CMAKE_CURRENT_BINARY_DIR}/PrusaSlicer-gcodeviewer.rc) + # Generate debug symbols even in release mode. + if (MSVC) + target_link_options(PrusaSlicer_app_gcodeviewer PUBLIC "$<$:/DEBUG>") + endif () + target_compile_definitions(PrusaSlicer_app_gcodeviewer PRIVATE -DSLIC3R_WRAPPER_NOCONSOLE -DSLIC3R_WRAPPER_GCODEVIEWER) + add_dependencies(PrusaSlicer_app_gcodeviewer PrusaSlicer) + set_target_properties(PrusaSlicer_app_gcodeviewer PROPERTIES OUTPUT_NAME "prusa-gcodeviewer") + target_link_libraries(PrusaSlicer_app_gcodeviewer PRIVATE boost_headeronly) endif () # Link the resources dir to where Slic3r GUI expects it diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index aaf3db9158..2962f0cdfe 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -101,6 +101,7 @@ int CLI::run(int argc, char **argv) std::find(m_transforms.begin(), m_transforms.end(), "cut") == m_transforms.end() && std::find(m_transforms.begin(), m_transforms.end(), "cut_x") == m_transforms.end() && std::find(m_transforms.begin(), m_transforms.end(), "cut_y") == m_transforms.end(); + bool start_as_gcodeviewer = false; const std::vector &load_configs = m_config.option("load", true)->values; @@ -521,6 +522,9 @@ int CLI::run(int argc, char **argv) << " (" << print.total_extruded_volume()/1000 << "cm3)" << std::endl; */ } + } else if (opt_key == "gcodeviewer") { + start_gui = true; + start_as_gcodeviewer = true; } else { boost::nowide::cerr << "error: option not supported yet: " << opt_key << std::endl; return 1; diff --git a/src/PrusaSlicer_app_msvc.cpp b/src/PrusaSlicer_app_msvc.cpp index 712cff687d..5f12c91479 100644 --- a/src/PrusaSlicer_app_msvc.cpp +++ b/src/PrusaSlicer_app_msvc.cpp @@ -221,6 +221,11 @@ int wmain(int argc, wchar_t **argv) std::vector argv_extended; argv_extended.emplace_back(argv[0]); +#ifdef SLIC3R_WRAPPER_GCODEVIEWER + wchar_t gcodeviewer_param[] = L"--gcodeviewer"; + argv_extended.emplace_back(gcodeviewer_param); +#endif /* SLIC3R_WRAPPER_GCODEVIEWER */ + #ifdef SLIC3R_GUI // Here one may push some additional parameters based on the wrapper type. bool force_mesa = false; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 3401dcc020..770983ad59 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3530,6 +3530,12 @@ CLIActionsConfigDef::CLIActionsConfigDef() def->cli = "export-gcode|gcode|g"; def->set_default_value(new ConfigOptionBool(false)); + def = this->add("gcodeviewer", coBool); + def->label = L("G-code viewer"); + def->tooltip = L("Visualize an already sliced and saved G-code"); + def->cli = "gcodeviewer"; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("slice", coBool); def->label = L("Slice"); def->tooltip = L("Slice the model as FFF or SLA based on the printer_technology configuration value."); diff --git a/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in b/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in new file mode 100644 index 0000000000..7f4e5a15c3 --- /dev/null +++ b/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in @@ -0,0 +1,25 @@ +1 VERSIONINFO +FILEVERSION @SLIC3R_RC_VERSION@ +PRODUCTVERSION @SLIC3R_RC_VERSION@ +{ + BLOCK "StringFileInfo" + { + BLOCK "040904E4" + { + VALUE "CompanyName", "Prusa Research" + VALUE "FileDescription", "@SLIC3R_APP_NAME@ G-code Viewer" + VALUE "FileVersion", "@SLIC3R_BUILD_ID@" + VALUE "ProductName", "@SLIC3R_APP_NAME@ G-code Viewer" + VALUE "ProductVersion", "@SLIC3R_BUILD_ID@" + VALUE "InternalName", "@SLIC3R_APP_NAME@ G-code Viewer" + VALUE "LegalCopyright", "Copyright \251 2016-2020 Prusa Research, \251 2011-2018 Alessandro Ranelucci" + VALUE "OriginalFilename", "prusa-gcodeviewer.exe" + } + } + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x409, 1252 + } +} +2 ICON "@SLIC3R_RESOURCES_DIR@/icons/PrusaSlicer-gcodeviewer.ico" +1 24 "PrusaSlicer.manifest"