diff --git a/Build.PL b/Build.PL index 3f1cf2633f..ef17ec046b 100644 --- a/Build.PL +++ b/Build.PL @@ -3,7 +3,7 @@ print "This script is currently used for installing Perl dependenices for running\n"; print "the libslic3r unit / integration tests through Perl prove.\n"; print "If you don't plan to run the unit / integration tests, you don't need to\n"; -print "install these dependencies to build and run Slic3r.\n"; +print "install these dependencies to build and run PrusaSlicer.\n"; use strict; use warnings; @@ -122,7 +122,7 @@ EOF } print "\n"; -print "In the next step, you need to build the Slic3r C++ library.\n"; +print "In the next step, you need to build the PrusaSlicer C++ library.\n"; print "1) Create a build directory and change to it\n"; print "2) run cmake .. -DCMAKE_BUILD_TYPE=Release\n"; print "3) run make\n"; diff --git a/CMakeLists.txt b/CMakeLists.txt index 346d2cf4ab..73805d0d8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -project(Slic3r) +project(PrusaSlicer) cmake_minimum_required(VERSION 3.2) include("version.inc") @@ -22,11 +22,11 @@ else() endif() endif() -option(SLIC3R_STATIC "Compile Slic3r with static libraries (Boost, TBB, glew)" ${SLIC3R_STATIC_INITIAL}) -option(SLIC3R_GUI "Compile Slic3r with GUI components (OpenGL, wxWidgets)" 1) -option(SLIC3R_FHS "Assume Slic3r is to be installed in a FHS directory structure" 0) +option(SLIC3R_STATIC "Compile PrusaSlicer with static libraries (Boost, TBB, glew)" ${SLIC3R_STATIC_INITIAL}) +option(SLIC3R_GUI "Compile PrusaSlicer with GUI components (OpenGL, wxWidgets)" 1) +option(SLIC3R_FHS "Assume PrusaSlicer is to be installed in a FHS directory structure" 0) option(SLIC3R_WX_STABLE "Build against wxWidgets stable (3.0) as oppsed to dev (3.1) on Linux" 0) -option(SLIC3R_PROFILE "Compile Slic3r with an invasive Shiny profiler" 0) +option(SLIC3R_PROFILE "Compile PrusaSlicer with an invasive Shiny profiler" 0) option(SLIC3R_PCH "Use precompiled headers" 1) option(SLIC3R_MSVC_COMPILE_PARALLEL "Compile on Visual Studio in parallel" 1) option(SLIC3R_MSVC_PDB "Generate PDB files on MSVC in Release mode" 1) @@ -59,7 +59,8 @@ if (MSVC) endif () # /bigobj (Increase Number of Sections in .Obj file) # error C3859: virtual memory range for PCH exceeded; please recompile with a command line option of '-Zm90' or greater - add_compile_options(-bigobj -Zm316) + # Generate symbols at every build target, even for the release. + add_compile_options(-bigobj -Zm316 /Zi) endif () # Display and check CMAKE_PREFIX_PATH @@ -207,13 +208,13 @@ endif() add_definitions(-DwxUSE_UNICODE -D_UNICODE -DUNICODE -DWXINTL_NO_GETTEXT_MACRO) if (SLIC3R_PROFILE) - message("Slic3r will be built with a Shiny invasive profiler") + message("PrusaSlicer will be built with a Shiny invasive profiler") add_definitions(-DSLIC3R_PROFILE) endif () # Disable optimization even with debugging on. if (0) - message(STATUS "Perl compiled without optimization. Disabling optimization for the Slic3r build.") + message(STATUS "Perl compiled without optimization. Disabling optimization for the PrusaSlicer build.") message("Old CMAKE_CXX_FLAGS_RELEASE: ${CMAKE_CXX_FLAGS_RELEASE}") message("Old CMAKE_CXX_FLAGS_RELWITHDEBINFO: ${CMAKE_CXX_FLAGS_RELEASE}") message("Old CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS_RELEASE}") @@ -336,9 +337,9 @@ add_custom_target(pot COMMENT "Generate pot file from strings in the source tree" ) -# libslic3r, Slic3r GUI and the slic3r executable. +# libslic3r, PrusaSlicer GUI and the PrusaSlicer executable. add_subdirectory(src) -set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT slic3r_app_console) +set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT PrusaSlicer_app_console) # Perl bindings, currently only used for the unit / integration tests of libslic3r. # Also runs the unit / integration tests. @@ -360,7 +361,7 @@ endif() if (WIN32) install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources") else () - set(SLIC3R_FHS_RESOURCES "${CMAKE_INSTALL_FULL_DATAROOTDIR}/slic3r-prusa3d") + set(SLIC3R_FHS_RESOURCES "${CMAKE_INSTALL_FULL_DATAROOTDIR}/PrusaSlicer") install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${SLIC3R_FHS_RESOURCES}") endif () configure_file(${LIBDIR}/platform/unix/fhs.hpp.in ${LIBDIR_BIN}/platform/unix/fhs.hpp) diff --git a/slic3r.sublime-project b/PrusaSlicer.sublime-project similarity index 100% rename from slic3r.sublime-project rename to PrusaSlicer.sublime-project diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index a77f8b4a02..5720901578 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -1,12 +1,12 @@ # -# This CMake project downloads, configures and builds Slic3r PE dependencies on Unix and Windows. +# This CMake project downloads, configures and builds PrusaSlicer dependencies on Unix and Windows. # # When using this script, it's recommended to perform an out-of-source build using CMake. # # All the dependencies are installed in a `destdir` directory in the root of the build directory, # in a traditional Unix-style prefix structure. The destdir can be used directly by CMake -# when building Slic3r - to do this, set the CMAKE_PREFIX_PATH to ${destdir}/usr/local. -# Warning: On UNIX/Linux, you also need to set -DSLIC3R_STATIC=1 when building Slic3r. +# when building PrusaSlicer - to do this, set the CMAKE_PREFIX_PATH to ${destdir}/usr/local. +# Warning: On UNIX/Linux, you also need to set -DSLIC3R_STATIC=1 when building PrusaSlicer. # # For better clarity of console output, it's recommended to _not_ use a parallelized build # for the top-level command, ie. use `make -j 1` or `ninja -j 1` to force single-threaded top-level @@ -20,7 +20,7 @@ # therefore, unfortunatelly, the installation cannot be copied/moved elsewhere without re-installing wxWidgets. # -project(Slic3r-deps) +project(PrusaSlicer-deps) cmake_minimum_required(VERSION 3.2) include(ExternalProject) @@ -36,8 +36,8 @@ set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination direct option(DEP_DEBUG "Build debug variants (only applicable on Windows)" ON) option(DEP_WX_STABLE "Build against wxWidgets stable 3.0 as opposed to default 3.1 (Linux only)" OFF) -message(STATUS "Slic3r deps DESTDIR: ${DESTDIR}") -message(STATUS "Slic3r deps debug build: ${DEP_DEBUG}") +message(STATUS "PrusaSlicer deps DESTDIR: ${DESTDIR}") +message(STATUS "PrusaSlicer deps debug build: ${DEP_DEBUG}") if (MSVC) if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") diff --git a/deps/wxwidgets-pngprefix.h b/deps/wxwidgets-pngprefix.h index de62e310bd..67c70af802 100644 --- a/deps/wxwidgets-pngprefix.h +++ b/deps/wxwidgets-pngprefix.h @@ -1,4 +1,4 @@ -// Patched in Slic3r: These two were missing: +// Patched in PrusaSlicer: These two were missing: #define png_write_eXIf wx_png_write_eXIf #define png_handle_eXIf wx_png_handle_eXIf diff --git a/doc/How to build - Mac OS.md b/doc/How to build - Mac OS.md index 590f48db19..42a71e10d7 100644 --- a/doc/How to build - Mac OS.md +++ b/doc/How to build - Mac OS.md @@ -44,7 +44,7 @@ Alternatively, if you would like to use XCode GUI, modify the `cmake` command to cmake .. -GXcode -DCMAKE_PREFIX_PATH="$PWD/../deps/build/destdir/usr/local" -and then open the `Slic3r.xcodeproj` file. +and then open the `PrusaSlicer.xcodeproj` file. This should open up XCode where you can perform build using the GUI or perform other tasks. ### Note on Mac OS X SDKs diff --git a/doc/How to build - Windows.md b/doc/How to build - Windows.md index 71f74c66d3..242af9dab2 100644 --- a/doc/How to build - Windows.md +++ b/doc/How to build - Windows.md @@ -44,8 +44,8 @@ Note that if you're building a 32-bit variant, you will need to change the `"Vis Conversely, if you're using Visual Studio version other than 2013, the version number will need to be changed accordingly. -If `cmake` has finished without errors, go to the build directory and open the `Slic3r.sln` solution file in Visual Studio. -Before building, make sure you're building the right project (use one of those starting with `slic3r_app_...`) and that you're building +If `cmake` has finished without errors, go to the build directory and open the `PrusaSlicer.sln` solution file in Visual Studio. +Before building, make sure you're building the right project (use one of those starting with `PrusaSlicer_app_...`) and that you're building with the right configuration, i.e. _Release_ vs. _Debug_. When unsure, choose _Release_. Note that you won't be able to build a _Debug_ variant against a _Release_-only dependencies package. diff --git a/resources/icons/PrusaSlicer.icns b/resources/icons/PrusaSlicer.icns index c1eba897ec..2364b6c13a 100644 Binary files a/resources/icons/PrusaSlicer.icns and b/resources/icons/PrusaSlicer.icns differ diff --git a/resources/icons/PrusaSlicer.ico b/resources/icons/PrusaSlicer.ico index 5765f77d23..4a335cb6aa 100644 Binary files a/resources/icons/PrusaSlicer.ico and b/resources/icons/PrusaSlicer.ico differ diff --git a/resources/icons/PrusaSlicer.png b/resources/icons/PrusaSlicer.png index 896cc44604..dc51630fbb 100644 Binary files a/resources/icons/PrusaSlicer.png and b/resources/icons/PrusaSlicer.png differ diff --git a/resources/icons/PrusaSlicer_128px.png b/resources/icons/PrusaSlicer_128px.png index e8b2e3e3eb..ddf2223002 100644 Binary files a/resources/icons/PrusaSlicer_128px.png and b/resources/icons/PrusaSlicer_128px.png differ diff --git a/resources/icons/PrusaSlicer_192px.png b/resources/icons/PrusaSlicer_192px.png index 9af2bfc74e..a667be3e71 100644 Binary files a/resources/icons/PrusaSlicer_192px.png and b/resources/icons/PrusaSlicer_192px.png differ diff --git a/resources/icons/PrusaSlicer_192px_grayscale.png b/resources/icons/PrusaSlicer_192px_grayscale.png index 910f941870..6a52fb0311 100644 Binary files a/resources/icons/PrusaSlicer_192px_grayscale.png and b/resources/icons/PrusaSlicer_192px_grayscale.png differ diff --git a/resources/icons/PrusaSlicer_192px_transparent.png b/resources/icons/PrusaSlicer_192px_transparent.png index f85c835b3c..18dd923981 100644 Binary files a/resources/icons/PrusaSlicer_192px_transparent.png and b/resources/icons/PrusaSlicer_192px_transparent.png differ diff --git a/resources/icons/PrusaSlicer_32px.png b/resources/icons/PrusaSlicer_32px.png index 6bf5a9cd14..bbbf840cab 100644 Binary files a/resources/icons/PrusaSlicer_32px.png and b/resources/icons/PrusaSlicer_32px.png differ diff --git a/resources/localization/Slic3rPE.pot b/resources/localization/PrusaSlicer.pot similarity index 97% rename from resources/localization/Slic3rPE.pot rename to resources/localization/PrusaSlicer.pot index 1fbea57e5a..e453150b86 100644 --- a/resources/localization/Slic3rPE.pot +++ b/resources/localization/PrusaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-05-11 23:33+0200\n" +"POT-Creation-Date: 2019-05-13 15:02+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -164,7 +164,7 @@ msgstr "" msgid "Choose a file to import bed shape from (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/GUI_ObjectList.cpp:1443 +#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/GUI_ObjectList.cpp:1438 msgid "Error!" msgstr "" @@ -312,7 +312,7 @@ msgstr "" msgid "All standard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:3006 +#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:3007 msgid "All" msgstr "" @@ -756,9 +756,9 @@ msgstr "" msgid "Add..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3444 src/slic3r/GUI/GUI_ObjectList.cpp:1269 +#: src/slic3r/GUI/GLCanvas3D.cpp:3444 src/slic3r/GUI/GUI_ObjectList.cpp:1267 #: src/slic3r/GUI/Plater.cpp:2933 src/slic3r/GUI/Plater.cpp:2951 -#: src/slic3r/GUI/Tab.cpp:2956 +#: src/slic3r/GUI/Tab.cpp:2957 msgid "Delete" msgstr "" @@ -1015,7 +1015,7 @@ msgstr "" msgid "Switch to editing mode" msgstr "" -#: src/slic3r/GUI/GUI.cpp:142 src/slic3r/GUI/Tab.cpp:2815 +#: src/slic3r/GUI/GUI.cpp:142 src/slic3r/GUI/Tab.cpp:2816 msgid "It's impossible to print multi-part object(s) with SLA technology." msgstr "" @@ -1023,7 +1023,7 @@ msgstr "" msgid "Please check and fix your object list." msgstr "" -#: src/slic3r/GUI/GUI.cpp:144 src/slic3r/GUI/Tab.cpp:2817 +#: src/slic3r/GUI/GUI.cpp:144 src/slic3r/GUI/Tab.cpp:2818 msgid "Attention!" msgstr "" @@ -1099,7 +1099,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:539 src/slic3r/GUI/Tab.cpp:1030 #: src/slic3r/GUI/Tab.cpp:1045 src/slic3r/GUI/Tab.cpp:1143 #: src/slic3r/GUI/Tab.cpp:1146 src/slic3r/GUI/Tab.cpp:1520 -#: src/slic3r/GUI/Tab.cpp:1946 src/slic3r/GUI/Tab.cpp:3460 +#: src/slic3r/GUI/Tab.cpp:1946 src/slic3r/GUI/Tab.cpp:3461 #: src/slic3r/GUI/wxExtensions.cpp:2510 src/libslic3r/PrintConfig.cpp:73 #: src/libslic3r/PrintConfig.cpp:188 src/libslic3r/PrintConfig.cpp:351 #: src/libslic3r/PrintConfig.cpp:989 src/libslic3r/PrintConfig.cpp:2200 @@ -1169,7 +1169,7 @@ msgstr "" msgid "The presets on the following tabs were modified" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:831 src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/GUI_App.cpp:831 src/slic3r/GUI/Tab.cpp:2804 msgid "Discard changes and continue anyway?" msgstr "" @@ -1267,8 +1267,8 @@ msgid "Extrusion Width" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:87 src/slic3r/GUI/GUI_ObjectList.cpp:541 -#: src/slic3r/GUI/Plater.cpp:429 src/slic3r/GUI/Tab.cpp:3422 -#: src/slic3r/GUI/Tab.cpp:3423 src/libslic3r/PrintConfig.cpp:2388 +#: src/slic3r/GUI/Plater.cpp:429 src/slic3r/GUI/Tab.cpp:3423 +#: src/slic3r/GUI/Tab.cpp:3424 src/libslic3r/PrintConfig.cpp:2388 #: src/libslic3r/PrintConfig.cpp:2395 src/libslic3r/PrintConfig.cpp:2404 #: src/libslic3r/PrintConfig.cpp:2413 src/libslic3r/PrintConfig.cpp:2423 #: src/libslic3r/PrintConfig.cpp:2449 src/libslic3r/PrintConfig.cpp:2456 @@ -1280,7 +1280,7 @@ msgid "Supports" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:88 src/slic3r/GUI/GUI_ObjectList.cpp:542 -#: src/slic3r/GUI/Tab.cpp:3450 src/slic3r/GUI/Tab.cpp:3451 +#: src/slic3r/GUI/Tab.cpp:3451 src/slic3r/GUI/Tab.cpp:3452 #: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2548 #: src/libslic3r/PrintConfig.cpp:2562 src/libslic3r/PrintConfig.cpp:2572 #: src/libslic3r/PrintConfig.cpp:2585 src/libslic3r/PrintConfig.cpp:2594 @@ -1329,9 +1329,9 @@ msgid "Right button click the icon to change the object settings" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:357 src/slic3r/GUI/GUI_ObjectList.cpp:378 -#: src/slic3r/GUI/GUI_ObjectList.cpp:390 src/slic3r/GUI/GUI_ObjectList.cpp:2855 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2865 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2897 src/slic3r/GUI/wxExtensions.cpp:499 +#: src/slic3r/GUI/GUI_ObjectList.cpp:390 src/slic3r/GUI/GUI_ObjectList.cpp:2846 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2856 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2888 src/slic3r/GUI/wxExtensions.cpp:499 #: src/slic3r/GUI/wxExtensions.cpp:524 msgid "default" msgstr "" @@ -1343,7 +1343,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:876 src/slic3r/GUI/GUI_ObjectList.cpp:1151 #: src/slic3r/GUI/GUI_ObjectList.cpp:1157 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1389 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1384 #, possible-c-format msgid "Quick Add Settings (%s)" msgstr "" @@ -1383,150 +1383,167 @@ msgid "Change type" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:1204 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1343 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1338 msgid "Set as a Separated Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1212 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1210 msgid "Rename" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1222 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1220 msgid "Fix through the Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1231 src/slic3r/GUI/Plater.cpp:2969 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1229 src/slic3r/GUI/Plater.cpp:2969 msgid "Export as STL" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1238 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1236 msgid "Change extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1257 src/libslic3r/PrintConfig.cpp:300 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1255 src/libslic3r/PrintConfig.cpp:300 msgid "Default" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1263 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1261 msgid "Select new extruder for the object/part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1343 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1338 msgid "Set as a Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1556 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 msgid "Generic" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1699 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1694 msgid "You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1716 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1711 msgid "You can't delete the last intance from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1742 src/slic3r/GUI/Plater.cpp:2306 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1737 src/slic3r/GUI/Plater.cpp:2306 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1851 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1846 msgid "Group manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1863 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 msgid "Object manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1873 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1868 msgid "Object Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1877 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 msgid "Part Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1886 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1881 msgid "Part manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1892 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1887 msgid "Instance manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 msgid "Object or Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2543 msgid "Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2414 msgid "Unsupported selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2420 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2415 #, possible-c-format msgid "You started your selection with %s Item." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2421 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2416 #, possible-c-format msgid "In this mode you can select only other %s Items%s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2419 msgid "of a current Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2429 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2502 src/slic3r/GUI/Plater.cpp:118 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:118 msgid "Info" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2543 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2538 msgid "You can't change a type of the last solid part of the object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2550 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2543 +msgid "Modifier" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2543 +msgid "Support Enforcer" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2543 +msgid "Support Blocker" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2545 +msgid "Type:" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2545 msgid "Select type of part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 msgid "Enter new name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2714 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 msgid "Renaming" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2730 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2824 src/slic3r/GUI/Tab.cpp:3303 -#: src/slic3r/GUI/Tab.cpp:3307 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2725 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2819 src/slic3r/GUI/Tab.cpp:3304 +#: src/slic3r/GUI/Tab.cpp:3308 msgid "The supplied name is not valid;" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2731 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2825 src/slic3r/GUI/Tab.cpp:3304 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2726 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2820 src/slic3r/GUI/Tab.cpp:3305 msgid "the following characters are not allowed:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2845 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2836 msgid "Set extruder for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2846 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2837 msgid "Select extruder number for selected objects and/or parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2859 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2850 msgid "Select extruder number:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2860 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2851 msgid "This extruder will be set for selected items" msgstr "" @@ -1934,9 +1951,14 @@ msgstr "" msgid "Layers Slider Shortcuts" msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:36 +msgid "based on Slic3r" +msgstr "" + #: src/slic3r/GUI/MainFrame.cpp:61 msgid "" -" - Remember to check for updates at http://github.com/prusa3d/slic3r/releases" +" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" +"releases" msgstr "" #: src/slic3r/GUI/MainFrame.cpp:163 @@ -2405,7 +2427,7 @@ msgstr "" #: src/slic3r/GUI/MainFrame.cpp:713 src/slic3r/GUI/Plater.cpp:2439 #: src/slic3r/GUI/Plater.cpp:3658 src/slic3r/GUI/Tab.cpp:1163 -#: src/slic3r/GUI/Tab.cpp:3461 +#: src/slic3r/GUI/Tab.cpp:3462 msgid "Slicing" msgstr "" @@ -2953,7 +2975,11 @@ msgid "" msgstr "" #: src/slic3r/GUI/Preferences.cpp:63 -msgid "If enabled, Slic3r checks for new versions of " +msgid "" +"If enabled, PrusaSlicer will check for the new versions of itself online. " +"When a new version becomes available a notification is displayed at the next " +"application startup (never during program usage). This is only a " +"notification mechanisms, no automatic installation is done." msgstr "" #: src/slic3r/GUI/Preferences.cpp:71 @@ -3334,7 +3360,7 @@ msgstr "" msgid "default SLA print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1001 src/slic3r/GUI/Tab.cpp:3416 +#: src/slic3r/GUI/Tab.cpp:1001 src/slic3r/GUI/Tab.cpp:3417 msgid "Layers and perimeters" msgstr "" @@ -3418,7 +3444,7 @@ msgstr "" msgid "Other" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1172 src/slic3r/GUI/Tab.cpp:3464 +#: src/slic3r/GUI/Tab.cpp:1172 src/slic3r/GUI/Tab.cpp:3465 msgid "Output options" msgstr "" @@ -3430,7 +3456,7 @@ msgstr "" msgid "Extruder clearance (mm)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1184 src/slic3r/GUI/Tab.cpp:3465 +#: src/slic3r/GUI/Tab.cpp:1184 src/slic3r/GUI/Tab.cpp:3466 msgid "Output file" msgstr "" @@ -3442,19 +3468,19 @@ msgstr "" #: src/slic3r/GUI/Tab.cpp:1581 src/slic3r/GUI/Tab.cpp:1582 #: src/slic3r/GUI/Tab.cpp:1991 src/slic3r/GUI/Tab.cpp:1992 #: src/slic3r/GUI/Tab.cpp:2085 src/slic3r/GUI/Tab.cpp:2086 -#: src/slic3r/GUI/Tab.cpp:3353 src/slic3r/GUI/Tab.cpp:3354 +#: src/slic3r/GUI/Tab.cpp:3354 src/slic3r/GUI/Tab.cpp:3355 msgid "Notes" msgstr "" #: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1589 #: src/slic3r/GUI/Tab.cpp:1998 src/slic3r/GUI/Tab.cpp:2092 -#: src/slic3r/GUI/Tab.cpp:3361 src/slic3r/GUI/Tab.cpp:3470 +#: src/slic3r/GUI/Tab.cpp:3362 src/slic3r/GUI/Tab.cpp:3471 msgid "Dependencies" msgstr "" #: src/slic3r/GUI/Tab.cpp:1205 src/slic3r/GUI/Tab.cpp:1590 #: src/slic3r/GUI/Tab.cpp:1999 src/slic3r/GUI/Tab.cpp:2093 -#: src/slic3r/GUI/Tab.cpp:3362 src/slic3r/GUI/Tab.cpp:3471 +#: src/slic3r/GUI/Tab.cpp:3363 src/slic3r/GUI/Tab.cpp:3472 msgid "Profile dependencies" msgstr "" @@ -3617,7 +3643,7 @@ msgid "Size and coordinates" msgstr "" #: src/slic3r/GUI/Tab.cpp:1824 src/slic3r/GUI/Tab.cpp:2025 -#: src/slic3r/GUI/Tab.cpp:3008 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "Set" msgstr "" @@ -3681,7 +3707,7 @@ msgstr "" msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2065 src/slic3r/GUI/Tab.cpp:3335 +#: src/slic3r/GUI/Tab.cpp:2065 src/slic3r/GUI/Tab.cpp:3336 msgid "Corrections" msgstr "" @@ -3760,106 +3786,106 @@ msgid "" "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2448 +#: src/slic3r/GUI/Tab.cpp:2449 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" "Shall I disable it in order to enable Firmware Retraction?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2450 +#: src/slic3r/GUI/Tab.cpp:2451 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2776 -#, possible-c-format -msgid "Default preset (%s)" -msgstr "" - #: src/slic3r/GUI/Tab.cpp:2777 #, possible-c-format +msgid "Default preset (%s)" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2778 +#, possible-c-format msgid "Preset (%s)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2794 +#: src/slic3r/GUI/Tab.cpp:2795 msgid "has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2797 +#: src/slic3r/GUI/Tab.cpp:2798 msgid "is not compatible with printer" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2798 +#: src/slic3r/GUI/Tab.cpp:2799 msgid "is not compatible with print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2800 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "and it has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2804 +#: src/slic3r/GUI/Tab.cpp:2805 msgid "Unsaved Changes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2816 +#: src/slic3r/GUI/Tab.cpp:2817 msgid "Please check your object list before preset changing." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2895 +#: src/slic3r/GUI/Tab.cpp:2896 msgid "%1% - Copy" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2918 +#: src/slic3r/GUI/Tab.cpp:2919 msgid "The supplied name is empty. It can't be saved." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2923 +#: src/slic3r/GUI/Tab.cpp:2924 msgid "Cannot overwrite a system profile." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2927 +#: src/slic3r/GUI/Tab.cpp:2928 msgid "Cannot overwrite an external profile." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2953 +#: src/slic3r/GUI/Tab.cpp:2954 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2953 +#: src/slic3r/GUI/Tab.cpp:2954 msgid "delete" msgstr "" #. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:2955 +#: src/slic3r/GUI/Tab.cpp:2956 msgid "Are you sure you want to %1% the selected preset?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2956 +#: src/slic3r/GUI/Tab.cpp:2957 msgid "Remove" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:2958 +#: src/slic3r/GUI/Tab.cpp:2959 msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3084 +#: src/slic3r/GUI/Tab.cpp:3085 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3086 +#: src/slic3r/GUI/Tab.cpp:3087 msgid "" "indicates that the settings are the same as the system values for the " "current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3088 +#: src/slic3r/GUI/Tab.cpp:3089 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3090 +#: src/slic3r/GUI/Tab.cpp:3091 msgid "" "indicates that some settings were changed and are not equal to the system " "values for the current option group.\n" @@ -3867,23 +3893,23 @@ msgid "" "to the system values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3095 +#: src/slic3r/GUI/Tab.cpp:3096 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3097 +#: src/slic3r/GUI/Tab.cpp:3098 msgid "" "for the left button: \tindicates a non-system preset,\n" "for the right button: \tindicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3100 +#: src/slic3r/GUI/Tab.cpp:3101 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3102 +#: src/slic3r/GUI/Tab.cpp:3103 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -3891,30 +3917,30 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3127 +#: src/slic3r/GUI/Tab.cpp:3128 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system " "values for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3129 +#: src/slic3r/GUI/Tab.cpp:3130 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system values for the current option group.\n" "Click to reset all settings for current option group to the system values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3132 +#: src/slic3r/GUI/Tab.cpp:3133 msgid "WHITE BULLET icon indicates a non system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3135 +#: src/slic3r/GUI/Tab.cpp:3136 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3137 +#: src/slic3r/GUI/Tab.cpp:3138 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -3922,25 +3948,25 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3143 +#: src/slic3r/GUI/Tab.cpp:3144 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3144 +#: src/slic3r/GUI/Tab.cpp:3145 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system value.\n" "Click to reset current value to the system value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3150 +#: src/slic3r/GUI/Tab.cpp:3151 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3151 +#: src/slic3r/GUI/Tab.cpp:3152 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -3948,60 +3974,60 @@ msgid "" msgstr "" #. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3264 +#: src/slic3r/GUI/Tab.cpp:3265 #, possible-c-format msgid "Save %s as:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3308 +#: src/slic3r/GUI/Tab.cpp:3309 msgid "the following postfix are not allowed:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3312 +#: src/slic3r/GUI/Tab.cpp:3313 msgid "The supplied name is not available." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3325 +#: src/slic3r/GUI/Tab.cpp:3326 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3327 src/slic3r/GUI/Tab.cpp:3418 +#: src/slic3r/GUI/Tab.cpp:3328 src/slic3r/GUI/Tab.cpp:3419 msgid "Layers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3331 +#: src/slic3r/GUI/Tab.cpp:3332 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3426 +#: src/slic3r/GUI/Tab.cpp:3427 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3431 +#: src/slic3r/GUI/Tab.cpp:3432 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3441 +#: src/slic3r/GUI/Tab.cpp:3442 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3446 +#: src/slic3r/GUI/Tab.cpp:3447 msgid "Automatic generation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3508 +#: src/slic3r/GUI/Tab.cpp:3509 msgid "Head penetration should not be greater than the head width." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3509 +#: src/slic3r/GUI/Tab.cpp:3510 msgid "Invalid Head penetration" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3521 +#: src/slic3r/GUI/Tab.cpp:3522 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3522 +#: src/slic3r/GUI/Tab.cpp:3523 msgid "Invalid pinhead diameter" msgstr "" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f5099c8bb5..e2745e4dda 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -project(Slic3r-native) +project(PrusaSlicer-native) add_subdirectory(admesh) add_subdirectory(avrdude) @@ -64,39 +64,36 @@ endif() # Create a slic3r executable # Process mainfests for various platforms. -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/platform/msw/slic3r.rc.in ${CMAKE_CURRENT_BINARY_DIR}/slic3r.rc @ONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/platform/msw/slic3r.manifest.in ${CMAKE_CURRENT_BINARY_DIR}/slic3r.manifest @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/platform/msw/PrusaSlicer.rc.in ${CMAKE_CURRENT_BINARY_DIR}/PrusaSlicer.rc @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/platform/msw/PrusaSlicer.manifest.in ${CMAKE_CURRENT_BINARY_DIR}/PrusaSlicer.manifest @ONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/platform/osx/Info.plist.in ${CMAKE_CURRENT_BINARY_DIR}/Info.plist @ONLY) if (MSVC) - add_library(slic3r SHARED slic3r.cpp slic3r.hpp) + add_library(PrusaSlicer SHARED PrusaSlicer.cpp PrusaSlicer.hpp) else () - add_executable(slic3r slic3r.cpp slic3r.hpp) + add_executable(PrusaSlicer PrusaSlicer.cpp PrusaSlicer.hpp) endif () if (NOT MSVC) - if(SLIC3R_GUI) - set_target_properties(slic3r PROPERTIES OUTPUT_NAME "slic3r-gui") - else() - set_target_properties(slic3r PROPERTIES OUTPUT_NAME "slic3r-console") - endif() + # Binary name on unix like systems (OSX, Linux) + set_target_properties(PrusaSlicer PROPERTIES OUTPUT_NAME "prusa-slicer") endif () -target_link_libraries(slic3r libslic3r) +target_link_libraries(PrusaSlicer libslic3r) if (APPLE) # add_compile_options(-stdlib=libc++) # add_definitions(-DBOOST_THREAD_DONT_USE_CHRONO -DBOOST_NO_CXX11_RVALUE_REFERENCES -DBOOST_THREAD_USES_MOVE) # -liconv: boost links to libiconv by default - target_link_libraries(slic3r "-liconv -framework IOKit" "-framework CoreFoundation" -lc++) + target_link_libraries(PrusaSlicer "-liconv -framework IOKit" "-framework CoreFoundation" -lc++) elseif (MSVC) - # Manifest is provided through slic3r.rc, don't generate your own. + # Manifest is provided through PrusaSlicer.rc, don't generate your own. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO") else () # Boost on Raspberry-Pi does not link to pthreads explicitely. - target_link_libraries(slic3r ${CMAKE_DL_LIBS} -lstdc++ Threads::Threads) + target_link_libraries(PrusaSlicer ${CMAKE_DL_LIBS} -lstdc++ Threads::Threads) endif () # Add the Slic3r GUI library, libcurl, OpenGL and GLU libraries. if (SLIC3R_GUI) - target_link_libraries(slic3r libslic3r_gui ${wxWidgets_LIBRARIES}) + target_link_libraries(PrusaSlicer libslic3r_gui ${wxWidgets_LIBRARIES}) # Configure libcurl and its dependencies OpenSSL & zlib find_package(CURL REQUIRED) @@ -104,13 +101,13 @@ if (SLIC3R_GUI) # Required by libcurl find_package(ZLIB REQUIRED) endif() - target_include_directories(slic3r PRIVATE ${CURL_INCLUDE_DIRS}) - target_link_libraries(slic3r ${CURL_LIBRARIES} ${ZLIB_LIBRARIES}) + target_include_directories(PrusaSlicer PRIVATE ${CURL_INCLUDE_DIRS}) + target_link_libraries(PrusaSlicer ${CURL_LIBRARIES} ${ZLIB_LIBRARIES}) if (SLIC3R_STATIC) if (NOT APPLE) # libcurl is always linked dynamically to the system libcurl on OSX. # On other systems, libcurl is linked statically if SLIC3R_STATIC is set. - target_compile_definitions(slic3r PRIVATE CURL_STATICLIB) + target_compile_definitions(PrusaSlicer PRIVATE CURL_STATICLIB) endif() if (CMAKE_SYSTEM_NAME STREQUAL "Linux") # As of now, our build system produces a statically linked libcurl, @@ -118,34 +115,40 @@ if (SLIC3R_GUI) find_package(OpenSSL REQUIRED) message("OpenSSL include dir: ${OPENSSL_INCLUDE_DIR}") message("OpenSSL libraries: ${OPENSSL_LIBRARIES}") - target_include_directories(slic3r PRIVATE ${OPENSSL_INCLUDE_DIR}) - target_link_libraries(slic3r ${OPENSSL_LIBRARIES}) + target_include_directories(PrusaSlicer PRIVATE ${OPENSSL_INCLUDE_DIR}) + target_link_libraries(PrusaSlicer ${OPENSSL_LIBRARIES}) endif() endif() if (MSVC) - target_link_libraries(slic3r user32.lib Setupapi.lib OpenGL32.Lib GlU32.Lib) + # Generate debug symbols even in release mode. + target_link_options(PrusaSlicer PUBLIC "$<$:/DEBUG>") + target_link_libraries(PrusaSlicer user32.lib Setupapi.lib OpenGL32.Lib GlU32.Lib) elseif (MINGW) - target_link_libraries(slic3r -lopengl32) + target_link_libraries(PrusaSlicer -lopengl32) elseif (APPLE) - target_link_libraries(slic3r "-framework OpenGL") + target_link_libraries(PrusaSlicer "-framework OpenGL") else () - target_link_libraries(slic3r -ldl -lGL -lGLU) + target_link_libraries(PrusaSlicer -ldl -lGL -lGLU) endif () endif () # On Windows, a shim application is required to produce a console / non console version of the Slic3r application. # Also the shim may load the Mesa software OpenGL renderer if the default renderer does not support OpenGL 2.0 and higher. if (MSVC) - add_executable(slic3r_app_gui WIN32 slic3r_app_msvc.cpp ${CMAKE_CURRENT_BINARY_DIR}/slic3r.rc) - target_compile_definitions(slic3r_app_gui PRIVATE -DSLIC3R_WRAPPER_NOCONSOLE) - add_dependencies(slic3r_app_gui slic3r) - set_target_properties(slic3r_app_gui PROPERTIES OUTPUT_NAME "slic3r" PDB_NAME "slic3r_gui") + add_executable(PrusaSlicer_app_gui WIN32 PrusaSlicer_app_msvc.cpp ${CMAKE_CURRENT_BINARY_DIR}/PrusaSlicer.rc) + # Generate debug symbols even in release mode. + target_link_options(PrusaSlicer_app_gui PUBLIC "$<$:/DEBUG>") + target_compile_definitions(PrusaSlicer_app_gui PRIVATE -DSLIC3R_WRAPPER_NOCONSOLE) + add_dependencies(PrusaSlicer_app_gui PrusaSlicer) + set_target_properties(PrusaSlicer_app_gui PROPERTIES OUTPUT_NAME "prusa-slicer") - add_executable(slic3r_app_console slic3r_app_msvc.cpp ${CMAKE_CURRENT_BINARY_DIR}/slic3r.rc) - target_compile_definitions(slic3r_app_console PRIVATE -DSLIC3R_WRAPPER_CONSOLE) - add_dependencies(slic3r_app_console slic3r) - set_target_properties(slic3r_app_console PROPERTIES OUTPUT_NAME "slic3r-console") + add_executable(PrusaSlicer_app_console PrusaSlicer_app_msvc.cpp ${CMAKE_CURRENT_BINARY_DIR}/PrusaSlicer.rc) + # Generate debug symbols even in release mode. + target_link_options(PrusaSlicer_app_console PUBLIC "$<$:/DEBUG>") + 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") endif () # Link the resources dir to where Slic3r GUI expects it @@ -154,7 +157,7 @@ if (MSVC) foreach (CONF ${CMAKE_CONFIGURATION_TYPES}) file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${CONF}" WIN_CONF_OUTPUT_DIR) file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${CONF}/resources" WIN_RESOURCES_SYMLINK) - add_custom_command(TARGET slic3r POST_BUILD + add_custom_command(TARGET PrusaSlicer POST_BUILD COMMAND if exist "${WIN_CONF_OUTPUT_DIR}" "(" if not exist "${WIN_RESOURCES_SYMLINK}" "(" mklink /J "${WIN_RESOURCES_SYMLINK}" "${SLIC3R_RESOURCES_DIR_WIN}" @@ -166,7 +169,7 @@ if (MSVC) endforeach () else () file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/resources" WIN_RESOURCES_SYMLINK) - add_custom_command(TARGET slic3r POST_BUILD + add_custom_command(TARGET PrusaSlicer POST_BUILD COMMAND if not exist "${WIN_RESOURCES_SYMLINK}" "(" mklink /J "${WIN_RESOURCES_SYMLINK}" "${SLIC3R_RESOURCES_DIR_WIN}" ")" COMMENT "Symlinking the resources directory into the build tree" VERBATIM @@ -174,13 +177,13 @@ if (MSVC) endif () elseif (XCODE) # Because of Debug/Release/etc. configurations (similar to MSVC) the slic3r binary is located in an extra level - add_custom_command(TARGET slic3r POST_BUILD + add_custom_command(TARGET PrusaSlicer POST_BUILD COMMAND ln -sf "${SLIC3R_RESOURCES_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/resources" COMMENT "Symlinking the resources directory into the build tree" VERBATIM ) else () - add_custom_command(TARGET slic3r POST_BUILD + add_custom_command(TARGET PrusaSlicer POST_BUILD COMMAND ln -sf "${SLIC3R_RESOURCES_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/../resources" COMMENT "Symlinking the resources directory into the build tree" VERBATIM @@ -189,11 +192,11 @@ endif() # Slic3r binary install target if (WIN32) - install(TARGETS slic3r RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}") + install(TARGETS PrusaSlicer RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}") if (MSVC) - install(TARGETS slic3r_app_gui RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}") - install(TARGETS slic3r_app_console RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}") + install(TARGETS PrusaSlicer_app_gui RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}") + install(TARGETS PrusaSlicer_app_console RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}") endif () else () - install(TARGETS slic3r RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + install(TARGETS PrusaSlicer RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") endif () diff --git a/src/slic3r.cpp b/src/PrusaSlicer.cpp similarity index 99% rename from src/slic3r.cpp rename to src/PrusaSlicer.cpp index 981e59c30b..e5a11e4d0e 100644 --- a/src/slic3r.cpp +++ b/src/PrusaSlicer.cpp @@ -39,7 +39,7 @@ #include "libslic3r/Format/OBJ.hpp" #include "libslic3r/Utils.hpp" -#include "slic3r.hpp" +#include "PrusaSlicer.hpp" #ifdef SLIC3R_GUI #include "slic3r/GUI/GUI.hpp" @@ -568,7 +568,7 @@ bool CLI::setup(int argc, char **argv) void CLI::print_help(bool include_print_options, PrinterTechnology printer_technology) const { boost::nowide::cout - << SLIC3R_APP_NAME << " " << SLIC3R_BUILD << " " << "based on Slic3r" + << SLIC3R_BUILD_ID << " " << "based on Slic3r" #ifdef SLIC3R_GUI << " (with GUI support)" #else /* SLIC3R_GUI */ diff --git a/src/slic3r.hpp b/src/PrusaSlicer.hpp similarity index 100% rename from src/slic3r.hpp rename to src/PrusaSlicer.hpp diff --git a/src/slic3r_app_msvc.cpp b/src/PrusaSlicer_app_msvc.cpp similarity index 96% rename from src/slic3r_app_msvc.cpp rename to src/PrusaSlicer_app_msvc.cpp index c100f8fd9b..5b01751b9d 100644 --- a/src/slic3r_app_msvc.cpp +++ b/src/PrusaSlicer_app_msvc.cpp @@ -48,10 +48,10 @@ public: wc.lpfnWndProc = OpenGLVersionCheck::supports_opengl2_wndproc; wc.hInstance = (HINSTANCE)GetModuleHandle(nullptr); wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND); - wc.lpszClassName = L"slic3r_opengl_version_check"; + wc.lpszClassName = L"PrusaSlicer_opengl_version_check"; wc.style = CS_OWNDC; if (RegisterClass(&wc)) { - HWND hwnd = CreateWindowW(wc.lpszClassName, L"slic3r_opengl_version_check", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, 0, 0, wc.hInstance, (LPVOID)this); + HWND hwnd = CreateWindowW(wc.lpszClassName, L"PrusaSlicer_opengl_version_check", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, 0, 0, wc.hInstance, (LPVOID)this); if (hwnd) { message_pump_exit = false; while (GetMessage(&msg, NULL, 0, 0 ) > 0 && ! message_pump_exit) @@ -271,11 +271,11 @@ int wmain(int argc, wchar_t **argv) wchar_t path_to_slic3r[MAX_PATH + 1] = { 0 }; wcscpy(path_to_slic3r, path_to_exe); - wcscat(path_to_slic3r, L"slic3r.dll"); + wcscat(path_to_slic3r, L"PrusaSlicer.dll"); // printf("Loading Slic3r library: %S\n", path_to_slic3r); HINSTANCE hInstance_Slic3r = LoadLibraryExW(path_to_slic3r, nullptr, 0); if (hInstance_Slic3r == nullptr) { - printf("slic3r.dll was not loaded\n"); + printf("PrusaSlicer.dll was not loaded\n"); return -1; } @@ -289,7 +289,7 @@ int wmain(int argc, wchar_t **argv) #endif ); if (slic3r_main == nullptr) { - printf("could not locate the function slic3r_main in slic3r.dll\n"); + printf("could not locate the function slic3r_main in PrusaSlicer.dll\n"); return -1; } // argc minus the trailing nullptr of the argv diff --git a/src/libslic3r/libslic3r_version.h.in b/src/libslic3r/libslic3r_version.h.in index 7c4a4b2948..26a67362b7 100644 --- a/src/libslic3r/libslic3r_version.h.in +++ b/src/libslic3r/libslic3r_version.h.in @@ -4,6 +4,6 @@ #define SLIC3R_APP_NAME "@SLIC3R_APP_NAME@" #define SLIC3R_APP_KEY "@SLIC3R_APP_KEY@" #define SLIC3R_VERSION "@SLIC3R_VERSION@" -#define SLIC3R_BUILD "@SLIC3R_BUILD@" +#define SLIC3R_BUILD_ID "@SLIC3R_BUILD_ID@" #endif /* __SLIC3R_VERSION_H */ diff --git a/src/platform/msw/slic3r.manifest.in b/src/platform/msw/PrusaSlicer.manifest.in similarity index 100% rename from src/platform/msw/slic3r.manifest.in rename to src/platform/msw/PrusaSlicer.manifest.in diff --git a/src/platform/msw/slic3r.rc.in b/src/platform/msw/PrusaSlicer.rc.in similarity index 95% rename from src/platform/msw/slic3r.rc.in rename to src/platform/msw/PrusaSlicer.rc.in index 4d38c3fccb..a112f3211f 100644 --- a/src/platform/msw/slic3r.rc.in +++ b/src/platform/msw/PrusaSlicer.rc.in @@ -22,4 +22,4 @@ PRODUCTVERSION @SLIC3R_RC_VERSION@ } } 2 ICON "@SLIC3R_RESOURCES_DIR@/icons/PrusaSlicer.ico" -1 24 "slic3r.manifest" +1 24 "PrusaSlicer.manifest" diff --git a/src/slic3r/GUI/AppConfig.cpp b/src/slic3r/GUI/AppConfig.cpp index e4f0c9ec78..9fe8bfe479 100644 --- a/src/slic3r/GUI/AppConfig.cpp +++ b/src/slic3r/GUI/AppConfig.cpp @@ -22,7 +22,7 @@ namespace Slic3r { static const std::string VENDOR_PREFIX = "vendor:"; static const std::string MODEL_PREFIX = "model:"; -static const std::string VERSION_CHECK_URL = "https://raw.githubusercontent.com/prusa3d/Slic3r-settings/master/live/Slic3rPE.version"; +static const std::string VERSION_CHECK_URL = "https://raw.githubusercontent.com/prusa3d/PrusaSlicer-settings/master/live/PrusaSlicer.version"; void AppConfig::reset() { diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index db116a5dd9..efa35a5110 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -174,7 +174,7 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *beg #endif } -wxBitmap* BitmapCache::insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, float scale /* = 1.0f */) +wxBitmap* BitmapCache::insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, float scale /* = 1.0f */, const bool grayscale/* = false*/) { wxImage image(width, height); image.InitAlpha(); @@ -187,14 +187,20 @@ wxBitmap* BitmapCache::insert_raw_rgba(const std::string &bitmap_key, unsigned w *rgb ++ = *raw_data ++; *alpha ++ = *raw_data ++; } + + if (grayscale) + image.ConvertToGreyscale(m_gs, m_gs, m_gs); + return this->insert(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image), scale)); } -wxBitmap* BitmapCache::load_png(const std::string &bitmap_name, unsigned int width, unsigned int height) +wxBitmap* BitmapCache::load_png(const std::string &bitmap_name, unsigned int width, unsigned int height, + const bool grayscale/* = false*/) { std::string bitmap_key = bitmap_name + ( height !=0 ? "-h" + std::to_string(height) : - "-w" + std::to_string(width)); + "-w" + std::to_string(width)) + + (grayscale ? "-gs" : ""); auto it = m_map.find(bitmap_key); if (it != m_map.end()) @@ -213,15 +219,20 @@ wxBitmap* BitmapCache::load_png(const std::string &bitmap_name, unsigned int wid if (height != 0 && width != 0) image.Rescale(width, height, wxIMAGE_QUALITY_BILINEAR); + if (grayscale) + image.ConvertToGreyscale(m_gs, m_gs, m_gs); + return this->insert(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image))); } -wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_width, unsigned target_height, float scale /* = 1.0f */) +wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_width, unsigned target_height, + float scale /* = 1.0f */, const bool grayscale/* = false*/) { std::string bitmap_key = bitmap_name + ( target_height !=0 ? "-h" + std::to_string(target_height) : "-w" + std::to_string(target_width)) - + (scale != 1.0f ? "-s" + std::to_string(scale) : ""); + + (scale != 1.0f ? "-s" + std::to_string(scale) : "") + + (grayscale ? "-gs" : ""); target_height != 0 ? target_height *= scale : target_width *= scale; @@ -256,7 +267,7 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_ ::nsvgDeleteRasterizer(rast); ::nsvgDelete(image); - return this->insert_raw_rgba(bitmap_key, width, height, data.data(), scale); + return this->insert_raw_rgba(bitmap_key, width, height, data.data(), scale, grayscale); } wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency) diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index f032d80827..10ce3299ef 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -29,12 +29,12 @@ public: wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2, const wxBitmap &bmp3); wxBitmap* insert(const std::string &name, const std::vector &bmps) { return this->insert(name, &bmps.front(), &bmps.front() + bmps.size()); } wxBitmap* insert(const std::string &name, const wxBitmap *begin, const wxBitmap *end); - wxBitmap* insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, float scale = 1.0f); + wxBitmap* insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, float scale = 1.0f, const bool grayscale = false); // Load png from resources/icons. bitmap_key is given without the .png suffix. Bitmap will be rescaled to provided height/width if nonzero. - wxBitmap* load_png(const std::string &bitmap_key, unsigned int width = 0, unsigned int height = 0); + wxBitmap* load_png(const std::string &bitmap_key, unsigned int width = 0, unsigned int height = 0, const bool grayscale = false); // Load svg from resources/icons. bitmap_key is given without the .svg suffix. SVG will be rasterized to provided height/width. - wxBitmap* load_svg(const std::string &bitmap_key, unsigned int width = 0, unsigned int height = 0, float scale = 1.0f); + wxBitmap* load_svg(const std::string &bitmap_key, unsigned int width = 0, unsigned int height = 0, float scale = 1.0f, const bool grayscale = false); static wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency); static wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3]) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE); } @@ -42,6 +42,7 @@ public: private: std::map m_map; + double m_gs = 0.2; // value, used for image.ConvertToGreyscale(m_gs, m_gs, m_gs) }; } // GUI diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 137ebe68e9..3880f1d790 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -915,6 +915,11 @@ int GUI_App::extruders_cnt() const preset.config.option("nozzle_diameter")->values.size(); } +void GUI_App::open_web_page_localized(const std::string &http_address) +{ + wxLaunchDefaultBrowser(http_address + "&lng=" + this->current_language_code()); +} + void GUI_App::window_pos_save(wxTopLevelWindow* window, const std::string &name) { if (name.empty()) { return; } diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 0ac5e1d42b..0d06348269 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -171,6 +171,8 @@ public: PrintHostJobQueue& printhost_job_queue() { return *m_printhost_job_queue.get(); } + void open_web_page_localized(const std::string &http_address); + private: bool on_init_inner(); void window_pos_save(wxTopLevelWindow* window, const std::string &name); diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index f59c8739d1..741dc0801e 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1120,7 +1120,8 @@ void ObjectList::append_menu_items_add_volume(wxMenu* menu) wxMenuItem* ObjectList::append_menu_item_split(wxMenu* menu) { return append_menu_item(menu, wxID_ANY, _(L("Split to parts")), "", - [this](wxCommandEvent&) { split(); }, "split_parts_SMALL", menu); + [this](wxCommandEvent&) { split(); }, "split_parts_SMALL", menu, + [this]() { return is_splittable(); }, wxGetApp().plater()); } wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_) @@ -1199,16 +1200,14 @@ wxMenuItem* ObjectList::append_menu_item_change_type(wxMenu* menu) } -wxMenuItem* ObjectList::append_menu_item_instance_to_object(wxMenu* menu) +wxMenuItem* ObjectList::append_menu_item_instance_to_object(wxMenu* menu, wxWindow* parent) { return append_menu_item(menu, wxID_ANY, _(L("Set as a Separated Object")), "", - [this](wxCommandEvent&) { split_instances(); }, "", menu); + [this](wxCommandEvent&) { split_instances(); }, "", menu, [](){return wxGetApp().plater()->can_set_instance_to_object(); }, parent); } void ObjectList::append_menu_items_osx(wxMenu* menu) { - append_menu_item_delete(menu); - append_menu_item(menu, wxID_ANY, _(L("Rename")), "", [this](wxCommandEvent&) { rename_item(); }, "", menu); @@ -1219,8 +1218,10 @@ wxMenuItem* ObjectList::append_menu_item_fix_through_netfabb(wxMenu* menu) { if (!is_windows10()) return nullptr; + Plater* plater = wxGetApp().plater(); wxMenuItem* menu_item = append_menu_item(menu, wxID_ANY, _(L("Fix through the Netfabb")), "", - [this](wxCommandEvent&) { fix_through_netfabb(); }, "", menu); + [this](wxCommandEvent&) { fix_through_netfabb(); }, "", menu, + [plater]() {return plater->can_fix_through_netfabb(); }, plater); menu->AppendSeparator(); return menu_item; @@ -1286,9 +1287,6 @@ void ObjectList::create_object_popupmenu(wxMenu *menu) // rest of a object_menu will be added later in: // - append_menu_items_add_volume() -> for "Add (volumes)" // - append_menu_item_settings() -> for "Add (settings)" - - wxGetApp().plater()->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { - evt.Enable(is_splittable()); }, m_menu_item_split->GetId()); } void ObjectList::create_sla_object_popupmenu(wxMenu *menu) @@ -1320,17 +1318,11 @@ void ObjectList::create_part_popupmenu(wxMenu *menu) // rest of a object_sla_menu will be added later in: // - append_menu_item_settings() -> for "Add (settings)" - - wxGetApp().plater()->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { - evt.Enable(is_splittable()); }, m_menu_item_split_part->GetId()); } void ObjectList::create_instance_popupmenu(wxMenu*menu) { -#ifdef __WXOSX__ - append_menu_item_delete(menu); -#endif // __WXOSX__ - m_menu_item_split_instances = append_menu_item_instance_to_object(menu); + m_menu_item_split_instances = append_menu_item_instance_to_object(menu, wxGetApp().plater()); /* New behavior logic: * 1. Split Object to several separated object, if ALL instances are selected @@ -2545,9 +2537,9 @@ void ObjectList::change_part_type() } } - const wxString names[] = { "Part", "Modifier", "Support Enforcer", "Support Blocker" }; + const wxString names[] = { _(L("Part")), _(L("Modifier")), _(L("Support Enforcer")), _(L("Support Blocker")) }; - auto new_type = ModelVolumeType(wxGetSingleChoiceIndex("Type: ", _(L("Select type of part")), wxArrayString(4, names), int(type))); + auto new_type = ModelVolumeType(wxGetSingleChoiceIndex(_(L("Type:")), _(L("Select type of part")), wxArrayString(4, names), int(type))); if (new_type == type || new_type == ModelVolumeType::INVALID) return; @@ -2837,10 +2829,6 @@ void ObjectList::show_multi_selection_menu() wxMenu* menu = new wxMenu(); -#ifdef __WXOSX__ - append_menu_item_delete(menu); -#endif //__WXOSX__ - if (extruders_count() > 1) append_menu_item(menu, wxID_ANY, _(L("Set extruder for selected items")), _(L("Select extruder number for selected objects and/or parts")), diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 1625c2fac8..2932d86f9b 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -199,7 +199,7 @@ public: wxMenuItem* append_menu_item_split(wxMenu* menu); wxMenuItem* append_menu_item_settings(wxMenu* menu); wxMenuItem* append_menu_item_change_type(wxMenu* menu); - wxMenuItem* append_menu_item_instance_to_object(wxMenu* menu); + wxMenuItem* append_menu_item_instance_to_object(wxMenu* menu, wxWindow* parent); void append_menu_items_osx(wxMenu* menu); wxMenuItem* append_menu_item_fix_through_netfabb(wxMenu* menu); void append_menu_item_export_stl(wxMenu* menu) const ; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index b068b12ffd..128aba16d0 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -33,7 +33,7 @@ namespace Slic3r { namespace GUI { MainFrame::MainFrame() : -DPIFrame(NULL, wxID_ANY, wxString(SLIC3R_BUILD) + " " + _(L("based on Slic3r")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, "mainframe"), +DPIFrame(NULL, wxID_ANY, wxString(SLIC3R_BUILD_ID) + " " + _(L("based on Slic3r")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, "mainframe"), m_printhost_queue_dlg(new PrintHostQueueDialog(this)) { // Fonts were created by the DPIFrame constructor for the monitor, on which the window opened. @@ -341,18 +341,22 @@ void MainFrame::init_menubar() // File menu wxMenu* fileMenu = new wxMenu; { - wxMenuItem* item_open = append_menu_item(fileMenu, wxID_ANY, _(L("&Open Project")) + dots + "\tCtrl+O", _(L("Open a project file")), - [this](wxCommandEvent&) { if (m_plater) m_plater->load_project(); }, menu_icon("open")); - wxMenuItem* item_save = append_menu_item(fileMenu, wxID_ANY, _(L("&Save Project")) + "\tCtrl+S", _(L("Save current project file")), - [this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(into_path(m_plater->get_project_filename())); }, menu_icon("save")); - wxMenuItem* item_save_as = append_menu_item(fileMenu, wxID_ANY, _(L("Save Project &as")) + dots + "\tCtrl+Alt+S", _(L("Save current project file as")), - [this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(); }, menu_icon("save")); + append_menu_item(fileMenu, wxID_ANY, _(L("&Open Project")) + dots + "\tCtrl+O", _(L("Open a project file")), + [this](wxCommandEvent&) { if (m_plater) m_plater->load_project(); }, menu_icon("open"), nullptr, + [this](){return m_plater != nullptr; }, this); + append_menu_item(fileMenu, wxID_ANY, _(L("&Save Project")) + "\tCtrl+S", _(L("Save current project file")), + [this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(into_path(m_plater->get_project_filename())); }, menu_icon("save"), nullptr, + [this](){return m_plater != nullptr && can_save(); }, this); + append_menu_item(fileMenu, wxID_ANY, _(L("Save Project &as")) + dots + "\tCtrl+Alt+S", _(L("Save current project file as")), + [this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(); }, menu_icon("save"), nullptr, + [this](){return m_plater != nullptr && can_save(); }, this); fileMenu->AppendSeparator(); wxMenu* import_menu = new wxMenu(); - wxMenuItem* item_import_model = append_menu_item(import_menu, wxID_ANY, _(L("Import STL/OBJ/AM&F/3MF")) + dots + "\tCtrl+I", _(L("Load a model")), - [this](wxCommandEvent&) { if (m_plater) m_plater->add_model(); }, menu_icon("import_plater")); + append_menu_item(import_menu, wxID_ANY, _(L("Import STL/OBJ/AM&F/3MF")) + dots + "\tCtrl+I", _(L("Load a model")), + [this](wxCommandEvent&) { if (m_plater) m_plater->add_model(); }, menu_icon("import_plater"), nullptr, + [this](){return m_plater != nullptr; }, this); import_menu->AppendSeparator(); append_menu_item(import_menu, wxID_ANY, _(L("Import &Config")) + dots + "\tCtrl+L", _(L("Load exported configuration file")), [this](wxCommandEvent&) { load_config_file(); }, menu_icon("import_config")); @@ -365,15 +369,19 @@ void MainFrame::init_menubar() wxMenu* export_menu = new wxMenu(); wxMenuItem* item_export_gcode = append_menu_item(export_menu, wxID_ANY, _(L("Export &G-code")) + dots +"\tCtrl+G", _(L("Export current plate as G-code")), - [this](wxCommandEvent&) { if (m_plater) m_plater->export_gcode(); }, menu_icon("export_gcode")); + [this](wxCommandEvent&) { if (m_plater) m_plater->export_gcode(); }, menu_icon("export_gcode"), nullptr, + [this](){return can_export_gcode(); }, this); m_changeable_menu_items.push_back(item_export_gcode); export_menu->AppendSeparator(); - wxMenuItem* item_export_stl = append_menu_item(export_menu, wxID_ANY, _(L("Export plate as &STL")) + dots, _(L("Export current plate as STL")), - [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(); }, menu_icon("export_plater")); - wxMenuItem* item_export_stl_sla = append_menu_item(export_menu, wxID_ANY, _(L("Export plate as STL including supports")) + dots, _(L("Export current plate as STL including supports")), - [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(true); }, menu_icon("export_plater")); - wxMenuItem* item_export_amf = append_menu_item(export_menu, wxID_ANY, _(L("Export plate as &AMF")) + dots, _(L("Export current plate as AMF")), - [this](wxCommandEvent&) { if (m_plater) m_plater->export_amf(); }, menu_icon("export_plater")); + append_menu_item(export_menu, wxID_ANY, _(L("Export plate as &STL")) + dots, _(L("Export current plate as STL")), + [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(); }, menu_icon("export_plater"), nullptr, + [this](){return can_export_model(); }, this); + append_menu_item(export_menu, wxID_ANY, _(L("Export plate as STL including supports")) + dots, _(L("Export current plate as STL including supports")), + [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(true); }, menu_icon("export_plater"), nullptr, + [this](){return can_export_supports(); }, this); + append_menu_item(export_menu, wxID_ANY, _(L("Export plate as &AMF")) + dots, _(L("Export current plate as AMF")), + [this](wxCommandEvent&) { if (m_plater) m_plater->export_amf(); }, menu_icon("export_plater"), nullptr, + [this](){return can_export_model(); }, this); export_menu->AppendSeparator(); append_menu_item(export_menu, wxID_ANY, _(L("Export &Config")) +dots +"\tCtrl+E", _(L("Export current configuration to file")), [this](wxCommandEvent&) { export_config(); }, menu_icon("export_config")); @@ -413,16 +421,6 @@ void MainFrame::init_menubar() fileMenu->AppendSeparator(); append_menu_item(fileMenu, wxID_EXIT, _(L("&Quit")), wxString::Format(_(L("Quit %s")), SLIC3R_APP_NAME), [this](wxCommandEvent&) { Close(false); }); - - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(m_plater != nullptr); }, item_open->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable((m_plater != nullptr) && can_save()); }, item_save->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable((m_plater != nullptr) && can_save()); }, item_save_as->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(m_plater != nullptr); }, item_import_model->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_export_gcode()); }, item_export_gcode->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_export_model()); }, item_export_stl->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_export_supports()); }, item_export_stl_sla->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_export_model()); }, item_export_amf->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_slice()); }, m_menu_item_reslice_now->GetId()); } #ifdef _MSC_VER @@ -446,26 +444,25 @@ void MainFrame::init_menubar() #else wxString hotkey_delete = "Del"; #endif - wxMenuItem* item_select_all = append_menu_item(editMenu, wxID_ANY, _(L("&Select all")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "A", _(L("Selects all objects")), - [this](wxCommandEvent&) { if (m_plater != nullptr) m_plater->select_all(); }, ""); + append_menu_item(editMenu, wxID_ANY, _(L("&Select all")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "A", + _(L("Selects all objects")), [this](wxCommandEvent&) { if (m_plater != nullptr) m_plater->select_all(); }, + "", nullptr, [this](){return can_select(); }, this); editMenu->AppendSeparator(); - wxMenuItem* item_delete_sel = append_menu_item(editMenu, wxID_ANY, _(L("&Delete selected")) + sep + hotkey_delete, _(L("Deletes the current selection")), - [this](wxCommandEvent&) { m_plater->remove_selected(); }, menu_icon("remove_menu")); - wxMenuItem* item_delete_all = append_menu_item(editMenu, wxID_ANY, _(L("Delete &all")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + hotkey_delete, _(L("Deletes all objects")), - [this](wxCommandEvent&) { m_plater->reset_with_confirm(); }, menu_icon("delete_all_menu")); + append_menu_item(editMenu, wxID_ANY, _(L("&Delete selected")) + sep + hotkey_delete, + _(L("Deletes the current selection")),[this](wxCommandEvent&) { m_plater->remove_selected(); }, + menu_icon("remove_menu"), nullptr, [this](){return can_delete(); }, this); + append_menu_item(editMenu, wxID_ANY, _(L("Delete &all")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + hotkey_delete, + _(L("Deletes all objects")), [this](wxCommandEvent&) { m_plater->reset_with_confirm(); }, + menu_icon("delete_all_menu"), nullptr, [this](){return can_delete_all(); }, this); editMenu->AppendSeparator(); - wxMenuItem* item_copy = append_menu_item(editMenu, wxID_ANY, _(L("&Copy")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "C", _(L("Copy selection to clipboard")), - [this](wxCommandEvent&) { m_plater->copy_selection_to_clipboard(); }, menu_icon("copy_menu")); - wxMenuItem* item_paste = append_menu_item(editMenu, wxID_ANY, _(L("&Paste")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "V", _(L("Paste clipboard")), - [this](wxCommandEvent&) { m_plater->paste_from_clipboard(); }, menu_icon("paste_menu")); - - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_select()); }, item_select_all->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_delete()); }, item_delete_sel->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_delete_all()); }, item_delete_all->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(m_plater->can_copy()); }, item_copy->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(m_plater->can_paste()); }, item_paste->GetId()); + append_menu_item(editMenu, wxID_ANY, _(L("&Copy")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "C", + _(L("Copy selection to clipboard")), [this](wxCommandEvent&) { m_plater->copy_selection_to_clipboard(); }, + menu_icon("copy_menu"), nullptr, [this](){return m_plater->can_copy(); }, this); + append_menu_item(editMenu, wxID_ANY, _(L("&Paste")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "V", + _(L("Paste clipboard")), [this](wxCommandEvent&) { m_plater->paste_from_clipboard(); }, + menu_icon("paste_menu"), nullptr, [this](){return m_plater->can_paste(); }, this); } // Window menu @@ -489,13 +486,12 @@ void MainFrame::init_menubar() [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 2); }, menu_icon("printer")); if (m_plater) { windowMenu->AppendSeparator(); - wxMenuItem* item_3d = append_menu_item(windowMenu, wxID_HIGHEST + 5, _(L("3&D")) + "\tCtrl+5", _(L("Show the 3D editing view")), - [this](wxCommandEvent&) { m_plater->select_view_3D("3D"); }, menu_icon("editor_menu")); - wxMenuItem* item_preview = append_menu_item(windowMenu, wxID_HIGHEST + 6, _(L("Pre&view")) + "\tCtrl+6", _(L("Show the 3D slices preview")), - [this](wxCommandEvent&) { m_plater->select_view_3D("Preview"); }, menu_icon("preview_menu")); - - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_change_view()); }, item_3d->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_change_view()); }, item_preview->GetId()); + append_menu_item(windowMenu, wxID_HIGHEST + 5, _(L("3&D")) + "\tCtrl+5", _(L("Show the 3D editing view")), + [this](wxCommandEvent&) { m_plater->select_view_3D("3D"); }, menu_icon("editor_menu"), nullptr, + [this](){return can_change_view(); }, this); + append_menu_item(windowMenu, wxID_HIGHEST + 6, _(L("Pre&view")) + "\tCtrl+6", _(L("Show the 3D slices preview")), + [this](wxCommandEvent&) { m_plater->select_view_3D("Preview"); }, menu_icon("preview_menu"), nullptr, + [this](){return can_change_view(); }, this); } #if _WIN32 @@ -521,40 +517,39 @@ void MainFrame::init_menubar() if (m_plater) { viewMenu = new wxMenu(); // The camera control accelerators are captured by GLCanvas3D::on_char(). - wxMenuItem* item_iso = append_menu_item(viewMenu, wxID_ANY, _(L("Iso")) + sep + "&0", _(L("Iso View")), [this](wxCommandEvent&) { select_view("iso"); }); + append_menu_item(viewMenu, wxID_ANY, _(L("Iso")) + sep + "&0", _(L("Iso View")),[this](wxCommandEvent&) { select_view("iso"); }, + "", nullptr, [this](){return can_change_view(); }, this); viewMenu->AppendSeparator(); //TRN To be shown in the main menu View->Top - wxMenuItem* item_top = append_menu_item(viewMenu, wxID_ANY, _(L("Top")) + sep + "&1", _(L("Top View")), [this](wxCommandEvent&) { select_view("top"); }); + append_menu_item(viewMenu, wxID_ANY, _(L("Top")) + sep + "&1", _(L("Top View")), [this](wxCommandEvent&) { select_view("top"); }, + "", nullptr, [this](){return can_change_view(); }, this); //TRN To be shown in the main menu View->Bottom - wxMenuItem* item_bottom = append_menu_item(viewMenu, wxID_ANY, _(L("Bottom")) + sep + "&2", _(L("Bottom View")), [this](wxCommandEvent&) { select_view("bottom"); }); - wxMenuItem* item_front = append_menu_item(viewMenu, wxID_ANY, _(L("Front")) + sep + "&3", _(L("Front View")), [this](wxCommandEvent&) { select_view("front"); }); - wxMenuItem* item_rear = append_menu_item(viewMenu, wxID_ANY, _(L("Rear")) + sep + "&4", _(L("Rear View")), [this](wxCommandEvent&) { select_view("rear"); }); - wxMenuItem* item_left = append_menu_item(viewMenu, wxID_ANY, _(L("Left")) + sep + "&5", _(L("Left View")), [this](wxCommandEvent&) { select_view("left"); }); - wxMenuItem* item_right = append_menu_item(viewMenu, wxID_ANY, _(L("Right")) + sep + "&6", _(L("Right View")), [this](wxCommandEvent&) { select_view("right"); }); - - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_change_view()); }, item_iso->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_change_view()); }, item_top->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_change_view()); }, item_bottom->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_change_view()); }, item_front->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_change_view()); }, item_rear->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_change_view()); }, item_left->GetId()); - Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_change_view()); }, item_right->GetId()); + append_menu_item(viewMenu, wxID_ANY, _(L("Bottom")) + sep + "&2", _(L("Bottom View")), [this](wxCommandEvent&) { select_view("bottom"); }, + "", nullptr, [this](){return can_change_view(); }, this); + append_menu_item(viewMenu, wxID_ANY, _(L("Front")) + sep + "&3", _(L("Front View")), [this](wxCommandEvent&) { select_view("front"); }, + "", nullptr, [this](){return can_change_view(); }, this); + append_menu_item(viewMenu, wxID_ANY, _(L("Rear")) + sep + "&4", _(L("Rear View")), [this](wxCommandEvent&) { select_view("rear"); }, + "", nullptr, [this](){return can_change_view(); }, this); + append_menu_item(viewMenu, wxID_ANY, _(L("Left")) + sep + "&5", _(L("Left View")), [this](wxCommandEvent&) { select_view("left"); }, + "", nullptr, [this](){return can_change_view(); }, this); + append_menu_item(viewMenu, wxID_ANY, _(L("Right")) + sep + "&6", _(L("Right View")), [this](wxCommandEvent&) { select_view("right"); }, + "", nullptr, [this](){return can_change_view(); }, this); } // Help menu auto helpMenu = new wxMenu(); { append_menu_item(helpMenu, wxID_ANY, _(L("Prusa 3D &Drivers")), _(L("Open the Prusa3D drivers download page in your browser")), - [this](wxCommandEvent&) { wxLaunchDefaultBrowser("http://www.prusa3d.com/drivers/"); }); + [this](wxCommandEvent&) { wxGetApp().open_web_page_localized("https://www.prusa3d.com/downloads"); }); append_menu_item(helpMenu, wxID_ANY, _(L("Software &Releases")), _(L("Open the software releases page in your browser")), - [this](wxCommandEvent&) { wxLaunchDefaultBrowser("http://github.com/prusa3d/slic3r/releases"); }); + [this](wxCommandEvent&) { wxLaunchDefaultBrowser("http://github.com/prusa3d/PrusaSlicer/releases"); }); //# my $versioncheck = $self->_append_menu_item($helpMenu, "Check for &Updates...", "Check for new Slic3r versions", sub{ //# wxTheApp->check_version(1); //# }); //# $versioncheck->Enable(wxTheApp->have_version_check); append_menu_item(helpMenu, wxID_ANY, wxString::Format(_(L("%s &Website")), SLIC3R_APP_NAME), wxString::Format(_(L("Open the %s website in your browser")), SLIC3R_APP_NAME), - [this](wxCommandEvent&) { wxLaunchDefaultBrowser("https://www.prusa3d.com/slic3r-prusa-edition/"); }); + [this](wxCommandEvent&) { wxGetApp().open_web_page_localized("https://www.prusa3d.com/slicerweb"); }); // append_menu_item(helpMenu, wxID_ANY, wxString::Format(_(L("%s &Manual")), SLIC3R_APP_NAME), // wxString::Format(_(L("Open the %s manual in your browser")), SLIC3R_APP_NAME), // [this](wxCommandEvent&) { wxLaunchDefaultBrowser("http://manual.slic3r.org/"); }); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 404456cf05..fd29bcfa80 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -445,7 +445,7 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent, const int label_width) : option = m_og->get_option("fill_density"); option.opt.label = L("Infill"); - option.opt.width = 6; + option.opt.width = 7/*6*/; option.opt.sidetext = " "; line.append_option(option); @@ -1336,6 +1336,8 @@ struct Plater::priv bool can_arrange() const; bool can_layers_editing() const; bool can_fix_through_netfabb() const; + bool can_set_instance_to_object() const; + bool can_mirror() const; void msw_rescale_object_menu(); @@ -1347,10 +1349,8 @@ private: bool complit_init_part_menu(); void init_view_toolbar(); - bool can_set_instance_to_object() const; bool can_split() const; bool layers_height_allowed() const; - bool can_mirror() const; void update_fff_scene(); void update_sla_scene(); @@ -2928,39 +2928,31 @@ void Plater::priv::msw_rescale_object_menu() bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/) { - wxMenuItem* item_delete = nullptr; if (is_part) { - item_delete = append_menu_item(menu, wxID_ANY, _(L("Delete")) + "\tDel", _(L("Remove the selected object")), - [this](wxCommandEvent&) { q->remove_selected(); }, "delete"); + append_menu_item(menu, wxID_ANY, _(L("Delete")) + "\tDel", _(L("Remove the selected object")), + [this](wxCommandEvent&) { q->remove_selected(); }, "delete", nullptr, [this]() { return can_delete(); }, q); sidebar->obj_list()->append_menu_item_export_stl(menu); } else { wxMenuItem* item_increase = append_menu_item(menu, wxID_ANY, _(L("Increase copies")) + "\t+", _(L("Place one more copy of the selected object")), - [this](wxCommandEvent&) { q->increase_instances(); }, "add_copies"); + [this](wxCommandEvent&) { q->increase_instances(); }, "add_copies", nullptr, [this]() { return can_increase_instances(); }, q); wxMenuItem* item_decrease = append_menu_item(menu, wxID_ANY, _(L("Decrease copies")) + "\t-", _(L("Remove one copy of the selected object")), - [this](wxCommandEvent&) { q->decrease_instances(); }, "remove_copies"); + [this](wxCommandEvent&) { q->decrease_instances(); }, "remove_copies", nullptr, [this]() { return can_decrease_instances(); }, q); wxMenuItem* item_set_number_of_copies = append_menu_item(menu, wxID_ANY, _(L("Set number of copies")) + dots, _(L("Change the number of copies of the selected object")), - [this](wxCommandEvent&) { q->set_number_of_copies(); }, "number_of_copies"); + [this](wxCommandEvent&) { q->set_number_of_copies(); }, "number_of_copies", nullptr, [this]() { return can_increase_instances(); }, q); + items_increase.push_back(item_increase); items_decrease.push_back(item_decrease); items_set_number_of_copies.push_back(item_set_number_of_copies); // Delete menu was moved to be after +/- instace to make it more difficult to be selected by mistake. - item_delete = append_menu_item(menu, wxID_ANY, _(L("Delete")) + "\tDel", _(L("Remove the selected object")), - [this](wxCommandEvent&) { q->remove_selected(); }, "delete"); + append_menu_item(menu, wxID_ANY, _(L("Delete")) + "\tDel", _(L("Remove the selected object")), + [this](wxCommandEvent&) { q->remove_selected(); }, "delete", nullptr, [this]() { return can_delete(); }, q); menu->AppendSeparator(); - wxMenuItem* item_instance_to_object = sidebar->obj_list()->append_menu_item_instance_to_object(menu); - - if (q != nullptr) - { - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_increase_instances()); }, item_increase->GetId()); - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_decrease_instances()); }, item_decrease->GetId()); - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_increase_instances()); }, item_set_number_of_copies->GetId()); - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_set_instance_to_object()); }, item_instance_to_object->GetId()); - } + sidebar->obj_list()->append_menu_item_instance_to_object(menu, q); menu->AppendSeparator(); append_menu_item(menu, wxID_ANY, _(L("Reload from Disk")), _(L("Reload the selected file from Disk")), @@ -2972,7 +2964,7 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/ menu->AppendSeparator(); } - wxMenuItem* item_fix_through_netfabb = sidebar->obj_list()->append_menu_item_fix_through_netfabb(menu); + sidebar->obj_list()->append_menu_item_fix_through_netfabb(menu); wxMenu* mirror_menu = new wxMenu(); if (mirror_menu == nullptr) @@ -2985,16 +2977,8 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/ append_menu_item(mirror_menu, wxID_ANY, _(L("Along Z axis")), _(L("Mirror the selected object along the Z axis")), [this](wxCommandEvent&) { mirror(Z); }, "mark_Z", menu); - wxMenuItem* item_mirror = append_submenu(menu, mirror_menu, wxID_ANY, _(L("Mirror")), _(L("Mirror the selected object"))); - - // ui updates needs to be bound to the parent panel - if (q != nullptr) - { - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_mirror()); }, item_mirror->GetId()); - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_delete()); }, item_delete->GetId()); - if (item_fix_through_netfabb) - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_fix_through_netfabb()); }, item_fix_through_netfabb->GetId()); - } + append_submenu(menu, mirror_menu, wxID_ANY, _(L("Mirror")), _(L("Mirror the selected object")), "", + [this]() { return can_mirror(); }, q); return true; } @@ -3005,30 +2989,24 @@ bool Plater::priv::complit_init_object_menu() if (split_menu == nullptr) return false; - wxMenuItem* item_split_objects = append_menu_item(split_menu, wxID_ANY, _(L("To objects")), _(L("Split the selected object into individual objects")), - [this](wxCommandEvent&) { split_object(); }, "split_object_SMALL", &object_menu); - wxMenuItem* item_split_volumes = append_menu_item(split_menu, wxID_ANY, _(L("To parts")), _(L("Split the selected object into individual sub-parts")), - [this](wxCommandEvent&) { split_volume(); }, "split_parts_SMALL", &object_menu); + append_menu_item(split_menu, wxID_ANY, _(L("To objects")), _(L("Split the selected object into individual objects")), + [this](wxCommandEvent&) { split_object(); }, "split_object_SMALL", &object_menu, [this]() { return can_split(); }, q); + append_menu_item(split_menu, wxID_ANY, _(L("To parts")), _(L("Split the selected object into individual sub-parts")), + [this](wxCommandEvent&) { split_volume(); }, "split_parts_SMALL", &object_menu, [this]() { return can_split(); }, q); - wxMenuItem* item_split = append_submenu(&object_menu, split_menu, wxID_ANY, _(L("Split")), _(L("Split the selected object"))/*, "shape_ungroup.png"*/); + append_submenu(&object_menu, split_menu, wxID_ANY, _(L("Split")), _(L("Split the selected object")), "", + [this]() { return can_split() && wxGetApp().get_mode() > comSimple; }, q); object_menu.AppendSeparator(); // "Add (volumes)" popupmenu will be added later in append_menu_items_add_volume() - // ui updates needs to be binded to the parent panel - if (q != nullptr) - { - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_split()); }, item_split->GetId()); - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_split()); }, item_split_objects->GetId()); - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_split() && wxGetApp().get_mode() > comSimple); }, item_split_volumes->GetId()); - } return true; } bool Plater::priv::complit_init_sla_object_menu() { - wxMenuItem* item_split = append_menu_item(&sla_object_menu, wxID_ANY, _(L("Split")), _(L("Split the selected object into individual objects")), - [this](wxCommandEvent&) { split_object(); }, "split_object_SMALL"); + append_menu_item(&sla_object_menu, wxID_ANY, _(L("Split")), _(L("Split the selected object into individual objects")), + [this](wxCommandEvent&) { split_object(); }, "split_object_SMALL", nullptr, [this]() { return can_split(); }, q); sla_object_menu.AppendSeparator(); @@ -3036,31 +3014,19 @@ bool Plater::priv::complit_init_sla_object_menu() append_menu_item(&sla_object_menu, wxID_ANY, _(L("Optimize orientation")), _(L("Optimize the rotation of the object for better print results.")), [this](wxCommandEvent&) { sla_optimize_rotation(); }); - // ui updates needs to be binded to the parent panel - if (q != nullptr) - { - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_split()); }, item_split->GetId()); - } - return true; } bool Plater::priv::complit_init_part_menu() { - wxMenuItem* item_split = append_menu_item(&part_menu, wxID_ANY, _(L("Split")), _(L("Split the selected object into individual sub-parts")), - [this](wxCommandEvent&) { split_volume(); }, "split_parts_SMALL"); + append_menu_item(&part_menu, wxID_ANY, _(L("Split")), _(L("Split the selected object into individual sub-parts")), + [this](wxCommandEvent&) { split_volume(); }, "split_parts_SMALL", nullptr, [this]() { return can_split(); }, q); part_menu.AppendSeparator(); auto obj_list = sidebar->obj_list(); obj_list->append_menu_item_change_type(&part_menu); - // ui updates needs to be binded to the parent panel - if (q != nullptr) - { - q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(can_split()); }, item_split->GetId()); - } - return true; } @@ -3965,6 +3931,8 @@ bool Plater::can_delete() const { return p->can_delete(); } bool Plater::can_delete_all() const { return p->can_delete_all(); } bool Plater::can_increase_instances() const { return p->can_increase_instances(); } bool Plater::can_decrease_instances() const { return p->can_decrease_instances(); } +bool Plater::can_set_instance_to_object() const { return p->can_set_instance_to_object(); } +bool Plater::can_fix_through_netfabb() const { return p->can_fix_through_netfabb(); } bool Plater::can_split_to_objects() const { return p->can_split_to_objects(); } bool Plater::can_split_to_volumes() const { return p->can_split_to_volumes(); } bool Plater::can_arrange() const { return p->can_arrange(); } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index e4327f4335..3e70036864 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -200,6 +200,8 @@ public: bool can_delete_all() const; bool can_increase_instances() const; bool can_decrease_instances() const; + bool can_set_instance_to_object() const; + bool can_fix_through_netfabb() const; bool can_split_to_objects() const; bool can_split_to_volumes() const; bool can_arrange() const; diff --git a/src/slic3r/GUI/SysInfoDialog.cpp b/src/slic3r/GUI/SysInfoDialog.cpp index ebeadf9c1d..052a5c12aa 100644 --- a/src/slic3r/GUI/SysInfoDialog.cpp +++ b/src/slic3r/GUI/SysInfoDialog.cpp @@ -24,7 +24,7 @@ std::string get_main_info(bool format_as_html) if (!format_as_html) out << b_start << SLIC3R_APP_NAME << b_end << line_end; out << b_start << "Version: " << b_end << SLIC3R_VERSION << line_end; - out << b_start << "Build: " << b_end << SLIC3R_BUILD << line_end; + out << b_start << "Build: " << b_end << SLIC3R_BUILD_ID << line_end; out << line_end; out << b_start << "Operating System: " << b_end << wxPlatformInfo::Get().GetOperatingSystemFamilyName() << line_end; out << b_start << "System Architecture: " << b_end << wxPlatformInfo::Get().GetArchName() << line_end; diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 3a36ef9c33..24fe778c9d 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -25,8 +25,9 @@ using Slic3r::GUI::from_u8; wxDEFINE_EVENT(wxCUSTOMEVT_TICKSCHANGED, wxEvent); wxDEFINE_EVENT(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED, wxCommandEvent); -#ifdef __WXMSW__ +#ifndef __WXGTK__// msw_menuitem_bitmaps is used for MSW and OSX static std::map msw_menuitem_bitmaps; +#ifdef __WXMSW__ void msw_rescale_menu(wxMenu* menu) { struct update_icons { @@ -47,9 +48,27 @@ void msw_rescale_menu(wxMenu* menu) update_icons::run(item); } #endif /* __WXMSW__ */ +#endif /* no __WXGTK__ */ + +void enable_menu_item(wxUpdateUIEvent& evt, std::function const cb_condition, wxMenuItem* item) +{ + const bool enable = cb_condition(); + evt.Enable(enable); + +#ifdef __WXOSX__ + const auto it = msw_menuitem_bitmaps.find(item->GetId()); + if (it != msw_menuitem_bitmaps.end()) + { + const wxBitmap& item_icon = create_scaled_bitmap(nullptr, it->second, 16, false, !enable); + if (item_icon.IsOk()) + item->SetBitmap(item_icon); + } +#endif // __WXOSX__ +} wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const wxString& description, - std::function cb, const wxBitmap& icon, wxEvtHandler* event_handler) + std::function cb, const wxBitmap& icon, wxEvtHandler* event_handler, + std::function const cb_condition, wxWindow* parent) { if (id == wxID_ANY) id = wxNewId(); @@ -67,25 +86,33 @@ wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const #endif // __WXMSW__ menu->Bind(wxEVT_MENU, cb, id); + if (parent) { + parent->Bind(wxEVT_UPDATE_UI, [cb_condition, item](wxUpdateUIEvent& evt) { + enable_menu_item(evt, cb_condition, item); }, id); + } + return item; } wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const wxString& description, - std::function cb, const std::string& icon, wxEvtHandler* event_handler) + std::function cb, const std::string& icon, wxEvtHandler* event_handler, + std::function const cb_condition, wxWindow* parent) { if (id == wxID_ANY) id = wxNewId(); const wxBitmap& bmp = !icon.empty() ? create_scaled_bitmap(nullptr, icon) : wxNullBitmap; // FIXME: pass window ptr -#ifdef __WXMSW__ +//#ifdef __WXMSW__ +#ifndef __WXGTK__ if (bmp.IsOk()) msw_menuitem_bitmaps[id] = icon; #endif /* __WXMSW__ */ - return append_menu_item(menu, id, string, description, cb, bmp, event_handler); + return append_menu_item(menu, id, string, description, cb, bmp, event_handler, cb_condition, parent); } -wxMenuItem* append_submenu(wxMenu* menu, wxMenu* sub_menu, int id, const wxString& string, const wxString& description, const std::string& icon) +wxMenuItem* append_submenu(wxMenu* menu, wxMenu* sub_menu, int id, const wxString& string, const wxString& description, const std::string& icon, + std::function const cb_condition, wxWindow* parent) { if (id == wxID_ANY) id = wxNewId(); @@ -93,7 +120,8 @@ wxMenuItem* append_submenu(wxMenu* menu, wxMenu* sub_menu, int id, const wxStrin wxMenuItem* item = new wxMenuItem(menu, id, string, description); if (!icon.empty()) { item->SetBitmap(create_scaled_bitmap(nullptr, icon)); // FIXME: pass window ptr -#ifdef __WXMSW__ +//#ifdef __WXMSW__ +#ifndef __WXGTK__ msw_menuitem_bitmaps[id] = icon; #endif /* __WXMSW__ */ } @@ -101,6 +129,11 @@ wxMenuItem* append_submenu(wxMenu* menu, wxMenu* sub_menu, int id, const wxStrin item->SetSubMenu(sub_menu); menu->Append(item); + if (parent) { + parent->Bind(wxEVT_UPDATE_UI, [cb_condition, item](wxUpdateUIEvent& evt) { + enable_menu_item(evt, cb_condition, item); }, id); + } + return item; } @@ -350,7 +383,8 @@ int em_unit(wxWindow* win) } // If an icon has horizontal orientation (width > height) call this function with is_horizontal = true -wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in, const int px_cnt/* = 16*/, const bool is_horizontal /* = false*/) +wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in, + const int px_cnt/* = 16*/, const bool is_horizontal /* = false*/, const bool grayscale/* = false*/) { static Slic3r::GUI::BitmapCache cache; @@ -370,9 +404,9 @@ wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in, con boost::replace_last(bmp_name, ".png", ""); // Try loading an SVG first, then PNG if SVG is not found: - wxBitmap *bmp = cache.load_svg(bmp_name, width, height, scale_factor); + wxBitmap *bmp = cache.load_svg(bmp_name, width, height, scale_factor, grayscale); if (bmp == nullptr) { - bmp = cache.load_png(bmp_name, width, height); + bmp = cache.load_png(bmp_name, width, height, grayscale); } if (bmp == nullptr) { @@ -2456,7 +2490,6 @@ ModeButton::ModeButton( wxWindow * parent, const wxString& mode /* = wxEmptyString*/, const wxSize& size /* = wxDefaultSize*/, const wxPoint& pos /* = wxDefaultPosition*/) : -// wxButton(parent, id, mode, pos, wxDefaultSize/*size*/, wxBU_EXACTFIT | wxNO_BORDER), ScalableButton(parent, id, icon_name, mode, size, pos) { m_tt_focused = wxString::Format(_(L("Switch to the %s mode")), mode); @@ -2513,7 +2546,14 @@ ModeSizer::ModeSizer(wxWindow *parent, int hgap/* = 10*/) : m_mode_btns.reserve(3); for (const auto& button : buttons) { - m_mode_btns.push_back(new ModeButton(parent, wxID_ANY, button.second, button.first)); +#ifdef __WXOSX__ + wxSize sz = parent->GetTextExtent(button.first); + // set default width for ModeButtons to correct rendering on OnFocus under OSX + sz.x += 2 * em_unit(parent); + m_mode_btns.push_back(new ModeButton(parent, wxID_ANY, button.second, button.first, sz)); +#else + m_mode_btns.push_back(new ModeButton(parent, wxID_ANY, button.second, button.first));; +#endif // __WXOSX__ } for (auto btn : m_mode_btns) diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 2b47cd77eb..78fb7be55b 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -27,12 +27,15 @@ inline void msw_rescale_menu(wxMenu* /* menu */) {} #endif /* __WXMSW__ */ wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const wxString& description, - std::function cb, const wxBitmap& icon, wxEvtHandler* event_handler = nullptr); + std::function cb, const wxBitmap& icon, wxEvtHandler* event_handler = nullptr, + std::function const cb_condition = []() { return true;}, wxWindow* parent = nullptr); wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const wxString& description, - std::function cb, const std::string& icon = "", wxEvtHandler* event_handler = nullptr); + std::function cb, const std::string& icon = "", wxEvtHandler* event_handler = nullptr, + std::function const cb_condition = []() { return true; }, wxWindow* parent = nullptr); wxMenuItem* append_submenu(wxMenu* menu, wxMenu* sub_menu, int id, const wxString& string, const wxString& description, - const std::string& icon = ""); + const std::string& icon = "", + std::function const cb_condition = []() { return true; }, wxWindow* parent = nullptr); wxMenuItem* append_menu_radio_item(wxMenu* menu, int id, const wxString& string, const wxString& description, std::function cb, wxEvtHandler* event_handler); @@ -42,7 +45,8 @@ void edit_tooltip(wxString& tooltip); void msw_buttons_rescale(wxDialog* dlg, const int em_unit, const std::vector& btn_ids); int em_unit(wxWindow* win); -wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name, const int px_cnt = 16, const bool is_horizontal = false); +wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name, + const int px_cnt = 16, const bool is_horizontal = false, const bool grayscale = false); class wxCheckListBoxComboPopup : public wxCheckListBox, public wxComboPopup { diff --git a/version.inc b/version.inc index ef49ce0371..0f0d93403b 100644 --- a/version.inc +++ b/version.inc @@ -4,7 +4,6 @@ set(SLIC3R_APP_NAME "PrusaSlicer") set(SLIC3R_APP_KEY "PrusaSlicer") set(SLIC3R_VERSION "1.42.0-beta2") -set(SLIC3R_BUILD "${SLIC3R_VERSION}+UNKNOWN") -set(SLIC3R_BUILD_ID "${SLIC3R_BUILD_ID}") +set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN") set(SLIC3R_RC_VERSION "1,42,0,0") set(SLIC3R_RC_VERSION_DOTS "1.42.0.0") diff --git a/xs/xsp/XS.xsp b/xs/xsp/XS.xsp index e6f252ca84..083d21d388 100644 --- a/xs/xsp/XS.xsp +++ b/xs/xsp/XS.xsp @@ -20,7 +20,7 @@ VERSION() SV* BUILD() CODE: - RETVAL = newSVpv(SLIC3R_BUILD, 0); + RETVAL = newSVpv(SLIC3R_BUILD_ID, 0); OUTPUT: RETVAL SV*