From e1528e4299a459b19a65312adb7154b36d905c6d Mon Sep 17 00:00:00 2001 From: wuyifanfancy <73487021+wuyifanfancy@users.noreply.github.com> Date: Mon, 18 Jul 2022 09:39:34 +0800 Subject: [PATCH 1/4] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b0746b0a8d..5c2cc0469f 100644 --- a/README.md +++ b/README.md @@ -48,5 +48,5 @@ Slic3r is licensed under the GNU Affero General Public License, version 3. Slic3 The GNU Affero General Public License, version 3 ensures that if you use any part of this software in any way (even behind a web server), your software must be released under the same license. -The BambuNetworking and BambuTunnel plugins are based on non-free libraries. They are optional to the Bambu Studio and provides extended functionalities for users. +The bambu networking plugin is based on non-free libraries. It is optional to the Bambu Studio and provides extended functionalities for users. From e9e4d75877697d877dbb9389f418585004c376e6 Mon Sep 17 00:00:00 2001 From: "lane.wei" Date: Fri, 22 Jul 2022 17:46:10 +0800 Subject: [PATCH 2/4] Update the codes to 01.01.00.10 for the formal release 1. first formal version of macos 2. add the bambu networking plugin install logic 3. auto compute the wipe volume when filament change 4. add the logic of wiping into support 5. refine the GUI layout and icons, improve the gui apperance in lots of small places 6. serveral improve to support 7. support AMS auto-mapping 8. disable lots of unstable features: such as params table, media file download, HMS 9. fix serveral kinds of bugs 10. update the document of building 11. ... --- CMakeLists.txt | 1 + bbl/i18n/BambuStudio.pot | 239 +- bbl/i18n/de/BambuStudio_de.po | 12038 +--------------- bbl/i18n/en/BambuStudio_en.po | 1401 +- bbl/i18n/es/BambuStudio_es.po | 11912 +-------------- bbl/i18n/fr/BambuStudio_fr.po | 2385 +-- bbl/i18n/list.txt | 3 +- bbl/i18n/nl/BambuStudio_nl.po | 1844 +-- bbl/i18n/sv/BambuStudio_sv.po | 1830 +-- bbl/i18n/zh_cn/BambuStudio_zh_CN.po | 449 +- doc/Dependencies.md | 35 - doc/How to build - Linux et al.md | 131 +- doc/How to build - Mac OS.md | 130 +- doc/How to build - Windows.md | 234 +- doc/Localization_guide.md | 37 +- doc/images/long_text_on_button.png | Bin 11913 -> 0 bytes doc/updating/Updating.md | 52 - doc/updating/setting_mod.png | Bin 4050 -> 0 bytes doc/updating/setting_sys.png | Bin 3863 -> 0 bytes doc/updating/setting_user.png | Bin 3957 -> 0 bytes doc/updating/snapshots_dialog.png | Bin 78805 -> 0 bytes localazy.json | 7 +- resources/i18n/de/BambuStudio.mo | Bin 147024 -> 162108 bytes resources/i18n/en/BambuStudio.mo | Bin 152973 -> 150341 bytes resources/i18n/es/BambuStudio.mo | Bin 149379 -> 162792 bytes resources/i18n/fr/BambuStudio.mo | Bin 147935 -> 164655 bytes resources/i18n/nl/BambuStudio.mo | Bin 142927 -> 161887 bytes resources/i18n/sv/BambuStudio.mo | Bin 134449 -> 152796 bytes resources/i18n/zh_cn/BambuStudio.mo | Bin 143521 -> 145708 bytes resources/images/BambuStudio_about.png | Bin 10382 -> 12907 bytes resources/images/check_half_disabled.svg | 4 + resources/images/check_off_disabled.svg | 3 + resources/images/check_on_disabled.svg | 4 + resources/images/fragment_filter.svg | 12 +- resources/images/im_slider_delete.svg | 5 + resources/images/menu_export_gcode.svg | 3 + resources/images/mmu_segmentation.svg | 11 +- resources/images/monitor_sdcard_thumbnail.png | Bin 0 -> 9098 bytes resources/images/monitor_sdcard_thumbnail.svg | 15 - resources/images/monitor_state_off.svg | 10 + resources/images/monitor_state_on.svg | 10 + resources/images/plate_arrange.svg | 12 +- resources/images/plate_arrange_hover.svg | 12 +- resources/images/plate_locked.svg | 4 +- resources/images/plate_locked_hover.svg | 6 +- resources/images/plate_orient.svg | 18 +- resources/images/plate_orient_hover.svg | 18 +- resources/images/plate_unlocked.svg | 6 +- resources/images/plate_unlocked_hover.svg | 6 +- resources/images/recording_off_hover.svg | 6 + resources/images/recording_off_normal.svg | 6 + resources/images/recording_on_hover.svg | 7 + resources/images/recording_on_normal.svg | 7 + resources/images/sdcard_state_off.svg | 20 + resources/images/sdcard_state_on.svg | 17 + resources/images/split_objects.svg | 10 +- resources/images/split_parts.svg | 31 +- resources/images/tab_auxiliary_avtice.svg | 22 +- resources/images/timelapse_off_hover.svg | 12 + resources/images/timelapse_off_normal.svg | 12 + resources/images/timelapse_on_hover.svg | 13 + resources/images/timelapse_on_normal.svg | 13 + resources/images/toolbar_add_plate.svg | 28 +- resources/images/toolbar_arrange.svg | 12 +- resources/images/toolbar_assemble.svg | 10 +- resources/images/toolbar_cut.svg | 13 +- resources/images/toolbar_flatten.svg | 37 +- resources/images/toolbar_move.svg | 22 +- resources/images/toolbar_open.svg | 18 +- resources/images/toolbar_orient.svg | 17 +- resources/images/toolbar_rotate.svg | 19 +- resources/images/toolbar_scale.svg | 33 +- resources/images/toolbar_seam.svg | 18 +- resources/images/toolbar_settings.svg | 9 +- resources/images/toolbar_support.svg | 33 +- resources/images/video_state_off.svg | 9 + resources/images/video_state_on.svg | 9 + resources/profiles/BBL.json | 6 +- .../Bambu ABS @BBL X1C 0.8 nozzle.json | 2 +- .../Bambu PC @BBL X1C 0.8 nozzle.json | 14 + .../BBL/filament/Bambu PC @BBL X1C.json | 3 +- .../BBL/filament/Bambu TPU 95A @BBL X1C.json | 4 +- .../BBL/filament/fdm_filament_pet.json | 2 +- .../Bambu Lab X1 Carbon 0.6 nozzle.json | 1 + .../BBL/machine/Bambu Lab X1 Carbon.json | 2 +- .../fdm_process_bbl_0.10_nozzle_0.2.json | 2 +- .../BBL/process/fdm_process_bbl_common.json | 4 +- .../BBL/process/fdm_process_common.json | 2 +- resources/tooltip/styled.html | 2 +- resources/web/data/text.js | 54 +- resources/web/guide/22/22.css | 5 + resources/web/guide/22/22.js | 10 +- resources/web/guide/22/index.html | 2 +- resources/web/guide/31/31.css | 40 + resources/web/guide/31/31.js | 80 + resources/web/guide/31/index.html | 38 + resources/web/guide/5/5.css | 50 +- resources/web/guide/5/5.js | 24 + resources/web/guide/5/index.html | 50 +- resources/web/guide/6/6.css | 136 + resources/web/guide/6/6.js | 167 + resources/web/guide/6/index.html | 48 + resources/web/guide/6/restart.png | Bin 0 -> 16368 bytes resources/web/homepage/css/home.css | 38 + resources/web/homepage/index.html | 7 +- resources/web/homepage/js/home.js | 25 +- src/BambuStudio.cpp | 4 +- src/imgui/imconfig.h | 5 +- src/imgui/imgui_widgets.cpp | 6 +- src/libslic3r/AppConfig.cpp | 15 +- src/libslic3r/Brim.cpp | 75 +- src/libslic3r/CMakeLists.txt | 8 +- src/libslic3r/Circle.cpp | 3 + src/libslic3r/Fill/Fill.cpp | 3 +- src/libslic3r/Fill/FillConcentricWGapFill.cpp | 10 +- src/libslic3r/Fill/FillRectilinear.cpp | 2 +- src/libslic3r/Format/bbs_3mf.cpp | 23 +- src/libslic3r/Format/bbs_3mf.hpp | 9 +- src/libslic3r/GCode.cpp | 33 +- src/libslic3r/GCode/SpeedGenerator.cpp | 50 - src/libslic3r/GCode/SpeedGenerator.hpp | 22 - src/libslic3r/GCode/ToolOrdering.cpp | 100 +- src/libslic3r/GCode/ToolOrdering.hpp | 24 + src/libslic3r/Layer.hpp | 6 + src/libslic3r/LayerRegion.cpp | 8 +- src/libslic3r/MacUtils.hpp | 10 + src/libslic3r/MacUtils.mm | 15 + src/libslic3r/Model.cpp | 40 +- src/libslic3r/Model.hpp | 3 + src/libslic3r/PerimeterGenerator.cpp | 48 +- src/libslic3r/PerimeterGenerator.hpp | 2 +- src/libslic3r/Polyline.cpp | 58 +- src/libslic3r/Polyline.hpp | 37 +- src/libslic3r/Preset.cpp | 4 +- src/libslic3r/Print.cpp | 1 + src/libslic3r/Print.hpp | 9 +- src/libslic3r/PrintConfig.cpp | 36 +- src/libslic3r/PrintConfig.hpp | 2 + src/libslic3r/PrintObject.cpp | 97 +- src/libslic3r/PrintObjectSlice.cpp | 60 +- src/libslic3r/ProjectTask.hpp | 5 +- src/libslic3r/SVG.hpp | 1 + src/libslic3r/Slicing.hpp | 5 +- src/libslic3r/SupportMaterial.cpp | 20 +- src/libslic3r/TreeSupport.cpp | 261 +- src/libslic3r/TreeSupport.hpp | 5 +- src/libslic3r/TriangleMesh.cpp | 13 +- src/libslic3r/VariableWidth.cpp | 120 +- src/libslic3r/libslic3r.h | 1 - src/libslic3r/utils.cpp | 14 + src/slic3r/CMakeLists.txt | 8 +- src/slic3r/GUI/AMSMaterialsSetting.cpp | 119 +- src/slic3r/GUI/AMSMaterialsSetting.hpp | 7 +- src/slic3r/GUI/AboutDialog.cpp | 93 +- src/slic3r/GUI/AmsMappingPopup.cpp | 114 +- src/slic3r/GUI/AmsMappingPopup.hpp | 13 +- src/slic3r/GUI/Auxiliary.cpp | 17 +- src/slic3r/GUI/BBLStatusBarBind.cpp | 27 +- src/slic3r/GUI/BBLStatusBarSend.cpp | 66 +- src/slic3r/GUI/BBLStatusBarSend.hpp | 1 + src/slic3r/GUI/BBLTopbar.cpp | 6 +- src/slic3r/GUI/BindDialog.cpp | 10 +- src/slic3r/GUI/Calibration.cpp | 89 +- src/slic3r/GUI/Calibration.hpp | 1 + src/slic3r/GUI/CameraPopup.cpp | 93 + src/slic3r/GUI/CameraPopup.hpp | 30 + src/slic3r/GUI/ConfigManipulation.cpp | 6 +- src/slic3r/GUI/ConnectPrinter.cpp | 2 +- src/slic3r/GUI/DeviceManager.cpp | 266 +- src/slic3r/GUI/DeviceManager.hpp | 30 +- src/slic3r/GUI/DownloadProgressDialog.cpp | 100 + src/slic3r/GUI/DownloadProgressDialog.hpp | 55 + src/slic3r/GUI/GCodeViewer.cpp | 3 +- src/slic3r/GUI/GLCanvas3D.cpp | 123 +- src/slic3r/GUI/GLTexture.cpp | 43 +- src/slic3r/GUI/GUI.cpp | 48 + src/slic3r/GUI/GUI.hpp | 3 +- src/slic3r/GUI/GUI_App.cpp | 759 +- src/slic3r/GUI/GUI_App.hpp | 32 +- src/slic3r/GUI/GUI_Factories.cpp | 3 +- src/slic3r/GUI/GUI_ObjectList.cpp | 32 +- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp | 4 +- .../GUI/Gizmos/GLGizmoMmuSegmentation.cpp | 134 +- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 2 +- .../GUI/Gizmos/GizmoObjectManipulation.cpp | 36 +- .../GUI/Gizmos/GizmoObjectManipulation.hpp | 2 + src/slic3r/GUI/IMSlider.cpp | 143 +- src/slic3r/GUI/IMSlider.hpp | 2 + src/slic3r/GUI/ImGuiWrapper.cpp | 38 +- src/slic3r/GUI/ImGuiWrapper.hpp | 10 +- src/slic3r/GUI/Jobs/BindJob.cpp | 4 +- src/slic3r/GUI/Jobs/PrintJob.cpp | 87 +- src/slic3r/GUI/Jobs/PrintJob.hpp | 1 + src/slic3r/GUI/Jobs/UpgradeNetworkJob.cpp | 136 + src/slic3r/GUI/Jobs/UpgradeNetworkJob.hpp | 56 + src/slic3r/GUI/MainFrame.cpp | 135 +- src/slic3r/GUI/MainFrame.hpp | 3 +- src/slic3r/GUI/MarkdownTip.cpp | 16 +- src/slic3r/GUI/MediaFilePanel.cpp | 13 +- src/slic3r/GUI/MediaFilePanel.h | 2 +- src/slic3r/GUI/MediaPlayCtrl.cpp | 18 +- src/slic3r/GUI/Monitor.cpp | 37 +- src/slic3r/GUI/MsgDialog.cpp | 3 +- src/slic3r/GUI/MsgDialog.hpp | 3 +- src/slic3r/GUI/Notebook.cpp | 7 +- src/slic3r/GUI/Notebook.hpp | 10 +- src/slic3r/GUI/NotificationManager.cpp | 62 +- src/slic3r/GUI/NotificationManager.hpp | 15 +- src/slic3r/GUI/OG_CustomCtrl.cpp | 33 +- src/slic3r/GUI/ObjectDataViewModel.cpp | 10 +- src/slic3r/GUI/ParamsPanel.cpp | 18 +- src/slic3r/GUI/PartPlate.cpp | 80 +- src/slic3r/GUI/PartPlate.hpp | 7 + src/slic3r/GUI/Plater.cpp | 118 +- src/slic3r/GUI/Plater.hpp | 4 + src/slic3r/GUI/Preferences.cpp | 10 +- src/slic3r/GUI/PresetComboBoxes.cpp | 5 +- src/slic3r/GUI/Printer/PrinterFileSystem.cpp | 39 +- src/slic3r/GUI/Printer/PrinterFileSystem.h | 10 +- src/slic3r/GUI/ReleaseNote.cpp | 114 +- src/slic3r/GUI/ReleaseNote.hpp | 15 + src/slic3r/GUI/SelectMachine.cpp | 1225 +- src/slic3r/GUI/SelectMachine.hpp | 103 +- src/slic3r/GUI/StatusPanel.cpp | 453 +- src/slic3r/GUI/StatusPanel.hpp | 54 +- src/slic3r/GUI/Tab.cpp | 8 +- src/slic3r/GUI/Tabbook.cpp | 4 +- src/slic3r/GUI/UnsavedChangesDialog.cpp | 5 +- src/slic3r/GUI/UpdateDialogs.cpp | 2 +- src/slic3r/GUI/WebDailytipDialog.cpp | 352 - src/slic3r/GUI/WebDownPluginDlg.cpp | 339 + ...ailytipDialog.hpp => WebDownPluginDlg.hpp} | 33 +- src/slic3r/GUI/WebGuideDialog.cpp | 66 +- src/slic3r/GUI/WebGuideDialog.hpp | 7 + src/slic3r/GUI/WebUpdatePlugin.cpp | 0 src/slic3r/GUI/WebUpdatePlugin.hpp | 0 src/slic3r/GUI/WebViewDialog.cpp | 22 + src/slic3r/GUI/WebViewDialog.hpp | 1 + src/slic3r/GUI/Widgets/AMSControl.cpp | 43 +- src/slic3r/GUI/Widgets/AMSControl.hpp | 1 + src/slic3r/GUI/Widgets/Button.cpp | 6 +- src/slic3r/GUI/Widgets/CheckBox.cpp | 12 +- src/slic3r/GUI/Widgets/CheckBox.hpp | 11 +- src/slic3r/GUI/Widgets/Label.cpp | 27 + src/slic3r/GUI/Widgets/Label.hpp | 3 + src/slic3r/GUI/Widgets/SideButton.cpp | 4 + src/slic3r/GUI/Widgets/SideMenuPopup.cpp | 11 +- src/slic3r/GUI/Widgets/StepCtrl.cpp | 53 +- src/slic3r/GUI/Widgets/StepCtrl.hpp | 2 +- src/slic3r/GUI/Widgets/TempInput.cpp | 52 +- src/slic3r/GUI/WipeTowerDialog.cpp | 151 +- src/slic3r/GUI/WipeTowerDialog.hpp | 27 +- src/slic3r/GUI/wxExtensions.cpp | 3 +- src/slic3r/GUI/wxMediaCtrl2.cpp | 23 +- src/slic3r/GUI/wxMediaCtrl2.h | 17 +- src/slic3r/GUI/wxMediaCtrl2.mm | 36 +- src/slic3r/Utils/Http.cpp | 14 +- src/slic3r/Utils/Http.hpp | 20 + src/slic3r/Utils/MacDarkMode.mm | 10 + src/slic3r/Utils/NetworkAgent.cpp | 204 +- src/slic3r/Utils/NetworkAgent.hpp | 12 +- src/slic3r/Utils/PresetUpdater.cpp | 43 +- src/slic3r/Utils/PresetUpdater.hpp | 5 +- src/slic3r/Utils/bambu_networking.hpp | 2 +- version.inc | 2 +- 267 files changed, 10326 insertions(+), 32228 deletions(-) delete mode 100644 doc/Dependencies.md delete mode 100644 doc/images/long_text_on_button.png delete mode 100644 doc/updating/Updating.md delete mode 100644 doc/updating/setting_mod.png delete mode 100644 doc/updating/setting_sys.png delete mode 100644 doc/updating/setting_user.png delete mode 100644 doc/updating/snapshots_dialog.png create mode 100644 resources/images/check_half_disabled.svg create mode 100644 resources/images/check_off_disabled.svg create mode 100644 resources/images/check_on_disabled.svg create mode 100644 resources/images/im_slider_delete.svg create mode 100644 resources/images/menu_export_gcode.svg create mode 100644 resources/images/monitor_sdcard_thumbnail.png delete mode 100644 resources/images/monitor_sdcard_thumbnail.svg create mode 100644 resources/images/monitor_state_off.svg create mode 100644 resources/images/monitor_state_on.svg create mode 100644 resources/images/recording_off_hover.svg create mode 100644 resources/images/recording_off_normal.svg create mode 100644 resources/images/recording_on_hover.svg create mode 100644 resources/images/recording_on_normal.svg create mode 100644 resources/images/sdcard_state_off.svg create mode 100644 resources/images/sdcard_state_on.svg create mode 100644 resources/images/timelapse_off_hover.svg create mode 100644 resources/images/timelapse_off_normal.svg create mode 100644 resources/images/timelapse_on_hover.svg create mode 100644 resources/images/timelapse_on_normal.svg create mode 100644 resources/images/video_state_off.svg create mode 100644 resources/images/video_state_on.svg create mode 100644 resources/profiles/BBL/filament/Bambu PC @BBL X1C 0.8 nozzle.json create mode 100644 resources/web/guide/31/31.css create mode 100644 resources/web/guide/31/31.js create mode 100644 resources/web/guide/31/index.html create mode 100644 resources/web/guide/6/6.css create mode 100644 resources/web/guide/6/6.js create mode 100644 resources/web/guide/6/index.html create mode 100644 resources/web/guide/6/restart.png delete mode 100644 src/libslic3r/GCode/SpeedGenerator.cpp delete mode 100644 src/libslic3r/GCode/SpeedGenerator.hpp create mode 100644 src/libslic3r/MacUtils.hpp create mode 100644 src/libslic3r/MacUtils.mm create mode 100644 src/slic3r/GUI/DownloadProgressDialog.cpp create mode 100644 src/slic3r/GUI/DownloadProgressDialog.hpp create mode 100644 src/slic3r/GUI/Jobs/UpgradeNetworkJob.cpp create mode 100644 src/slic3r/GUI/Jobs/UpgradeNetworkJob.hpp delete mode 100644 src/slic3r/GUI/WebDailytipDialog.cpp create mode 100644 src/slic3r/GUI/WebDownPluginDlg.cpp rename src/slic3r/GUI/{WebDailytipDialog.hpp => WebDownPluginDlg.hpp} (78%) create mode 100644 src/slic3r/GUI/WebUpdatePlugin.cpp create mode 100644 src/slic3r/GUI/WebUpdatePlugin.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 790b76a7ec..fa776709ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,6 +53,7 @@ if (APPLE) if (CMAKE_MACOSX_BUNDLE) set(CMAKE_INSTALL_RPATH @executable_path/../Frameworks) endif() + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version" FORCE) endif () # Proposal for C++ unit tests and sandboxes diff --git a/bbl/i18n/BambuStudio.pot b/bbl/i18n/BambuStudio.pot index 03b0ea0d49..42bb563e27 100644 --- a/bbl/i18n/BambuStudio.pot +++ b/bbl/i18n/BambuStudio.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-15 10:25+0800\n" +"POT-Creation-Date: 2022-07-22 18:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -51,7 +51,7 @@ msgstr "" msgid "Highlight overhang areas" msgstr "" -msgid "Fragment filter" +msgid "Gap fill" msgstr "" msgid "Perform" @@ -84,7 +84,7 @@ msgstr "" msgid "Fill" msgstr "" -msgid "Fragment Filter" +msgid "Gap Fill" msgstr "" msgid "Highlight faces according to overhang angle." @@ -232,15 +232,12 @@ msgstr "" msgid "°" msgstr "" -msgid "Position:" +msgid "Size" msgstr "" msgid "%" msgstr "" -msgid "Size" -msgstr "" - msgid "uniform scale" msgstr "" @@ -419,6 +416,13 @@ msgstr "" msgid "BambuStudio got an unhandled exception: %1%" msgstr "" +msgid "Downloading Bambu Network plug-in" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "Connect %s[SN:%s] failed!" +msgstr "" + msgid "" "BambuStudio configuration file may be corrupted and is not abled to be " "parsed.Please delete the file and try again." @@ -440,10 +444,13 @@ msgstr "" msgid "Click to download new version in default browser: %s" msgstr "" -msgid "New version of Bambu Studio" +msgid "The Bambu Studio needs an upgrade" msgstr "" -msgid "The Bambu Studio needs an upgrade" +msgid "This is the newest version." +msgstr "" + +msgid "Info" msgstr "" msgid "Loading user presets..." @@ -467,18 +474,12 @@ msgstr "" msgid "Choose one file (gcode/.gco/.g/.ngc/ngc):" msgstr "" -msgid "Login information expired. Please login again." -msgstr "" - msgid "" "The version of Bambu studio is too low and needs to be updated to the latest " "version before it can be used normally" msgstr "" -msgid "This is the newest version." -msgstr "" - -msgid "Info" +msgid "Login information expired. Please login again." msgstr "" msgid "Loading" @@ -976,9 +977,7 @@ msgstr "" msgid "No printer" msgstr "" -msgid "" -"Heat the nozzle to target \n" -"temperature" +msgid "Heat the nozzle to target temperature" msgstr "" msgid "Cut filament" @@ -987,9 +986,7 @@ msgstr "" msgid "Pull back current filament" msgstr "" -msgid "" -"Push new filament \n" -"into extruder" +msgid "Push new filament into extruder" msgstr "" msgid "Purge old filament" @@ -1056,9 +1053,6 @@ msgid "" "Arrange failed. Found some exceptions when processing object geometries." msgstr "" -msgid "Arranging" -msgstr "" - msgid "Arranging canceled." msgstr "" @@ -1154,11 +1148,38 @@ msgstr "" msgid "Sending print job through cloud service" msgstr "" +msgid "Service Unavailable" +msgstr "" + +msgid "Unkown Error." +msgstr "" + msgid "Sending print configuration" msgstr "" #, possible-c-format, possible-boost-format -msgid "Successfully sent.Will automatically jump to the device page in %s s" +msgid "Successfully sent. Will automatically jump to the device page in %s s" +msgstr "" + +msgid "An SD card needs to be inserted before printing via LAN." +msgstr "" + +msgid "Downloading" +msgstr "" + +msgid "Download failed" +msgstr "" + +msgid "Cancelled" +msgstr "" + +msgid "Finish" +msgstr "" + +msgid "Installing" +msgstr "" + +msgid "Install failed" msgstr "" msgid "Portions copyright" @@ -1193,6 +1214,28 @@ msgstr "" msgid "About %s" msgstr "" +msgid "" +"Bambu Studio is based on PrusaSlicer by PrusaResearch and SuperSlicer by " +"Merill(supermerill)." +msgstr "" + +msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." +msgstr "" + +msgid "" +"Slic3r was created by Alessandro Ranellucci with the help of many other " +"contributors." +msgstr "" + +msgid "Bambu Studio also referenced some ideas from Cura by Ultimaker." +msgstr "" + +msgid "" +"There many parts of the software that come from community contributions, so " +"we're unable to list them one-by-one, and instead, they'll be attributed in " +"the corresponding code comments." +msgstr "" + msgid "Colour" msgstr "" @@ -1253,6 +1296,9 @@ msgstr "" msgid "File" msgstr "" +msgid "Close" +msgstr "" + msgid "" "A error occurred. Maybe memory of system is not enough or it's a bug of the " "program" @@ -1590,6 +1636,9 @@ msgstr "" msgid "Update failed." msgstr "" +msgid "Failed to start printing job" +msgstr "" + msgid "N/A" msgstr "" @@ -1877,8 +1926,9 @@ msgid "Only the object being edit is visible." msgstr "" msgid "" -"An object is layed over the boundary of plate.\n" -"Please solve the problem by moving it totally inside or outside plate." +"An object is laid over the boundary of plate or exceeds the height limit.\n" +"Please solve the problem by moving it totally on or off the plate, and " +"confirming that the height is within the build volume." msgstr "" msgid "Calibration" @@ -1899,6 +1949,9 @@ msgstr "" msgid "Start Calibration" msgstr "" +msgid "Completed" +msgstr "" + msgid "Calibrating" msgstr "" @@ -1919,36 +1972,6 @@ msgid "" "on the printer, as shown in the figure:" msgstr "" -msgid "Creating" -msgstr "" - -msgid "Uploading" -msgstr "" - -msgid "Waiting" -msgstr "" - -msgid "Sending" -msgstr "" - -msgid "Finished" -msgstr "" - -msgid "Please fill report first." -msgstr "" - -msgid "Unable to create zip file" -msgstr "" - -msgid "Enter a search term" -msgstr "" - -msgid "Online" -msgstr "" - -msgid "Offline" -msgstr "" - msgid "Application is closing" msgstr "" @@ -1970,9 +1993,6 @@ msgstr "" msgid "Project" msgstr "" -msgid "Debug" -msgstr "" - msgid "Slice" msgstr "" @@ -2090,6 +2110,12 @@ msgstr "" msgid "Export current Sliced file" msgstr "" +msgid "Export G-code" +msgstr "" + +msgid "Export current plate as G-code" +msgstr "" + msgid "Export" msgstr "" @@ -2147,24 +2173,6 @@ msgstr "" msgid "Deselects all objects" msgstr "" -msgid "Show Model Mesh(TODO)" -msgstr "" - -msgid "Display triangles of models" -msgstr "" - -msgid "Show Model Shadow(TODO)" -msgstr "" - -msgid "Display shadow of objects" -msgstr "" - -msgid "Show Printable Box(TODO)" -msgstr "" - -msgid "Display printable box" -msgstr "" - msgid "Use Perspective View" msgstr "" @@ -2234,7 +2242,7 @@ msgstr "" msgid "" "Do you want to synchronize your personal data from Bambu Cloud? \n" -"Contains the following information:\n" +"It contains the following information:\n" "1. The Process presets\n" "2. The Filament presets\n" "3. The Printer presets\n" @@ -2290,10 +2298,10 @@ msgstr "" msgid "Swap Y/Z axes" msgstr "" -msgid "Close" +msgid "Camera" msgstr "" -msgid "Monitoring" +msgid "Video" msgstr "" msgid "Printing Progress" @@ -2335,6 +2343,9 @@ msgstr "" msgid "Printing List" msgstr "" +msgid "Downloading..." +msgstr "" + msgid "Resume" msgstr "" @@ -2362,15 +2373,15 @@ msgstr "" msgid "HMS" msgstr "" -msgid "Please upgrade your printer first" -msgstr "" - msgid "Failed to connect to the server" msgstr "" msgid "Failed to connect to the printer" msgstr "" +msgid "Connecting..." +msgstr "" + msgid "OK" msgstr "" @@ -2482,6 +2493,9 @@ msgstr "" msgid " (Repair)" msgstr "" +msgid " Click here to install it." +msgstr "" + msgid "WARNING:" msgstr "" @@ -2673,11 +2687,6 @@ msgstr "" msgid "Object with multiple parts was detected" msgstr "" -msgid "" -"Preview only mode:\n" -"The loaded file contains gcode only." -msgstr "" - msgid "The file does not contain any geometry data." msgstr "" @@ -2715,6 +2724,15 @@ msgstr "" msgid "Please resolve the slicing errors and publish again." msgstr "" +msgid "" +"Network Plug-in is not detected. Network related features are unavailable." +msgstr "" + +msgid "" +"Preview only mode:\n" +"The loaded file contains gcode only, Can not enter the Prepare page" +msgstr "" + msgid "Some presets are modified." msgstr "" @@ -2732,9 +2750,6 @@ msgstr "" msgid "Load project" msgstr "" -msgid "Preview only mode for gcode file." -msgstr "" - msgid "The selected file" msgstr "" @@ -2791,9 +2806,6 @@ msgid "" "Suggest to use auto-arrange to avoid collisions when printing." msgstr "" -msgid "Export G-code" -msgstr "" - msgid "Send G-code" msgstr "" @@ -3011,7 +3023,7 @@ msgstr "" msgid "DEBUG settings have saved successfully!" msgstr "" -msgid "Swith cloud environment, Please login again!" +msgid "Switch cloud environment, Please login again!" msgstr "" msgid "System presets" @@ -3143,6 +3155,12 @@ msgstr "" msgid "Simply switch to \"%1%\"" msgstr "" +msgid "Online" +msgstr "" + +msgid "Offline" +msgstr "" + msgid "My Device" msgstr "" @@ -3152,6 +3170,9 @@ msgstr "" msgid "Input access code" msgstr "" +msgid "Log out successful." +msgstr "" + msgid "Busy" msgstr "" @@ -3204,9 +3225,7 @@ msgstr "" msgid "The printer is busy on other print job" msgstr "" -msgid "" -"The firmware versions of printer and AMS are too low.Please update to the " -"latest version before sending the print job" +msgid "Printer firmware does not support material = >ams slot mapping." msgstr "" msgid "" @@ -3246,9 +3265,6 @@ msgstr "" msgid "There was a problem connecting to the printer. Please try again." msgstr "" -msgid "Log out successful." -msgstr "" - msgid "Failed to log out." msgstr "" @@ -3308,7 +3324,7 @@ msgstr "" msgid "Special mode" msgstr "" -msgid "Output file" +msgid "G-code output" msgstr "" msgid "Frequent" @@ -4506,6 +4522,18 @@ msgid "" "usually can be printing directly without support if not very long" msgstr "" +msgid "Thick bridges" +msgstr "" + +msgid "Layers and Perimeters" +msgstr "" + +msgid "" +"If enabled, bridges are more reliable, can bridge longer distances, but may " +"look worse. If disabled, bridges look better but are reliable just for " +"shorter bridged distances." +msgstr "" + msgid "Max bridge length" msgstr "" @@ -5132,7 +5160,8 @@ msgstr "" msgid "" "Don't retract when the travel is in infill area absolutely. That means the " -"oozing can't been seen" +"oozing can't been seen. This can reduce times of retraction for complex " +"model and save printing time, but make slicing and G-code generating slower" msgstr "" msgid "Enable" diff --git a/bbl/i18n/de/BambuStudio_de.po b/bbl/i18n/de/BambuStudio_de.po index 4ddadb0c25..4ab95126d3 100644 --- a/bbl/i18n/de/BambuStudio_de.po +++ b/bbl/i18n/de/BambuStudio_de.po @@ -1,15 +1,17 @@ msgid "" msgstr "" +"Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-15 10:25+0800\n" +"POT-Creation-Date: 2022-07-22 18:39+0800\n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Phrase (phrase.com)\n" -"X-Language: de\n" -"X-Source-Language: C\n" +"Plural-Forms: nplurals=2; plural=(n==1) ? 0 : 1;\n" +"X-Generator: Poedit 3.1\n" msgid "Supports Painting" msgstr "Supports aufmalen" @@ -44,14 +46,14 @@ msgstr "Alles gemalte löschen" msgid "Highlight overhang areas" msgstr "Bereiche mit Überhang hervorheben" -msgid "Fragment filter" +msgid "Gap fill" msgstr "" msgid "Perform" msgstr "Ausführen" msgid "Fragment area" -msgstr "" +msgstr "Fragment area" msgid "Set pen size" msgstr "Pinselgröße festlegen" @@ -75,9 +77,9 @@ msgid "Sphere" msgstr "Kugel" msgid "Fill" -msgstr "" +msgstr "Fill" -msgid "Fragment Filter" +msgid "Gap Fill" msgstr "" msgid "Highlight faces according to overhang angle." @@ -147,10 +149,10 @@ msgid "Shortcut Key " msgstr "Shortcut Taste " msgid "Triangle" -msgstr "" +msgstr "Triangle" msgid "Height Range" -msgstr "" +msgstr "Height Range" msgid "Remove painted color" msgstr "Gemalte Farbe entfernen" @@ -228,15 +230,12 @@ msgstr "Weltkoordinaten" msgid "°" msgstr "°" -msgid "Position:" -msgstr "Position:" +msgid "Size" +msgstr "Größe" msgid "%" msgstr "%" -msgid "Size" -msgstr "Größe" - msgid "uniform scale" msgstr "einheitliche Skala" @@ -325,7 +324,7 @@ msgstr "Drahtgitter anzeigen" #, boost-format msgid "%1%" -msgstr "" +msgstr "%1%" msgid "Can't apply when proccess preview." msgstr "Kann nicht angewendet werden, wenn die Vorschau angezeigt wird." @@ -337,10 +336,10 @@ msgid "Operation already cancelling. Please wait few seconds." msgstr "Operation wird bereits abgebrochen. Bitte warten Sie einige Sekunden." msgid "Face recognition" -msgstr "" +msgstr "Face recognition" msgid "Perform Recognition" -msgstr "" +msgstr "Perform Recognition" msgid "Cube" msgstr "Würfel" @@ -352,7 +351,7 @@ msgid "Cone" msgstr "Kegel" msgid "Timelapse Wipe Tower" -msgstr "" +msgstr "Timelapse Wipe Tower" msgid "Add Modifier" msgstr "Modifizierer hinzufügen" @@ -428,6 +427,13 @@ msgstr "Kritischer Fehler" msgid "BambuStudio got an unhandled exception: %1%" msgstr "BambuStudio hat eine unbehandelte Ausnahme erhalten: %1%" +msgid "Downloading Bambu Network plug-in" +msgstr "" + +#, c-format, boost-format +msgid "Connect %s[SN:%s] failed!" +msgstr "" + msgid "" "BambuStudio configuration file may be corrupted and is not abled to be " "parsed.Please delete the file and try again." @@ -455,12 +461,15 @@ msgid "Click to download new version in default browser: %s" msgstr "" "Klicken Sie hier, um die neue Version im Standardbrowser herunterzuladen: %s" -msgid "New version of Bambu Studio" -msgstr "Neue Version von Bambu Studio" - msgid "The Bambu Studio needs an upgrade" msgstr "Bambu Studio benötigt ein Upgrade" +msgid "This is the newest version." +msgstr "Das ist die aktuellste Version." + +msgid "Info" +msgstr "Info" + msgid "Loading user presets..." msgstr "Nutzervoreistellungen laden..." @@ -482,25 +491,21 @@ msgstr "Wählen sie eine oder mer Dateien (3mf/step/stl/obj/amf):" msgid "Choose one file (gcode/.gco/.g/.ngc/ngc):" msgstr "Wählen sie eine Datei (gcode/.gco/.g/.ngc/ngc):" -msgid "Login information expired. Please login again." -msgstr "Login abgelaufen. Bitte neu einloggen." - msgid "" "The version of Bambu studio is too low and needs to be updated to the latest " "version before it can be used normally" msgstr "" +"The version of Bambu studio is too low and needs to be updated to the latest " +"version before it can be used normally" -msgid "This is the newest version." -msgstr "Das ist die aktuellste Version." - -msgid "Info" -msgstr "Info" +msgid "Login information expired. Please login again." +msgstr "Login abgelaufen. Bitte neu einloggen." msgid "Loading" msgstr "Lade" msgid "Loading user preset" -msgstr "" +msgstr "Loading user preset" msgid "Switching application language" msgstr "Wechsel der Sprache" @@ -524,7 +529,7 @@ msgid "Select a G-code file:" msgstr "Wähle eine G-Code Datei:" msgid "Bambu Studio GUI initialization failed" -msgstr "" +msgstr "Bambu Studio GUI initialization failed" #, boost-format msgid "Fatal error, exception catched: %1%" @@ -973,7 +978,7 @@ msgid "No-brim" msgstr "Keine Umrandung" msgid " " -msgstr " " +msgstr "" msgid "Layer height" msgstr "Schichthöhe" @@ -1011,10 +1016,8 @@ msgstr "Linientyp" msgid "No printer" msgstr "Kein Drucker" -msgid "" -"Heat the nozzle to target \n" -"temperature" -msgstr "Die Druckdüse auf die Zieltemperatur heitzen" +msgid "Heat the nozzle to target temperature" +msgstr "" msgid "Cut filament" msgstr "Material schneiden" @@ -1022,13 +1025,11 @@ msgstr "Material schneiden" msgid "Pull back current filament" msgstr "Aktuelles Material zurückziehen" -msgid "" -"Push new filament \n" -"into extruder" -msgstr "Neues Filament in den Extruder drücken" +msgid "Push new filament into extruder" +msgstr "" msgid "Purge old filament" -msgstr "" +msgstr "Purge old filament" msgid "?" msgstr "?" @@ -1040,10 +1041,10 @@ msgid "Click the pencil icon to edit the filament." msgstr "Das Stift-Symbol drücken um das Material zu bearbeiten." msgid "Load Filament" -msgstr "Laden" +msgstr "Load" msgid "Unload Filament" -msgstr "" +msgstr "Unload" msgid "Tips" msgstr "Tipps" @@ -1101,9 +1102,6 @@ msgstr "" "Anordnen fehlgeschlagen. Bei der Verarbeitung von Objektgeometrien wurden " "einige Ausnahmen gefunden." -msgid "Arranging" -msgstr "Anordnen" - msgid "Arranging canceled." msgstr "Anordnen abgebrochen." @@ -1153,66 +1151,95 @@ msgid "Exception" msgstr "Ausnahme" msgid "Logging in" -msgstr "" +msgstr "Logging in" msgid "Login failed" -msgstr "" +msgstr "Login failed" msgid "The region parameter is incorrrect" -msgstr "" +msgstr "The region parameter is incorrrect." msgid "Failure of printer login" -msgstr "" +msgstr "Failure of printer login" msgid "Failed to get ticket" -msgstr "" +msgstr "Failed to get ticket" msgid "User authorization timeout" -msgstr "" +msgstr "User authorization timeout" msgid "Failure of bind" -msgstr "" +msgstr "Failure of bind" msgid "Unknown Failure" -msgstr "" +msgstr "Unknown Failure" msgid "Abnormal print file data. Please slice again" -msgstr "" +msgstr "Abnormal print file data. Please slice again" msgid "Task canceled" -msgstr "" +msgstr "Task canceled" msgid "Upload task timed out. Please check the network problem and try again" -msgstr "" +msgstr "Upload task timed out. Please check the network problem and try again" msgid "Cloud service connection failed. Please try again." -msgstr "" +msgstr "Cloud service connection failed. Please try again." msgid "Print file not found, please slice again" -msgstr "" +msgstr "Print file not found, please slice again" msgid "" "The print file exceeds the maximum allowable size (1GB). Please simplify the " "model and slice again" msgstr "" +"The print file exceeds the maximum allowable size (1GB). Please simplify the " +"model and slice again" msgid "Failed uploading print file" -msgstr "" +msgstr "Failed uploading print file" msgid "Wrong Access code" -msgstr "" +msgstr "Wrong Access code" msgid "Sending print job over LAN" -msgstr "" +msgstr "Sending print job over LAN" msgid "Sending print job through cloud service" +msgstr "Sending print job through cloud service" + +msgid "Service Unavailable" +msgstr "" + +msgid "Unkown Error." msgstr "" msgid "Sending print configuration" -msgstr "" +msgstr "Sending print configuration" #, c-format, boost-format -msgid "Successfully sent.Will automatically jump to the device page in %s s" +msgid "Successfully sent. Will automatically jump to the device page in %s s" +msgstr "" + +msgid "An SD card needs to be inserted before printing via LAN." +msgstr "" + +msgid "Downloading" +msgstr "" + +msgid "Download failed" +msgstr "" + +msgid "Cancelled" +msgstr "" + +msgid "Finish" +msgstr "" + +msgid "Installing" +msgstr "" + +msgid "Install failed" msgstr "" msgid "Portions copyright" @@ -1225,7 +1252,7 @@ msgid "License" msgstr "Lizenz" msgid "Bambu Studio is licensed under " -msgstr "" +msgstr "Bambu Studio is licensed under " msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, Version 3" @@ -1234,79 +1261,122 @@ msgid "" "Bambu Studio is based on PrusaSlicer by Prusa Research, which is from Slic3r " "by Alessandro Ranellucci and the RepRap community" msgstr "" +"Bambu Studio is based on PrusaSlicer by Prusa Research, which is from Slic3r " +"by Alessandro Ranellucci and the RepRap community" msgid "Libraries" -msgstr "" +msgstr "Libraries" msgid "" "This software uses open source components whose copyright and other " "proprietary rights belong to their respective owners" msgstr "" +"This software uses open source components whose copyright and other " +"proprietary rights belong to their respective owners" #, c-format, boost-format msgid "About %s" msgstr "Über %s" -msgid "Colour" +msgid "" +"Bambu Studio is based on PrusaSlicer by PrusaResearch and SuperSlicer by " +"Merill(supermerill)." msgstr "" -msgid "SN" +msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." msgstr "" +msgid "" +"Slic3r was created by Alessandro Ranellucci with the help of many other " +"contributors." +msgstr "" + +msgid "Bambu Studio also referenced some ideas from Cura by Ultimaker." +msgstr "" + +msgid "" +"There many parts of the software that come from community contributions, so " +"we're unable to list them one-by-one, and instead, they'll be attributed in " +"the corresponding code comments." +msgstr "" + +msgid "Colour" +msgstr "Colour" + +msgid "SN" +msgstr "SN" + msgid "" "Nozzle\n" "Temperature" msgstr "" +"Nozzle\n" +"Temperature" msgid "max" -msgstr "" +msgstr "max" msgid "min" -msgstr "" +msgstr "min" #, boost-format msgid "The input value should be greater than %1% and less than %2%" -msgstr "" +msgstr "The input value should be greater than %1% and less than %2%" msgid "Confirm" msgstr "Bestätigen" msgid "Insertion update" -msgstr "" +msgstr "Insertion update" msgid "" "The AMS will automatically read the filament information when inserting a " "new Bambu Lab filament. This takes about 20 seconds." msgstr "" +"The AMS will automatically read the filament information when inserting a " +"new Bambu Lab filament. This takes about 20 seconds." msgid "" "Note: if new filament is inserted during printing, the AMS will not " "automatically read any information until printing is completed." msgstr "" +"Note: if new filament is inserted during printing, the AMS will not " +"automatically read any information until printing is completed." msgid "" "When inserting a new filament, the AMS will not automatically read its " "information, leaving it blank for you to enter manually." msgstr "" +"When inserting a new filament, the AMS will not automatically read its " +"information, leaving it blank for you to enter manually." msgid "Power on update" -msgstr "" +msgstr "Power on update" msgid "" "The AMS will automatically read the information of inserted filament on " "start-up. It will take about 1 minute.The reading process will roll filament " "spools." msgstr "" +"The AMS will automatically read the information of inserted filament on " +"start-up. It will take about 1 minute.The reading process will roll filament " +"spools." msgid "" "The AMS will not automatically read information from inserted filament " "during startup and will continue to use the information recorded before the " "last shutdown." msgstr "" +"The AMS will not automatically read information from inserted filament " +"during startup and will continue to use the information recorded before the " +"last shutdown." msgid "File" msgstr "Datei" +msgid "Close" +msgstr "Schließen" + msgid "" "A error occurred. Maybe memory of system is not enough or it's a bug of the " "program" @@ -1619,67 +1689,67 @@ msgstr "" "zurück\n" msgid "Auto bed leveling" -msgstr "" +msgstr "Auto bed leveling" msgid "Heatbed preheating" -msgstr "" +msgstr "Heatbed preheating" msgid "Sweeping XY mech mode" -msgstr "" +msgstr "Sweeping XY mech mode" msgid "Changing filament" -msgstr "" +msgstr "Changing filament" msgid "M400 pause" -msgstr "" +msgstr "M400 pause" msgid "Paused due to filament runout" -msgstr "" +msgstr "Paused due to filament runout" msgid "Heating hotend" -msgstr "" +msgstr "Heating hotend" msgid "Calibrating extrusion" -msgstr "" +msgstr "Calibrating extrusion" msgid "Scanning bed surface" -msgstr "" +msgstr "Scanning bed surface" msgid "Inspecting first layer" -msgstr "" +msgstr "Inspecting first layer" msgid "Identifying build plate type" -msgstr "" +msgstr "Identifying build plate type" msgid "Calibrating Micro Lidar" -msgstr "" +msgstr "Calibrating Micro Lidar" msgid "Homing toolhead" -msgstr "" +msgstr "Homing toolhead" msgid "Cleaning nozzle tip" -msgstr "" +msgstr "Cleaning nozzle tip" msgid "Checking extruder temperature" -msgstr "" +msgstr "Checking extruder temperature" msgid "Printing was paused by the user" -msgstr "" +msgstr "Printing was paused by the user" msgid "Pause of front cover falling" -msgstr "" +msgstr "Pause of front cover falling" msgid "Calibrating the micro lida" -msgstr "" +msgstr "Calibrating the micro lidar" msgid "Calibrating extrusion flow" -msgstr "" +msgstr "Calibrating extrusion flow" msgid "Paused due to nozzle temperature malfunction" -msgstr "" +msgstr "Paused due to nozzle temperature malfunction" msgid "Paused due to heat bed temperature malfunction" -msgstr "" +msgstr "Paused due to heat bed temperature malfunction" msgid "MC" msgstr "MC" @@ -1720,6 +1790,9 @@ msgstr "Authentifizierung fehlgeschlagen." msgid "Update failed." msgstr "Update fehlgeschlagen." +msgid "Failed to start printing job" +msgstr "" + msgid "N/A" msgstr "N/A" @@ -1872,10 +1945,10 @@ msgid "Filament 1" msgstr "Material 1" msgid "Flushed filament" -msgstr "" +msgstr "Flushed filament" msgid "Filament change times" -msgstr "" +msgstr "Filament change times" msgid "Color change" msgstr "Farbwechsel" @@ -1980,7 +2053,7 @@ msgid "Assembly Return" msgstr "Zurücksetzen der Montage" msgid "return" -msgstr "" +msgstr "return" msgid "Paint Toolbar" msgstr "Malwerkzeuge" @@ -2010,12 +2083,10 @@ msgid "Only the object being edit is visible." msgstr "Nur das bearbeitete Modell ist sichtbar." msgid "" -"An object is layed over the boundary of plate.\n" -"Please solve the problem by moving it totally inside or outside plate." +"An object is laid over the boundary of plate or exceeds the height limit.\n" +"Please solve the problem by moving it totally on or off the plate, and " +"confirming that the height is within the build volume." msgstr "" -"Ein Objekt ragt über die Begrenzung der Druckplatte.\n" -"Lösen Sie das Problem, indem Sie es vollständig innerhalb oder außerhalb der " -"Druckplatte verschieben." msgid "Calibration" msgstr "Kalibration" @@ -2028,6 +2099,9 @@ msgid "" "minimize deviation.\n" "It keeps the device performing optimally." msgstr "" +"The calibration program detects the status of your device automatically to " +"minimize deviation.\n" +"It keeps the device performing optimally." msgid "Calibration Flow" msgstr "Flusskalibrierung" @@ -2035,6 +2109,9 @@ msgstr "Flusskalibrierung" msgid "Start Calibration" msgstr "Kalibration starten" +msgid "Completed" +msgstr "" + msgid "Calibrating" msgstr "Kalibrieren" @@ -2042,48 +2119,20 @@ msgid "Timelapse" msgstr "Zeitraffer" msgid "Monitoring Recording" -msgstr "" +msgstr "Monitoring Recording" msgid "ConnectPrinter(LAN)" -msgstr "" +msgstr "ConnectPrinter(LAN)" msgid "Please input the printer access code:" -msgstr "" +msgstr "Please input the printer access code:" msgid "" "You can find it in \"Settings > Network > Connection code\"\n" "on the printer, as shown in the figure:" msgstr "" - -msgid "Creating" -msgstr "" - -msgid "Uploading" -msgstr "Lade hoch" - -msgid "Waiting" -msgstr "" - -msgid "Sending" -msgstr "" - -msgid "Finished" -msgstr "Fertig" - -msgid "Please fill report first." -msgstr "Bitte füllen Sie zuerst den Bericht aus." - -msgid "Unable to create zip file" -msgstr "" - -msgid "Enter a search term" -msgstr "Suchbegriff eingeben" - -msgid "Online" -msgstr "Online" - -msgid "Offline" -msgstr "Offline" +"You can find it in \"Settings > Network > Connection code\"\n" +"on the printer, as shown in the figure:" msgid "Application is closing" msgstr "Anwendung schließt" @@ -2102,14 +2151,11 @@ msgid "Preview" msgstr "Vorschau" msgid "Device" -msgstr "" +msgstr "Device" msgid "Project" msgstr "Projekt" -msgid "Debug" -msgstr "Debuggen" - msgid "Slice" msgstr "Slice" @@ -2227,6 +2273,12 @@ msgstr "Alle Objekte als STL exportieren" msgid "Export current Sliced file" msgstr "Aktuelle geslicete Datei exportieren" +msgid "Export G-code" +msgstr "Exportiere G-Code" + +msgid "Export current plate as G-code" +msgstr "" + msgid "Export" msgstr "Exportieren" @@ -2284,24 +2336,6 @@ msgstr "Alles abwählen" msgid "Deselects all objects" msgstr "Alle Objekte abwählen" -msgid "Show Model Mesh(TODO)" -msgstr "Modell Mesh anzeigen(TODO)" - -msgid "Display triangles of models" -msgstr "Dreiecke der Modelle anzeigen" - -msgid "Show Model Shadow(TODO)" -msgstr "Modellschatten anzeigen(TODO)" - -msgid "Display shadow of objects" -msgstr "Schatten von Objekten anzeigen" - -msgid "Show Printable Box(TODO)" -msgstr "Druckbare Box anzeigen(TODO)" - -msgid "Display printable box" -msgstr "Bedruckbare Box anzeigen" - msgid "Use Perspective View" msgstr "Perspektivische Ansicht verwenden" @@ -2371,7 +2405,7 @@ msgstr "Materialeinstellungen" msgid "" "Do you want to synchronize your personal data from Bambu Cloud? \n" -"Contains the following information:\n" +"It contains the following information:\n" "1. The Process presets\n" "2. The Filament presets\n" "3. The Printer presets\n" @@ -2427,11 +2461,11 @@ msgstr "Optionen:" msgid "Swap Y/Z axes" msgstr "Y/Z-Achsen vertauschen" -msgid "Close" -msgstr "Schließen" +msgid "Camera" +msgstr "" -msgid "Monitoring" -msgstr "Überwachung" +msgid "Video" +msgstr "" msgid "Printing Progress" msgstr "Druckprozess" @@ -2446,7 +2480,7 @@ msgid "0%" msgstr "0%" msgid "Control" -msgstr "" +msgstr "Control" msgid "100%" msgstr "100%" @@ -2472,6 +2506,9 @@ msgstr "Debug-Informationen" msgid "Printing List" msgstr "Druckliste" +msgid "Downloading..." +msgstr "" + msgid "Resume" msgstr "Fortsetzen" @@ -2499,15 +2536,15 @@ msgstr "Update" msgid "HMS" msgstr "HMS" -msgid "Please upgrade your printer first" -msgstr "" - msgid "Failed to connect to the server" msgstr "Verbindung zum Server fehlgeschlagen" msgid "Failed to connect to the printer" msgstr "Verbindung zum Drucker fehlgeschlagen" +msgid "Connecting..." +msgstr "" + msgid "OK" msgstr "OK" @@ -2619,6 +2656,9 @@ msgstr "Export ok." msgid " (Repair)" msgstr " (Reparatur)" +msgid " Click here to install it." +msgstr "" + msgid "WARNING:" msgstr "WARNUNG:" @@ -2825,13 +2865,8 @@ msgstr "Diese Dateien als ein einziges Objekt mit mehreren Teilen laden?\n" msgid "Object with multiple parts was detected" msgstr "Objekt mit mehreren Teilen wurde entdeckt" -msgid "" -"Preview only mode:\n" -"The loaded file contains gcode only." -msgstr "" - msgid "The file does not contain any geometry data." -msgstr "" +msgstr "The file does not contain any geometry data." msgid "Export STL file:" msgstr "Exportiere STL Datei:" @@ -2867,6 +2902,15 @@ msgstr "Slicen der Druckplatte %d" msgid "Please resolve the slicing errors and publish again." msgstr "Bitte beheben Sie die Slicing-Fehler und veröffentlichen Sie erneut." +msgid "" +"Network Plug-in is not detected. Network related features are unavailable." +msgstr "" + +msgid "" +"Preview only mode:\n" +"The loaded file contains gcode only, Can not enter the Prepare page" +msgstr "" + msgid "Some presets are modified." msgstr "Einige Voreinstellungen wurden geändert." @@ -2888,9 +2932,6 @@ msgstr "Neues Projekt erstellen" msgid "Load project" msgstr "Projekt laden" -msgid "Preview only mode for gcode file." -msgstr "" - msgid "The selected file" msgstr "Die gewählte Datei" @@ -2916,10 +2957,10 @@ msgid "Only one G-code file can be opened at the same time." msgstr "Es kann immer nur eine G-Code-Datei gleichzeitig geöffnet werden." msgid "Can not add models when in preview mode!" -msgstr "" +msgstr "Unable to add models in preview mode" msgid "Add Models" -msgstr "" +msgstr "Add Models" msgid "All objects will be removed, continue?" msgstr "Alle Objekte werden entfernt, fortfahren?" @@ -2952,9 +2993,6 @@ msgstr "" "Es wird vorgeschlagen, die automatische Anordnung zu verwenden, um " "Kollisionen beim Drucken zu vermeiden." -msgid "Export G-code" -msgstr "Exportiere G-Code" - msgid "Send G-code" msgstr "Sende G-code" @@ -2987,7 +3025,7 @@ msgstr "Größe: %1% x %2% x %3% mm\n" #, boost-format msgid "Volume: %1% in³\n" -msgstr "" +msgstr "Volume: %1% in³\n" #, boost-format msgid "Volume: %1% mm³\n" @@ -3015,34 +3053,34 @@ msgid "Changing application language" msgstr "Wechsel der Sprache der Anwendung" msgid "Changing the region will log out your account.\n" -msgstr "" +msgstr "Changing the region will log you out of your account.\n" msgid "Region selection" -msgstr "" +msgstr "Region selection" msgid "Second" msgstr "Sekunde" msgid "General Settings" -msgstr "" +msgstr "General Settings" msgid "Asia-Pacific" -msgstr "" +msgstr "Asia-Pacific" msgid "China" -msgstr "" +msgstr "China" msgid "Europe" -msgstr "" +msgstr "Europe" msgid "North America" -msgstr "" +msgstr "North America" msgid "Others" msgstr "Sonstige" msgid "Login Region" -msgstr "" +msgstr "Login Region" msgid "Metric" msgstr "Metrisch" @@ -3057,10 +3095,10 @@ msgid "User sync" msgstr "Benutzer-Synchronisation" msgid "Auto sync user presets(Printer/Filament/Process)" -msgstr "" +msgstr "Auto sync user presets(Printer/Filament/Process)" msgid "User Sync" -msgstr "" +msgstr "User Sync" msgid "Associate files to BambuStudio" msgstr "Dateien mit BambuStudio verknüpfen" @@ -3082,7 +3120,7 @@ msgstr "" "Dateien festgelegt" msgid "Associate .step/.stp files to BambuStudio" -msgstr "" +msgstr "Associate .step/.stp files to BambuStudio" msgid "If enabled, sets BambuStudio as default application to open .step files" msgstr "" @@ -3159,7 +3197,7 @@ msgid "trace" msgstr "Spurensuche" msgid "Host Setting" -msgstr "" +msgstr "Host Setting" msgid "DEV host: api-dev.bambu-lab.com/v1" msgstr "DEV host: api-dev.bambu-lab.com/v1" @@ -3182,8 +3220,8 @@ msgstr "Debug-Einstellungen speichern" msgid "DEBUG settings have saved successfully!" msgstr "DEBUG-Einstellungen wurden erfolgreich gespeichert!" -msgid "Swith cloud environment, Please login again!" -msgstr "Cloud-Umgebung wechseln, bitte erneut anmelden!" +msgid "Switch cloud environment, Please login again!" +msgstr "" msgid "System presets" msgstr "Systemvoreinstellungen" @@ -3322,6 +3360,12 @@ msgstr "Für \"%1%\", fügen Sie \"%2%\" als neue Voreinstellung hinzu" msgid "Simply switch to \"%1%\"" msgstr "Wechseln Sie einfach zu \"%1%\"" +msgid "Online" +msgstr "Online" + +msgid "Offline" +msgstr "Offline" + msgid "My Device" msgstr "Mein Gerät" @@ -3329,10 +3373,13 @@ msgid "Other Device" msgstr "Anderes Gerät" msgid "Input access code" -msgstr "" +msgstr "Input access code" + +msgid "Log out successful." +msgstr "Abmeldung erfolgreich." msgid "Busy" -msgstr "" +msgstr "Busy" msgid "Bambu Cool Plate" msgstr "Bambu kalte Druckplatte" @@ -3347,7 +3394,7 @@ msgid "Send print job to" msgstr "Druckauftrag senden an" msgid "Refresh" -msgstr "" +msgstr "Refresh" msgid "Bed Leveling" msgstr "Druckbettnivellierung" @@ -3362,47 +3409,50 @@ msgid "send completed" msgstr "senden abgeschlossen" msgid "No login account, only printers in LAN mode are displayed" -msgstr "" +msgstr "No login account, only printers in LAN mode are displayed" msgid "Connecting to server" -msgstr "" +msgstr "Connecting to server" msgid "Synchronizing device information" -msgstr "" +msgstr "Synchronizing device information" msgid "Synchronizing device information time out" -msgstr "" +msgstr "Synchronizing device information time out" msgid "Cannot send the print task when the upgrade is in progress" -msgstr "" +msgstr "Cannot send the print task when the upgrade is in progress" msgid "" "The printer is executing instructions. Please restart printing after it ends" msgstr "" +"The printer is executing instructions. Please restart printing after it ends" msgid "The printer is busy on other print job" -msgstr "" +msgstr "The printer is busy with another print job." -msgid "" -"The firmware versions of printer and AMS are too low.Please update to the " -"latest version before sending the print job" +msgid "Printer firmware does not support material = >ams slot mapping." msgstr "" msgid "" "Filaments to AMS slots mappings have been established. You can click a " "filament above to change its mapping AMS slot" msgstr "" +"Filaments to AMS slots mappings have been established. You can click a " +"filament above to change its mapping AMS slot" msgid "" "Please click each filament above to specify its mapping AMS slot before " "sending the print job" msgstr "" +"Please click each filament above to specify its mapping AMS slot before " +"sending the print job" msgid "Preparing print job" -msgstr "" +msgstr "Preparing print job" msgid "Modifying the device name" -msgstr "" +msgstr "Modifying the device name" msgid "Log in printer" msgstr "Drucker anmelden" @@ -3428,9 +3478,6 @@ msgstr "" "Bei der Verbindung mit dem Drucker ist ein Problem aufgetreten. Bitte " "versuchen Sie es erneut." -msgid "Log out successful." -msgstr "Abmeldung erfolgreich." - msgid "Failed to log out." msgstr "Abmeldung fehlgeschlagen." @@ -3489,13 +3536,13 @@ msgid "Prime tower" msgstr "Prime-Turm" msgid "Flush options" -msgstr "" +msgstr "Flush options" msgid "Special mode" msgstr "Spezialmodus" -msgid "Output file" -msgstr "Ausgabedatei" +msgid "G-code output" +msgstr "" msgid "Frequent" msgstr "Häufig" @@ -3522,7 +3569,7 @@ msgid "Reserved keywords found" msgstr "Reservierte Schlüsselwörter gefunden" msgid "Setting Overrides" -msgstr "" +msgstr "Setting Overrides" msgid "Retraction" msgstr "Einzug" @@ -3557,6 +3604,8 @@ msgid "" "Bed temperature when cool plate is installed. Value 0 means the filament " "does not support to print on the Cool Plate" msgstr "" +"This is the bed temperature when the cool plate is installed. A value of 0 " +"means the filament does not support printing on the Cool Plate." msgid "Engineering plate" msgstr "technische Druckplatte" @@ -3565,6 +3614,8 @@ msgid "" "Bed temperature when engineering plate is installed. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" +"This is the bed temperature when the engineering plate is installed. A value " +"of 0 means the filament does not support printing on the Engineering Plate." msgid "High Temp Plate" msgstr "Hochtemperaturdruckplatte" @@ -3573,6 +3624,9 @@ msgid "" "Bed temperature when high temperature plate is installed. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" +"This is the bed temperature when the high temperature plate is installed. A " +"value of 0 means the filament does not support printing on the High Temp " +"Plate." msgid "Volumetric speed limitation" msgstr "Volumetrische Geschwindigkeitsbegrenzung" @@ -3818,7 +3872,7 @@ msgid "The name \"%1%\" already exists." msgstr "Der Name \"%1%\" existiert bereits." msgid "Basic Info" -msgstr "" +msgstr "Basic Info" msgid "Pictures" msgstr "Bilder" @@ -3888,7 +3942,7 @@ msgid "The configuration is up to date." msgstr "Die Konfiguration ist auf dem neuesten Stand." msgid "Auto-Calc" -msgstr "" +msgstr "Auto-Calc" msgid "Flushing volumes for filament change" msgstr "Spülvolumen für Materialwechsel" @@ -3897,7 +3951,7 @@ msgid "Flushing volume (mm³) for each filament pair." msgstr "Spülvolumen (mm³) für jedes Materialpaar." msgid "Flush multiplier" -msgstr "" +msgstr "Flush multiplier" msgid "unloaded" msgstr "entladen wird" @@ -4389,11 +4443,11 @@ msgstr "" #, boost-format msgid "%1% is too close to others, and collisions may be caused." -msgstr "" +msgstr "%1% is too close to others, and collisions may be caused." #, boost-format msgid "%1% is too tall, and collisions will be caused." -msgstr "" +msgstr "%1% is too tall, and collisions will be caused." msgid " is too close to others, there will be collisions when printing.\n" msgstr " zu nahe an anderen, es kommt beim Drucken zu Kollisionen.\n" @@ -4406,10 +4460,10 @@ msgid "Prime Tower" msgstr "Prime Turm" msgid " is too close to others, and collisions may be caused.\n" -msgstr "" +msgstr " is too close to others, and collisions may be caused.\n" msgid " is too close to exclusion area, and collisions will be caused.\n" -msgstr "" +msgstr " is too close to exclusion area, and collisions will be caused.\n" msgid "" "Can not print multiple filaments which have large difference of temperature " @@ -4566,6 +4620,8 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Cool Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the Cool Plate." msgid "°C" msgstr "°C" @@ -4577,11 +4633,15 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the Engineering Plate." msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the High Temp Plate." msgid "Initial layer" msgstr "Erste Schicht" @@ -4593,16 +4653,22 @@ msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Cool Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the Cool Plate." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Engineering Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the Engineering Plate." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the High Temp Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the High Temp Plate." msgid "Bed types supported by the printer" msgstr "Vom Drucker unterstützte Druckbettypen" @@ -4694,12 +4760,14 @@ msgstr "" "die Brücke zu verringern und den Durchhang zu verbessern" msgid "Only one wall on top surfaces" -msgstr "" +msgstr "Only one wall on top surfaces" msgid "" "Use only one wall on flat top surface, to give more space to the top infill " "pattern" msgstr "" +"Use only one wall on flat top surface, to give more space to the top infill " +"pattern" msgid "Slow down for overhang" msgstr "Verlangsamen bei Überhängen" @@ -4833,6 +4901,18 @@ msgstr "" "macht. Brücke kann in der Regel direkt ohne Unterstützung gedruckt werden, " "wenn diese nicht sehr lang ist" +msgid "Thick bridges" +msgstr "" + +msgid "Layers and Perimeters" +msgstr "" + +msgid "" +"If enabled, bridges are more reliable, can bridge longer distances, but may " +"look worse. If disabled, bridges look better but are reliable just for " +"shorter bridged distances." +msgstr "" + msgid "Max bridge length" msgstr "Max Überbrückungslänge" @@ -4841,6 +4921,9 @@ msgid "" "bridges to be supported, and set it to a very large value if you don't want " "any bridges to be supported." msgstr "" +"Max length of bridges that don't need support. Set it to 0 if you want all " +"bridges to be supported, and set it to a very large value if you don't want " +"any bridges to be supported." msgid "End G-code" msgstr "G-Code am Ende" @@ -4867,7 +4950,7 @@ msgid "Monotonic" msgstr "Monotonisch" msgid "Monotonic line" -msgstr "" +msgstr "Monotonic line" msgid "Bottom surface pattern" msgstr "Muster der unteren Oberfläche" @@ -5063,6 +5146,7 @@ msgstr "Stützmaterial" msgid "" "Support material is commonly used to print support and support interface" msgstr "" +"Support material is commonly used to print support and support interface" msgid "Temperature of vitrificaiton" msgstr "Verglasungstemperatur" @@ -5135,6 +5219,8 @@ msgid "" "Acceleration of top surface infill. Using a lower value may improve top " "surface quality" msgstr "" +"Acceleration of top surface infill. Using a lower value may improve top " +"surface quality" msgid "" "Acceleration of initial layer. Using a lower value can improve build plate " @@ -5545,20 +5631,19 @@ msgid "Diameter of nozzle" msgstr "Druckdüsendurchmesser" msgid "Nozzle volume" -msgstr "" +msgstr "Nozzle volume" msgid "Volume of nozzle between the cutter and the end of nozzle" -msgstr "" +msgstr "Volume of nozzle between the cutter and the end of nozzle" msgid "Reduce infill retraction" msgstr "Rückzug bei der Füllung verringern" msgid "" "Don't retract when the travel is in infill area absolutely. That means the " -"oozing can't been seen" +"oozing can't been seen. This can reduce times of retraction for complex " +"model and save printing time, but make slicing and G-code generating slower" msgstr "" -"Ziehen Sie nicht zurück, wenn sich der Weg im Füllbereich befindet. Das " -"bedeutet, dass man die Quellung nicht sehen kann" msgid "Enable" msgstr "Aktivieren" @@ -6129,7 +6214,7 @@ msgid "Width of prime tower" msgstr "Breite des Prime-Turms" msgid "Flush into objects' infill" -msgstr "" +msgstr "Flush into objects' infill" msgid "" "Purging after filament change will be done inside objects' infills. This may " @@ -6137,23 +6222,31 @@ msgid "" "printed with transparent filament, the mixed color infill will be seen " "outside" msgstr "" +"Purging after filament change will be done inside objects' infills. This may " +"lower the amount of waste and decrease the print time. If the walls are " +"printed with transparent filament, the mixed color infill will be visible." msgid "Flush into objects' support" -msgstr "" +msgstr "Flush into objects' support" msgid "" "Purging after filament change will be done inside objects' support. This may " "lower the amount of waste and decrease the print time" msgstr "" +"Purging after filament change will be done inside objects' support. This may " +"lower the amount of waste and decrease the print time." msgid "Flush into this object" -msgstr "" +msgstr "Flush into this object" msgid "" "This object will be used to purge the nozzle after a filament change to save " "filament and decrease the print time. Colours of the objects will be mixed " "as a result" msgstr "" +"This object will be used to purge the nozzle after a filament change to save " +"filament and decrease the print time. Colours of the objects will be mixed " +"as a result" msgid "X-Y hole compensation" msgstr "X-Y-Loch-Kompensation" @@ -6230,10 +6323,10 @@ msgid "Arrange options: 0-disable, 1-enable, others-auto" msgstr "Anordnungsoptionen: 0-deaktiviert; 1-aktiviert; andere-automatisch" msgid "Convert Unit" -msgstr "" +msgstr "Convert Unit" msgid "Convert the units of model" -msgstr "" +msgstr "Convert the units of model" msgid "Orient the model" msgstr "Das Modell ausrichten" @@ -6331,11435 +6424,204 @@ msgstr "Fehler auf Zeile %1%:\n" #, c-format, boost-format msgid "Support: generate toolpath at layer %d" -msgstr "" +msgstr "Support: generate toolpath at layer %d" msgid "Support: detect overhangs" -msgstr "" +msgstr "Support: detect overhangs" msgid "Support: generate contact points" -msgstr "" +msgstr "Support: generate contact points" msgid "Support: propagate branches" -msgstr "" +msgstr "Support: propagate branches" msgid "Support: draw polygons" -msgstr "" +msgstr "Support: draw polygons" msgid "Support: generate toolpath" -msgstr "" +msgstr "Support: generate toolpath" #, c-format, boost-format msgid "Support: generate polygons at layer %d" -msgstr "" +msgstr "Support: generate polygons at layer %d" #, c-format, boost-format msgid "Support: fix holes at layer %d" -msgstr "" +msgstr "Support: fix holes at layer %d" #, c-format, boost-format msgid "Support: propagate branches at layer %d" -msgstr "" +msgstr "Support: propagate branches at layer %d" -#~ msgid "Fix model through cloud" -#~ msgstr "Modell durch die Cloud reparieren" +#~ msgid "Creating" +#~ msgstr "Creating" -#~ msgid "Fix model locally" -#~ msgstr "Modell lokal reparieren" +#~ msgid "Uploading" +#~ msgstr "Lade hoch" -#~ msgid "Lightning" -#~ msgstr "Lightning" +#~ msgid "Waiting" +#~ msgstr "Waiting" -#~ msgid "Module" -#~ msgstr "Modul" +#~ msgid "Sending" +#~ msgstr "Sending" -#~ msgid "Mouse wheel" -#~ msgstr "Mausrad" +#~ msgid "Finished" +#~ msgstr "Fertig" -#~ msgid "Any arrow" -#~ msgstr "Jeder Pfeil" +#~ msgid "Please fill report first." +#~ msgstr "Bitte füllen Sie zuerst den Bericht aus." -#~ msgid "Shift + Any arrow" -#~ msgstr "Umschalttaste + beliebiger Pfeil" +#~ msgid "Unable to create zip file" +#~ msgstr "Unable to create zip file" -#~ msgid "Ctrl + Any arrow" -#~ msgstr "Strg + beliebiger Pfeil" +#~ msgid "Enter a search term" +#~ msgstr "Suchbegriff eingeben" + +#~ msgid "Debug" +#~ msgstr "Debuggen" + +#~ msgid "Monitoring" +#~ msgstr "Überwachung" + +#~ msgid "Fragment filter" +#~ msgstr "Fragment filter" + +#~ msgid "Fragment Filter" +#~ msgstr "Fragment Filter" + +#~ msgid "Position:" +#~ msgstr "Position:" #~ msgid "Alt + Mouse wheel" #~ msgstr "Alt + Mausrad" -#~ msgid "Shift + Mouse wheel" -#~ msgstr "Umschalttaste + Mausrad" - -#~ msgid "Beginner's Tutorial" -#~ msgstr "Einsteiger-Tutorial" - -#~ msgid "Render statistics debugging box" -#~ msgstr "Debugging-Box für Renderstatistiken" - -#~ msgid "The bed is auto leveling" -#~ msgstr "Das Druckbett richtet sich automatisch ein" - -#~ msgid "The hot bed is preheating" -#~ msgstr "Das Heizbatt wärmt sich vor" - -#~ msgid "Frequncy sweeping" -#~ msgstr "Speewing Frequenz" - -#~ msgid "Change the filament" -#~ msgstr "Wechsle das Filament" - -#~ msgid "Pause(M400)" -#~ msgstr "Pause(M400)" - -#~ msgid "Pause(Lack of filament)" -#~ msgstr "Pause(Zu wenig Material)" - -#~ msgid "The nozzle is preheating" -#~ msgstr "Die Druckdüse wärmt sich auf" - -#~ msgid "Extruder compensation scanning" -#~ msgstr "Extruder ausgleichs-Scannen" - -#~ msgid "Bed surface scanning" -#~ msgstr "Scannen der Druckbettoberfläche" - -#~ msgid "First layer scanning" -#~ msgstr "Scannen der ersten Schicht" - -#~ msgid "Bed surface is auto identifying" -#~ msgstr "Die Druckbettoberfläche wird automatisch erkannt" - -#~ msgid "In the calibration of extrinsic parameters" -#~ msgstr "Bei der Kalibrierung der extrinsischen Parameter" - -#~ msgid "The tool head is homing" -#~ msgstr "Der Werkzeugkopf kalibriert sich" - -#~ msgid "Nozzle cleaning" -#~ msgstr "Säubern der Druckdüse" - -#~ msgid "In the calibration of temperature protection" -#~ msgstr "In der Kalibration des Temperaturschutz" - -#~ msgid "Silent Mode" -#~ msgstr "Leise-Modus" - -#~ msgid "Show Edges(TODO)" -#~ msgstr "Kanten anzeigen(TODO)" - -#~ msgid "Show Edges" -#~ msgstr "Kanten anzeigen" - -#~ msgid "Associate .step files to BambuStudio" -#~ msgstr "Zuordnen von .step-Dateien zu BambuStudio" - -#~ msgid "Vibration Calibration" -#~ msgstr "Vibrationskalibrierung" - -#~ msgid "First Layer Inspection" -#~ msgstr "Inspektion der ersten Schicht" - -#~ msgid "Please select a printer first." -#~ msgstr "Bitte wählen Sie zunächst einen Drucker aus." - -#~ msgid "Enable spaghetti detector" -#~ msgstr "Spaghetti-Detektor einschalten" - -#~ msgid "Enable the camera on printer to check spaghetti" -#~ msgstr "Aktivieren Sie die Kamera am Drucker, um Spaghetti zu überwachen" - -#~ msgid "Preparation before calibration" -#~ msgstr "Vorbereitung der Kalibrierung" - #~ msgid "" -#~ "Before calibration, please make sure a filament is loaded and its nozzle " -#~ "temperature and bed temperature is set in Feeding lab." +#~ "An object is layed over the boundary of plate.\n" +#~ "Please solve the problem by moving it totally inside or outside plate." #~ msgstr "" -#~ "Vergewissern Sie sich vor der Kalibrierung, dass ein Material geladen " -#~ "ist, die Druckdüsentemperatur und die Betttemperatur eingestellt sind." +#~ "Ein Objekt ragt über die Begrenzung der Druckplatte.\n" +#~ "Lösen Sie das Problem, indem Sie es vollständig innerhalb oder außerhalb " +#~ "der Druckplatte verschieben." -#~ msgid "" -#~ "Calibration program detects the status of your device systematically to " -#~ "minimise deviation. It keeps the device at its the best performance" -#~ msgstr "" -#~ "Das Kalibrierungsprogramm ermittelt systematisch den Status Ihres Geräts, " -#~ "um Abweichungen zu minimieren. Es hält das Gerät bei seiner besten " -#~ "Leistung" +#~ msgid "Arranging" +#~ msgstr "Anordnen" -#~ msgid "Per Object Setting" -#~ msgstr "Pro Objekt Einstellungen" +#~ msgid "Ctrl + Any arrow" +#~ msgstr "Strg + beliebiger Pfeil" -#~ msgid "Reset All" -#~ msgstr "alle Zurücksetzen" +#~ msgid "Ctrl + Left mouse button" +#~ msgstr "Ctrl + Left mouse button" -#~ msgid "Failed to create the print job. Please try agian." -#~ msgstr "" -#~ "Der Druckauftrag konnte nicht erstellt werden. Bitte versuchen Sie es " -#~ "erneut." +#~ msgid "Display printable box" +#~ msgstr "Bedruckbare Box anzeigen" -#~ msgid "Failed to upload the print job. Please try agian." -#~ msgstr "" -#~ "Der Druckauftrag konnte nicht hochgeladen werden. Bitte versuchen Sie es " -#~ "erneut." +#~ msgid "Display shadow of objects" +#~ msgstr "Schatten von Objekten anzeigen" -#~ msgid "Uploading print job timed out. Please try again." -#~ msgstr "" -#~ "Das Hochladen des Druckauftrags wurde abgebrochen. Bitte versuchen Sie es " -#~ "erneut." - -#~ msgid "Failed to send the print job. Please try again." -#~ msgstr "" -#~ "Der Druckauftrag konnte nicht gesendet werden. Bitte versuchen Sie es " -#~ "erneut." - -#~ msgid "Sending print task timed out. Please try again." -#~ msgstr "" -#~ "Die Zeit für das Senden der Druckaufgabe wurde überschritten. Bitte " -#~ "versuchen Sie es erneut." - -#~ msgid "The printer is being updated. Please try again after the update." -#~ msgstr "" -#~ "Der Drucker wird gerade aktualisiert. Bitte versuchen Sie es nach der " -#~ "Aktualisierung erneut." - -#~ msgid "Exporting 3mf..." -#~ msgstr "Exportieren der 3mf..." - -#~ msgid "Internal error." -#~ msgstr "Interner Fehler." - -#~ msgid "Exporting 3mf failed, please slice again." -#~ msgstr "Der Export der 3mf ist fehlgeschlagen, bitte slicen Sie erneut." - -#~ msgid "No printer available" -#~ msgstr "Kein Drucker verfügbar" - -#~ msgid "YES" -#~ msgstr "Ja" - -#~ msgid "NO" -#~ msgstr "Nein" - -#~ msgid "Login with your Account" -#~ msgstr "Anmeldung mit ihrem Account" - -#~ msgid "Logout" -#~ msgstr "Ausloggen" - -#~ msgid "Publish Model/Profile" -#~ msgstr "Veröffentliche Modell/Profil" - -#~ msgid "Please slice all plates before upload" -#~ msgstr "Bitte alle Bauplatten vor dem Hochladen slicen" - -#~ msgid "Total Size:" -#~ msgstr "Gesamtgröße:" - -#~ msgid "Tiny patch filter" -#~ msgstr "Kleiner-Lücken-Filter" - -#~ msgid "Filter tiny patch" -#~ msgstr "Kleine Lücken filtern" - -#~ msgid "Process %1% / 100" -#~ msgstr "Bearbeite %1% / 100" - -#~ msgid "Bambu Studio initialization failed" -#~ msgstr "Initialisierung von Bambu Studio fehlgeschlagen" - -#~ msgid "Object %s has zero size and can't be arranged." -#~ msgstr "Das Objekt %s hat die Größe Null und kann nicht angeordnet werden." - -#~ msgid "Show daily tips" -#~ msgstr "Tägliche Tipps anzeigen" - -#~ msgid "Choose Filaments" -#~ msgstr "Material wählen" - -#~ msgid "Bind Dialog" -#~ msgstr "Bindungs-Dialog" +#~ msgid "Display triangles of models" +#~ msgstr "Dreiecke der Modelle anzeigen" #~ msgid "" #~ "Do you want to synchronize your personal data from Bambu Cloud? \n" #~ "Contains the following information:\n" #~ "1. The Process presets\n" #~ "2. The Filament presets\n" -#~ "3. The Machine presets\n" +#~ "3. The Printer presets\n" #~ msgstr "" -#~ "Möchten Sie Ihre persönlichen Daten aus der Bambu Cloud " -#~ "synchronisieren? \n" -#~ "Enthält die folgenden Informationen:\n" -#~ "1. Die Prozessvoreinstellungen\n" -#~ "2. Die Voreinstellungen des Material\n" -#~ "3. Die Voreinstellungen für die Maschine\n" - -#~ msgid "Machine Control" -#~ msgstr "Maschinensteuerung" - -#~ msgid "Temperature and Axis Control" -#~ msgstr "Temperatur- und Achsensteuerung" - -#~ msgid "Model:" -#~ msgstr "Modell:" - -#~ msgid "Serial:" -#~ msgstr "Seriennummer:" - -#~ msgid "Version:" -#~ msgstr "Version:" - -#~ msgid "Upgrade firmware" -#~ msgstr "Firmware Upgraden" - -#~ msgid "Relase Note" -#~ msgstr "Hinweis zur Veröffentlichung" - -#~ msgid "Printing" -#~ msgstr "Druckend" - -#~ msgid "Idle" -#~ msgstr "Untätig" - -#~ msgid "Lastest version" -#~ msgstr "Neuste Version" - -#~ msgid "Upgrading" -#~ msgstr "Updaten" - -#~ msgid "Upgrading success" -#~ msgstr "Erfolgreich aktualisiert" - -#~ msgid "Upgrading failed" -#~ msgstr "Upgrade fehlgeschlagen" - -#~ msgid "Need to stop slicing first." -#~ msgstr "Sie müssen erst mit dem Slicen aufhören." - -#~ msgid "Drop Files when slicing" -#~ msgstr "Dateien beim Slicen ablegen" - -#~ msgid "Importing Model" -#~ msgstr "Modell importieren" - -#~ msgid "prepare 3mf file..." -#~ msgstr "3mf-Datei vorbereiten..." - -#~ msgid "Import project failed, Please try again!" -#~ msgstr "Projektimport fehlgeschlagen, bitte versuchen Sie es erneut!" - -#~ msgid "downloading project ..." -#~ msgstr "Herunterladen des Projekts ..." - -#~ msgid "Project downloaded %d%%" -#~ msgstr "Projekt heruntergeladen %d%%" - -#~ msgid "Failed to publish your project. Please try agian!" -#~ msgstr "" -#~ "Ihr Projekt konnte nicht veröffentlicht werden. Bitte versuchen Sie es " -#~ "erneut!" - -#~ msgid "preparing, export 3mf failed!" -#~ msgstr "Vorbereitung, Export 3mf fehlgeschlagen!" - -#~ msgid "Preparing to upload your project..." -#~ msgstr "Vorbereitungen zum Hochladen Ihres Projekts..." - -#~ msgid "get_des,err:code=%u,msg=%s" -#~ msgstr "get_des,err:code=%u,msg=%s" - -#~ msgid "req_proj,err:code=%u,msg=%s" -#~ msgstr "req_proj,err:code=%u,msg=%s" - -#~ msgid "req_prof,err:code=%u,msg=%s" -#~ msgstr "req_prof,err:code=%u,msg=%s" - -#~ msgid "Uploading..." -#~ msgstr "Hochladen..." - -#~ msgid "Uploading %d%%, remaining time %s" -#~ msgstr "Hochladen von %d%%, verbleibende Zeit %s" - -#~ msgid "Upload has been canceled." -#~ msgstr "Der Upload wurde abgebrochen." - -#~ msgid "Publishing..." -#~ msgstr "Veröffentlichen..." - -#~ msgid "Failed to publish. Please try again!" -#~ msgstr "Veröffentlichung fehlgeschlagen. Bitte versuchen Sie es erneut!" - -#~ msgid "Uploading is timed out. Please try again!" -#~ msgstr "" -#~ "Die Zeit für das Hochladen ist abgelaufen. Bitte versuchen Sie es erneut!" - -#~ msgid "Design id is empty." -#~ msgstr "Die Design-ID ist leer." - -#~ msgid "Chinese (Simplified)" -#~ msgstr "Chinesisch (Simplified)" - -#~ msgid "GUI" -#~ msgstr "GUI" - -#~ msgid "Sync" -#~ msgstr "Synchronisierung" - -#~ msgid "Shortcuts" -#~ msgstr "Tastaturkürzel" - -#~ msgid "General settings" -#~ msgstr "Allgemeine Einstellungen" - -#~ msgid "Record Timelapse" -#~ msgstr "Zeitraffer aufnehmen" - -#~ msgid "Current printer is busy. Please select another one." -#~ msgstr "Der aktuelle Drucker ist besetzt. Bitte wählen Sie einen anderen." - -#~ msgid "Filament Retraction" -#~ msgstr "Einziehen des Materials" - -#~ msgid "Bed temperature when cool plate is installed" -#~ msgstr "Druckbetttemperatur bei installierter kalter Druckplatte" - -#~ msgid "Bed temperature when engineering plate is installed" -#~ msgstr "Druckbetttemperatur bei installierter technischer Druckplatte" - -#~ msgid "Bed temperature when high temperature plate is installed" -#~ msgstr "Betttemperatur, wenn die Hochtemperaturdruckplatte installiert ist" - -#~ msgid "Keep" -#~ msgstr "Behalten" - -#~ msgid "Unable to get system certificate." -#~ msgstr "Systemzertifikat kann nicht abgerufen werden." - -#~ msgid "use system SSL certificate: %1%" -#~ msgstr "System-SSL-Zertifikat verwenden: %1%" - -#~ msgid "CURL initialization failed. See the log for additional details." -#~ msgstr "" -#~ "Die CURL-Initialisierung ist fehlgeschlagen. Siehe in das Protokoll für " -#~ "weitere Details." - -#~ msgid "print project cancelled." -#~ msgstr "Druckprojekt abgebrochen." - -#~ msgid "Creating a print job..." -#~ msgstr "Druckauftrag erstellen..." - -#~ msgid "Uploading the print job..." -#~ msgstr "Hochladen des Druckauftrags..." - -#~ msgid "The size of the uploaded file cannot exceed 1 GB." -#~ msgstr "Die Größe der hochgeladenen Datei darf 1 GB nicht überschreiten." - -#~ msgid " Failed to upload the print job. Check Md5 failed, please try agian." -#~ msgstr "" -#~ " Der Druckauftrag konnte nicht hochgeladen werden. Md5-Prüfung " -#~ "fehlgeschlagen, bitte versuchen Sie es erneut." - -#~ msgid "" -#~ "\n" -#~ "upload,err:code=%u,msg=%s" -#~ msgstr "" -#~ "\n" -#~ "upload,err:code=%u,msg=%s" - -#~ msgid "Wait for the job to be sent." -#~ msgstr "Warten Sie, bis der Auftrag gesendet wird." - -#~ msgid "The print job has been sent to your printer." -#~ msgstr "Der Druckauftrag wurde an Ihren Drucker gesendet." - -#~ msgid "Invalid plate index %d" -#~ msgstr "Ungültiger Druckplattenindex %d" - -#~ msgid "Plate %d" -#~ msgstr "Druckplatte %d" - -#~ msgid "%s" -#~ msgstr "%s" - -#~ msgid "Start printing..." -#~ msgstr "Mit dem Drucken beginnen..." - -#~ msgid "%1% is too close to others, there will be collisions when printing." -#~ msgstr "" -#~ "da %1% zu nahe an anderen liegt, wird es beim Drucken zu Kollisionen " -#~ "kommen." - -#~ msgid "" -#~ "\n" -#~ "%1% is too close to others, there will be collisions when printing." -#~ msgstr "" -#~ "\n" -#~ "da %1% zu nahe an anderen liegt, wird es beim Drucken zu Kollisionen " -#~ "kommen." - -#~ msgid "%1% is too tall, there will be collisions when printing." -#~ msgstr "%1% ist zu groß, beim Drucken kommt es zu Kollisionen." - -#~ msgid "" -#~ "\n" -#~ "%1% is too tall, there will be collisions when printing." -#~ msgstr "" -#~ "\n" -#~ "%1% ist zu groß, beim Drucken kommt es zu Kollisionen." - -#~ msgid "bed temperature for layers except the initial one" -#~ msgstr "Druckbetttemperatur für alle Schichten außer der Anfangsschicht" - -#~ msgid "Bed temperature of the initial layer" -#~ msgstr "Druckbettemperatur für die erste Schicht" - -#~ msgid "Smart" -#~ msgstr "Clever" - -#~ msgid "No brim" -#~ msgstr "Kein Rand" - -#~ msgid "Outer brim only" -#~ msgstr "Nur äußerer Rand" - -#~ msgid "Inner brim only" -#~ msgstr "Nur innerer Rand" - -#~ msgid "Outer and inner brim" -#~ msgstr "Äußere und innerer Rand" - -#~ msgid "Load" -#~ msgstr "Laden" - -#~ msgid "First layer" -#~ msgstr "Erste Schicht" - -#~ msgid "Import STL/OBJ/AMF/3MF without config, keep plater" -#~ msgstr "" -#~ "Importiere STL/OBJ/AMF/3MF mit Konfigurationsdaten, Druckplatte " -#~ "beibehalten" - -#~ msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" -#~ msgstr "" -#~ "Alles Gizmos: Drehen - linke Maustaste; Schwenken - rechte Maustaste" - -#~ msgid "Gizmo move: Press to snap by 1mm" -#~ msgstr "Gizmo Bewegung: Drücken um um 1 mm zu Rasten" - -#~ msgid "Gizmos" -#~ msgstr "Gizmos" - -#~ msgid "Eject drive" -#~ msgstr "Laufwerk auswerfen" - -#~ msgid "%1$d open edge" -#~ msgid_plural "%1$d open edges" -#~ msgstr[0] "%1$d offene Kante" -#~ msgstr[1] "%1$d offene Kanten" - -#~ msgid "Save project" -#~ msgstr "Projekt speichern" - -#~ msgid "Event" -#~ msgstr "Ereignis" - -#~ msgid "Remaining time" -#~ msgstr "Restzeit" - -#~ msgid "Duration" -#~ msgstr "Dauer" - -#~ msgid "Fan settings" -#~ msgstr "Lüfter Einstellungen" - -#~ msgid "Cooling thresholds" -#~ msgstr "Kühlungsschwellwerte" - -#~ msgid "Enable auto cooling" -#~ msgstr "Automatische Kühlung aktivieren" - -#~ msgid "Disable fan for the first" -#~ msgstr "Kein Lüfter für die ersten" - -#~ msgid "Enable fan if layer print time is below" -#~ msgstr "Lüfter einschalten wenn die Schichtdruckzeit geringer ist als" - -#~ msgid "Slow down if layer print time is below" -#~ msgstr "Langsamer drucken wenn die Schichtdruckzeit geringer ist als" - -#~ msgid "mm or %" -#~ msgstr "mm oder %" - -#~ msgid "Merge" -#~ msgstr "Zusammenfügen" - -#~ msgid "Merged" -#~ msgstr "Zusammengeführt" - -#~ msgid "Upgrade" -#~ msgstr "Aktualisieren" - -#~ msgid "Gizmo-Move" -#~ msgstr "Gizmo Bewegen" - -#~ msgid "Gizmo-Scale" -#~ msgstr "Gizmo Skalierung" - -#~ msgid "Gizmo-Rotate" -#~ msgstr "Gizmo-Rotation" - -#~ msgid "Export current plate as G-code" -#~ msgstr "Exportiere die aktuelle Plattenbelegung als G-Code" - -#~ msgid "Box" -#~ msgstr "Kubus" - -#~ msgid "Switching Presets: Unsaved Changes" -#~ msgstr "Voreinstellungen umschalten: Nicht gespeicherte Änderungen" - -#~ msgid "Save the selected options to preset \"%1%\"." -#~ msgstr "" -#~ "Speichern der ausgewählten Optionen unter der Voreinstellung \"%1%\"." - -#~ msgid "Transfer the selected options to the newly selected preset \"%1%\"." -#~ msgstr "" -#~ "Übertragen der ausgewählten Optionen auf die neu gewählte Voreinstellung " -#~ "\"%1%\"." - -#~ msgid "The following preset was modified" -#~ msgid_plural "The following presets were modified" -#~ msgstr[0] "Die folgende Voreinstellung wurde geändert" -#~ msgstr[1] "Die folgenden Voreinstellungen wurden geändert" - -#~ msgid "Local coordinates" -#~ msgstr "Lokale Koordinaten" - -#~ msgid "Object name" -#~ msgstr "Objektname" - -#~ msgid "Set Mirror" -#~ msgstr "Spiegel setzen" - -#~ msgid "Drop to bed" -#~ msgstr "Auf das Druckbett fallen lassen" - -#~ msgid "Reset rotation" -#~ msgstr "Rotation zurücksetzen" - -#~ msgid "Reset scale" -#~ msgstr "Skalierung zurücksetzen" - -#~ msgid "Inches" -#~ msgstr "Zoll" - -#~ msgid "default value" -#~ msgstr "Standardwert" - -#~ msgid "parameter name" -#~ msgstr "Parametername" - -#~ msgid "Add..." -#~ msgstr "Hinzufügen..." - -#~ msgid "Max print speed" -#~ msgstr "Maximale Druckgeschwindigkeit" - -#~ msgid "mm/s or %" -#~ msgstr "mm/s oder %" - -#~ msgid "Thick bridges" -#~ msgstr "Dicke Brücken" - -#~ msgid "Default color" -#~ msgstr "Standardfarbe" - -#~ msgid "Check for Configuration Updates" -#~ msgstr "Nach Konfigurationsaktualisierungen suchen" - -#~ msgid "Check for configuration updates" -#~ msgstr "Suche nach Konfigurationsaktualisierungen" - -#~ msgid "Application preferences" -#~ msgstr "Anwendungseinstellungen" - -#~ msgid "Simple" -#~ msgstr "Einfach" - -#~ msgid "Mode" -#~ msgstr "&Modus" - -#~ msgid "Restart application" -#~ msgstr "Anwendung neu starten" - -#~ msgid "Run %s" -#~ msgstr "%s ausführen" - -#~ msgid "Add/Remove printers" -#~ msgstr "Drucker hinzufügen/entfernen" - -#~ msgid "Configuration update is available." -#~ msgstr "Konfigurationsupdate ist verfügbar." - -#~ msgid "See more." -#~ msgstr "Siehe mehr." - -#~ msgid "" -#~ "You have just added a G-code for color change, but its value is empty.\n" -#~ "To export the G-code correctly, check the \"Color Change G-code\" in " -#~ "\"Printer Settings > Custom G-code\"" -#~ msgstr "" -#~ "Sie haben gerade einen G-Code für Farbwechsel hinzugefügt, aber sein Wert " -#~ "ist leer.\n" -#~ "Um den G-Code korrekt zu exportieren, überprüfen Sie den \"Farbwechsel-G-" -#~ "Code\" unter \"Druckereinstellungen > Benutzerdefinierter G-Code\"." - -#~ msgid "" -#~ "No color change event was added to the print. The print does not look " -#~ "like a sign." -#~ msgstr "" -#~ "Dem Druck wurde kein Farbwechsel hinzugefügt. Der Druck sieht nicht wie " -#~ "ein Schild aus." - -#~ msgid "Desktop integration was successful." -#~ msgstr "Desktop Integration war erfolgreich." - -#~ msgid "Desktop integration failed." -#~ msgstr "Desktop Integration fehlgeschlagen." - -#~ msgid "Undo desktop integration was successful." -#~ msgstr "Die Desktop-Integration wurde erfolgreich rückgängig gemacht." - -#~ msgid "Undo desktop integration failed." -#~ msgstr "Rücknahme der Desktop Integration fehlgeschlagen." - -#~ msgid "See Releases page." -#~ msgstr "Siehe Releases-Seite." - -#~ msgid "Slicing finished." -#~ msgstr "Slicing abgeschlossen." - -#~ msgid "ERROR:" -#~ msgstr "FEHLER:" - -#~ msgid "Exporting finished." -#~ msgstr "Exportieren beendet." - -#~ msgid "Add/Remove filaments" -#~ msgstr "Filamente hinzufügen/entfernen" - -#~ msgid "Add/Remove materials" -#~ msgstr "Materialien hinzufügen/entfernen" - -#~ msgid "System Information" -#~ msgstr "Systeminformationen" - -#~ msgid "Copy to Clipboard" -#~ msgstr "Zu Zwischenablage kopieren" - -#~ msgid "&Preferences" -#~ msgstr "&Einstellungen" - -#~ msgid "&Language" -#~ msgstr "Sp&rache" - -#~ msgid "&Configuration" -#~ msgstr "&Konfiguration" - -#~ msgid "&New Project" -#~ msgstr "&Neues Projekt" - -#~ msgid "&Open Project" -#~ msgstr "Pr&ojekt öffnen" - -#~ msgid "&Save Project" -#~ msgstr "Projekt &sichern" - -#~ msgid "Save Project &as" -#~ msgstr "Projekt speichern &als" - -#~ msgid "Export &G-code" -#~ msgstr "Export &G-Code" - -#~ msgid "&Export" -#~ msgstr "&Export" - -#~ msgid "&Undo" -#~ msgstr "&Undo" - -#~ msgid "&Redo" -#~ msgstr "&Redo" - -#~ msgid "&Copy" -#~ msgstr "&Kopieren" - -#~ msgid "&Paste" -#~ msgstr "Ei&nfügen" - -#~ msgid "&Delete selected" -#~ msgstr "Löschen aus&gewählt" - -#~ msgid "&Select all" -#~ msgstr "Alle&s auswählen" - -#~ msgid "D&eselect all" -#~ msgstr "All&es Abwählen" - -#~ msgid "&Edit" -#~ msgstr "&Bearbeiten" - -#~ msgid "Select a gcode file:" -#~ msgstr "Gcode Datei auswählen:" - -#~ msgid "Paint-on supports" -#~ msgstr "Aufmal-Stützen" - -#~ msgid "Paint-on seam" -#~ msgstr "Aufmal-Naht" - -#~ msgid "Multimaterial painting" -#~ msgstr "Multimaterial Bemalung" - -#~ msgid "Sinking" -#~ msgstr "Absenken" - -#~ msgid "Instances" -#~ msgstr "Kopien" - -#~ msgid "Instance %d" -#~ msgstr "Kopie %d" - -#~ msgid "Change extruder color" -#~ msgstr "Extruderfarbe ändern" - -#~ msgid "Stealth" -#~ msgstr "Stealth" - -#~ msgid "Material Settings" -#~ msgstr "Material Einstellungen" - -#~ msgid "" -#~ "Post-processing script %1% failed.\n" -#~ "\n" -#~ "The post-processing script is expected to change the G-code file %2% in " -#~ "place, but the G-code file was deleted and likely saved under a new " -#~ "name.\n" -#~ "Please adjust the post-processing script to change the G-code in place " -#~ "and consult the manual on how to optionally rename the post-processed G-" -#~ "code file.\n" -#~ msgstr "" -#~ "Nachbearbeitungsskript %1% fehlgeschlagen.\n" -#~ "\n" -#~ "Das Nachbearbeitungsskript sollte die G-Code-Datei %2% an Ort und Stelle " -#~ "ändern, aber die G-Code-Datei wurde gelöscht und wahrscheinlich unter " -#~ "einem neuen Namen gespeichert.\n" -#~ "Bitte passen Sie das Nachbearbeitungsskript an, um den G-Code an Ort und " -#~ "Stelle zu ändern, und lesen Sie im Handbuch nach, wie Sie die " -#~ "nachbearbeitete G-Code-Datei optional umbenennen können.\n" - -#~ msgid "First layer bed temperature" -#~ msgstr "Erste Schicht Bett-Temperatur" - -#~ msgid "First layer density" -#~ msgstr "Dichte der ersten Schicht" - -#~ msgid "First layer expansion" -#~ msgstr "Expansion der ersten Schicht" - -#~ msgid "Purging volumes - load/unload volumes" -#~ msgstr "Reinigungsvolumen - Lade-/Entladevolumen" - -#~ msgid "Purging volumes - matrix" -#~ msgstr "Reinigungsvolumen - Matrix" - -#~ msgid "G-code viewer" -#~ msgstr "G-Code-Viewer" - -#~ msgid "Visualize an already sliced and saved G-code" -#~ msgstr "Visualisierung eines bereits gesliceten und gespeicherten G-Codes" - -#~ msgid "Split triangles" -#~ msgstr "Dreiecke teilen" - -#~ msgid "Clipping of view" -#~ msgstr "Ausschnitt der Ansicht" - -#~ msgid "Reset direction" -#~ msgstr "Richtung zurücksetzen" - -#~ msgid "Brush size" -#~ msgstr "Pinselgröße" - -#~ msgid "Brush shape" -#~ msgstr "Pinselform" - -#~ msgid "Enforce seam" -#~ msgstr "Naht erzwingen" - -#~ msgid "Block seam" -#~ msgstr "Naht blockieren" - -#~ msgid "Remove selection" -#~ msgstr "Auswahl entfernen" - -#~ msgid "Remove all selection" -#~ msgstr "Gesamte Auswahl entfernen" - -#~ msgid "Seam painting" -#~ msgstr "Aufmal-Nähte" - -#~ msgid "Paints all facets inside, regardless of their orientation." -#~ msgstr "Bemalt alle umfassten Flächen, unabhängig von ihrer Ausrichtung." - -#~ msgid "Ignores facets facing away from the camera." -#~ msgstr "Ignoriert die von der Kamera abgewandten Flächen." - -#~ msgid "" -#~ "License agreements of all following programs (libraries) are part of " -#~ "application license agreement" -#~ msgstr "" -#~ "Lizenzvereinbarungen für alle folgenden Programme (Bibliotheken) sind " -#~ "Teil der Anwendungslizenzvereinbarung" - -#~ msgid "is licensed under the" -#~ msgstr "ist unter der Lizenz der" - -#~ msgid "" -#~ "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " -#~ "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " -#~ "numerous others." -#~ msgstr "" -#~ "Beiträge von Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr " -#~ "Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik und " -#~ "zahlreichen anderen." - -#~ msgid "Copy Version Info" -#~ msgstr "Versionsinfo kopieren" - -#~ msgid "nozzle" -#~ msgstr "Düse" - -#~ msgid "Alternate nozzles:" -#~ msgstr "Alternative Düsen:" - -#~ msgid "All standard" -#~ msgstr "Alles standard" - -#~ msgid "Welcome to the %s Configuration Assistant" -#~ msgstr "Willkommen zum %s Konfigurations-Assistent" - -#~ msgid "Welcome to the %s Configuration Wizard" -#~ msgstr "Willkommen zum %s Konfigurations-Assistent" - -#~ msgid "Welcome" -#~ msgstr "Willkommen" - -#~ msgid "" -#~ "Hello, welcome to %s! This %s helps you with the initial configuration; " -#~ "just a few settings and you will be ready to print." -#~ msgstr "" -#~ "Hallo, willkommen bei %s! Dieses %s hilft Ihnen bei der " -#~ "Erstkonfiguration; nur ein paar Einstellungen und Sie sind bereit zum " -#~ "Drucken." - -#~ msgid "Remove user profiles (a snapshot will be taken beforehand)" -#~ msgstr "Benutzerprofile entfernen (eine Momentaufnahme wird vorab erstellt)" - -#~ msgid "" -#~ "Perform desktop integration (Sets this binary to be searchable by the " -#~ "system)." -#~ msgstr "" -#~ "Desktop-Integration durchführen (stellt diese Binärdatei so ein, dass sie " -#~ "vom System durchsucht werden kann)." - -#~ msgid "%s Family" -#~ msgstr "%s Familie" - -#~ msgid "Printer:" -#~ msgstr "Drucker:" - -#~ msgid "Vendor:" -#~ msgstr "Hersteller:" - -#~ msgid "Profile:" -#~ msgstr "Profil:" - -#~ msgid "(All)" -#~ msgstr "(Alles)" - -#~ msgid "" -#~ "%1% marked with * are not compatible with some installed " -#~ "printers." -#~ msgstr "" -#~ "%1%, die mit * markiert sind, sind nicht mit einigen " -#~ "installierten Druckern kompatibel." - -#~ msgid "SLA materials" -#~ msgstr "SLA Materialien" - -#~ msgid "All installed printers are compatible with the selected %1%." -#~ msgstr "" -#~ "Alle installierten Drucker sind mit dem ausgewählten %1% kompatibel." - -#~ msgid "filament" -#~ msgstr "Filament" - -#~ msgid "SLA material" -#~ msgstr "SLA Material" - -#~ msgid "" -#~ "Only the following installed printers are compatible with the selected " -#~ "filaments" -#~ msgstr "" -#~ "Nur die folgenden installierten Drucker sind mit den ausgewählten " -#~ "Filamenten kompatibel" - -#~ msgid "" -#~ "Only the following installed printers are compatible with the selected " -#~ "SLA materials" -#~ msgstr "" -#~ "Nur die folgenden installierten Drucker sind mit den ausgewählten SLA-" -#~ "Materialien kompatibel" - -#~ msgid "Custom Printer Setup" -#~ msgstr "Benutzerdefinierte Drucker-Einrichtung" - -#~ msgid "Custom Printer" -#~ msgstr "Benutzerdefinierter Drucker" - -#~ msgid "Define a custom printer profile" -#~ msgstr "Benutzerdefiniertes Druckerprofil definieren" - -#~ msgid "Custom profile name:" -#~ msgstr "Benutzerdefinierter Profilname:" - -#~ msgid "Files association" -#~ msgstr "Zuordnung der Dateien" - -#~ msgid "Other Vendors" -#~ msgstr "Andere Hersteller" - -#~ msgid "Invalid numeric input." -#~ msgstr "Ungültige numerische Eingabe." - -#~ msgid "Filament and Nozzle Diameters" -#~ msgstr "Filament- und Düsendurchmesser" - -#~ msgid "Print Diameters" -#~ msgstr "Druckdurchmesser" - -#~ msgid "Enter the diameter of your printer's hot end nozzle." -#~ msgstr "Geben Sie den Durchmesser der Hotenddüse ein." - -#~ msgid "Nozzle Diameter:" -#~ msgstr "Düsendurchmesser:" - -#~ msgid "Enter the diameter of your filament." -#~ msgstr "Geben Sie den Durchmesser des Filaments ein." - -#~ msgid "" -#~ "Good precision is required, so use a caliper and do multiple measurements " -#~ "along the filament, then compute the average." -#~ msgstr "" -#~ "Eine hohe Genauigkeit ist erforderlich, also verwenden Sie einen " -#~ "Messschieber und führen Sie mehrere Messungen entlang des Filaments " -#~ "durch, um dann den Mittelwert zu berechnen." - -#~ msgid "Filament Diameter:" -#~ msgstr "Filamentdurchmesser:" - -#~ msgid "Nozzle and Bed Temperatures" -#~ msgstr "Düsen- und Bett-Temperaturen" - -#~ msgid "Temperatures" -#~ msgstr "Temperaturen" - -#~ msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." -#~ msgstr "" -#~ "Ein Daumenwert ist 160 bis 230 °C für PLA, und 215 bis 250 °C für ABS." - -#~ msgid "Extrusion Temperature:" -#~ msgstr "Extrusionstemperatur:" - -#~ msgid "" -#~ "Enter the bed temperature needed for getting your filament to stick to " -#~ "your heated bed." -#~ msgstr "" -#~ "Geben Sie die Druckbetttemperatur ein, die erforderlich ist, damit Ihr " -#~ "Filament an Ihrem beheizten Druckbett haftet." - -#~ msgid "" -#~ "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you " -#~ "have no heated bed." -#~ msgstr "" -#~ "Ein Daumenwert ist 60 °C für PLA und 110 °C für ABS. Auf 0 setzen, falls " -#~ "kein beheiztes Druckbett vorhanden ist." - -#~ msgid "Bed Temperature:" -#~ msgstr "Druckbetttemperatur:" - -#~ msgid "SLA Materials" -#~ msgstr "SLA Materialien" - -#~ msgid "FFF Technology Printers" -#~ msgstr "FFF Technologie Drucker" - -#~ msgid "SLA Technology Printers" -#~ msgstr "SLA Technologie Drucker" - -#~ msgid "" -#~ "Following printer profiles has no default filament: %1%Please select one " -#~ "manually." -#~ msgstr "" -#~ "Folgende Druckerprofile haben kein Standardmaterial: %1%Bitte wählen Sie " -#~ "eines manuell aus." - -#~ msgid "" -#~ "Following printer profiles has no default material: %1%Please select one " -#~ "manually." -#~ msgstr "" -#~ "Folgende Druckerprofile haben kein Standardmaterial: %1%Bitte wählen Sie " -#~ "eines manuell aus." - -#~ msgid "The following FFF printer models have no filament selected:" -#~ msgstr "" -#~ "Bei den folgenden FFF-Druckermodellen wurde kein Filament ausgewählt:" - -#~ msgid "" -#~ "Do you want to select default filaments for these FFF printer models?" -#~ msgstr "" -#~ "Möchten Sie Standardfilamente für diese FFF-Druckermodelle auswählen?" - -#~ msgid "Configuration is edited in ConfigWizard" -#~ msgstr "Die Konfiguration wird im ConfigWizard bearbeitet" - -#~ msgid "All user presets will be deleted." -#~ msgstr "Alle Benutzervoreinstellungen werden gelöscht." - -#~ msgid "A new vendor was installed and one of its printers will be activated" -#~ msgid_plural "" -#~ "New vendors were installed and one of theirs printers will be activated" -#~ msgstr[0] "" -#~ "Ein neuer Anbieter wurde installiert und einer seiner Drucker wird " -#~ "aktiviert" -#~ msgstr[1] "" -#~ "Neue Anbieter wurden installiert und einer ihrer Drucker wird aktiviert" - -#~ msgid "A new Printer was installed and it will be activated." -#~ msgstr "A new Printer was installed and it will be activated." - -#~ msgid "Some Printers were uninstalled." -#~ msgstr "Einige Drucker wurden deinstalliert." - -#~ msgid "A new filament was installed and it will be activated." -#~ msgstr "Es wurde ein neues Filament installiert, das nun aktiviert wird." - -#~ msgid "A new SLA material was installed and it will be activated." -#~ msgstr "Ein neues SLA-Material wurde installiert und wird nun aktiviert." - -#~ msgid "Some filaments were uninstalled." -#~ msgstr "Einige Filamente wurden deinstalliert." - -#~ msgid "Select all standard printers" -#~ msgstr "Wähle alle Standarddrucker" - -#~ msgid "< &Back" -#~ msgstr "< &Zurück" - -#~ msgid "&Next >" -#~ msgstr "&Weiter >" - -#~ msgid "&Finish" -#~ msgstr "&Beenden" - -#~ msgid "Filament Profiles Selection" -#~ msgstr "Filament Profile Auswahl" - -#~ msgid "Configuration Assistant" -#~ msgstr "Konfigurations-Assistent" - -#~ msgid "Configuration &Assistant" -#~ msgstr "Konfigurations &Assistent" - -#~ msgid "Configuration Wizard" -#~ msgstr "Konfigurations-Assistent" - -#~ msgid "Configuration &Wizard" -#~ msgstr "&Konfigurations-Assistent" - -#~ msgid "" -#~ "Use this setting to rotate the support material pattern on the horizontal " -#~ "plane." -#~ msgstr "" -#~ "Verwenden Sie diese Einstellung, um das Muster des Stützmaterials auf der " -#~ "horizontalen Ebene zu drehen." - -#~ msgid "Compare this preset with some another" -#~ msgstr "Diese Voreinstellung mit einer anderen vergleichen" - -#~ msgid "Wipe tower parameters" -#~ msgstr "Reinigungsturm Parameter" - -#~ msgid "Volumetric flow hints not available" -#~ msgstr "Hinweise zum Volumenstrom nicht verfügbar" - -#~ msgid "New printer preset selected" -#~ msgstr "Neue Druckervoreinstellung ausgewählt" - -#~ msgid "Bridges fan speed" -#~ msgstr "Brückenlüftergeschwindigkeit" - -#~ msgid "Bed Shape and Size" -#~ msgstr "Druckbettform und -größe" - -#~ msgid "Set the shape of your printer's bed." -#~ msgstr "Stellen Sie die Konturen Ihres Druckerbettes ein." - -#~ msgid "Place bearings in slots and resume printing" -#~ msgstr "Lager in Nuten einsetzen und Druck wieder aufnehmen" - -#~ msgid "One layer mode" -#~ msgstr "Eine Schicht Modus" - -#~ msgid "Discard all custom changes" -#~ msgstr "Alle benutzerdefinierten Änderungen verwerfen" - -#~ msgid "Jump to move" -#~ msgstr "Zum Bewegen wechseln" - -#~ msgid "" -#~ "Jump to height %s\n" -#~ "Set ruler mode\n" -#~ "or Set extruder sequence for the entire print" -#~ msgstr "" -#~ "Auf Höhe %s springen\n" -#~ "Lineal-Modus einstellen\n" -#~ "oder Extrudersequenz für den gesamten Druck einstellen" - -#~ msgid "" -#~ "Jump to height %s\n" -#~ "or Set ruler mode" -#~ msgstr "" -#~ "Auf Höhe %s springen\n" -#~ "oder Linealmodus einstellen" - -#~ msgid "Edit current color - Right click the colored slider segment" -#~ msgstr "" -#~ "Aktuelle Farbe bearbeiten - Rechtsklick auf das farbige " -#~ "Schiebereglersegment" - -#~ msgid "This is wipe tower layer" -#~ msgstr "Dies ist die Wischturmschicht" - -#~ msgid "" -#~ "The sequential print is on.\n" -#~ "It's impossible to apply any custom G-code for objects printing " -#~ "sequentually." -#~ msgstr "" -#~ "Der sequenzielle Druck ist eingeschaltet.\n" -#~ "Es ist nicht möglich, einen benutzerdefinierten G-Code für Objekte " -#~ "anzuwenden, die sequentiell gedruckt werden." - -#~ msgid "Print mode" -#~ msgstr "Druckmodus" - -#~ msgid "Add extruder change - Left click" -#~ msgstr "Extruderwechsel hinzufügen - Linksklick" - -#~ msgid "" -#~ "Add color change - Left click for predefined color or Shift + Left click " -#~ "for custom color selection" -#~ msgstr "" -#~ "Farbwechsel hinzufügen - Linksklick für vordefinierte Farbe oder Shift + " -#~ "Linksklick für benutzerdefinierte Farbauswahl" - -#~ msgid "Add color change - Left click" -#~ msgstr "Farbwechsel hinzufügen - Linksklick" - -#~ msgid "or press \"+\" key" -#~ msgstr "oder drücken Sie die Taste \"+\"" - -#~ msgid "Add another code - Ctrl + Left click" -#~ msgstr "Weiteren Code hinzufügen - Strg + Linksklick" - -#~ msgid "Add another code - Right click" -#~ msgstr "Weiteren Code hinzufügen - Rechtsklick" - -#~ msgid "" -#~ "The sequential print is on.\n" -#~ "It's impossible to apply any custom G-code for objects printing " -#~ "sequentually.\n" -#~ "This code won't be processed during G-code generation." -#~ msgstr "" -#~ "Der sequentielle Druck ist eingeschaltet.\n" -#~ "Es ist unmöglich, einen benutzerdefinierten G-Code für Objekte " -#~ "anzuwenden, die sequentiell gedruckt werden.\n" -#~ "Dieser Code wird bei der G-Code-Generierung nicht verarbeitet." - -#~ msgid "continue" -#~ msgstr "weiter" - -#~ msgid "Color change (\"%1%\")" -#~ msgstr "Farbwechsel (\"%1%\")" - -#~ msgid "Color change (\"%1%\") for Extruder %2%" -#~ msgstr "Farbwechsel (\"%1%\") für Extruder %2%" - -#~ msgid "Pause print (\"%1%\")" -#~ msgstr "Druck pausieren (\"%1%\")" - -#~ msgid "Custom template (\"%1%\")" -#~ msgstr "Benutzerdefinierte Vorlage (\"%1%\")" - -#~ msgid "Extruder (tool) is changed to Extruder \"%1%\"" -#~ msgstr "Extruder (Werkzeug) ist geändert auf Extruder \"%1%\"" - -#~ msgid "Note" -#~ msgstr "Hinweis" - -#~ msgid "" -#~ "G-code associated to this tick mark is in a conflict with print mode.\n" -#~ "Editing it will cause changes of Slider data." -#~ msgstr "" -#~ "Der mit diesem Häkchen verbundene G-Code steht in Konflikt mit dem " -#~ "Druckmodus.\n" -#~ "Seine Bearbeitung führt zu Änderungen der Slicer-Daten." - -#~ msgid "" -#~ "There is a color change for extruder that won't be used till the end of " -#~ "print job.\n" -#~ "This code won't be processed during G-code generation." -#~ msgstr "" -#~ "Es gibt einen Farbwechsel für den Extruder, der nicht vor dem Ende des " -#~ "Druckauftrags verwendet wird.\n" -#~ "Dieser Code wird bei der G-Code-Generierung nicht verarbeitet." - -#~ msgid "" -#~ "There is an extruder change set to the same extruder.\n" -#~ "This code won't be processed during G-code generation." -#~ msgstr "" -#~ "Es gibt einen Extruderwechsel, der auf denselben Extruder eingestellt " -#~ "ist.\n" -#~ "Dieser Code wird während der G-Code-Generierung nicht verarbeitet." - -#~ msgid "" -#~ "There is a color change for extruder that has not been used before.\n" -#~ "Check your settings to avoid redundant color changes." -#~ msgstr "" -#~ "Es gibt einen Farbwechsel für den Extruder, der bisher noch nicht " -#~ "verwendet wurde.\n" -#~ "Überprüfen Sie Ihre Einstellungen, um überflüssige Farbwechsel zu " -#~ "vermeiden." - -#~ msgid "Delete tick mark - Left click or press \"-\" key" -#~ msgstr "Häkchen löschen - Linksklick oder Taste \"-\" drücken" - -#~ msgid "Edit tick mark - Ctrl + Left click" -#~ msgstr "Häkchen bearbeiten - Strg + Linksklick" - -#~ msgid "Edit tick mark - Right click" -#~ msgstr "Häkchen bearbeiten - Rechtsklick" - -#~ msgid "Extruder %d" -#~ msgstr "Extruder %d" - -#~ msgid "used" -#~ msgstr "genutzt" - -#~ msgid "Switch code to Color change (%1%) for:" -#~ msgstr "Umschalten des Codes auf Farbwechsel (%1%) für:" - -#~ msgid "Add color change (%1%) for:" -#~ msgstr "Farbwechsel (%1%) hinzufügen für:" - -#~ msgid "Add color change" -#~ msgstr "Farbwechsel hinzufügen" - -#~ msgid "Add pause print" -#~ msgstr "Druckpause hinzufügen" - -#~ msgid "Add custom template" -#~ msgstr "Benutzerdefinierte Vorlage hinzufügen" - -#~ msgid "Edit color" -#~ msgstr "Farbe bearbeiten" - -#~ msgid "Edit pause print message" -#~ msgstr "Druckpausen-Mitteilung bearbeiten" - -#~ msgid "Edit custom G-code" -#~ msgstr "Benutzerdefinierten G-Code bearbeiten" - -#~ msgid "Delete color change" -#~ msgstr "Farbwechsel löschen" - -#~ msgid "Delete tool change" -#~ msgstr "Werkzeugwechsel löschen" - -#~ msgid "Delete pause print" -#~ msgstr "Druckpause löschen" - -#~ msgid "Delete custom G-code" -#~ msgstr "Benutzerdefinierten G-Code löschen" - -#~ msgid "Jump to height" -#~ msgstr "Zur Höhe wechseln" - -#~ msgid "Hide ruler" -#~ msgstr "Lineal verbergen" - -#~ msgid "Show object height" -#~ msgstr "Objekthöhe anzeigen" - -#~ msgid "Show object height on the ruler" -#~ msgstr "Objekthöhe auf dem Lineal anzeigen" - -#~ msgid "Show estimated print time" -#~ msgstr "Geschätzte Druckzeit anzeigen" - -#~ msgid "Show estimated print time on the ruler" -#~ msgstr "Geschätzte Druckzeit auf dem Lineal anzeigen" - -#~ msgid "Ruler mode" -#~ msgstr "Lineal-Modus" - -#~ msgid "Set ruler mode" -#~ msgstr "Lineal-Modus einstellen" - -#~ msgid "Set auto color changes" -#~ msgstr "Automatische Farbwechsel einstellen" - -#~ msgid "This action will cause deletion of all ticks on vertical slider." -#~ msgstr "" -#~ "Diese Aktion löscht alle Markierungen auf dem vertikalen Schieberegler." - -#~ msgid "" -#~ "This action is not revertible.\n" -#~ "Do you want to proceed?" -#~ msgstr "" -#~ "Diese Maßnahme ist nicht rückgängig zu machen.\n" -#~ "Möchten Sie fortfahren?" - -#~ msgid "Enter custom G-code used on current layer" -#~ msgstr "Benutzerdefinierten G-Code für die aktuelle Schicht eingeben" - -#~ msgid "Custom G-code on current layer (%1% mm)." -#~ msgstr "Benutzerdefinierter G-Code auf der aktuellen Ebene (%1% mm)." - -#~ msgid "Enter short message shown on Printer display when a print is paused" -#~ msgstr "" -#~ "Geben Sie eine kurze Nachricht ein, die auf dem Druckerdisplay angezeigt " -#~ "wird, wenn der Druck angehalten wird" - -#~ msgid "Message for pause print on current layer (%1% mm)." -#~ msgstr "Meldung für die Druckpause auf der aktuellen Schicht (%1% mm)." - -#~ msgid "Enter the move you want to jump to" -#~ msgstr "Geben Sie die Bewegung ein, zu welcher Sie wechseln möchten" - -#~ msgid "Enter the height you want to jump to" -#~ msgstr "Geben Sie die Höhe ein, auf die Sie wechseln möchten" - -#~ msgid "The last color change data was saved for a single extruder printing." -#~ msgstr "" -#~ "Die letzten Farbwechsel-Daten wurden für einen Einzel-Extruder-Druck " -#~ "gespeichert." - -#~ msgid "The last color change data was saved for a multi extruder printing." -#~ msgstr "" -#~ "Die letzten Farbwechsel-Daten wurden für einen Multi-Extruder-Druck " -#~ "gespeichert." - -#~ msgid "Your current changes will delete all saved color changes." -#~ msgstr "Ihre aktuellen Änderungen löschen alle gespeicherten Farbwechsel." - -#~ msgid "Are you sure you want to continue?" -#~ msgstr "Sind Sie sicher, dass Sie weitermachen wollen?" - -#~ msgid "" -#~ "Select YES if you want to delete all saved tool changes, \n" -#~ "NO if you want all tool changes switch to color changes, \n" -#~ "or CANCEL to leave it unchanged." -#~ msgstr "" -#~ "Wählen Sie JA, wenn Sie alle gespeicherten Werkzeugänderungen löschen " -#~ "möchten, \n" -#~ "NEIN, wenn Sie möchten, dass alle Werkzeugänderungen auf Farbwechsel " -#~ "umgestellt werden, \n" -#~ "oder ABBRECHEN, um sie unverändert zu lassen." - -#~ msgid "Do you want to delete all saved tool changes?" -#~ msgstr "Möchten Sie alle gespeicherten Werkzeugänderungen löschen?" - -#~ msgid "" -#~ "The last color change data was saved for a multi extruder printing with " -#~ "tool changes for whole print." -#~ msgstr "" -#~ "Die letzten Farbwechsel-Daten wurden für einen Multi-Extruder-Druck mit " -#~ "Werkzeugwechsel für den gesamten Druck gespeichert." - -#~ msgid "Your current changes will delete all saved extruder (tool) changes." -#~ msgstr "" -#~ "Ihre aktuellen Änderungen löschen alle gespeicherten Extruder-(Werkzeug-) " -#~ "Wechsel." - -#~ msgid "An object outside the print area was detected." -#~ msgstr "Es wurde ein Objekt außerhalb des Druckbereichs erkannt." - -#~ msgid "A toolpath outside the print area was detected." -#~ msgstr "Es wurde ein Werkzeugweg außerhalb des Druckbereichs erkannt." - -#~ msgid "SLA supports outside the print area were detected." -#~ msgstr "SLA-Stützen außerhalb des Druckbereichs wurden erkannt." - -#~ msgid "Some objects are not visible during editing." -#~ msgstr "Einige Objekte sind während der Bearbeitung nicht sichtbar." - -#~ msgid "" -#~ "An object outside the print area was detected.\n" -#~ "Resolve the current problem to continue slicing." -#~ msgstr "" -#~ "Es wurde ein Objekt außerhalb des Druckbereichs erkannt.\n" -#~ "Das Problem lösen, um mit dem Slicen fortzufahren." - -#~ msgid "Rotate lower part upwards" -#~ msgstr "Unteren Teil umdrehen" - -#~ msgid "Add supports" -#~ msgstr "Stützen hinzufügen" - -#~ msgid "Scale factors" -#~ msgstr "Skalierungsfaktoren" - -#~ msgid "Use for search" -#~ msgstr "Zur Suche verwenden" - -#~ msgid "Category" -#~ msgstr "Kategorie" - -#~ msgid "Search in English" -#~ msgstr "Suche in Englisch" - -#~ msgid "Could not arrange model objects! Some geometries may be invalid." -#~ msgstr "" -#~ "Modellobjekte konnten nicht angeordnet werden! Einige Geometrien können " -#~ "ungültig sein." - -#~ msgid "New project, clear plater" -#~ msgstr "Neues Projekt, Druckplatte leeren" - -#~ msgid "Save project (3mf)" -#~ msgstr "Speichere Projekt (3mf)" - -#~ msgid "Save project as (3mf)" -#~ msgstr "Speichere Projekt als (3mf)" - -#~ msgid "(Re)slice" -#~ msgstr "(Re)Slice" - -#~ msgid "Import Config from ini/amf/3mf/gcode" -#~ msgstr "Konfiguration aus ini/amf/3mf/gcode importieren" - -#~ msgid "Load Config from ini/amf/3mf/gcode and merge" -#~ msgstr "Lade und füge Konfiguration von ini/amf/3mf/gcode hinzu" - -#~ msgid "Export config" -#~ msgstr "Konfiguration exportieren" - -#~ msgid "Export to SD card / Flash drive" -#~ msgstr "Export auf SD-Karte/Flash-Laufwerk" - -#~ msgid "Eject SD card / Flash drive" -#~ msgstr "SD-Karte/Flash-Laufwerk auswerfen" - -#~ msgid "Reload plater from disk" -#~ msgstr "Druckplatte neu von der Festplatte laden" - -#~ msgid "Search" -#~ msgstr "Suchen" - -#~ msgid "Select Plater Tab" -#~ msgstr "Wählt Druckplattenreiter" - -#~ msgid "Select Print Settings Tab" -#~ msgstr "Wählt Druckeinstellungsreiter" - -#~ msgid "Select Filament Settings Tab" -#~ msgstr "Wählt Filamenteinstellungsreiter" - -#~ msgid "Select Printer Settings Tab" -#~ msgstr "Wählt Druckereinstellungsreiter" - -#~ msgid "Switch to 3D" -#~ msgstr "Zeige 3D" - -#~ msgid "Switch to Preview" -#~ msgstr "Wechseln zur Vorschau" - -#~ msgid "Print host upload queue" -#~ msgstr "Druckhost Warteschlange" - -#~ msgid "Open new instance" -#~ msgstr "Neue Instanz öffnen" - -#~ msgid "Camera view" -#~ msgstr "Kameraansicht" - -#~ msgid "Show/Hide object/instance labels" -#~ msgstr "Objekt-/Kopiebeschriftungen ein-/ausblenden" - -#~ msgid "Commands" -#~ msgstr "Befehle" - -#~ msgid "Arrange selection" -#~ msgstr "Auswahl anordnen" - -#~ msgid "Add Instance of the selected object" -#~ msgstr "Kopie des gewählten Objektes hinzufügen" - -#~ msgid "Remove Instance of the selected object" -#~ msgstr "Entfernt Kopie des gewählten Objekts" - -#~ msgid "" -#~ "Press to select multiple objects\n" -#~ "or move multiple objects with mouse" -#~ msgstr "" -#~ "Drücken zum Auswählen des mehrteiligen Objekts \n" -#~ "oder Bewegen des mehrteiligen Objekts mit der Maus" - -#~ msgid "Press to activate selection rectangle" -#~ msgstr "Drücken um das Auswahlrechteck zu aktivieren" - -#~ msgid "Press to activate deselection rectangle" -#~ msgstr "Drücken um das Abwahlrechteck zu aktivieren" - -#~ msgid "Page Up" -#~ msgstr "Page Up" - -#~ msgid "Rotate selection 45 degrees CCW" -#~ msgstr "Auswahl um 45 Grad drehen gegen UZS" - -#~ msgid "Page Down" -#~ msgstr "Page Down" - -#~ msgid "Rotate selection 45 degrees CW" -#~ msgstr "Auswahl um 45 Grad drehen im UZS" - -#~ msgid "Gizmo move" -#~ msgstr "Gizmo Bewegung" - -#~ msgid "Gizmo scale" -#~ msgstr "Gizmo Skalieren" - -#~ msgid "Gizmo rotate" -#~ msgstr "Gizmo Rotieren" - -#~ msgid "Gizmo cut" -#~ msgstr "Gizmo Schnitt" - -#~ msgid "Gizmo Place face on bed" -#~ msgstr "Gizmo auf Fläche platzieren" - -#~ msgid "Gizmo SLA hollow" -#~ msgstr "Gizmo SLA Aushöhlung" - -#~ msgid "Gizmo SLA support points" -#~ msgstr "Gizmo SLA Stützpunkte" - -#~ msgid "Gizmo FDM paint-on supports" -#~ msgstr "Gizmo FDM Aufmal-Stützen" - -#~ msgid "Gizmo FDM paint-on seam" -#~ msgstr "Gizmo FDM Aufmal-Naht" - -#~ msgid "Gizmo Multi Material painting" -#~ msgstr "Gizmo Multi Material Bemalung" - -#~ msgid "Unselect gizmo or clear selection" -#~ msgstr "Gizmo abwählen oder Auswahl löschen" - -#~ msgid "Change camera type (perspective, orthographic)" -#~ msgstr "Ändern des Kameratyps (perspektivisch, orthografisch)" - -#~ msgid "Zoom to Bed" -#~ msgstr "Zoom aufs Druckbett" - -#~ msgid "" -#~ "Zoom to selected object\n" -#~ "or all objects in scene, if none selected" -#~ msgstr "" -#~ "Auf ausgewähltes Objekt zoomen\n" -#~ "oder alle Objekte in der Szene, wenn keines ausgewählt ist" - -#~ msgid "Zoom in" -#~ msgstr "Heranzoomen" - -#~ msgid "Zoom out" -#~ msgstr "Herauszoomen" - -#~ msgid "Switch between Editor/Preview" -#~ msgstr "Umschalten zwischen Editor/Vorschau" - -#~ msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" -#~ msgstr "" -#~ "Dialogfeld Einstellungen für 3Dconnexion-Geräte anzeigen/verbergen, falls " -#~ "aktiviert" - -#~ msgid "Show/Hide 3Dconnexion devices settings dialog" -#~ msgstr "Einstellungsdialog für 3Dconnexion-Geräte ein-/ausblenden" - -#~ msgid "Minimize application" -#~ msgstr "Anwendung minimieren" - -#~ msgid "Gizmo scale: Press to snap by 5%" -#~ msgstr "Gizmo Skalieren: Drücken, um um 5% zu rasten" - -#~ msgid "Gizmo scale: Scale selection to fit print volume" -#~ msgstr "" -#~ "Gizmo Skalieren: Auswahl skalieren, um in das Druckvolumen zu passen" - -#~ msgid "Gizmo scale: Press to activate one direction scaling" -#~ msgstr "Gizmo Skalieren: Drücken, um Eine-Richtung-Skalierung zu aktivieren" - -#~ msgid "Gizmo scale: Press to scale selected objects around their own center" -#~ msgstr "" -#~ "Gizmo Skalieren: Drücken, um ausgewählte Objekte um ihr eigenes Zentrum " -#~ "zu skalieren" - -#~ msgid "" -#~ "Gizmo rotate: Press to rotate selected objects around their own center" -#~ msgstr "" -#~ "Gizmo Rotieren: Drücken, um ausgewählte Objekte um ihr eigenes Zentrum zu " -#~ "drehen" - -#~ msgid "" -#~ "The following shortcuts are applicable when the specified gizmo is active" -#~ msgstr "" -#~ "Die folgenden Tastenkombinationen sind anwendbar, wenn das angegebene " -#~ "Gizmo aktiv ist" - -#~ msgid "Set selected items as Printable/Unprintable" -#~ msgstr "Ausgewählte Elemente als druckbar/ nicht druckbar festlegen" - -#~ msgid "Set default extruder for the selected items" -#~ msgstr "Standard-Extruder für die ausgewählten Elemente festlegen" - -#~ msgid "Set extruder number for the selected items" -#~ msgstr "Extrudernummer für die ausgewählten Elemente einstellen" - -#~ msgid "Show/Hide Legend and Estimated printing time" -#~ msgstr "Legende und geschätzte Druckzeit anzeigen/verbergen" - -#~ msgid "Show/Hide G-code window" -#~ msgstr "G-Code-Fenster ein-/ausblenden" - -#~ msgid "Move active thumb Up" -#~ msgstr "Aktiven Schieber nach oben bewegen" - -#~ msgid "Move active thumb Down" -#~ msgstr "Aktiven Schieber nach unten bewegen" - -#~ msgid "Set upper thumb as active" -#~ msgstr "Oberen Schieber aktiv setzen" - -#~ msgid "Set lower thumb as active" -#~ msgstr "Unteren Schieber aktiv setzen" - -#~ msgid "Add color change marker for current layer" -#~ msgstr "Fügt einen Farbwechselmarker der aktuellen Schicht hinzu" - -#~ msgid "Delete color change marker for current layer" -#~ msgstr "Löscht einen Farbwechselmarker der aktuellen Schicht" - -#~ msgid "" -#~ "Press to speed up 5 times while moving thumb\n" -#~ "with arrow keys or mouse wheel" -#~ msgstr "" -#~ "Drücken, um 5 Mal schneller zu werden, während der Regler mit Pfeiltasten " -#~ "oder Mausrad bewegt wird" - -#~ msgid "Vertical Slider" -#~ msgstr "Vertikaler Schieberegler" - -#~ msgid "" -#~ "The following shortcuts are applicable in G-code preview when the " -#~ "vertical slider is active" -#~ msgstr "" -#~ "Die folgenden Tastenkombinationen sind in der G-Code-Vorschau anwendbar, " -#~ "wenn der vertikale Schieberegler aktiv ist" - -#~ msgid "Move active thumb Left" -#~ msgstr "Aktiven Schieber nach links bewegen" - -#~ msgid "Move active thumb Right" -#~ msgstr "Aktiven Schieber nach rechts bewegen" - -#~ msgid "Set left thumb as active" -#~ msgstr "Linken Schieber aktiv setzen" - -#~ msgid "Set right thumb as active" -#~ msgstr "Rechten Schieber aktiv setzen" - -#~ msgid "Horizontal Slider" -#~ msgstr "Horizontaler Schieberegler" - -#~ msgid "" -#~ "The following shortcuts are applicable in G-code preview when the " -#~ "horizontal slider is active" -#~ msgstr "" -#~ "Die folgenden Tastenkombinationen sind in der G-Code-Vorschau anwendbar, " -#~ "wenn der horizontale Schieberegler aktiv ist" - -#~ msgid "Keyboard shortcuts" -#~ msgstr "Tastaturkürzel" - -#~ msgid "Show &Configuration Folder" -#~ msgstr "Zeige &Konfigurationsordner" - -#~ msgid "Export AMF file:" -#~ msgstr "Exportiere AMF Datei:" - -#~ msgid "Export OBJ file:" -#~ msgstr "Exportiere OBJ Datei:" - -#~ msgid "Replace from:" -#~ msgstr "Ersetzen von:" - -#~ msgid "Unable to replace with more than one volume" -#~ msgstr "Kann nicht durch mehr als ein Volumen ersetzt werden" - -#~ msgid "Error during replace" -#~ msgstr "Fehler während Ersatz" - -#~ msgid "Do you want to replace it" -#~ msgstr "Möchten Sie es ersetzen" - -#~ msgid "Reload from:" -#~ msgstr "Neuladen von:" - -#~ msgid "Unable to reload:" -#~ msgstr "Kann nicht nachgeladen werden:" - -#~ msgid "Error during reload" -#~ msgstr "Fehler beim erneuten Laden" - -#~ msgid "The provided file name is not valid." -#~ msgstr "Der angegebene Dateiname ist ungültig." - -#~ msgid "The following characters are not allowed by a FAT file system:" -#~ msgstr "Die folgenden Zeichen sind in einem FAT-Dateisystem nicht zulässig:" - -#~ msgid "All objects are outside of the print volume." -#~ msgstr "Alle Objekte befinden sich außerhalb des Druckraums." - -#~ msgid "The supplied settings will cause an empty print." -#~ msgstr "Die vorgenommenen Einstellungen führen zu einem leeren Druck." - -#~ msgid "" -#~ "The Spiral Vase option can only be used when printing single material " -#~ "objects." -#~ msgstr "" -#~ "Die Option Spiralvase kann nur beim Drucken von Objekten aus einem " -#~ "einzigen Material verwendet werden." - -#~ msgid "" -#~ "The wipe tower is only supported if all extruders have the same nozzle " -#~ "diameter and use filaments of the same diameter." -#~ msgstr "" -#~ "Der Wischturm wird nur unterstützt, wenn alle Extruder den gleichen " -#~ "Düsendurchmesser haben und Filamente mit dem gleichen Durchmesser " -#~ "verwenden." - -#~ msgid "" -#~ "The Wipe Tower is currently only supported for the Marlin, RepRap/" -#~ "Sprinter, RepRapFirmware and Repetier G-code flavors." -#~ msgstr "" -#~ "Der Wischturm wird derzeit nur für die Varianten Marlin, RepRap/Sprinter, " -#~ "RepRapFirmware und Repetier-G-Code unterstützt." - -#~ msgid "" -#~ "Ooze prevention is currently not supported with the wipe tower enabled." -#~ msgstr "" -#~ "Die Sickervermeidung wird derzeit nicht unterstützt, wenn der Wischturm " -#~ "aktiviert ist." - -#~ msgid "" -#~ "The Wipe Tower is only supported for multiple objects if they have equal " -#~ "layer heights" -#~ msgstr "" -#~ "Der Wischturm wird nur für mehrere Objekte unterstützt, wenn diese die " -#~ "gleiche Schichthöhe haben" - -#~ msgid "" -#~ "The Wipe Tower is only supported for multiple objects if they are printed " -#~ "over an equal number of raft layers" -#~ msgstr "" -#~ "Der Wischturm wird nur für mehrere Objekte unterstützt, wenn diese mit " -#~ "der gleichen Anzahl von Raftschichten gedruckt werden" - -#~ msgid "" -#~ "The Wipe Tower is only supported for multiple objects if they are sliced " -#~ "equally." -#~ msgstr "" -#~ "Der Wischturm wird nur für mehrere Objekte unterstützt, wenn diese gleich " -#~ "gesliced werden." - -#~ msgid "" -#~ "The Wipe tower is only supported if all objects have the same variable " -#~ "layer height" -#~ msgstr "" -#~ "Der Reinigungsturm wird nur unterstützt, wenn alle Objekte die gleiche " -#~ "variable Schichthöhe haben" - -#~ msgid "" -#~ "One or more object were assigned an extruder that the printer does not " -#~ "have." -#~ msgstr "" -#~ "Eines oder mehrere Objekte wurden einem Extruder zugewiesen, der auf " -#~ "diesem Drucker nicht vorhanden ist." - -#~ msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" -#~ msgstr "" -#~ "%1%=%2% mm ist zu niedrig, um auf einer Schichthöhe von %3% mm druckbar " -#~ "zu sein" - -#~ msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" -#~ msgstr "" -#~ "Übermäßig %1%=%2% mm, um mit einem Düsendurchmesser von %3% mm druckbar " -#~ "zu sein" - -#~ msgid "" -#~ "Printing with multiple extruders of differing nozzle diameters. If " -#~ "support is to be printed with the current extruder " -#~ "(support_material_extruder == 0 or support_material_interface_extruder == " -#~ "0), all nozzles have to be of the same diameter." -#~ msgstr "" -#~ "Der Druck erfolgt mit mehreren Extrudern mit unterschiedlichen " -#~ "Düsendurchmessern. Falls Stützen mit dem aktuellen Extruder gedruckt " -#~ "werden sollen (support_material_extruder == 0 oder " -#~ "support_material_interface_extruder == 0), müssen alle Druckdüsen den " -#~ "gleichen Durchmesser aufweisen." - -#~ msgid "First layer height can't be greater than nozzle diameter" -#~ msgstr "" -#~ "Schichthöhe der ersten Schicht darf nicht größer sein als der " -#~ "Düsendurchmesser" - -#~ msgid "Layer height can't be greater than nozzle diameter" -#~ msgstr "Schichthöhe darf nicht größer sein als der Düsendurchmesser" - -#~ msgid "Infilling layers" -#~ msgstr "Fülle Schichten" - -#~ msgid "Generating skirt and brim" -#~ msgstr "Erzeuge Schürtze und Rand" - -#~ msgid "Skirt" -#~ msgstr "Schürze" - -#~ msgid "Skirt Loops" -#~ msgstr "Schleifen für die Schürze" - -#~ msgid "Same as top" -#~ msgstr "Gleich wie oben" - -#~ msgid "Drag and drop G-code file" -#~ msgstr "G-Code-Datei ziehen und ablegen" - -#~ msgid "Skirt/Brim" -#~ msgstr "Schürze/Rand" - -#~ msgid "Mixed" -#~ msgstr "Gemischt" - -#~ msgid "Printer technology" -#~ msgstr "Druckertechnologie" - -#~ msgid "Between objects G-code" -#~ msgstr "G-Code zwischen Objekten" - -#~ msgid "Bridges" -#~ msgstr "Überbrückungen" - -#~ msgid "Label objects" -#~ msgstr "Objekte benennen" - -#~ msgid "0 (no open anchors)" -#~ msgstr "0 (keine offenen Anker)" - -#~ msgid "1 mm" -#~ msgstr "1 mm" - -#~ msgid "2 mm" -#~ msgstr "2 mm" - -#~ msgid "5 mm" -#~ msgstr "5 mm" - -#~ msgid "10 mm" -#~ msgstr "10 mm" - -#~ msgid "1000 (unlimited)" -#~ msgstr "1000 (unbegrenzt)" - -#~ msgid "Maximum length of the infill anchor" -#~ msgstr "Maximale Länge des Infill-Ankers" - -#~ msgid "0 (not anchored)" -#~ msgstr "0 (nicht verankert)" - -#~ msgid "Inherits profile" -#~ msgstr "Übernimmt Profil" - -#~ msgid "Interface shells" -#~ msgstr "Schnittstellenshells" - -#~ msgid "After layer change G-code" -#~ msgstr "G-Code am Schichtende" - -#~ msgid "Perimeter" -#~ msgstr "Außenkontur" - -#~ msgid "Printer type" -#~ msgstr "Druckertyp" - -#~ msgid "Printer variant" -#~ msgstr "Druckervariante" - -#~ msgid "Retract on layer change" -#~ msgstr "Bei Schichtwechsel einziehen" - -#~ msgid "Retraction Length (Toolchange)" -#~ msgstr "Einzugslänge (Werkzeugwechsel)" - -#~ msgid "Extra length on restart" -#~ msgstr "Extra Länge bei Neustart" - -#~ msgid "Skirt height" -#~ msgstr "Schürzenhöhe" - -#~ msgid "Draft shield" -#~ msgstr "Windschutz" - -#~ msgid "Disabled" -#~ msgstr "Deaktiviert" - -#~ msgid "Limited" -#~ msgstr "Begrenzt" - -#~ msgid "Enabled" -#~ msgstr "Aktiviert" - -#~ msgid "Solid infill" -#~ msgstr "Massives Infill" - -#~ msgid "Solid layers" -#~ msgstr "Massive Schichten" - -#~ msgid "Number of solid layers to generate on top and bottom surfaces." -#~ msgstr "" -#~ "Anzahl der zu erzeugenden massiven Schichten auf der Ober- und Unterseite." - -#~ msgid "Minimum thickness of a top / bottom shell" -#~ msgstr "Mindeststärke einer Ober-/Bodenschale" - -#~ msgid "Single Extruder Multi Material" -#~ msgstr "Einzelextruder mit Multi-Material" - -#~ msgid "Prime all printing extruders" -#~ msgstr "Alle Druckextruder vorfüllen" - -#~ msgid "No sparse layers (EXPERIMENTAL)" -#~ msgstr "Keine spärlichen Schichten (EXPERIMENTELL)" - -#~ msgid "Slice gap closing radius" -#~ msgstr "Slice Lückenschlussradius" - -#~ msgid "Slicing Mode" -#~ msgstr "Slice-Modus" - -#~ msgid "Regular" -#~ msgstr "Normal" - -#~ msgid "Even-odd" -#~ msgstr "Gerade-ungerade" - -#~ msgid "Close holes" -#~ msgstr "Löcher schließen" - -#~ msgid "Bottom contact Z distance" -#~ msgstr "Boden Kontakt Z Abstand" - -#~ msgid "Enforce support for the first" -#~ msgstr "Erzwinge Stützen bei den ersten" - -#~ msgid "Enforce support for the first n layers" -#~ msgstr "Erzwinge Stützen bei den ersten n Schichten" - -#~ msgid "Closing radius" -#~ msgstr "Schließradius" - -#~ msgid "Z travel" -#~ msgstr "Z Eilgang" - -#~ msgid "%1$d Object was loaded with custom supports." -#~ msgid_plural "%1$d Objects were loaded with custom supports." -#~ msgstr[0] "%1$d Objekt wurde mit angepassten Stützen geladen." -#~ msgstr[1] "%1$d Objekte wurden mit angepassten Stützen geladen." - -#~ msgid "%1$d Object was loaded with custom seam." -#~ msgid_plural "%1$d Objects were loaded with custom seam." -#~ msgstr[0] "%1$d Objekt wurde mit angepasster Naht geladen." -#~ msgstr[1] "%1$d Objekte wurden mit angepasster Naht geladen." - -#~ msgid "%1$d Object was loaded with multimaterial painting." -#~ msgid_plural "%1$d Objects were loaded with multimaterial painting." -#~ msgstr[0] "%1$d Objekt wurde mit Multimaterial-Bemalung geladen." -#~ msgstr[1] "%1$d Objekte wurden mit Multimaterial-Bemalung geladen." - -#~ msgid "%1$d Object was loaded with partial sinking." -#~ msgid_plural "%1$d Objects were loaded with partial sinking." -#~ msgstr[0] "%1$d Objekt wurde mit teilweiser Absenkung geladen." -#~ msgstr[1] "%1$d Objekte wurden mit teilweiser Absenkung geladen." - -#~ msgid "" -#~ "Some fields are too long to fit. Right mouse click reveals the full text." -#~ msgstr "" -#~ "Einige Texte sind zu lang. Ein rechter Mausklick zeigt den vollständigen " -#~ "Text an." - -#~ msgid "All settings changes will not be saved" -#~ msgstr "Alle Einstellungsänderungen werden nicht gesichert." - -#~ msgid "All settings changes will be discarded." -#~ msgstr "Alle Einstellungsänderungen werden verworfen." - -#~ msgid "Keep the selected settings." -#~ msgstr "Die gewählten Einstellungen werden beibehalten." - -#~ msgid "Transfer the selected settings to the newly selected preset." -#~ msgstr "" -#~ "Übertragen der gewählten Einstellungen auf die neu gewählte " -#~ "Voreinstellung." - -#~ msgid "Preset \"%1%\" has the following unsaved changes:" -#~ msgstr "" -#~ "Die \"%1%\" Voreinstellung hat die folgenden ungespeicherten Änderungen:" - -#~ msgid "" -#~ "Preset \"%1%\" is not compatible with the new printer profile and it has " -#~ "the following unsaved changes:" -#~ msgstr "" -#~ "Die \"%1%\" Voreinstellung ist mit dem neuen Druckerprofil nicht " -#~ "kompatibel und weist die folgenden ungespeicherten Änderungen auf:" - -#~ msgid "" -#~ "Preset \"%1%\" is not compatible with the new print profile and it has " -#~ "the following unsaved changes:" -#~ msgstr "" -#~ "Die \"%1%\" Voreinstellung ist mit dem neuen Druckprofil nicht kompatibel " -#~ "und weist die folgenden ungespeicherten Änderungen auf:" - -#~ msgid "Show all presets (including incompatible)" -#~ msgstr "Alle Voreinstellungen anzeigen (auch inkompatible)" - -#~ msgid "Left Preset Value" -#~ msgstr "Linker voreingestellter Wert" - -#~ msgid "Right Preset Value" -#~ msgstr "Rechter voreingestellter Wert" - -#~ msgid "Compare Presets" -#~ msgstr "Voreinstellungen vergleichen" - -#~ msgid "One of the presets doesn't found" -#~ msgstr "Eine der Voreinstellungen wird nicht gefunden" - -#~ msgid "Compared presets has different printer technology" -#~ msgstr "" -#~ "Verglichene Voreinstellungen haben unterschiedliche Druckertechnologie" - -#~ msgid "Presets are the same" -#~ msgstr "Voreinstellungen sind gleich" - -#~ msgid "" -#~ "Presets are different.\n" -#~ "Click this button to select the same preset for the right and left preset." -#~ msgstr "" -#~ "Voreinstellungen sind unterschiedlich.\n" -#~ "Klicken Sie auf diese Schaltfläche, um dieselbe Voreinstellung für die " -#~ "rechte und linke Voreinstellung auszuwählen." - -#~ msgid "Undef category" -#~ msgstr "Kategorie nicht definieren" - -#~ msgid "Undef group" -#~ msgstr "Gruppe nicht definieren" - -#~ msgid "Eigen vectorization supported:" -#~ msgstr "Eigen Vektorisierung unterstützt:" - -#~ msgid "Data to send" -#~ msgstr "Daten zum Senden" - -#~ msgid "Send system info" -#~ msgstr "Sende Systeminfo" - -#~ msgid "" -#~ "This is the first time you are running %1%. We would like to ask you to " -#~ "send some of your system information to us. This will only happen once " -#~ "and we will not ask you to do this again (only after you upgrade to the " -#~ "next version)." -#~ msgstr "" -#~ "Dies ist das erste Mal, dass Sie %1% ausführen. Wir möchten Sie bitten, " -#~ "einige Ihrer Systeminformationen an uns zu senden. Dies geschieht nur " -#~ "einmal und wir werden Sie nicht noch einmal dazu auffordern (erst nach " -#~ "dem Upgrade auf die nächste Version)." - -#~ msgid "" -#~ "If we know your hardware, operating system, etc., it will greatly help us " -#~ "in development and prioritization, because we will be able to focus our " -#~ "effort more efficiently and spend time on features that are needed the " -#~ "most." -#~ msgstr "" -#~ "Wenn wir Ihre Hardware, Ihr Betriebssystem usw. kennen, hilft uns das " -#~ "sehr bei der Entwicklung und der Festlegung von Prioritäten, denn so " -#~ "können wir unsere Arbeit effizienter gestalten und uns auf die Funktionen " -#~ "konzentrieren, die am dringendsten benötigt werden." - -#~ msgid "Is it safe?" -#~ msgstr "Ist das sicher?" - -#~ msgid "Show verbatim data that will be sent" -#~ msgstr "Ausführlich Daten anzeigen, die gesendet werden" - -#~ msgid "Ask me next time" -#~ msgstr "Mich das nächste Mal fragen" - -#~ msgid "Do not send anything" -#~ msgstr "Nichts senden" - -#~ msgid "System info sent successfully. Thank you." -#~ msgstr "Systeminfo erfolgreich gesendet. Dankeschön." - -#~ msgid "Sending system info failed!" -#~ msgstr "Senden von Systeminformationen fehlgeschlagen!" - -#~ msgid "Sending system info was cancelled." -#~ msgstr "Senden von Systeminformationen wurde abgebrochen." - -#~ msgid "Sending system info..." -#~ msgstr "Sende Systeminfo..." - -#~ msgid "Changing of an application language" -#~ msgstr "Wechsele die Anwendungssprache" - -#~ msgid "Bed filling canceled." -#~ msgstr "Bettfüllen abgebrochen." - -#~ msgid "Bed filling done." -#~ msgstr "Bett füllen abgeschlossen." - -#~ msgid "Orientation search canceled." -#~ msgstr "Ausrichtungssuche abgebrochen." - -#~ msgid "Orientation found." -#~ msgstr "Ausrichtung gefunden." - -#~ msgid "Filling bed" -#~ msgstr "Bett füllen" - -#~ msgid "Searching for optimal orientation" -#~ msgstr "Suche nach der optimalen Orientierung" - -#~ msgid "Tool position" -#~ msgstr "Werkzeugposition" - -#~ msgid "Generating toolpaths" -#~ msgstr "Generiere Werkzeugwege" - -#~ msgid "Generating vertex buffer" -#~ msgstr "Erzeuge den Vertex-Puffer" - -#~ msgid "Generating index buffers" -#~ msgstr "Generiere Indexpuffer" - -#~ msgid "Click to hide" -#~ msgstr "Klicken zum Ausblenden" - -#~ msgid "Click to show" -#~ msgstr "Klicken zum Anzeigen" - -#~ msgid "Percentage" -#~ msgstr "Prozent" - -#~ msgid "Feature type" -#~ msgstr "Merkmalstyp" - -#~ msgid "Height (mm)" -#~ msgstr "Höhe (mm)" - -#~ msgid "Width (mm)" -#~ msgstr "Breite (mm)" - -#~ msgid "Stealth mode" -#~ msgstr "Stealth Modus" - -#~ msgid "Show stealth mode" -#~ msgstr "Stealth Modus anzeigen" - -#~ msgid "Show normal mode" -#~ msgstr "Normalen Modus zeigen" - -#~ msgid "" -#~ "Copying of the temporary G-code to the output G-code failed. Maybe the SD " -#~ "card is write locked?\n" -#~ "Error message: %1%" -#~ msgstr "" -#~ "Das Kopieren des temporären G-Codes auf den Ausgabe-G-Code ist " -#~ "fehlgeschlagen. Vielleicht ist die SD-Karte schreibgeschützt?\n" -#~ "Fehlermeldung: %1%" - -#~ msgid "" -#~ "%s has encountered an error. It was likely caused by running out of " -#~ "memory. If you are sure you have enough RAM on your system, this may also " -#~ "be a bug and we would be glad if you reported it." -#~ msgstr "" -#~ "%s ist auf einen Fehler gestoßen. Es wurde wahrscheinlich dadurch " -#~ "verursacht, dass der Speicher knapp wird. Wenn Sie sicher sind, dass Sie " -#~ "genügend RAM auf Ihrem System haben, kann dies auch ein Programmfehler " -#~ "sein, und wir würden uns freuen, wenn Sie ihn melden würden." - -#~ msgid "Masked SLA file exported to %1%" -#~ msgstr "Maskierte SLA-Datei exportiert nach %1%" - -#~ msgid "Running post-processing scripts" -#~ msgstr "Post-Prozess Scripts werden ausgeführt" - -#~ msgid "Unknown error occured during exporting G-code." -#~ msgstr "Unbekannter Fehler trat beim Exportieren von G-Code auf." - -#~ msgid "" -#~ "Copying of the temporary G-code to the output G-code failed. There might " -#~ "be problem with target device, please try exporting again or using " -#~ "different device. The corrupted output G-code is at %1%.tmp." -#~ msgstr "" -#~ "Das Kopieren des temporären G-Codes auf den Ausgabe-G-Code ist " -#~ "fehlgeschlagen. Es könnte ein Problem mit dem Zielgerät vorliegen, bitte " -#~ "versuchen Sie erneut zu exportieren oder ein anderes Gerät zu verwenden. " -#~ "Der beschädigte Ausgabe-G-Code liegt in %1%.tmp." - -#~ msgid "" -#~ "Renaming of the G-code after copying to the selected destination folder " -#~ "has failed. Current path is %1%.tmp. Please try exporting again." -#~ msgstr "" -#~ "Das Umbenennen des G-Codes nach dem Kopieren in den ausgewählten " -#~ "Zielordner ist fehlgeschlagen. Der aktuelle Pfad ist %1%.tmp. Bitte " -#~ "versuchen Sie erneut zu exportieren." - -#~ msgid "" -#~ "Copying of the temporary G-code has finished but the original code at %1% " -#~ "couldn't be opened during copy check. The output G-code is at %2%.tmp." -#~ msgstr "" -#~ "Das Kopieren des temporären G-Codes ist abgeschlossen, aber der " -#~ "Originalcode aus %1% konnte während der Kopierprüfung nicht geöffnet " -#~ "werden. Der ausgegebene G-Code liegt in %2%.tmp." - -#~ msgid "" -#~ "Copying of the temporary G-code has finished but the exported code " -#~ "couldn't be opened during copy check. The output G-code is at %1%.tmp." -#~ msgstr "" -#~ "Das Kopieren des temporären G-Codes ist abgeschlossen, aber der " -#~ "exportierte Code konnte während der Kopierprüfung nicht geöffnet werden. " -#~ "Der Ausgabe-G-Code liegt in %1%.tmp." - -#~ msgid "G-code file exported to %1%" -#~ msgstr "G-Code Datei exportiert nach %1%" - -#~ msgid "" -#~ "If estimated layer time is below ~%1%s, fan will run at %2%%% and print " -#~ "speed will be reduced so that no less than %3%s are spent on that layer " -#~ "(however, speed will never be reduced below %4%mm/s)." -#~ msgstr "" -#~ "Wenn die geschätzte Schichtzeit unter ~%1%s liegt, läuft der Lüfter mit " -#~ "%2%%% und die Druckgeschwindigkeit wird reduziert, so dass nicht weniger " -#~ "als %3%s für diese Schicht verwendet werden (die Geschwindigkeit wird " -#~ "jedoch nie unter %4%mm/s reduziert)." - -#~ msgid "" -#~ "If estimated layer time is greater, but still below ~%1%s, fan will run " -#~ "at a proportionally decreasing speed between %2%%% and %3%%%." -#~ msgstr "" -#~ "Falls die erwartete Schichtdruckzeit größer, aber noch unterhalb von ~" -#~ "%1%s ist, wird der Lüfter mit einer sich proportional verringernden " -#~ "Geschwindigkeit zwischen %2%%% und %3%%% laufen." - -#~ msgid "" -#~ "If estimated layer time is greater, but still below ~%1%s, fan will run " -#~ "at %2%%%" -#~ msgstr "" -#~ "Wenn die geschätzte Schichtzeit größer ist, aber immer noch unter ~%1%s " -#~ "liegt, läuft der Lüfter mit %2%%%" - -#~ msgid "" -#~ "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%." -#~ msgstr "" -#~ "Die Lüfterdrehzahl wird rampenförmig von Null bei Schicht %1% auf %2%%% " -#~ "bei Schicht %3% erhöht." - -#~ msgid "During the other layers, fan will always run at %1%%%" -#~ msgstr "Bei den anderen Schichten läuft der Lüfter immer mit %1%%%" - -#~ msgid "Fan will always run at %1%%%" -#~ msgstr "Der Lüfter läuft immer mit %1%%%" - -#~ msgid "except for the first %1% layers." -#~ msgstr "außer für die ersten %1% Schichten." - -#~ msgid "except for the first layer." -#~ msgstr "außer für die erste Schicht." - -#~ msgid "During the other layers, fan will be turned off." -#~ msgstr "Bei den anderen Schichten wird der Lüfter ausgeschaltet." - -#~ msgid "Fan will be turned off." -#~ msgstr "Der Lüfter wird ausgeschaltet." - -#~ msgid "external perimeters" -#~ msgstr "Außenkonturen" - -#~ msgid "perimeters" -#~ msgstr "Außenkonturen" - -#~ msgid "infill" -#~ msgstr "Infill" - -#~ msgid "solid infill" -#~ msgstr "Massives Infill" - -#~ msgid "top solid infill" -#~ msgstr "Oberes massives Infill" - -#~ msgid "support" -#~ msgstr "Stützen" - -#~ msgid "support interface" -#~ msgstr "Schnittstelle zu den Stützen" - -#~ msgid "First layer volumetric" -#~ msgstr "Volumenparameter der ersten Schicht" - -#~ msgid "Bridging volumetric" -#~ msgstr "Überbrückungvolumen" - -#~ msgid "Volumetric" -#~ msgstr "Volumetrisch" - -#~ msgid "flow rate is maximized" -#~ msgstr "die Durchflussmenge ist am Maximum" - -#~ msgid "by the print profile maximum" -#~ msgstr "mit dem Maximum des Druckerprofils" - -#~ msgid "when printing" -#~ msgstr "während dem Druck" - -#~ msgid "with a volumetric rate" -#~ msgstr "mit einer Volumenrate von" - -#~ msgid "%3.2f mm³/s at filament speed %3.2f mm/s." -#~ msgstr "%3.2f mm³/s mit einer Filamentgeschwindigkeit von %3.2f mm/s." - -#~ msgid "" -#~ "Recommended object thin wall thickness: Not available due to invalid " -#~ "layer height." -#~ msgstr "" -#~ "Empfohlene Stärke der dünnen Wände des Objekts: Nicht verfügbar wegen " -#~ "unzulässiger Schichthöhe." - -#~ msgid "Recommended object thin wall thickness for layer height %.2f and" -#~ msgstr "" -#~ "Empfohlene Stärke der dünnen Wände des Objekts für die Schichthöhe %.2f " -#~ "und" - -#~ msgid "%d lines: %.2f mm" -#~ msgstr "%d Linien: %.2f mm" - -#~ msgid "" -#~ "Recommended object thin wall thickness: Not available due to excessively " -#~ "small extrusion width." -#~ msgstr "" -#~ "Empfohlene Stärke der dünnen Wände des Objekts: Nicht verfügbar wegen " -#~ "extrem geringer Extrusionsbreite." - -#~ msgid "" -#~ "Top / bottom shell thickness hint: Not available due to invalid layer " -#~ "height." -#~ msgstr "" -#~ "Hinweis zur Ober-/Bodenschalestärke: Nicht verfügbar wegen ungültiger " -#~ "Schichthöhe." - -#~ msgid "Top shell is %1% mm thick for layer height %2% mm." -#~ msgstr "Die obere Schale ist %1% mm stark für eine Schichthöhe von %2% mm." - -#~ msgid "Minimum top shell thickness is %1% mm." -#~ msgstr "Die Mindeststärke der Oberschale beträgt %1% mm." - -#~ msgid "Top is open." -#~ msgstr "Oben ist offen." - -#~ msgid "Bottom shell is %1% mm thick for layer height %2% mm." -#~ msgstr "Die Bodenschale ist %1% mm stark für eine Schichthöhe von %2% mm." - -#~ msgid "Minimum bottom shell thickness is %1% mm." -#~ msgstr "Die Mindeststärke der Bodenschale beträgt %1% mm." - -#~ msgid "Bottom is open." -#~ msgstr "Boden ist offen." - -#~ msgid "Post processing scripts shall modify G-code file in place." -#~ msgstr "" -#~ "Nachbearbeitungsskripte sollen die G-Code-Datei an ihrem Speicherort " -#~ "ändern." - -#~ msgid "There is an object with no extrusions in the first layer." -#~ msgstr "In der ersten Schicht gibt es ein Objekt ohne Extrusionen." - -#~ msgid "Empty layer between %1% and %2%." -#~ msgstr "Leere Schicht zwischen %1% und %2%." - -#~ msgid "(Some lines not shown)" -#~ msgstr "(Einige Zeilen nicht gezeigt)" - -#~ msgid "Object name: %1%" -#~ msgstr "Objekt Name: %1%" - -#~ msgid "" -#~ "Make sure the object is printable. This is usually caused by negligibly " -#~ "small extrusions or by a faulty model. Try to repair the model or change " -#~ "its orientation on the bed." -#~ msgstr "" -#~ "Stellen Sie sicher, dass das Objekt druckbar ist. Dies wird in der Regel " -#~ "durch vernachlässigbar kleine Extrusionen oder durch ein fehlerhaftes " -#~ "Modell verursacht. Versuchen Sie, das Modell zu reparieren oder seine " -#~ "Ausrichtung auf dem Bett zu ändern." - -#~ msgid "Tool change G-code" -#~ msgstr "G-Code für Werkzeugwechsel" - -#~ msgid "Between objects G-code (for sequential printing)" -#~ msgstr "G-Code zwischen Objekten (Sequentielles Drucken)" - -#~ msgid "Filament Start G-code" -#~ msgstr "Filament Start G-code" - -#~ msgid "Filament End G-code" -#~ msgstr "Filament Ende G-code" - -#~ msgid "In the custom G-code were found reserved keywords:" -#~ msgstr "" -#~ "In dem benutzerdefinierten G-Code wurden reservierte Schlüsselwörter " -#~ "gefunden:" - -#~ msgid "" -#~ "This may cause problems in g-code visualization and printing time " -#~ "estimation." -#~ msgstr "" -#~ "Dies kann zu Problemen bei der Visualisierung des G-Codes und der " -#~ "Schätzung der Druckzeit führen." - -#~ msgid "" -#~ "Your print is very close to the priming regions. Make sure there is no " -#~ "collision." -#~ msgstr "" -#~ "Ihr Druck ist sehr nahe an den Priming-Bereichen. Stellen Sie sicher, " -#~ "dass es keine Kollision gibt." - -#~ msgid "Wipe tower" -#~ msgstr "Reinigungsturm" - -#~ msgid "" -#~ "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." -#~ msgstr "" -#~ "Kann die Extrusionsbreite für %1% nicht berechnen: Variable \"%2%\" nicht " -#~ "zugänglich." - -#~ msgid "Generating perimeters" -#~ msgstr "Generiere Außenkonturen" - -#~ msgid "Preparing infill" -#~ msgstr "Infill wird vorbereitet" - -#~ msgid "Generating support material" -#~ msgstr "Generiere Stützmaterial" - -#~ msgid "" -#~ "Layer height is not valid.\n" -#~ "\n" -#~ "The layer height will be reset to 0.01." -#~ msgstr "" -#~ "Die Schichthöhe ist nicht gültig.\n" -#~ "\n" -#~ "Die Schichthöhe wird auf 0,01 zurückgesetzt." - -#~ msgid "" -#~ "First layer height is not valid.\n" -#~ "\n" -#~ "The first layer height will be reset to 0.01." -#~ msgstr "" -#~ "Die Höhe der ersten Schicht ist nicht gültig.\n" -#~ "\n" -#~ "Die Höhe der ersten Schicht wird auf 0,01 zurückgesetzt." - -#~ msgid "First layer height" -#~ msgstr "Höhe der ersten Schicht" - -#~ msgid "Shall I adjust those settings in order to enable Spiral Vase?" -#~ msgstr "" -#~ "Soll ich diese Einstellungen anpassen, um die Spiralvase zu aktivieren?" - -#~ msgid "Spiral Vase" -#~ msgstr "Spiralvasenmodus" - -#~ msgid "" -#~ "Supports work better, if the following feature is enabled:\n" -#~ "- Detect bridging perimeters" -#~ msgstr "" -#~ "Stützen funktionieren besser, wenn die folgende Funktion aktiviert ist:\n" -#~ "- Erkennen von Umfangbrücken" - -#~ msgid "Shall I adjust those settings for supports?" -#~ msgstr "Soll ich diese Einstellungen für Stützen anpassen?" - -#~ msgid "Support Generator" -#~ msgstr "Stütz-Generator" - -#~ msgid "The %1% infill pattern is not supposed to work at 100%% density." -#~ msgstr "" -#~ "Das %1% Füllmuster ist nicht für die Arbeit mit 100%% Dichte vorgesehen." - -#~ msgid "Shall I switch to rectilinear fill pattern?" -#~ msgstr "Soll ich auf geradliniges Füllmuster wechseln?" - -#~ msgid "Head penetration should not be greater than the head width." -#~ msgstr "Die Kopfeindringung sollte nicht größer als die Kopfbreite sein." - -#~ msgid "Invalid Head penetration" -#~ msgstr "Ungültige Eindringtiefe des Stützkopfes" - -#~ msgid "Pinhead diameter should be smaller than the pillar diameter." -#~ msgstr "" -#~ "Der Nadelkopfdurchmesser sollte kleiner sein als der Säulendurchmesser." - -#~ msgid "Invalid pinhead diameter" -#~ msgstr "Ungültiger Nadelkopfdurchmesser" - -#~ msgid "" -#~ "Processing model '%1%' with more than 1M triangles could be slow. It is " -#~ "highly recommend to reduce amount of triangles." -#~ msgstr "" -#~ "Die Verarbeitung des Modells '%1%' mit mehr als 1M Dreiecken könnte " -#~ "langsam sein. Es wird dringend empfohlen, die Anzahl der Dreiecke zu " -#~ "reduzieren." - -#~ msgid "Post-processing scripts" -#~ msgstr "Nachbearbeitungs Script" - -#~ msgid "Print speed override" -#~ msgstr "Korrektur der Druckgeschwindigkeit" - -#~ msgid "Print Host upload" -#~ msgstr "Hochladen zum Druckhost" - -#~ msgid "" -#~ "The Wipe Tower is currently not supported for multimaterial sequential " -#~ "prints." -#~ msgstr "" -#~ "Der Wischturm wird derzeit nicht für sequentielle Multimaterialdrucke " -#~ "unterstützt." - -#~ msgid "Names of presets related to the physical printer" -#~ msgstr "" -#~ "Namen der Voreinstellungen, die sich auf den physischen Drucker beziehen" - -#~ msgid "Compatible printers" -#~ msgstr "Kompatible Drucker" - -#~ msgid "Compatible printers condition" -#~ msgstr "Kompatible Druckerbedingung" - -#~ msgid "" -#~ "A boolean expression using the configuration values of an active printer " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active printer profile." -#~ msgstr "" -#~ "Ein boolescher Ausdruck, der die Konfigurationswerte eines aktiven " -#~ "Druckerprofils verwendet. Wenn dieser Ausdruck als wahr bewertet wird, " -#~ "wird dieses Profil als kompatibel mit dem aktiven Druckerprofil angesehen." - -#~ msgid "Compatible print profiles" -#~ msgstr "Kompatible Druckprofile" - -#~ msgid "Compatible print profiles condition" -#~ msgstr "Kompatible Druckprofile Bedingung" - -#~ msgid "" -#~ "A boolean expression using the configuration values of an active print " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active print profile." -#~ msgstr "" -#~ "Ein boolescher Ausdruck, der die Konfigurationswerte eines aktiven " -#~ "Druckprofils verwendet. Wenn dieser Ausdruck als wahr bewertet wird, wird " -#~ "dieses Profil als kompatibel mit dem aktiven Druckprofil angesehen." - -#~ msgid "Aligned Rectilinear" -#~ msgstr "Ausgerichtet Geradlinig" - -#~ msgid "Hilbert Curve" -#~ msgstr "Hilbertkurve" - -#~ msgid "Archimedean Chords" -#~ msgstr "Archimedische Bögen" - -#~ msgid "Octagram Spiral" -#~ msgstr "Achterstern-Spirale" - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for external " -#~ "perimeters. If left zero, default extrusion width will be used if set, " -#~ "otherwise 1.125 x nozzle diameter will be used. If expressed as " -#~ "percentage (for example 200%), it will be computed over layer height." -#~ msgstr "" -#~ "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle " -#~ "Extrusionsbreite für externe Außenkonturen anzugeben. Falls auf null " -#~ "belassen, wird die Standard-Extrusionsbreite verwendet (falls angeben), " -#~ "ansonsten wird der Durchmesser der Druckdüse x 1,125 verwendet. Falls als " -#~ "Prozentwert (z.B. 200%) angegeben, wird dieser ausgehend von der " -#~ "Schichthöhe berechnet." - -#~ msgid "" -#~ "This separate setting will affect the speed of external perimeters (the " -#~ "visible ones). If expressed as percentage (for example: 80%) it will be " -#~ "calculated on the perimeters speed setting above. Set to zero for auto." -#~ msgstr "" -#~ "Diese separate Einstellung wirkt sich auf die Geschwindigkeit der äußeren " -#~ "(sichtbaren) Außenkonturen aus. Als Prozentwert eingegeben (z.B. 80%), " -#~ "wird sie ausgehend von der obigen Geschwindigkeitseinstellung für " -#~ "Außenkonturen berechnet. Für die automatische Berechnung auf null setzen." - -#~ msgid "Extra perimeters if needed" -#~ msgstr "Extra Konturen wenn notwendig" - -#, fuzzy -#~ msgid "" -#~ "Add more perimeters when needed for avoiding gaps in sloping walls. " -#~ "Slic3r keeps adding perimeters, until more than 70% of the loop " -#~ "immediately above is supported." -#~ msgstr "" -#~ "Fügen Sie bei Bedarf weitere Perimeter hinzu, um Spalten in schrägen " -#~ "Wänden zu vermeiden. PrusaSlicer fügt immer wieder Perimeter hinzu, bis " -#~ "mehr als 70% der unmittelbar darüber liegenden Schleife unterstützt " -#~ "werden." - -#~ msgid "" -#~ "The extruder to use (unless more specific extruder settings are " -#~ "specified). This value overrides perimeter and infill extruders, but not " -#~ "the support extruders." -#~ msgstr "" -#~ "Der Extruder, der verwendet werden soll, falls keine sonstigen " -#~ "Extrudereinstellungen angegeben wurden. Dies übersteuert die Angaben für " -#~ "die Außenkontur- und Infill-Extruder, aber nicht die Angabe des Extruders " -#~ "für die Stützen." - -#~ msgid "" -#~ "Set this to the vertical distance between your nozzle tip and (usually) " -#~ "the X carriage rods. In other words, this is the height of the clearance " -#~ "cylinder around your extruder, and it represents the maximum depth the " -#~ "extruder can peek before colliding with other printed objects." -#~ msgstr "" -#~ "Stellen Sie dies auf den vertikalen Abstand zwischen Ihrer Düsenspitze " -#~ "und (in der Regel) den X-Wagenstangen ein. Mit anderen Worten, das ist " -#~ "die Höhe des Abstandszylinders um Ihren Extruder herum und stellt die " -#~ "maximale Tiefe dar, die der Extruder vor der Kollision mit anderen " -#~ "Druckobjekten sehen kann." - -#~ msgid "" -#~ "Set this to the clearance radius around your extruder. If the extruder is " -#~ "not centered, choose the largest value for safety. This setting is used " -#~ "to check for collisions and to display the graphical preview in the " -#~ "plater." -#~ msgstr "" -#~ "Stellen Sie dies auf den Freiraumradius um Ihren Extruder ein. Wenn der " -#~ "Extruder nicht zentriert ist, wählen Sie zur Sicherheit den größten " -#~ "Wert. Diese Einstellung wird verwendet, um Kollisionen zu prüfen und die " -#~ "grafische Vorschau auf der Druckplatte anzuzeigen." - -#~ msgid "This is only used in the Slic3r interface as a visual help." -#~ msgstr "" -#~ "Dies wird nur als visuelles Hilfsmittel in der PrusaSlicer-" -#~ "Benutzeroberfläche verwendet." - -#~ msgid "" -#~ "If your firmware doesn't handle the extruder displacement you need the G-" -#~ "code to take it into account. This option lets you specify the " -#~ "displacement of each extruder with respect to the first one. It expects " -#~ "positive coordinates (they will be subtracted from the XY coordinate)." -#~ msgstr "" -#~ "Wenn Ihre Firmware die Verschiebung des Extruders nicht beherrscht, " -#~ "benötigen Sie den G-Code, um sie zu berücksichtigen. Mit dieser Option " -#~ "können Sie die Verschiebung jedes Extruders in Bezug auf den ersten " -#~ "Extruder festlegen. Es erwartet positive Koordinaten (sie werden von der " -#~ "XY-Koordinate subtrahiert)." - -#~ msgid "Extrusion multiplier" -#~ msgstr "Extrusionsfaktor" - -#~ msgid "" -#~ "This factor changes the amount of flow proportionally. You may need to " -#~ "tweak this setting to get nice surface finish and correct single wall " -#~ "widths. Usual values are between 0.9 and 1.1. If you think you need to " -#~ "change this more, check filament diameter and your firmware E steps." -#~ msgstr "" -#~ "Dieser Faktor ändert die Extrusionsmenge proportional. Sie müssen diese " -#~ "Einstellung möglicherweise anpassen, um schöne Oberflächen und korrekte " -#~ "Hüllenstärken zu erhalten. Die üblichen Werte bewegen sich zwischen 0,9 " -#~ "und 1,1. Falls Sie größere Anpassungen eingeben müssen, kontrollieren Sie " -#~ "auch den Filamentdurchmesser und die E-Schritte in Ihrer Firmware." - -#~ msgid "" -#~ "Set this to a non-zero value to allow a manual extrusion width. If left " -#~ "to zero, Slic3r derives extrusion widths from the nozzle diameter (see " -#~ "the tooltips for perimeter extrusion width, infill extrusion width etc). " -#~ "If expressed as percentage (for example: 230%), it will be computed over " -#~ "layer height." -#~ msgstr "" -#~ "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle " -#~ "Extrusionsbreite zuzulassen. Falls auf null belassen, wird PrusaSlicer " -#~ "die Extrusionsbreiten vom Durchmesser der Druckdüse ableiten (siehe die " -#~ "Hilfstexte für die Extrusionsbreite für Außenkonturen, Infill usw.). " -#~ "Falls als Prozentwert (z.B. 230%) angegeben, wird dieser ausgehend von " -#~ "der Schichthöhe berechnet." - -#~ msgid "" -#~ "If this is enabled, fan will never be disabled and will be kept running " -#~ "at least at its minimum speed. Useful for PLA, harmful for ABS." -#~ msgstr "" -#~ "Wenn diese Option aktiviert ist, wird der Lüfter niemals deaktiviert und " -#~ "läuft mindestens mit seiner Minimaldrehzahl weiter. Sinnvoll für PLA, " -#~ "ungeignet für ABS." - -#~ msgid "" -#~ "If layer print time is estimated below this number of seconds, fan will " -#~ "be enabled and its speed will be calculated by interpolating the minimum " -#~ "and maximum speeds." -#~ msgstr "" -#~ "Wenn die Druckzeit der Ebenen unter dieser Anzahl von Sekunden liegt, " -#~ "wird der Lüfter aktiviert und seine Geschwindigkeit durch Interpolation " -#~ "der minimalen und maximalen Geschwindigkeiten berechnet." - -#~ msgid "" -#~ "Maximum volumetric speed allowed for this filament. Limits the maximum " -#~ "volumetric speed of a print to the minimum of print and filament " -#~ "volumetric speed. Set to zero for no limit." -#~ msgstr "" -#~ "Maximale volumetrische Geschwindigkeit, die für dieses Filament zulässig " -#~ "ist. Begrenzt die maximale volumetrische Geschwindigkeit eines Drucks auf " -#~ "das Minimum von Druck- und Filament-Volumengeschwindigkeit. Wird auf null " -#~ "gesetzt, wenn es keine Begrenzung gibt." - -#~ msgid "" -#~ "After a tool change, the exact position of the newly loaded filament " -#~ "inside the nozzle may not be known, and the filament pressure is likely " -#~ "not yet stable. Before purging the print head into an infill or a " -#~ "sacrificial object, Slic3r will always prime this amount of material into " -#~ "the wipe tower to produce successive infill or sacrificial object " -#~ "extrusions reliably." -#~ msgstr "" -#~ "Nach einem Werkzeugwechsel ist die genaue Position des neu geladenen " -#~ "Filaments innerhalb der Düse möglicherweise nicht bekannt, und der " -#~ "Filamentdruck ist wahrscheinlich noch nicht stabil. Bevor der Druckkopf " -#~ "in eine Füllung oder ein Opferobjekt wischt, wird PrusaSlicer immer diese " -#~ "Materialmenge in den Wischturm leiten, um aufeinanderfolgende Füll- oder " -#~ "Opferobjekt-Extrusionen zuverlässig herzustellen." - -#~ msgid "" -#~ "Enter your filament diameter here. Good precision is required, so use a " -#~ "caliper and do multiple measurements along the filament, then compute the " -#~ "average." -#~ msgstr "" -#~ "Geben Sie hier Ihren Filamentdurchmesser ein. Eine hohe Genauigkeit ist " -#~ "erforderlich, also verwenden Sie einen Messschieber und führen Sie " -#~ "mehrere Messungen entlang des Filaments durch, um dann den Mittelwert zu " -#~ "berechnen." - -#~ msgid "" -#~ "Enter your filament density here. This is only for statistical " -#~ "information. A decent way is to weigh a known length of filament and " -#~ "compute the ratio of the length to volume. Better is to calculate the " -#~ "volume directly through displacement." -#~ msgstr "" -#~ "Geben Sie hier Ihre Filamentdichte ein. Dies dient ausschließlich " -#~ "statistischen Zwecken. Ein vernünftiger Weg ist es, eine bekannte " -#~ "Filamentlänge zu wiegen und das Verhältnis von Länge zu Volumen zu " -#~ "berechnen. Besser ist es, das Volumen direkt durch Verdrängung zu " -#~ "berechnen." - -#~ msgid "The filament material type for use in custom G-codes." -#~ msgstr "" -#~ "Die Materialart des Filaments zur Verwendung in benutzerdefinierten G-" -#~ "Codes." - -#~ msgid "Soluble material is most likely used for a soluble support." -#~ msgstr "Lösliches Material wird meistens für lösliche Stützen verwendet." - -#~ msgid "" -#~ "Enter your filament cost per kg here. This is only for statistical " -#~ "information." -#~ msgstr "" -#~ "Geben Sie hier Ihre Filamentkosten pro kg ein. Dies dient ausschließlich " -#~ "statistischen Zwecken." - -#~ msgid "(Unknown)" -#~ msgstr "(Unbekannt)" - -#~ msgid "" -#~ "Default base angle for infill orientation. Cross-hatching will be applied " -#~ "to this. Bridges will be infilled using the best direction Slic3r can " -#~ "detect, so this setting does not affect them." -#~ msgstr "" -#~ "Standard-Grundwinkel für die Ausrichtung der Füllung. Hierfür werden " -#~ "Kreuzschraffuren verwendet. Brücken werden mit der besten Richtung " -#~ "gefüllt, die Slic3r erkennen kann, so dass diese Einstellung sie nicht " -#~ "beeinflusst." - -#~ msgid "Density of internal infill, expressed in the range 0% - 100%." -#~ msgstr "Infilldichte. Als Prozentwert von 0% - 100% ausgedrückt." - -#~ msgid "Fill pattern for general low-density infill." -#~ msgstr "Füllmuster für allgemeines Infill mit niedriger Dichte." - -#~ msgid "Stars" -#~ msgstr "Sterne" - -#~ msgid "3D Honeycomb" -#~ msgstr "3D Bienenwabe" - -#~ msgid "Support Cubic" -#~ msgstr "Stütz kubisch" - -#~ msgid "" -#~ "This is the acceleration your printer will use for first layer. Set zero " -#~ "to disable acceleration control for first layer." -#~ msgstr "" -#~ "Die Beschleunigung, die Ihr Drucker für die erste Schicht verwendet. " -#~ "Setzen Sie dies auf null, um die Beschleunigungskontrolle bei der ersten " -#~ "Schicht zu deaktivieren." - -#~ msgid "First object layer over raft interface" -#~ msgstr "Erste Objektschicht über der Raft-Schnittstelle" - -#~ msgid "" -#~ "This is the acceleration your printer will use for first layer of object " -#~ "above raft interface. Set zero to disable acceleration control for first " -#~ "layer of object above raft interface." -#~ msgstr "" -#~ "Dies ist die Beschleunigung, die Ihr Drucker für die erste Schicht des " -#~ "Objekts über der Raft-Schnittstelle verwendet. Stellen Sie Null ein, um " -#~ "die Beschleunigungssteuerung für die erste Schicht des Objekts über der " -#~ "Raft-Schnittstelle zu deaktivieren." - -#~ msgid "" -#~ "Heated build plate temperature for the first layer. Set this to zero to " -#~ "disable bed temperature control commands in the output." -#~ msgstr "" -#~ "Druckbetttemperatur für die erste Schicht. Setzen Sie diesen Wert auf " -#~ "null, um die Befehle zur Steuerung der Betttemperatur im Ausgang zu " -#~ "deaktivieren." - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for first " -#~ "layer. You can use this to force fatter extrudates for better adhesion. " -#~ "If expressed as percentage (for example 120%) it will be computed over " -#~ "first layer height. If set to zero, it will use the default extrusion " -#~ "width." -#~ msgstr "" -#~ "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle " -#~ "Extrusionsbreite für die erste Druckschicht anzugeben. Sie können damit " -#~ "eine stärkere Extrusion für bessere Haftung erzwingen. Falls auf null " -#~ "belassen, wird die Standard-Extrusionsbreite verwendet. Falls als " -#~ "Prozentwert (z.B. 120%) angegeben, wird dieser ausgehend von der " -#~ "Schichthöhe berechnet." - -#~ msgid "Fuzzy skin type." -#~ msgstr "Fuzzy Skin Typ." - -#~ msgid "Outside walls" -#~ msgstr "Äußere Wände" - -#~ msgid "" -#~ "The maximum distance that each skin point can be offset (both ways), " -#~ "measured perpendicular to the perimeter wall." -#~ msgstr "" -#~ "Der maximale Abstand, um den jeder Außenhautpunkt (in beide Richtungen) " -#~ "versetzt werden kann, gemessen senkrecht zur Umfangswand." - -#~ msgid "" -#~ "Perimeters will be split into multiple segments by inserting Fuzzy skin " -#~ "points. Lowering the Fuzzy skin point distance will increase the number " -#~ "of randomly offset points on the perimeter wall." -#~ msgstr "" -#~ "Perimeter werden in mehrere Segmente aufgeteilt, indem Fuzzy-Skin-Punkte " -#~ "eingefügt werden. Wenn Sie den Abstand der Fuzzy-Skin-Punkte verringern, " -#~ "erhöht sich die Anzahl der zufällig versetzten Punkte auf der Umfangswand." - -#~ msgid "Fill gaps" -#~ msgstr "Lücken füllen" - -#~ msgid "Layers and Perimeters" -#~ msgstr "Schichten und Konturen" - -#~ msgid "" -#~ "Enables filling of gaps between perimeters and between the inner most " -#~ "perimeters and infill." -#~ msgstr "" -#~ "Ermöglicht das Füllen von Lücken zwischen den Perimetern und zwischen den " -#~ "innersten Perimetern und dem Infill." - -#~ msgid "" -#~ "Speed for filling small gaps using short zigzag moves. Keep this " -#~ "reasonably low to avoid too much shaking and resonance issues. Set zero " -#~ "to disable gaps filling." -#~ msgstr "" -#~ "Geschwindigkeit, mit der kleine Lücken mit kurzen Zickzackbewegungen " -#~ "gefüllt werden. Beschränken Sie diese auf einen mäßigen Wert, um " -#~ "übermässiges Rütteln und Resonanzprobleme zu vermeiden. Auf Null gesetzt, " -#~ "wird das Füllen kleiner Lücken deaktiviert." - -#~ msgid "No extrusion" -#~ msgstr "Keine Extrusion" - -#~ msgid "" -#~ "Enable this to add comments into the G-Code labeling print moves with " -#~ "what object they belong to, which is useful for the Octoprint " -#~ "CancelObject plugin. This settings is NOT compatible with Single Extruder " -#~ "Multi Material setup and Wipe into Object / Wipe into Infill." -#~ msgstr "" -#~ "Aktivieren Sie dies, um Kommentare in den G-Code einzufügen, die die " -#~ "Druckbewegungen beschriften zu welchem Objekt sie gehören, was für das " -#~ "OctoPrint CancelObject Plugin nützlich ist. Diese Einstellungen sind " -#~ "NICHT kompatibel mit der Einstellung Single Extruder Multi Material und " -#~ "Wischen ins Objekt / Wischen ins Infill." - -#~ msgid "Length of the infill anchor" -#~ msgstr "Länge des Infill-Ankers" - -#~ msgid "The extruder to use when printing infill." -#~ msgstr "Extruder der beim Infill benutzt wird." - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for infill. " -#~ "If left zero, default extrusion width will be used if set, otherwise " -#~ "1.125 x nozzle diameter will be used. You may want to use fatter " -#~ "extrudates to speed up the infill and make your parts stronger. If " -#~ "expressed as percentage (for example 90%) it will be computed over layer " -#~ "height." -#~ msgstr "" -#~ "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle " -#~ "Extrusionsbreite für den Infill anzugeben. Falls auf null belassen, wird " -#~ "die Standard-Extrusionsbreite verwendet (falls angeben), ansonsten wird " -#~ "der Durchmesser der Druckdüse x 1,125 verwendet. Stärke Extrusionsbreiten " -#~ "sind vorteilhaft, um den Infill zu beschleunigen und um die Teile stärker " -#~ "zu machen. Falls als Prozentwert (z.B. 90%) angegeben, wird dieser " -#~ "ausgehend von der Schichthöhe berechnet." - -#~ msgid "" -#~ "This setting applies an additional overlap between infill and perimeters " -#~ "for better bonding. Theoretically this shouldn't be needed, but backlash " -#~ "might cause gaps. If expressed as percentage (example: 15%) it is " -#~ "calculated over perimeter extrusion width." -#~ msgstr "" -#~ "Diese Einstellung fügt eine zusätzliche Überlappung zwischen " -#~ "Außenkonturen und Infill ein, um die Haftung zu verbessern. Theoretisch " -#~ "sollte dies nicht notwendig sein, doch vorhandenes Getriebespiel könnte " -#~ "Lücken erzeugen. Als Prozentwert eingegeben (z.B. 15%) wird sie " -#~ "ausgehend von der Extrusionsbreite für die Außenkontur ausgerechnet." - -#~ msgid "Speed for printing the internal fill. Set to zero for auto." -#~ msgstr "Druckgeschwindigkeit für den Infill. Für Automatik auf null setzen." - -#~ msgid "Name of the profile, from which this profile inherits." -#~ msgstr "Name des Profils, von dem dieses Profil abgeleitet wurde." - -#~ msgid "" -#~ "Force the generation of solid shells between adjacent materials/volumes. " -#~ "Useful for multi-extruder prints with translucent materials or manual " -#~ "soluble support material." -#~ msgstr "" -#~ "Erzwingt die Erzeugung von massiven Schalen zwischen benachbarten " -#~ "Materialien/Volumina. Geeignet für Multiextruderdrucke mit transluzenten " -#~ "Materialien oder manuell löslichen Trägermaterialien." - -#~ msgid "Maximum width of a segmented region" -#~ msgstr "Maximale Breite einer segmentierten Region" - -#~ msgid "Maximum width of a segmented region. Zero disables this feature." -#~ msgstr "" -#~ "Maximale Breite eines segmentierten Bereichs. Null schaltet diese " -#~ "Funktion aus." - -#~ msgid "All top surfaces" -#~ msgstr "Alle Oberseiten" - -#~ msgid "Topmost surface only" -#~ msgstr "Nur oberste Fläche" - -#~ msgid "All solid surfaces" -#~ msgstr "Alle massiven Oberflächen" - -#~ msgid "Percent of a flow rate relative to object's normal layer height." -#~ msgstr "" -#~ "Prozent einer Flussrate relativ zur normalen Schichthöhe des Objekts." - -#~ msgid "Distance between ironing lines" -#~ msgstr "Abstand zwischen Bügellinien" - -#~ msgid "" -#~ "This custom code is inserted at every layer change, right after the Z " -#~ "move and before the extruder moves to the first layer point. Note that " -#~ "you can use placeholder variables for all Slic3r settings as well as " -#~ "[layer_num] and [layer_z]." -#~ msgstr "" -#~ "Dieser benutzerdefinierte Code wird bei jedem Schichtwechsel eingefügt, " -#~ "direkt nach der Z-Bewegung und bevor der Extruder zum ersten Lagenpunkt " -#~ "fährt. Beachten Sie, dass Sie Platzhaltervariablen für alle Slic3r-" -#~ "Einstellungen sowie [layer_num] und [layer_z] verwenden können." - -#~ msgid "Supports stealth mode" -#~ msgstr "Unterstützt Stealth Modus" - -#~ msgid "The firmware supports stealth mode" -#~ msgstr "Die Firmware unterstützt den Stealth Modus" - -#~ msgid "Minimum feedrate when extruding" -#~ msgstr "Maximaler Vorschub bei Extrusion" - -#~ msgid "Minimum feedrate when extruding (M205 S)" -#~ msgstr "Minimaler Vorschub beim Extrudieren (M205 S)" - -#~ msgid "Minimum travel feedrate" -#~ msgstr "Minimaler Vorschub im Eilgang" - -#~ msgid "Minimum travel feedrate (M205 T)" -#~ msgstr "Minimaler Vorschub im Eilgang (M205 T)" - -#~ msgid "Maximum acceleration when extruding" -#~ msgstr "Maximale Beschleunigung beim Extrudieren" - -#~ msgid "" -#~ "Maximum acceleration when extruding (M204 P)\n" -#~ "\n" -#~ "Marlin (legacy) firmware flavor will use this also as travel acceleration " -#~ "(M204 T)." -#~ msgstr "" -#~ "Maximale Beschleunigung beim Extrudieren (M204 P)\n" -#~ "\n" -#~ "Marlin (Legacy) Firmware Flavor verwendet dies auch als " -#~ "Fahrbeschleunigung (M204 T)." - -#~ msgid "Maximum acceleration when retracting" -#~ msgstr "Maximale Beschleunigung beim Einzug" - -#~ msgid "Maximum acceleration when retracting (M204 R)" -#~ msgstr "Maximale Beschleunigung beim Einzug (M204 R)" - -#~ msgid "Maximum acceleration for travel moves" -#~ msgstr "Maximale Beschleunigung für Fahrbewegungen" - -#~ msgid "Maximum acceleration for travel moves (M204 T)" -#~ msgstr "Maximale Beschleunigung für Fahrbewegungen (M204 T)" - -#~ msgid "This setting represents the maximum speed of your fan." -#~ msgstr "" -#~ "Diese Einstellung bestimmt die maximale Geschwindigkeit Ihres Lüfters." - -#, fuzzy -#~ msgid "" -#~ "This is the highest printable layer height for this extruder, used to cap " -#~ "the variable layer height and support layer height. Maximum recommended " -#~ "layer height is 75% of the extrusion width to achieve reasonable inter-" -#~ "layer adhesion. If set to 0, layer height is limited to 75% of the nozzle " -#~ "diameter." -#~ msgstr "" -#~ "Dies ist die höchste druckbare Schichthöhe für diesen Extruder, mit der " -#~ "die variable Schichthöhe und Stützschichthöhe abgedeckt wird. Die " -#~ "maximale empfohlene Schichthöhe beträgt 75% der Extrusionsbreite, um eine " -#~ "angemessene Zwischenlagenhaftung zu erreichen. Bei Einstellung auf 0 ist " -#~ "die Lagenhöhe auf 75% des Düsendurchmessers begrenzt." - -#~ msgid "" -#~ "When setting other speed settings to 0 Slic3r will autocalculate the " -#~ "optimal speed in order to keep constant extruder pressure. This " -#~ "experimental setting is used to set the highest print speed you want to " -#~ "allow." -#~ msgstr "" -#~ "Wenn andere Geschwindigkeitseinstellungen auf null gesetzt wurden, wird " -#~ "PrusaSlicer die optimale Geschwindigkeit automatisch berechnen, um den " -#~ "Extruderdruck konstant zu halten. Diese experimentelle Einstellung " -#~ "erlaubt Ihnen, die höchste zulässige Druckgeschwindigkeit anzugeben." - -#~ msgid "" -#~ "This experimental setting is used to set the maximum volumetric speed " -#~ "your extruder supports." -#~ msgstr "" -#~ "Diese experimentelle Einstellung gibt die maximale volumetrische " -#~ "Geschwindigkeit an, die von Ihrem Extruder unterstützt wird." - -#~ msgid "Max volumetric slope positive" -#~ msgstr "Max. volumetrische Steigung positiv" - -#~ msgid "" -#~ "This experimental setting is used to limit the speed of change in " -#~ "extrusion rate. A value of 1.8 mm³/s² ensures, that a change from the " -#~ "extrusion rate of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion " -#~ "height, feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at " -#~ "least 2 seconds." -#~ msgstr "" -#~ "Diese experimentelle Einstellung beschränkt die Änderungsgeschwindigkeit " -#~ "der Extrusionsmenge. Ein Wert von 1.8 mm³/s² gewährleistet, dass eine " -#~ "Änderung der Extrusionsmenge von 1.8 mm³/s (0.45mm Extrusionsbreite, " -#~ "0.2mm Extrusionshöhe, Vorschub 20 mm/s) zu 5.4 mm³/s (Vorschub 60 mm/s) " -#~ "mindestens 2 Sekunden dauern wird." - -#~ msgid "mm³/s²" -#~ msgstr "mm³/s²" - -#~ msgid "Max volumetric slope negative" -#~ msgstr "Max. volumetrische Steigung negativ" - -#~ msgid "This setting represents the minimum PWM your fan needs to work." -#~ msgstr "" -#~ "Diese Einstellung gibt den minimalen PWM-Wert an, den Ihr Lüfter für den " -#~ "Betrieb benötigt." - -#~ msgid "" -#~ "This is the lowest printable layer height for this extruder and limits " -#~ "the resolution for variable layer height. Typical values are between 0.05 " -#~ "mm and 0.1 mm." -#~ msgstr "" -#~ "Dies ist die niedrigste druckbare Schichthöhe für diesen Extruder und " -#~ "begrenzt die Auflösung bei variabler Schichthöhe. Typische Werte liegen " -#~ "zwischen 0,05 mm und 0,1 mm." - -#~ msgid "Slic3r will not scale speed down below this speed." -#~ msgstr "" -#~ "PrusaSlicer wird die Geschwindigkeit nicht unterhalb dieser " -#~ "Geschwindigkeit skalieren." - -#~ msgid "" -#~ "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" -#~ msgstr "Durchmesser der Extruderdüse (z.B.: 0.5, 0.35 usw.)" - -#~ msgid "" -#~ "Disables retraction when the travel path does not exceed the upper " -#~ "layer's perimeters (and thus any ooze will be probably invisible)." -#~ msgstr "" -#~ "Deaktiviert den Einzug, wenn der Verfahrweg die Perimeter der oberen " -#~ "Schicht nicht überschreitet (und somit ist der Auslauf wahrscheinlich " -#~ "unsichtbar)." - -#~ msgid "" -#~ "This option will drop the temperature of the inactive extruders to " -#~ "prevent oozing. It will enable a tall skirt automatically and move " -#~ "extruders outside such skirt when changing temperatures." -#~ msgstr "" -#~ "Mit dieser Option wird die Temperatur der inaktiven Extruder gesenkt, um " -#~ "ein Materialnachsickern zu verhindern. Es aktiviert automatisch eine hohe " -#~ "Schürze und bewegt die Extruder bei Temperaturänderungen außerhalb dieser " -#~ "Schürze." - -#~ msgid "" -#~ "Experimental option to adjust flow for overhangs (bridge flow will be " -#~ "used), to apply bridge speed to them and enable fan." -#~ msgstr "" -#~ "Experimentelle Option zur Anpassung des Durchflusses für Überhänge " -#~ "(Brückenvolumenfluss wird verwendet), zur Anwendung der " -#~ "Brückengeschwindigkeit und zur Aktivierung des Lüfters." - -#~ msgid "" -#~ "The extruder to use when printing perimeters and brim. First extruder is " -#~ "1." -#~ msgstr "" -#~ "Extruder der beim Umfang und Rand Drucken benutzt werden soll. Der erste " -#~ "Extruder ist 1." - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for " -#~ "perimeters. You may want to use thinner extrudates to get more accurate " -#~ "surfaces. If left zero, default extrusion width will be used if set, " -#~ "otherwise 1.125 x nozzle diameter will be used. If expressed as " -#~ "percentage (for example 200%) it will be computed over layer height." -#~ msgstr "" -#~ "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle " -#~ "Extrusionsbreite für Außenkonturen anzugeben. Dünnere Extrusionsbreiten " -#~ "sind vorteilhaft, um genauere Oberflächen zu erhalten. Falls auf null " -#~ "belassen, wird die Standard-Extrusionsbreite verwendet (falls angeben), " -#~ "ansonsten wird der Durchmesser der Druckdüse x 1,125 verwendet. Falls als " -#~ "Prozentwert (z.B. 200%) angegeben, wird dieser ausgehend von der " -#~ "Schichthöhe berechnet." - -#~ msgid "" -#~ "Speed for perimeters (contours, aka vertical shells). Set to zero for " -#~ "auto." -#~ msgstr "" -#~ "Geschwindigkeit für Außenkonturen (Konturen, bzw. vertikale Hüllen). Für " -#~ "Automatik auf null setzen." - -#~ msgid "" -#~ "If you want to process the output G-code through custom scripts, just " -#~ "list their absolute paths here. Separate multiple scripts with a " -#~ "semicolon. Scripts will be passed the absolute path to the G-code file as " -#~ "the first argument, and they can access the Slic3r config settings by " -#~ "reading environment variables." -#~ msgstr "" -#~ "Wenn Sie den Ausgabe-G-Code durch eigene Skripte verarbeiten wollen, " -#~ "geben Sie hier einfach die absoluten Pfade an. Trennen Sie mehrere " -#~ "Skripte durch ein Semikolon. Skripten wird als erstes Argument der " -#~ "absolute Pfad zur G-Code-Datei übergeben, und sie können auf die " -#~ "PrusaSlicer-Konfigurationseinstellungen zugreifen, indem sie " -#~ "Umgebungsvariablen lesen." - -#~ msgid "Type of the printer." -#~ msgstr "Druckertyp." - -#~ msgid "" -#~ "Name of the printer variant. For example, the printer variants may be " -#~ "differentiated by a nozzle diameter." -#~ msgstr "" -#~ "Name der Druckervariante. Beispielsweise können die Druckervarianten " -#~ "durch einen Düsendurchmesser unterschieden werden." - -#~ msgid "" -#~ "The vertical distance between object and raft. Ignored for soluble " -#~ "interface." -#~ msgstr "" -#~ "Der vertikale Abstand zwischen Objekt und Raft. Wird bei löslicher " -#~ "Schnittstelle ignoriert." - -#~ msgid "Expansion of the raft in XY plane for better stability." -#~ msgstr "Ausdehnung des Rafts in der XY-Ebene für bessere Stabilität." - -#~ msgid "Density of the first raft or support layer." -#~ msgstr "Dichte des ersten Raft- oder Stützschicht." - -#~ msgid "" -#~ "Expansion of the first raft or support layer to improve adhesion to print " -#~ "bed." -#~ msgstr "" -#~ "Expansion des ersten Rafts oder der ersten Schicht, um die Haftung am " -#~ "Druckbett zu verbessern." - -#~ msgid "" -#~ "The object will be raised by this number of layers, and support material " -#~ "will be generated under it." -#~ msgstr "" -#~ "Das Objekt wird um diese Anzahl von Schichten angehoben, und darunter " -#~ "wird Trägermaterial erzeugt." - -#~ msgid "" -#~ "Maximum deviation of exported G-code paths from their full resolution " -#~ "counterparts. Very high resolution G-code requires huge amount of RAM to " -#~ "slice and preview, also a 3D printer may stutter not being able to " -#~ "process a high resolution G-code in a timely manner. On the other hand, a " -#~ "low resolution G-code will produce a low poly effect and because the G-" -#~ "code reduction is performed at each layer independently, visible " -#~ "artifacts may be produced." -#~ msgstr "" -#~ "Maximale Abweichung der exportierten G-Code-Pfade von ihren Gegenstücken " -#~ "in voller Auflösung. Sehr hoch aufgelöster G-Code erfordert eine riesige " -#~ "Menge an Arbeitsspeicher für das Slicen und die Vorschau, außerdem kann " -#~ "ein 3D-Drucker stottern, weil er einen hoch aufgelösten G-Code nicht " -#~ "rechtzeitig verarbeiten kann. Andererseits erzeugt ein G-Code mit " -#~ "niedriger Auflösung einen Low-Poly-Effekt, und da die G-Code-Reduzierung " -#~ "auf jeder Ebene unabhängig durchgeführt wird, können sichtbare Artefakte " -#~ "entstehen." - -#~ msgid "Minimum travel after retraction" -#~ msgstr "Minimalbewegung nach Einziehen" - -#~ msgid "" -#~ "Retraction is not triggered when travel moves are shorter than this " -#~ "length." -#~ msgstr "" -#~ "Der Einzug wird nicht ausgelöst, wenn die Fahrbewegungen kürzer als diese " -#~ "Länge sind." - -#~ msgid "" -#~ "With bowden extruders, it may be wise to do some amount of quick retract " -#~ "before doing the wipe movement." -#~ msgstr "" -#~ "Bei Bowden-Extrudern kann es ratsam sein, vor der Reinigungsbewegung " -#~ "einen kurzen Einzug auszuführen." - -#~ msgid "This flag enforces a retraction whenever a Z move is done." -#~ msgstr "Diese Stellung erzwingt einen Einzug bei jeder Z-Bewegung." - -#~ msgid "" -#~ "When retraction is triggered, filament is pulled back by the specified " -#~ "amount (the length is measured on raw filament, before it enters the " -#~ "extruder)." -#~ msgstr "" -#~ "Wenn der Einzug ausgelöst wird, wird das Filament um diese Länge " -#~ "eingezogen. (Die Länge wird am unverarbeiteten Filament vor dem Extruder " -#~ "gemessen)." - -#~ msgid "mm (zero to disable)" -#~ msgstr "mm (Null zum Deaktivieren)" - -#~ msgid "" -#~ "When retraction is triggered before changing tool, filament is pulled " -#~ "back by the specified amount (the length is measured on raw filament, " -#~ "before it enters the extruder)." -#~ msgstr "" -#~ "Wenn der Einzug vor dem Werkzeugwechsel ausgelöst wird, wird das Filament " -#~ "um diese Länge eingezogen. (Die Länge wird am unverarbeiteten Filament " -#~ "vor dem Extruder gemessen)." - -#~ msgid "Lift Z" -#~ msgstr "Z Hebung" - -#~ msgid "" -#~ "If you set this to a positive value, Z is quickly raised every time a " -#~ "retraction is triggered. When using multiple extruders, only the setting " -#~ "for the first extruder will be considered." -#~ msgstr "" -#~ "Wenn Sie diesen Wert auf einen positiven Wert setzen, wird Z bei jedem " -#~ "Auslösen eines Einzugs schnell angehoben. Bei Verwendung mehrerer " -#~ "Extruder wird nur die Einstellung für den ersten Extruder berücksichtigt." - -#~ msgid "" -#~ "When the retraction is compensated after the travel move, the extruder " -#~ "will push this additional amount of filament. This setting is rarely " -#~ "needed." -#~ msgstr "" -#~ "Wenn der Einzug nach der Zwischenbewegung kompensiert wurde, wird der " -#~ "Extruder diese zusätzliche Menge an Filament ausgeben. Diese Einstellung " -#~ "wird selten benötigt." - -#~ msgid "" -#~ "When the retraction is compensated after changing tool, the extruder will " -#~ "push this additional amount of filament." -#~ msgstr "" -#~ "Wenn der Einzug nach dem Werkzeugwechsel kompensiert wurde, wird der " -#~ "Extruder diese zusätzliche Menge an Filament ausgeben." - -#~ msgid "The speed for retractions (it only applies to the extruder motor)." -#~ msgstr "Die Einzugsgeschwindigkeit (sie betrifft nur den Extruderantrieb)." - -#~ msgid "" -#~ "The speed for loading of a filament into extruder after retraction (it " -#~ "only applies to the extruder motor). If left to zero, the retraction " -#~ "speed is used." -#~ msgstr "" -#~ "Die Geschwindigkeit, mit der ein Filament nach dem Einzug wieder in den " -#~ "Extruder vorgeschoben wird. Falls null, wird die Einzugsgeschwindigkeit " -#~ "verwendet." - -#~ msgid "Random" -#~ msgstr "Zufällig" - -#~ msgid "Direction" -#~ msgstr "Richtung" - -#~ msgid "Preferred direction of the seam" -#~ msgstr "Bevorzugte Richtung für die Naht" - -#~ msgid "Seam preferred direction" -#~ msgstr "Bevorzugte Richtung für Nähte" - -#~ msgid "Jitter" -#~ msgstr "Jitter" - -#~ msgid "Seam preferred direction jitter" -#~ msgstr "Bevorzugte Zitterrichtung für Nähte" - -#~ msgid "Preferred direction of the seam - jitter" -#~ msgstr "Bevorzugte Zitterrichtung für die Naht" - -#~ msgid "" -#~ "Distance between skirt and brim (when draft shield is not used) or " -#~ "objects." -#~ msgstr "" -#~ "Abstand zwischen Schürze und Rand (wenn der Windschutz nicht verwendet " -#~ "wird) oder Objekten." - -#~ msgid "Height of skirt expressed in layers." -#~ msgstr "Höhe der Schürze, ausgedrückt in Schichten." - -#~ msgid "" -#~ "With draft shield active, the skirt will be printed skirt_distance from " -#~ "the object, possibly intersecting brim.\n" -#~ "Enabled = skirt is as tall as the highest printed object.\n" -#~ "Limited = skirt is as tall as specified by skirt_height.\n" -#~ "This is useful to protect an ABS or ASA print from warping and detaching " -#~ "from print bed due to wind draft." -#~ msgstr "" -#~ "Bei aktivem Windschutz wird die Schürze im Abstand von skirt_distance vom " -#~ "Objekt gedruckt, wobei sie möglicherweise den Rand überschneidet.\n" -#~ "Aktiviert = Schürze ist so hoch wie das höchste gedruckte Objekt.\n" -#~ "Begrenzt = die Schürze ist so hoch wie durch skirt_height angegeben.\n" -#~ "Dies ist nützlich, um einen ABS- oder ASA-Druck vor Verformung und " -#~ "Ablösung vom Druckbett aufgrund von Windzug zu schützen." - -#~ msgid "" -#~ "Number of loops for the skirt. If the Minimum Extrusion Length option is " -#~ "set, the number of loops might be greater than the one configured here. " -#~ "Set this to zero to disable skirt completely." -#~ msgstr "" -#~ "Anzahl der Schleifen für die Schürze. Wenn die Option Minimale " -#~ "Extrusionslänge gesetzt ist, kann die Anzahl der Schleifen größer sein " -#~ "als die hier konfigurierte. Setzen Sie diesen Wert auf null, um die " -#~ "Schürze komplett zu deaktivieren." - -#~ msgid "" -#~ "If layer print time is estimated below this number of seconds, print " -#~ "moves speed will be scaled down to extend duration to this value." -#~ msgstr "" -#~ "Wenn die Druckzeit der Ebene unter dieser Anzahl von Sekunden liegt, wird " -#~ "die Geschwindigkeit des Druckvorgangs verringert, um die Zeitdauer auf " -#~ "diesen Wert zu verlängern." - -#~ msgid "Small perimeters" -#~ msgstr "Dünne Außenkonturen" - -#~ msgid "" -#~ "This separate setting will affect the speed of perimeters having radius " -#~ "<= 6.5mm (usually holes). If expressed as percentage (for example: 80%) " -#~ "it will be calculated on the perimeters speed setting above. Set to zero " -#~ "for auto." -#~ msgstr "" -#~ "Diese separate Einstellung wirkt sich auf die Geschwindigkeit von " -#~ "Außenkonturen mit einem Radius <= 6,5 mm (üblicherweise Bohrungen) aus. " -#~ "Als Prozentwert eingegeben (z.B. 80%), wird sie ausgehend von der obigen " -#~ "Geschwindigkeitseinstellung für Außenkonturen berechnet. Für eine " -#~ "automatische Berechnung setzen Sie dies auf null." - -#~ msgid "" -#~ "Force solid infill for regions having a smaller area than the specified " -#~ "threshold." -#~ msgstr "" -#~ "Massives Infill für Bereiche, die eine kleinere Fläche als die angegebene " -#~ "Schwelle aufweisen." - -#~ msgid "The extruder to use when printing solid infill." -#~ msgstr "" -#~ "Der Extruder der beim Drucken von massivem Infill benutzt werden soll." - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for infill " -#~ "for solid surfaces. If left zero, default extrusion width will be used if " -#~ "set, otherwise 1.125 x nozzle diameter will be used. If expressed as " -#~ "percentage (for example 90%) it will be computed over layer height." -#~ msgstr "" -#~ "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle " -#~ "Extrusionsbreite für den Infill bei massiven Flächen anzugeben. Falls auf " -#~ "null belassen, wird die Standard-Extrusionsbreite verwendet (falls " -#~ "angeben), ansonsten wird der Durchmesser der Druckdüse x 1,125 verwendet. " -#~ "Falls als Prozentwert (z.B. 90%) angegeben, wird dieser ausgehend von der " -#~ "Schichthöhe berechnet." - -#~ msgid "" -#~ "Speed for printing solid regions (top/bottom/internal horizontal shells). " -#~ "This can be expressed as a percentage (for example: 80%) over the default " -#~ "infill speed above. Set to zero for auto." -#~ msgstr "" -#~ "Druckgeschwindigkeit für massive Bereiche (obere/untere/innenliegende " -#~ "waagrechte Hüllen). Sie kann als Prozentwert (z.B. 80%) der oben " -#~ "eingegebenen standardmäßigen Infill-Geschwindigkeit angegeben werden. Für " -#~ "Automatik auf null setzen." - -#~ msgid "" -#~ "This feature will raise Z gradually while printing a single-walled object " -#~ "in order to remove any visible seam. This option requires a single " -#~ "perimeter, no infill, no top solid layers and no support material. You " -#~ "can still set any number of bottom solid layers as well as skirt/brim " -#~ "loops. It won't work when printing more than one single object." -#~ msgstr "" -#~ "Diese Funktion hebt Z allmählich an, während ein einwandiges Objekt " -#~ "gedruckt wird, um jede sichtbare Naht zu entfernen. Diese Option " -#~ "erfordert eine einzelne Umrandung, keine Füllung, keine oberen festen " -#~ "Schichten und kein Stützmaterial. Sie können trotzdem eine beliebige " -#~ "Anzahl von unteren massiven Schichten sowie Schürzen-/Randschlaufen " -#~ "einstellen. Sie funktioniert nicht, wenn mehr als ein einzelnes Objekt " -#~ "gedruckt wird." - -#~ msgid "" -#~ "Temperature difference to be applied when an extruder is not active. " -#~ "Enables a full-height \"sacrificial\" skirt on which the nozzles are " -#~ "periodically wiped." -#~ msgstr "" -#~ "Der anzuwendende Temperaturunterschied, wenn kein Extruder aktiv ist. " -#~ "Dies aktiviert eine \"Wegwerf-\"Schürze über die ganze Druckhöhe, auf der " -#~ "die Düsen periodisch gereinigt werden." - -#~ msgid "The printer multiplexes filaments into a single hot end." -#~ msgstr "Der Drucker multiplext mehrere Filamente in einem Hotend." - -#~ msgid "" -#~ "If enabled, all printing extruders will be primed at the front edge of " -#~ "the print bed at the start of the print." -#~ msgstr "" -#~ "Wenn aktiviert, werden alle Druckextruder zu Beginn des Druckvorgangs an " -#~ "der Vorderkante des Druckbetts geprimt." - -#~ msgid "" -#~ "If enabled, the wipe tower will not be printed on layers with no " -#~ "toolchanges. On layers with a toolchange, extruder will travel downward " -#~ "to print the wipe tower. User is responsible for ensuring there is no " -#~ "collision with the print." -#~ msgstr "" -#~ "Wenn aktiviert, wird der Reinigungsturm nicht auf Schichten ohne " -#~ "Werkzeugwechsel gedruckt. Bei Schichten mit Werkzeugwechsel fährt der " -#~ "Extruder nach unten, um den Reinigungsturm zu drucken. Der Benutzer ist " -#~ "dafür verantwortlich, dass es nicht zu einer Kollision mit dem Druck " -#~ "kommt." - -#~ msgid "" -#~ "Cracks smaller than 2x gap closing radius are being filled during the " -#~ "triangle mesh slicing. The gap closing operation may reduce the final " -#~ "print resolution, therefore it is advisable to keep the value reasonably " -#~ "low." -#~ msgstr "" -#~ "Spalte, die kleiner als der doppelte Lückenschlussradius sind, werden " -#~ "während des Slicens des Dreiecksnetzes gefüllt. Der Lückenschluss kann " -#~ "die endgültige Druckauflösung verringern, daher ist es ratsam, den Wert " -#~ "relativ niedrig zu halten." - -#~ msgid "" -#~ "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " -#~ "close all holes in the model." -#~ msgstr "" -#~ "Verwenden Sie \"Gerade-ungerade\" für 3DLabPrint-Flugzeugmodelle. " -#~ "Verwenden Sie \"Löcher schließen\", um alle Löcher im Modell zu schließen." - -#~ msgid "" -#~ "XY separation between an object and its support. If expressed as " -#~ "percentage (for example 50%), it will be calculated over external " -#~ "perimeter width." -#~ msgstr "" -#~ "XY-Abstand zwischen einem Objekt und seinen Stützen. Falls in Prozenten " -#~ "angegeben (z.B. 50%), wird der Abstand von der Breite der Außenkontur " -#~ "ausgehend berechnet." - -#~ msgid "" -#~ "Only create support if it lies on a build plate. Don't create support on " -#~ "a print." -#~ msgstr "" -#~ "Nur dann Stützen schaffen, wenn sie auf der Druckplattform aufbauen. " -#~ "Erstellt keine Stützen, die auf dem Ausdruck gründen würden." - -#~ msgid "0 (soluble)" -#~ msgstr "0 (löslich)" - -#~ msgid "0.2 (detachable)" -#~ msgstr "0,2 (lösbar)" - -#~ msgid "" -#~ "Generate support material for the specified number of layers counting " -#~ "from bottom, regardless of whether normal support material is enabled or " -#~ "not and regardless of any angle threshold. This is useful for getting " -#~ "more adhesion of objects having a very thin or poor footprint on the " -#~ "build plate." -#~ msgstr "" -#~ "Generiere Stützmaterial für die angegebene Anzahl von Schichten, die von " -#~ "unten gezählt werden, unabhängig davon, ob normales Stützmaterial " -#~ "aktiviert ist oder nicht und unabhängig von einer Winkelschwelle. Dies " -#~ "ist nützlich, um die Haftung von Objekten mit einem sehr dünnen oder " -#~ "schlechten Standfuß auf der Bauplatte zu erhöhen." - -#~ msgid "" -#~ "The extruder to use when printing support material, raft and skirt (1+, 0 " -#~ "to use the current extruder to minimize tool changes)." -#~ msgstr "" -#~ "Der Extruder, der für den Druck von Stützmaterial, Raft und Schürze " -#~ "verwendet wird (1+, oder null um den aktuellen Extruder für die " -#~ "Minimierung von Werkzeugwechseln zu verwenden)." - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for support " -#~ "material. If left zero, default extrusion width will be used if set, " -#~ "otherwise nozzle diameter will be used. If expressed as percentage (for " -#~ "example 90%) it will be computed over layer height." -#~ msgstr "" -#~ "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle " -#~ "Extrusionsbreite für das Stützmaterial anzugeben. Falls auf null " -#~ "belassen, wird die Standard-Extrusionsbreite verwendet (falls angeben), " -#~ "ansonsten wird der Durchmesser der Druckdüse verwendet. Als Prozentwert " -#~ "(z.B. 90%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet." - -#~ msgid "Interface loops" -#~ msgstr "Kontaktschleifen" - -#~ msgid "" -#~ "The extruder to use when printing support material interface (1+, 0 to " -#~ "use the current extruder to minimize tool changes). This affects raft too." -#~ msgstr "" -#~ "Der Extruder, der für den Druck von Schnittstellen zum Stützmaterial " -#~ "verwendet wird (1+, oder null um den aktuellen Extruder für die " -#~ "Minimierung von Werkzeugwechseln zu verwenden). Dies betrifft auch den " -#~ "Raft." - -#~ msgid "" -#~ "Number of interface layers to insert between the object(s) and support " -#~ "material." -#~ msgstr "" -#~ "Anzahl der Schnittstellenschichten, die zwischen Objekt(en) und " -#~ "Trägermaterial eingefügt werden sollen." - -#~ msgid "0 (off)" -#~ msgstr "0 (aus)" - -#~ msgid "1 (light)" -#~ msgstr "1 (leicht)" - -#~ msgid "2 (default)" -#~ msgstr "2 (Standard)" - -#~ msgid "3 (heavy)" -#~ msgstr "3 (schwer)" - -#~ msgid "" -#~ "For snug supports, the support regions will be merged using morphological " -#~ "closing operation. Gaps smaller than the closing radius will be filled in." -#~ msgstr "" -#~ "Bei nahtlosen Stützen werden die Stützregionen mit Hilfe der " -#~ "morphologischen Schließungsoperation zusammengeführt. Lücken, die kleiner " -#~ "als der Schließradius sind, werden aufgefüllt." - -#~ msgid "Spacing between interface lines. Set zero to get a solid interface." -#~ msgstr "" -#~ "Abstand zwischen den Schnittstellenlinien. Auf null stellen, um ein " -#~ "massives Interface zu erhalten." - -#~ msgid "" -#~ "Speed for printing support material interface layers. If expressed as " -#~ "percentage (for example 50%) it will be calculated over support material " -#~ "speed." -#~ msgstr "" -#~ "Geschwindigkeit für den Druck von Trägermaterial-Schnittstellenschichten. " -#~ "Wenn es als Prozentsatz (z.B. 50%) ausgedrückt wird, wird es über die " -#~ "Geschwindigkeit des Trägermaterials berechnet." - -#~ msgid "Pattern used to generate support material." -#~ msgstr "Unterstützungsmaterialmuster." - -#~ msgid "" -#~ "Pattern used to generate support material interface. Default pattern for " -#~ "non-soluble support interface is Rectilinear, while default pattern for " -#~ "soluble support interface is Concentric." -#~ msgstr "" -#~ "Muster, das zur Erzeugung der Oberfläche des Stützmaterials verwendet " -#~ "wird. Das Standardmuster für nicht lösliche Stützflächen ist Rechtlinear, " -#~ "während das Standardmuster für lösliche Stützflächen Konzentrisch ist." - -#~ msgid "Spacing between support material lines." -#~ msgstr "Abstand zwischen Stützmateriallinien." - -#~ msgid "Speed for printing support material." -#~ msgstr "Druckgeschwindigkeit des Stützmaterials." - -#~ msgid "" -#~ "Style and shape of the support towers. Projecting the supports into a " -#~ "regular grid will create more stable supports, while snug support towers " -#~ "will save material and reduce object scarring." -#~ msgstr "" -#~ "Art und Form der Stütztürme. Wenn die Stützen in ein regelmäßiges Raster " -#~ "projiziert werden, ergeben sich stabilere Stützen, während schlanke " -#~ "Stütztürme Material sparen und die Narbenbildung am Objekt verringern." - -#~ msgid "" -#~ "Support material will not be generated for overhangs whose slope angle " -#~ "(90° = vertical) is above the given threshold. In other words, this value " -#~ "represent the most horizontal slope (measured from the horizontal plane) " -#~ "that you can print without support material. Set to zero for automatic " -#~ "detection (recommended)." -#~ msgstr "" -#~ "Für Überhänge, deren Neigungswinkel (90° = vertikal) oberhalb der " -#~ "vorgegebenen Schwelle liegt, wird kein Stützmaterial erzeugt. Mit anderen " -#~ "Worten, dieser Wert stellt die größte horizontale Steigung (gemessen von " -#~ "der horizontalen Ebene) dar, die Sie ohne Stützmaterial drucken können. " -#~ "Für die automatische Erkennung auf null setzen (empfohlen)." - -#~ msgid "With sheath around the support" -#~ msgstr "Mit Umhüllung der Stützen" - -#~ msgid "" -#~ "Add a sheath (a single perimeter line) around the base support. This " -#~ "makes the support more reliable, but also more difficult to remove." -#~ msgstr "" -#~ "Fügen Sie eine Sheath (eine einzelne Druckkontur) um die Basisschicht " -#~ "herum hinzu. Das macht die Stützen zuverlässiger, aber auch schwieriger " -#~ "zu entfernen." - -#~ msgid "" -#~ "Nozzle temperature for layers after the first one. Set this to zero to " -#~ "disable temperature control commands in the output G-code." -#~ msgstr "" -#~ "Düsentemperatur für Schichten nach der ersten. Setzen Sie diesen Wert auf " -#~ "Null, um Temperatursteuerungsbefehle im ausgegebenen G-Code zu " -#~ "deaktivieren." - -#~ msgid "" -#~ "If enabled, bridges are more reliable, can bridge longer distances, but " -#~ "may look worse. If disabled, bridges look better but are reliable just " -#~ "for shorter bridged distances." -#~ msgstr "" -#~ "Wenn diese Option aktiviert ist, sind die Brücken zuverlässiger und " -#~ "können größere Entfernungen überbrücken, sehen aber möglicherweise " -#~ "schlechter aus. Wenn deaktiviert, sehen Brücken besser aus, sind aber nur " -#~ "bei kürzeren überbrückten Entfernungen zuverlässig." - -#~ msgid "" -#~ "Detect single-width walls (parts where two extrusions don't fit and we " -#~ "need to collapse them into a single trace)." -#~ msgstr "" -#~ "Erkennen von Wänden mit einfacher Breite (Teile, bei denen zwei " -#~ "Extrusionen nicht passen und wir sie in eine einzige Druckspur " -#~ "zusammenfassen müssen)." - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for infill " -#~ "for top surfaces. You may want to use thinner extrudates to fill all " -#~ "narrow regions and get a smoother finish. If left zero, default extrusion " -#~ "width will be used if set, otherwise nozzle diameter will be used. If " -#~ "expressed as percentage (for example 90%) it will be computed over layer " -#~ "height." -#~ msgstr "" -#~ "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle " -#~ "Extrusionsbreite für die oberen Außenflächen anzugeben. Dünnere " -#~ "Extrusionsbreiten sind vorteilhaft, um Engstellen auszufüllen und um eine " -#~ "schönere Oberfläche zu erhalten. Falls auf null belassen, wird die " -#~ "Standard-Extrusionsbreite verwendet (falls angeben), ansonsten wird der " -#~ "Durchmesser der Druckdüse verwendet. Falls als Prozentwert (z.B. 90%) " -#~ "angegeben, wird dieser ausgehend von der Schichthöhe berechnet." - -#~ msgid "" -#~ "Speed for printing top solid layers (it only applies to the uppermost " -#~ "external layers and not to their internal solid layers). You may want to " -#~ "slow down this to get a nicer surface finish. This can be expressed as a " -#~ "percentage (for example: 80%) over the solid infill speed above. Set to " -#~ "zero for auto." -#~ msgstr "" -#~ "Druckgeschwindigkeit für die oberen massiven Schichten (betrifft nur die " -#~ "obersten Außenkonturen und nicht deren innenliegende massiven Schichten). " -#~ "Wir empfehlen, diesen Wert zu reduzieren, um eine schönere Oberfläche zu " -#~ "erhalten. Dies kann als Prozentwert (z.B. 80%) der oben eingegebenen " -#~ "Geschwindigkeit für massives Infill angegeben werden. Für Automatik auf " -#~ "null setzen." - -#~ msgid "Number of solid layers to generate on top surfaces." -#~ msgstr "Anzahl der zu erzeugenden massiven Schichten auf der Oberseite." - -#~ msgid "Minimum top shell thickness" -#~ msgstr "Mindeststärke der oberen Schale" - -#~ msgid "Speed for travel moves (jumps between distant extrusion points)." -#~ msgstr "" -#~ "Bewegungsgeschwindigkeit (zwischen weit entfernten Extrusionsorten)." - -#~ msgid "" -#~ "Speed for movements along the Z axis.\n" -#~ "When set to zero, the value is ignored and regular travel speed is used " -#~ "instead." -#~ msgstr "" -#~ "Geschwindigkeit für Bewegungen entlang der Z-Achse.\n" -#~ "Wenn der Wert auf Null gesetzt ist, wird er ignoriert und stattdessen die " -#~ "normale Fahrgeschwindigkeit verwendet." - -#~ msgid "" -#~ "This flag will move the nozzle while retracting to minimize the possible " -#~ "blob on leaky extruders." -#~ msgstr "" -#~ "Diese Einstellung wird die Düse während dem Einzug bewegen, um mögliche " -#~ "Tropfen bei einem undichten Extruder zu minimieren." - -#~ msgid "" -#~ "Multi material printers may need to prime or purge extruders on tool " -#~ "changes. Extrude the excess material into the wipe tower." -#~ msgstr "" -#~ "Multi-Material-Drucker müssen eventuell Extruder bei Werkzeugwechseln " -#~ "vor- oder nachspülen. Extrudieren Sie das überschüssige Material in den " -#~ "Reinigungsturm." - -#~ msgid "" -#~ "This vector saves required volumes to change from/to each tool used on " -#~ "the wipe tower. These values are used to simplify creation of the full " -#~ "purging volumes below." -#~ msgstr "" -#~ "Dieser Vektor speichert die erforderlichen Volumina für den Wechsel von/" -#~ "zu jedem am Reinigungsturm verwendeten Werkzeug. Diese Werte werden " -#~ "verwendet, um die Erstellung des vollen Reinigungsvolumens zu " -#~ "vereinfachen." - -#~ msgid "" -#~ "This matrix describes volumes (in cubic milimetres) required to purge the " -#~ "new filament on the wipe tower for any given pair of tools." -#~ msgstr "" -#~ "Diese Matrix beschreibt die Volumina (in Kubikmillimetern), die benötigt " -#~ "werden, um das neue Filament auf dem Reinigungsturm für ein bestimmtes " -#~ "Werkzeugpaar zu reinigen." - -#~ msgid "Position X" -#~ msgstr "X-Position" - -#~ msgid "X coordinate of the left front corner of a wipe tower" -#~ msgstr "X-Koordinate der linken vorderen Ecke des Reinigungsturms" - -#~ msgid "Position Y" -#~ msgstr "Y-Position" - -#~ msgid "Y coordinate of the left front corner of a wipe tower" -#~ msgstr "Y-Koordinate der linken vorderen Ecke des Reinigungsturms" - -#~ msgid "Width of a wipe tower" -#~ msgstr "Breite des Reinigungsturms" - -#~ msgid "Wipe tower rotation angle" -#~ msgstr "Rotationswinkel des Reinigungsturms" - -#~ msgid "Wipe tower rotation angle with respect to x-axis." -#~ msgstr "Rotationswinkel des Reinigungsturms bezogen auf die X-Achse." - -#~ msgid "Wipe tower brim width" -#~ msgstr "Wischturm Randbreite" - -#~ msgid "Wipe into this object's infill" -#~ msgstr "Das Infill dieses Objekts zum Reinigen verwenden" - -#~ msgid "" -#~ "Purging after toolchange will be done inside this object's infills. This " -#~ "lowers the amount of waste but may result in longer print time due to " -#~ "additional travel moves." -#~ msgstr "" -#~ "Die Spülung nach einem Werkzeugwechsel erfolgt innerhalb der Infills " -#~ "dieses Objekts. Dies verringert die Abfallmenge, kann aber aufgrund der " -#~ "zusätzlichen Verfahrwege zu einer längeren Druckzeit führen." - -#~ msgid "Wipe into this object" -#~ msgstr "Dieses Objekt zum Reinigen verwenden" - -#~ msgid "" -#~ "Object will be used to purge the nozzle after a toolchange to save " -#~ "material that would otherwise end up in the wipe tower and decrease print " -#~ "time. Colours of the objects will be mixed as a result." -#~ msgstr "" -#~ "Objekt wird zum Reinigen der Düse nach einem Materialwechsel verwendet, " -#~ "um Material zu sparen, das sonst im Reinigungsturm landen und die " -#~ "Druckzeit verkürzen würde. Die Farben der Objekte werden dabei gemischt." - -#~ msgid "Maximal bridging distance" -#~ msgstr "Maximaler Überbrückungsabstand" - -#~ msgid "Maximal distance between supports on sparse infill sections." -#~ msgstr "Maximalabstand zwischen Stützen auf spärlichen Infill-Abschnitten." - -#~ msgid "Z offset" -#~ msgstr "Z-Abstand" - -#~ msgid "" -#~ "This value will be added (or subtracted) from all the Z coordinates in " -#~ "the output G-code. It is used to compensate for bad Z endstop position: " -#~ "for example, if your endstop zero actually leaves the nozzle 0.3mm far " -#~ "from the print bed, set this to -0.3 (or fix your endstop)." -#~ msgstr "" -#~ "Dieser Wert wird zu allen Z-Koordinaten im ausgegebenen G-Code " -#~ "hinzuaddiert oder davon abgezogen. Damit kann eine fehlerhafte Z-" -#~ "Endanschlagsposition kompensiert werden: wenn z.B. bei Ihrem Nullwert die " -#~ "Druckdüse sich beim Endanschlag 0.3mm über der Druckplatte befindet, " -#~ "setzen Sie diesen Wert auf -0.3 (oder stellen Sie Ihren Endanschlag neu " -#~ "ein)." - -#~ msgid "Print speed" -#~ msgstr "Druckgeschwindigkeit" - -#~ msgid "Select the printers this profile is compatible with." -#~ msgstr "Wählen Sie die Drucker aus, die mit diesem Profil kompatibel sind." - -#~ msgid "Select the print profiles this profile is compatible with." -#~ msgstr "Wählt die Druckprofile, die mit diesem Profil kompatibel sind." - -#~ msgid "Dependencies" -#~ msgstr "Abhängigkeiten" - -#~ msgid "Profile dependencies" -#~ msgstr "Profil Abhängigkeiten" - -#~ msgid "Detach from system preset" -#~ msgstr "Lösen von der Systemvoreinstellung" - -#~ msgid "This is a default preset." -#~ msgstr "Dies ist eine Standard-Voreinstellung." - -#~ msgid "This is a system preset." -#~ msgstr "Dies ist eine Systemvoreinstellung." - -#~ msgid "Current preset is inherited from the default preset." -#~ msgstr "" -#~ "Aktuelle Voreinstellung ist abgeleitet von der Standardvoreinstellung." - -#~ msgid "Current preset is inherited from" -#~ msgstr "Aktuelle Voreinstellung ist abgeleitet von" - -#~ msgid "It can't be deleted or modified." -#~ msgstr "Es ist keine Löschung oder Änderung möglich." - -#~ msgid "" -#~ "Any modifications should be saved as a new preset inherited from this one." -#~ msgstr "" -#~ "Alle Änderungen sollten als neue Voreinstellungen gespeichert werden, die " -#~ "von diesem vererbt wurden." - -#~ msgid "To do that please specify a new name for the preset." -#~ msgstr "" -#~ "Zur Ausführung geben Sie bitte einen neuen Namen für die Voreinstellung " -#~ "ein." - -#~ msgid "Additional information:" -#~ msgstr "Weitere Informationen:" - -#~ msgid "vendor" -#~ msgstr "Hersteller" - -#~ msgid "printer model" -#~ msgstr "Druckermodell" - -#~ msgid "default print profile" -#~ msgstr "Standard-Druckprofil" - -#~ msgid "default filament profile" -#~ msgstr "Standard-Filamentprofil" - -#~ msgid "default SLA material profile" -#~ msgstr "Standard-SLA-Materialprofil" - -#~ msgid "default SLA print profile" -#~ msgstr "Standard-SLA-Druckprofil" - -#~ msgid "full profile name" -#~ msgstr "vollständiger Profilname" - -#~ msgid "symbolic profile name" -#~ msgstr "symbolischer Profilname" - -#~ msgid "" -#~ "The following line %s contains reserved keywords.\n" -#~ "Please remove it, as it may cause problems in G-code visualization and " -#~ "printing time estimation." -#~ msgid_plural "" -#~ "The following lines %s contain reserved keywords.\n" -#~ "Please remove them, as they may cause problems in G-code visualization " -#~ "and printing time estimation." -#~ msgstr[0] "" -#~ "Die folgende Zeile %s enthält reservierte Schlüsselwörter.\n" -#~ "Bitte entfernen Sie diese, da sie zu Problemen bei der Visualisierung des " -#~ "G-Codes und der Zeiteinschätzung beim Drucken verursachen kann." -#~ msgstr[1] "" -#~ "Die folgenden Zeilen %s enthalten reservierte Schlüsselwörter.\n" -#~ "Bitte entfernen Sie diese, da sie zu Problemen bei der Visualisierung des " -#~ "G-Codes und der Abschätzung der Druckzeit verursachen können." - -#~ msgid "Found reserved keywords in" -#~ msgstr "Reservierte Schlüsselwörter gefunden in" - -#~ msgid "" -#~ "A copy of the current system preset will be created, which will be " -#~ "detached from the system preset." -#~ msgstr "" -#~ "Es wird eine Kopie der aktuellen Systemvoreinstellung erstellt, die von " -#~ "der Systemvoreinstellung gelöst wird." - -#~ msgid "" -#~ "The current custom preset will be detached from the parent system preset." -#~ msgstr "" -#~ "Die aktuelle benutzerdefinierte Voreinstellung wird von der " -#~ "Voreinstellung des übergeordneten Systems gelöst." - -#~ msgid "Modifications to the current profile will be saved." -#~ msgstr "Änderungen am aktuellen Profil werden gespeichert." - -#~ msgid "Detach preset" -#~ msgstr "Lösen der Voreinstellugen" - -#~ msgid "Number of extruders of the printer." -#~ msgstr "Anzahl der Extruder des Druckers." - -#~ msgid "" -#~ "Single Extruder Multi Material is selected, \n" -#~ "and all extruders must have the same diameter.\n" -#~ "Do you want to change the diameter for all extruders to first extruder " -#~ "nozzle diameter value?" -#~ msgstr "" -#~ "Einzel-Extruder Multi-Material ist ausgewählt, \n" -#~ "und alle Extruder müssen den gleichen Durchmesser haben.\n" -#~ "Möchten Sie den Durchmesser für alle Extruder auf den Wert des ersten " -#~ "Extruderdüsendurchmessers ändern?" - -#~ msgid "Firmware" -#~ msgstr "Firmware" - -#~ msgid "Size and coordinates" -#~ msgstr "Größe und Koordinaten" - -#~ msgid "Tilt" -#~ msgstr "Kippen" - -#~ msgid "Tilt time" -#~ msgstr "Kippzeit" - -#~ msgid "Corrections" -#~ msgstr "Korrekturen" - -#~ msgid "Exposure" -#~ msgstr "Belichtung" - -#~ msgid "Values in this column are for Normal mode" -#~ msgstr "Werte in dieser Spalte sind für den normalen Modus" - -#~ msgid "Values in this column are for Stealth mode" -#~ msgstr "Werte in dieser Spalte sind für den Stealth Modus" - -#~ msgid "Single extruder MM setup" -#~ msgstr "Einzelextruder MM Setup" - -#~ msgid "Single extruder multimaterial parameters" -#~ msgstr "Einzelextruder Multimaterial Parameter" - -#~ msgid "" -#~ "This is a single extruder multimaterial printer, diameters of all " -#~ "extruders will be set to the new value. Do you want to proceed?" -#~ msgstr "" -#~ "Dies ist ein Einzelextruder-Multimaterialdrucker, die Durchmesser aller " -#~ "Extruder werden auf den neuen Wert eingestellt. Möchten Sie fortfahren?" - -#~ msgid "Position (for multi-extruder printers)" -#~ msgstr "Position (für Multi-Extruder-Drucker)" - -#~ msgid "Reset to Filament Color" -#~ msgstr "Zurücksetzen auf Filamentfarbe" - -#~ msgid "" -#~ "The physical printer below is based on the preset, you are going to " -#~ "delete." -#~ msgid_plural "" -#~ "The physical printers below are based on the preset, you are going to " -#~ "delete." -#~ msgstr[0] "" -#~ "Der unten stehende physische Drucker basiert auf der Voreinstellung, die " -#~ "Sie löschen wollen." -#~ msgstr[1] "" -#~ "Die unten aufgeführten physischen Drucker basieren auf der " -#~ "Voreinstellung, die Sie löschen möchten." - -#~ msgid "" -#~ "Note, that the selected preset will be deleted from this printer too." -#~ msgid_plural "" -#~ "Note, that the selected preset will be deleted from these printers too." -#~ msgstr[0] "" -#~ "Beachten Sie, dass die ausgewählte Voreinstellung auch von diesem Drucker " -#~ "gelöscht wird." -#~ msgstr[1] "" -#~ "Beachten Sie, dass die ausgewählte Voreinstellung auch von diesen " -#~ "Druckern gelöscht wird." - -#~ msgid "" -#~ "The physical printer below is based only on the preset, you are going to " -#~ "delete." -#~ msgid_plural "" -#~ "The physical printers below are based only on the preset, you are going " -#~ "to delete." -#~ msgstr[0] "" -#~ "Der unten stehenden physische Drucker basiert nur auf der Voreinstellung, " -#~ "die Sie löschen wollen." -#~ msgstr[1] "" -#~ "Die unten stehenden physischen Drucker basieren nur auf der " -#~ "Voreinstellung, die Sie löschen wollen." - -#~ msgid "" -#~ "Note, that this printer will be deleted after deleting the selected " -#~ "preset." -#~ msgid_plural "" -#~ "Note, that these printers will be deleted after deleting the selected " -#~ "preset." -#~ msgstr[0] "" -#~ "Beachten Sie, dass dieser Drucker nach dem Löschen der ausgewählten " -#~ "Voreinstellung gelöscht wird." -#~ msgstr[1] "" -#~ "Beachten Sie, dass diese Drucker nach dem Löschen der ausgewählten " -#~ "Voreinstellung gelöscht werden." - -#~ msgid "Are you sure you want to %1% the selected preset?" -#~ msgstr "Sind Sie sicher, dass Sie die gewählte Voreinstellung %1% möchten?" - -#~ msgid "" -#~ "LOCKED LOCK icon indicates that the settings are the same as the system " -#~ "(or default) values for the current option group" -#~ msgstr "" -#~ "Das Symbol GESCHLOSSENES SCHLOSS zeigt an, dass die Einstellungen mit den " -#~ "System- (oder Standard-) Werten für die aktuelle Optionsgruppe " -#~ "übereinstimmen" - -#~ msgid "" -#~ "UNLOCKED LOCK icon indicates that some settings were changed and are not " -#~ "equal to the system (or default) values for the current option group.\n" -#~ "Click to reset all settings for current option group to the system (or " -#~ "default) values." -#~ msgstr "" -#~ "Das Symbol GEÖFFNETES SCHLOSS zeigt an, dass einige Einstellungen " -#~ "geändert wurden und nicht mehr mit den System- (oder Standard-) Werte für " -#~ "die aktuelle Optionsgruppe identisch sind.\n" -#~ "Klicken Sie, um alle Einstellungen für die aktuelle Optionsgruppe auf die " -#~ "System- (oder Standard-) Werte zurückzusetzen." - -#~ msgid "WHITE BULLET icon indicates a non system (or non default) preset." -#~ msgstr "" -#~ "Das Symbol mit dem WEISSEN PUNKT zeigt eine Nicht-System- (oder nicht " -#~ "standardmäßige) Voreinstellung an." - -#~ msgid "" -#~ "WHITE BULLET icon indicates that the settings are the same as in the last " -#~ "saved preset for the current option group." -#~ msgstr "" -#~ "Das Symbol WEISSER PUNKT zeigt an, dass die Einstellungen dieselben sind " -#~ "wie in der zuletzt gespeicherten Voreinstellung für die aktuelle " -#~ "Optionsgruppe." - -#~ 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" -#~ "Click to reset all settings for the current option group to the last " -#~ "saved preset." -#~ msgstr "" -#~ "Das Symbol PFEIL ZURÜCK zeigt an, dass die Einstellungen geändert wurden " -#~ "und nicht mit dem zuletzt gespeicherten Preset für die aktuelle " -#~ "Optionsgruppe übereinstimmen. Klicken Sie hier, um alle Einstellungen für " -#~ "die aktuelle Optionsgruppe auf das zuletzt gespeicherte Preset " -#~ "zurückzusetzen." - -#~ msgid "" -#~ "LOCKED LOCK icon indicates that the value is the same as the system (or " -#~ "default) value." -#~ msgstr "" -#~ "Das Symbol GESCHLOSSENES SCHLOSS zeigt an, dass der Wert mit dem System- " -#~ "(oder Standard-) Wert übereinstimmt." - -#~ msgid "" -#~ "UNLOCKED LOCK icon indicates that the value was changed and is not equal " -#~ "to the system (or default) value.\n" -#~ "Click to reset current value to the system (or default) value." -#~ msgstr "" -#~ "Das Symbol GEÖFFNETES SCHLOSS zeigt an, dass der Wert geändert wurde und " -#~ "nicht mit der System- (oder Standard-) Einstellung identisch ist.\n" -#~ "Klicken Sie, um den aktuellen Wert auf die System- (oder Standard-) " -#~ "Einstellung zurückzusetzen." - -#~ msgid "" -#~ "WHITE BULLET icon indicates that the value is the same as in the last " -#~ "saved preset." -#~ msgstr "" -#~ "Das Symbol WEISSER PUNKT zeigt an, dass der Wert identisch ist mit " -#~ "demjenigen in der zuletzt gespeicherten Voreinstellung." - -#~ msgid "" -#~ "BACK ARROW icon indicates that the value was changed and is not equal to " -#~ "the last saved preset.\n" -#~ "Click to reset current value to the last saved preset." -#~ msgstr "" -#~ "Das Symbol PFEIL ZURÜCK zeigt an, dass der Wert geändert wurde und nicht " -#~ "mit dem zuletzt gespeicherten Preset übereinstimmt. \n" -#~ "Klicken Sie, um den aktuellen Wert auf das zuletzt gespeicherte Preset " -#~ "zurückzusetzen." - -#~ msgid "Material" -#~ msgstr "Material" - -#~ msgid "Material printing profile" -#~ msgstr "Material Druckprofil" - -#~ msgid "Layers and perimeters" -#~ msgstr "Schichten und Umfänge" - -#~ msgid "Supports" -#~ msgstr "Stützen" - -#~ msgid "Support head" -#~ msgstr "Stützkopf" - -#~ msgid "Support pillar" -#~ msgstr "Stützpfeiler" - -#~ msgid "Connection of the support sticks and junctions" -#~ msgstr "Verbindung von Stützstäben und Verbindungen" - -#~ msgid "Automatic generation" -#~ msgstr "Automatische Erzeugung" - -#~ msgid "Pad" -#~ msgstr "Grundschicht (Pad)" - -#~ msgid "Hollowing" -#~ msgstr "Aushöhlen" - -#~ msgid "Output options" -#~ msgstr "Ausgabeoptionen" - -#~ msgid "" -#~ "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" -#~ "To enable \"%1%\", please switch off \"%2%\"" -#~ msgstr "" -#~ "\"%1%\" ist deaktiviert, weil \"%2%\" in der Kategorie \"%3%\" " -#~ "eingeschaltet ist.\n" -#~ "Um \"%1%\" zu aktivieren, schalten Sie bitte \"%2%\" aus." - -#~ msgid "Object elevation" -#~ msgstr "Objekt-Hebung" - -#~ msgid "Pad around object" -#~ msgstr "Grundschicht um Objekt" - -#~ msgid "Print Settings" -#~ msgstr "Druckeinstellungen" - -#~ msgid "" -#~ "Preselects faces by overhang angle. It is possible to restrict paintable " -#~ "facets to only preselected faces when the option \"%1%\" is enabled." -#~ msgstr "" -#~ "Wählt Flächen nach Überhangswinkel vor. Wenn die Option \"%1%\" aktiviert " -#~ "ist, können Sie die bemalbaren Flächen auf die vorausgewählten Flächen " -#~ "beschränken." - -#~ msgid "Highlight overhang by angle" -#~ msgstr "Überhang nach Winkel hervorheben" - -#~ msgid "Enforce" -#~ msgstr "Erzwinge" - -#~ msgid "On overhangs only" -#~ msgstr "Nur für Überhänge" - -#~ msgid "Paints facets according to the chosen painting brush." -#~ msgstr "Bemalt Flächen entsprechend dem gewählten Pinsel." - -#~ msgid "" -#~ "Paints neighboring facets whose relative angle is less or equal to set " -#~ "angle." -#~ msgstr "" -#~ "Färbt benachbarte Flächen, deren relativer Winkel kleiner oder gleich dem " -#~ "eingestellten Winkel ist." - -#~ msgid "Allows painting only on facets selected by: \"%1%\"" -#~ msgstr "Erlaubt das Malen nur auf Flächen, ausgewählt mit: \"%1%\"" - -#~ msgid "Paints only one facet." -#~ msgstr "Bemalt nur eine Fläche." - -#~ msgid "Splits bigger facets into smaller ones while the object is painted." -#~ msgstr "" -#~ "Teilt größere Flächen in kleinere Flächen auf, während das Objekt bemalt " -#~ "wird." - -#~ msgid "Select what kind of support do you need" -#~ msgstr "Wählen Sie aus, welche Art von Unterstützung Sie benötigen" - -#~ msgid "Support on build plate only" -#~ msgstr "Stützen nur auf dem Druckbett" - -#~ msgid "For support enforcers only" -#~ msgstr "Nur für Stützverstärker" - -#~ msgid "Everywhere" -#~ msgstr "Überall" - -#~ msgid "" -#~ "This flag enables the brim that will be printed around each object on the " -#~ "first layer." -#~ msgstr "" -#~ "Dieses Kontrollkästchen aktiviert den Rand (Brim), der um jedes Objekt " -#~ "auf der ersten Ebene gedruckt wird." - -#~ msgid "Select what kind of pad do you need" -#~ msgstr "Wählen Sie aus, welche Art von Grundschicht Sie benötigen" - -#~ msgid "Below object" -#~ msgstr "Unter dem Objekt" - -#~ msgid "Around object" -#~ msgstr "Um das Objekt" - -#~ msgid "" -#~ "The first layer will be shrunk in the XY plane by the configured value to " -#~ "compensate for the 1st layer squish aka an Elephant Foot effect." -#~ msgstr "" -#~ "Die erste Schicht wird in der XY-Ebene um den vorgegebenen Wert " -#~ "verkleinert, um das Ausquetschen in der ersten Schicht (\"Elephant Foot\"-" -#~ "Effekt) zu kompensieren." - -#~ msgid "G-code thumbnails" -#~ msgstr "G-Code-Miniaturbilder" - -#~ msgid "" -#~ "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " -#~ "following format: \"XxY, XxY, ...\"" -#~ msgstr "" -#~ "Bildgrößen, die in einer .gcode und .sl1 / .sl1s Datei gespeichert werden " -#~ "sollen, im folgenden Format: \"XxY, XxY, ...\"" - -#~ msgid "" -#~ "This setting controls the height (and thus the total number) of the " -#~ "slices/layers. Thinner layers give better accuracy but take more time to " -#~ "print." -#~ msgstr "" -#~ "Diese Einstellung bestimmt die Höhe (und damit die Gesamtanzahl) der " -#~ "Scheiben/Schichten. Dünnere Schichten ergeben eine bessere Genauigkeit, " -#~ "benötigen aber mehr Zeit zum Drucken." - -#~ msgid "" -#~ "Set this to the maximum height that can be reached by your extruder while " -#~ "printing." -#~ msgstr "" -#~ "Stellen Sie hier die maximale Höhe ein, die Ihr Extruder beim Drucken " -#~ "erreichen kann." - -#~ msgid "" -#~ "Optimize travel moves in order to minimize the crossing of perimeters. " -#~ "This is mostly useful with Bowden extruders which suffer from oozing. " -#~ "This feature slows down both the print and the G-code generation." -#~ msgstr "" -#~ "Optimieren Sie die Verfahrbewegungen, um das Überschreiten von Konturen " -#~ "zu minimieren. Dies ist vor allem bei Bowdenextrudern nützlich, die unter " -#~ "sickerndem Material leiden. Diese Funktion verlangsamt sowohl den Druck " -#~ "als auch die Generierung des G-Codes." - -#~ msgid "" -#~ "The maximum detour length for avoid crossing perimeters. If the detour is " -#~ "longer than this value, avoid crossing perimeters is not applied for this " -#~ "travel path. Detour length could be specified either as an absolute value " -#~ "or as percentage (for example 50%) of a direct travel path." -#~ msgstr "" -#~ "Die maximale Umleitungslänge für kreuzen der Kontur vermeiden. Wenn die " -#~ "Umleitung länger als dieser Wert ist, wird die Umgehung von Konturen " -#~ "nicht für diesen Fahrweg angewendet. Die Umleitungslänge kann entweder " -#~ "als absoluter Wert oder als Prozentsatz (z. B. 50 %) eines direkten " -#~ "Verfahrwegs angegeben werden." - -#~ msgid "" -#~ "Bed temperature for layers after the first one. Set this to zero to " -#~ "disable bed temperature control commands in the output." -#~ msgstr "" -#~ "Druckbetttemperatur für Schichten nach der ersten Schicht. Setzen Sie " -#~ "diesen Wert auf null, um die Befehle zur Steuerung der Betttemperatur im " -#~ "Output zu deaktivieren." - -#~ msgid "" -#~ "This custom code is inserted at every layer change, right before the Z " -#~ "move. Note that you can use placeholder variables for all Slic3r settings " -#~ "as well as [layer_num] and [layer_z]." -#~ msgstr "" -#~ "Dieser benutzerdefinierte Code wird bei jedem Lagenwechsel, unmittelbar " -#~ "vor der Z Bewegung, eingefügt. Beachten Sie, dass Sie " -#~ "Platzhaltervariablen für alle PrusaSlicer-Einstellungen sowie [layer_num] " -#~ "und [layer_z] verwenden können." - -#~ msgid "Number of solid layers to generate on bottom surfaces." -#~ msgstr "Anzahl der zu erzeugenden massiven Schichten auf der Bodenfläche." - -#~ msgid "Bottom solid layers" -#~ msgstr "Massive Basisschichten" - -#~ msgid "Minimum bottom shell thickness" -#~ msgstr "Minimale Stärke der Bodenschale" - -#~ msgid "This fan speed is enforced during all bridges and overhangs." -#~ msgstr "" -#~ "Die Lüftergeschwindigkeit, die für Überbrückungen und Überhänge benutzt " -#~ "wird." - -#~ msgid "" -#~ "This factor affects the amount of plastic for bridging. You can decrease " -#~ "it slightly to pull the extrudates and prevent sagging, although default " -#~ "settings are usually good and you should experiment with cooling (use a " -#~ "fan) before tweaking this." -#~ msgstr "" -#~ "Diese Einstellung beeinflusst den Materialausstoss bei Brücken. Sie " -#~ "können den Wert leicht verringern, um die Extrusionsfäden zu strecken und " -#~ "ein Durchhängen zu vermeiden. Die Standardwerte sind aber normalerweise " -#~ "ausreichend und Sie sollten zuerst mit der Lüftergeschwindigkeit " -#~ "experimentieren, bevor Sie diesen Wert verändern." - -#~ msgid "Speed for printing bridges." -#~ msgstr "Brückendruckgeschwindigkeit." - -#~ msgid "Skirt and brim" -#~ msgstr "Schürze und Rand" - -#~ msgid "" -#~ "The horizontal width of the brim that will be printed around each object " -#~ "on the first layer. When raft is used, no brim is generated (use " -#~ "raft_first_layer_expansion)." -#~ msgstr "" -#~ "Die horizontale Breite des Rands, der um jedes Objekt in der ersten " -#~ "Schicht gedruckt wird. Wenn Raft verwendet wird, wird kein Rand erzeugt " -#~ "(verwenden Sie raft_first_layer_expansion)." - -#~ msgid "" -#~ "The places where the brim will be printed around each object on the first " -#~ "layer." -#~ msgstr "" -#~ "Die Stellen, an denen der Rand um jedes Objekt auf der ersten Schicht " -#~ "gedruckt werden soll." - -#~ msgid "" -#~ "Offset of brim from the printed object. The offset is applied after the " -#~ "elephant foot compensation." -#~ msgstr "" -#~ "Versatz des Rands zum gedruckten Objekt. Der Versatz wird nach dem " -#~ "Elefantenfußausgleich angewendet." - -#~ msgid "" -#~ "This flag enables the automatic cooling logic that adjusts print speed " -#~ "and fan speed according to layer printing time." -#~ msgstr "" -#~ "Diese Einstellung aktiviert die Logik, die die Druckgeschwindigkeit und " -#~ "Lüftergeschwindigkeit automatisch gemäß der Schichtdruckdauer regelt." - -#~ msgid "" -#~ "This is the acceleration your printer will be reset to after the role-" -#~ "specific acceleration values are used (perimeter/infill). Set zero to " -#~ "prevent resetting acceleration at all." -#~ msgstr "" -#~ "Dies ist der Beschleunigungswert, auf den Ihr Drucker zurückgesetzt wird, " -#~ "nachdem aufgabenspezifische Beschleunigungswerte (Außenkonturen/Infill) " -#~ "verwendet wurden. Setzen Sie dies auf null, um ein Zurückstellen der " -#~ "Beschleunigungswerte zu deaktivieren." - -#~ msgid "" -#~ "Default filament profile associated with the current printer profile. On " -#~ "selection of the current printer profile, this filament profile will be " -#~ "activated." -#~ msgstr "" -#~ "Standard-Filamentprofil, das dem aktuellen Druckerprofil zugeordnet ist. " -#~ "Bei Auswahl des aktuellen Druckerprofils wird dieses Filamentprofil " -#~ "aktiviert." - -#~ msgid "Default print profile" -#~ msgstr "Standard-Druckprofil" - -#~ msgid "" -#~ "Default print profile associated with the current printer profile. On " -#~ "selection of the current printer profile, this print profile will be " -#~ "activated." -#~ msgstr "" -#~ "Standarddruckprofil, das dem aktuellen Druckerprofil zugeordnet ist. Bei " -#~ "Auswahl des aktuellen Druckerprofils wird dieses Druckprofil aktiviert." - -#~ msgid "" -#~ "You can set this to a positive value to disable fan at all during the " -#~ "first layers, so that it does not make adhesion worse." -#~ msgstr "" -#~ "Sie können einen positiven Wert eingeben, um den Lüfter vollständig für " -#~ "die ersten Schichten auszuschalten, damit er die Haftung nicht " -#~ "beeinträchtigt." - -#~ msgid "" -#~ "Experimental option for preventing support material from being generated " -#~ "under bridged areas." -#~ msgstr "" -#~ "Experimentelle Option zur Verhinderung der Bildung von Trägermaterial " -#~ "unter Überbrückungsflächen." - -#~ msgid "Distance between copies" -#~ msgstr "Abstand zwischen Kopien" - -#~ msgid "Distance used for the auto-arrange feature of the plater." -#~ msgstr "Abstand für die automatische Druckplattenbelegung." - -#~ msgid "" -#~ "Fill pattern for top infill. This only affects the top visible layer, and " -#~ "not its adjacent solid shells." -#~ msgstr "" -#~ "Füllmuster für die obere Füllung. Dies betrifft nur die obere sichtbare " -#~ "Schicht und nicht die angrenzenden massiven Konturen." - -#~ msgid "" -#~ "Fill pattern for bottom infill. This only affects the bottom external " -#~ "visible layer, and not its adjacent solid shells." -#~ msgstr "" -#~ "Füllmuster für die Boden Füllung. Dies wirkt sich nur auf die äußere " -#~ "sichtbare Bodenschicht aus, nicht aber auf die angrenzenden massiven " -#~ "Konturen." - -#~ msgid "" -#~ "When printing with very low layer heights, you might still want to print " -#~ "a thicker bottom layer to improve adhesion and tolerance for non perfect " -#~ "build plates." -#~ msgstr "" -#~ "Wenn Sie mit sehr niedrigen Schichten drucken, sollten Sie trotzdem eine " -#~ "dickere untere Schicht drucken, um die Haftung und die Toleranz für nicht " -#~ "perfekte Druckplatten zu verbessern." - -#~ msgid "" -#~ "If expressed as absolute value in mm/s, this speed will be applied to all " -#~ "the print moves of the first layer, regardless of their type. If " -#~ "expressed as a percentage (for example: 40%) it will scale the default " -#~ "speeds." -#~ msgstr "" -#~ "Wird diese Geschwindigkeit als Absolutwert in mm/s angegeben, so wird sie " -#~ "auf alle Druckbewegungen der ersten Lage angewendet, unabhängig von ihrem " -#~ "Typ. In Prozent ausgedrückt (z.B. 40%) skaliert es die voreingestellten " -#~ "Geschwindigkeiten." - -#~ msgid "First layer nozzle temperature" -#~ msgstr "Erste Schicht Düsentemperatur" - -#~ msgid "" -#~ "Nozzle temperature for the first layer. If you want to control " -#~ "temperature manually during print, set this to zero to disable " -#~ "temperature control commands in the output G-code." -#~ msgstr "" -#~ "Düsentemperatur für die erste Schicht. Wenn Sie die Temperatur während " -#~ "des Drucks manuell steuern möchten, setzen Sie diesen Wert auf Null, um " -#~ "Temperatursteuerungsbefehle im ausgegebenen G-Code zu deaktivieren." - -#~ msgid "" -#~ "This option sets the number of perimeters to generate for each layer. " -#~ "Note that Slic3r may increase this number automatically when it detects " -#~ "sloping surfaces which benefit from a higher number of perimeters if the " -#~ "Extra Perimeters option is enabled." -#~ msgstr "" -#~ "Diese Stellung bestimmt die Anzahl der Außenkonturen, die für jede " -#~ "Schicht erzeugt werden. PusaSlicer kann diese Zahl automatisch " -#~ "vergrößern, wenn es schräge Oberflächen erkennt, die sich mit einer " -#~ "höheren Zahl von Außenkonturen besser drucken lassen, wenn die " -#~ "\"Zusätzliche Außenkonturen falls notwendig\" Option aktiviert ist." - -#~ msgid "(minimum)" -#~ msgstr "(Minimum)" - -#~ msgid "Position of perimeters starting points." -#~ msgstr "Position des Startpunktes des Umfangs." - -#~ msgid "Display width" -#~ msgstr "Displaybreite" - -#~ msgid "Width of the display" -#~ msgstr "Displaybreite" - -#~ msgid "Display height" -#~ msgstr "Displayhöhe" - -#~ msgid "Height of the display" -#~ msgstr "Displayhöhe" - -#~ msgid "Number of pixels in" -#~ msgstr "Anzahl an Pixeln in" - -#~ msgid "Number of pixels in X" -#~ msgstr "Anzahl an Pixeln in X" - -#~ msgid "Number of pixels in Y" -#~ msgstr "Anzahl an Pixeln in Y" - -#~ msgid "Display horizontal mirroring" -#~ msgstr "Zeige horizontale Spiegelung" - -#~ msgid "Mirror horizontally" -#~ msgstr "Horizontal spiegeln" - -#~ msgid "Enable horizontal mirroring of output images" -#~ msgstr "Horizontale Spiegelung der Ausgabebilder aktivieren" - -#~ msgid "Display vertical mirroring" -#~ msgstr "Zeige vertikale Spiegelung" - -#~ msgid "Mirror vertically" -#~ msgstr "Vertikal spiegeln" - -#~ msgid "Enable vertical mirroring of output images" -#~ msgstr "Vertikale Spiegelung der Ausgabebilder aktivieren" - -#~ msgid "Display orientation" -#~ msgstr "Displayausrichtung" - -#~ msgid "" -#~ "Set the actual LCD display orientation inside the SLA printer. Portrait " -#~ "mode will flip the meaning of display width and height parameters and the " -#~ "output images will be rotated by 90 degrees." -#~ msgstr "" -#~ "Setzt die aktuelle Ausrichtung der LCD-Anzeige im SLA-Drucker. Der " -#~ "Hochformatmodus kehrt die Bedeutung der Anzeigeparameter Breite und Höhe " -#~ "um und die Ausgabebilder werden um 90 Grad gedreht." - -#~ msgid "Landscape" -#~ msgstr "Querformat" - -#~ msgid "Portrait" -#~ msgstr "Hochformat" - -#~ msgid "Fast" -#~ msgstr "Schnell" - -#~ msgid "Fast tilt" -#~ msgstr "Schnelles Kippen" - -#~ msgid "Time of the fast tilt" -#~ msgstr "Dauer des schnellen Kippens" - -#~ msgid "Slow" -#~ msgstr "Langsam" - -#~ msgid "Slow tilt" -#~ msgstr "Langsames Kippen" - -#~ msgid "Time of the slow tilt" -#~ msgstr "Dauer des langsamen Kippens" - -#~ msgid "Area fill" -#~ msgstr "Bereichsfüllung" - -#~ msgid "" -#~ "The percentage of the bed area. \n" -#~ "If the print area exceeds the specified value, \n" -#~ "then a slow tilt will be used, otherwise - a fast tilt" -#~ msgstr "" -#~ "Der Prozentsatz der Druckbettfläche.\n" -#~ "Wenn der Druckbereich den angegebenen Wert überschreitet,\n" -#~ "wird eine langsame Verkippung verwendet, andernfalls - eine schnelle " -#~ "Verkippung" - -#~ msgid "Printer scaling correction" -#~ msgstr "Drucker skalierte Korrektur" - -#~ msgid "Printer scaling correction in X axis" -#~ msgstr "Korrektur der Druckerskalierung in der X-Achse" - -#~ msgid "Printer scaling X axis correction" -#~ msgstr "Druckerskalierung X-Achsen-Korrektur" - -#~ msgid "Printer scaling correction in Y axis" -#~ msgstr "Korrektur der Druckerskalierung in der Y-Achse" - -#~ msgid "Printer scaling Y axis correction" -#~ msgstr "Druckerskalierung Y-Achsen-Korrektur" - -#~ msgid "Printer scaling correction in Z axis" -#~ msgstr "Korrektur der Druckerskalierung in der Z-Achse" - -#~ msgid "Printer scaling Z axis correction" -#~ msgstr "Druckerskalierung Z-Achsen-Korrektur" - -#~ msgid "Printer absolute correction" -#~ msgstr "Drucker absolute Korrektur" - -#~ msgid "" -#~ "Will inflate or deflate the sliced 2D polygons according to the sign of " -#~ "the correction." -#~ msgstr "" -#~ "Vergrößert oder verringert die geslicten 2D-Polygone entsprechend dem " -#~ "Vorzeichen der Korrektur." - -#~ msgid "Elephant foot minimum width" -#~ msgstr "Elefantenfuß Mindestbreite" - -#~ msgid "" -#~ "Minimum width of features to maintain when doing elephant foot " -#~ "compensation." -#~ msgstr "" -#~ "Mindestbreite der Merkmale, die bei der Kompensation des Elefantenfußes " -#~ "einzuhalten sind." - -#~ msgid "Printer gamma correction" -#~ msgstr "Drucker Gammakorrektur" - -#~ msgid "" -#~ "This will apply a gamma correction to the rasterized 2D polygons. A gamma " -#~ "value of zero means thresholding with the threshold in the middle. This " -#~ "behaviour eliminates antialiasing without losing holes in polygons." -#~ msgstr "" -#~ "Dadurch wird eine Gammakorrektur auf die gerasterten 2D-Polygone " -#~ "angewendet. Ein Gamma-Wert von null bedeutet Schwellenwertbildung mit dem " -#~ "Schwellenwert in der Mitte. Dieses Verhalten eliminiert Antialiasing, " -#~ "ohne Löcher in Polygonen zu verlieren." - -#~ msgid "SLA material type" -#~ msgstr "SLA Materialtyp" - -#~ msgid "Bottle volume" -#~ msgstr "Flaschenvolumen" - -#~ msgid "ml" -#~ msgstr "ml" - -#~ msgid "Bottle weight" -#~ msgstr "Flaschengewicht" - -#~ msgid "kg" -#~ msgstr "kg" - -#~ msgid "g/ml" -#~ msgstr "g/ml" - -#~ msgid "money/bottle" -#~ msgstr "Kosten/Flasche" - -#~ msgid "Faded layers" -#~ msgstr "Ausblendende Schichten" - -#~ msgid "" -#~ "Number of the layers needed for the exposure time fade from initial " -#~ "exposure time to the exposure time" -#~ msgstr "" -#~ "Anzahl der für die Reduzierung der Belichtungszeit benötigten Schichten, " -#~ "von der anfänglichen bis zur Belichtungszeit" - -#~ msgid "Minimum exposure time" -#~ msgstr "Minimale Belichtungszeit" - -#~ msgid "Maximum exposure time" -#~ msgstr "Maximale Belichtungszeit" - -#~ msgid "Exposure time" -#~ msgstr "Belichtungszeit" - -#~ msgid "Minimum initial exposure time" -#~ msgstr "Minimale Anfang-Belichtungszeit" - -#~ msgid "Maximum initial exposure time" -#~ msgstr "Maximale Anfang-Belichtungszeit" - -#~ msgid "Initial exposure time" -#~ msgstr "Anfang-Belichtungszeit" - -#~ msgid "Correction for expansion" -#~ msgstr "Korrektur der Ausdehnung" - -#~ msgid "Correction for expansion in X axis" -#~ msgstr "Korrektur der Ausdehnung in der X-Achse" - -#~ msgid "Correction for expansion in Y axis" -#~ msgstr "Korrektur der Ausdehnung in der Y-Achse" - -#~ msgid "Correction for expansion in Z axis" -#~ msgstr "Korrektur der Ausdehnung in der Z-Achse" - -#~ msgid "Default SLA material profile" -#~ msgstr "Standard-SLA-Materialprofil" - -#~ msgid "Generate supports" -#~ msgstr "Stützen generieren" - -#~ msgid "Generate supports for the models" -#~ msgstr "Erzeugt Stützen für die Modelle" - -#~ msgid "Pinhead front diameter" -#~ msgstr "Nadelkopf vorderer Durchmesser" - -#~ msgid "Diameter of the pointing side of the head" -#~ msgstr "Durchmesser der Spitzenseite des Kopfes" - -#~ msgid "Head penetration" -#~ msgstr "Kopfeindringung" - -#~ msgid "How much the pinhead has to penetrate the model surface" -#~ msgstr "Wie tief der Nadelkopf in die Modelloberfläche eindringt" - -#~ msgid "Pinhead width" -#~ msgstr "Nadelkopf Breite" - -#~ msgid "Width from the back sphere center to the front sphere center" -#~ msgstr "" -#~ "Abstand von der Mitte der hinteren Kugel bis zur Mitte der vorderen Kugel" - -#~ msgid "Pillar diameter" -#~ msgstr "Pfeiler-Durchmesser" - -#~ msgid "Diameter in mm of the support pillars" -#~ msgstr "Durchmesser der Stützpfeiler in mm" - -#~ msgid "Small pillar diameter percent" -#~ msgstr "Kleiner Pfeilerdurchmesser in Prozent" - -#~ msgid "" -#~ "The percentage of smaller pillars compared to the normal pillar diameter " -#~ "which are used in problematic areas where a normal pilla cannot fit." -#~ msgstr "" -#~ "Der Prozentsatz der im Vergleich zum normalen Pfeilerdurchmesser " -#~ "kleineren Pfeiler, die in problematischen Bereichen eingesetzt werden, in " -#~ "die ein normaler Pfeiler nicht passt." - -#~ msgid "Max bridges on a pillar" -#~ msgstr "Max Brücken auf einem Pfeiler" - -#~ msgid "" -#~ "Maximum number of bridges that can be placed on a pillar. Bridges hold " -#~ "support point pinheads and connect to pillars as small branches." -#~ msgstr "" -#~ "Maximale Anzahl von Brücken, die auf einen Pfeiler gesetzt werden können. " -#~ "Brücken halten Stützpunkt-Nadelköpfe und verbinden sich als kleine Äste " -#~ "mit den Pfeilern." - -#~ msgid "Pillar connection mode" -#~ msgstr "Pfeiler-Verbindungsmodus" - -#~ msgid "" -#~ "Controls the bridge type between two neighboring pillars. Can be zig-zag, " -#~ "cross (double zig-zag) or dynamic which will automatically switch between " -#~ "the first two depending on the distance of the two pillars." -#~ msgstr "" -#~ "Steuert den Brückentyp zwischen zwei benachbarten Säulen. Kann Zickzack, " -#~ "Kreuz (Doppelzickzack) oder dynamisch sein, das je nach Abstand der " -#~ "beiden Säulen automatisch zwischen den beiden erstgenannten umschaltet." - -#~ msgid "Zig-Zag" -#~ msgstr "Zickzack" - -#~ msgid "Cross" -#~ msgstr "Kreuz" - -#~ msgid "Dynamic" -#~ msgstr "Dynamisch" - -#~ msgid "Pillar widening factor" -#~ msgstr "Pfeilerverbreiterungsfaktor" - -#~ msgid "" -#~ "Merging bridges or pillars into another pillars can increase the radius. " -#~ "Zero means no increase, one means full increase." -#~ msgstr "" -#~ "Das Zusammenfügen von Brücken oder Säulen in andere Säulen kann den " -#~ "Radius vergrößern. Null bedeutet keine Erhöhung, eins bedeutet volle " -#~ "Erhöhung." - -#~ msgid "Support base diameter" -#~ msgstr "Stützfuß Durchmesser" - -#~ msgid "Diameter in mm of the pillar base" -#~ msgstr "Durchmesser der Pfeilerbasis in mm" - -#~ msgid "Support base height" -#~ msgstr "Stützfuß Höhe" - -#~ msgid "The height of the pillar base cone" -#~ msgstr "Die Höhe des Pfeilergrundkegels" - -#~ msgid "Support base safety distance" -#~ msgstr "Sicherheitsabstand der Stützbasis" - -#~ msgid "" -#~ "The minimum distance of the pillar base from the model in mm. Makes sense " -#~ "in zero elevation mode where a gap according to this parameter is " -#~ "inserted between the model and the pad." -#~ msgstr "" -#~ "Der Mindestabstand des Säulenfußes zum Modell in mm. Sinnvoll im " -#~ "Nullhöhenmodus, bei dem ein Spalt gemäß diesem Parameter zwischen Modell " -#~ "und Grundschicht eingefügt wird." - -#~ msgid "Critical angle" -#~ msgstr "Kritischer Winkel" - -#~ msgid "The default angle for connecting support sticks and junctions." -#~ msgstr "" -#~ "Der Standardwinkel für die Verbindung von Stützstäben und Verbindungen." - -#~ msgid "The max length of a bridge" -#~ msgstr "Die maximale Länge einer Überbrückung" - -#~ msgid "Max pillar linking distance" -#~ msgstr "Max. Pfeiler Verbindungsabstand" - -#~ msgid "" -#~ "The max distance of two pillars to get linked with each other. A zero " -#~ "value will prohibit pillar cascading." -#~ msgstr "" -#~ "Der maximale Abstand zwischen 2 Pfeilern, die miteinander verbunden " -#~ "werden. Ein Wert von null verhindert die Kaskadierung von Pfeilern." - -#~ msgid "" -#~ "How much the supports should lift up the supported object. If \"Pad " -#~ "around object\" is enabled, this value is ignored." -#~ msgstr "" -#~ "Wie viel die Stützen das unterstützte Objekt anheben sollen. Wenn " -#~ "\"Grundschicht um Objekt\" aktiviert ist, wird dieser Wert ignoriert." - -#~ msgid "Support points density" -#~ msgstr "Stützpunktdichte" - -#~ msgid "This is a relative measure of support points density." -#~ msgstr "Dies ist ein relatives Maß für die Dichte der Stützpunkte." - -#~ msgid "Minimal distance of the support points" -#~ msgstr "Minimaler Abstand der Stützpunkte" - -#~ msgid "No support points will be placed closer than this threshold." -#~ msgstr "" -#~ "Es werden keine Stützpunkte näher als dieser Schwellenwert platziert." - -#~ msgid "Use pad" -#~ msgstr "Grundschicht benutzen" - -#~ msgid "Add a pad underneath the supported model" -#~ msgstr "Fügt eine Grundschicht unter das gestützte Modell" - -#~ msgid "Pad wall thickness" -#~ msgstr "Grundschicht Wandstärke" - -#~ msgid "The thickness of the pad and its optional cavity walls." -#~ msgstr "Die Stärke der Grundschicht und seine optionalen Hohlraumwände." - -#~ msgid "Pad wall height" -#~ msgstr "Grundschicht Wandhöhe" - -#~ msgid "" -#~ "Defines the pad cavity depth. Set to zero to disable the cavity. Be " -#~ "careful when enabling this feature, as some resins may produce an extreme " -#~ "suction effect inside the cavity, which makes peeling the print off the " -#~ "vat foil difficult." -#~ msgstr "" -#~ "Definiert die Tiefe des Grundschichthohlraums. Zum Deaktivieren der " -#~ "Aushöhlung auf null setzen. Seien Sie vorsichtig, wenn Sie diese Funktion " -#~ "aktivieren, da einige Harze einen extremen Saugeffekt im Hohlraum " -#~ "erzeugen können, der das Abziehen des Drucks von der Wannenfolie " -#~ "erschwert." - -#~ msgid "Pad brim size" -#~ msgstr "Grundschicht Randgröße" - -#~ msgid "How far should the pad extend around the contained geometry" -#~ msgstr "" -#~ "Wie weit sich die Grundschicht um die enthaltene Geometrie erstrecken soll" - -#~ msgid "Max merge distance" -#~ msgstr "Maximaler Zusammenfügeabstand" - -#~ msgid "" -#~ "Some objects can get along with a few smaller pads instead of a single " -#~ "big one. This parameter defines how far the center of two smaller pads " -#~ "should be. If theyare closer, they will get merged into one pad." -#~ msgstr "" -#~ "Einige Objekte können mit ein paar kleineren Grundschichten auskommen, " -#~ "anstatt mit einer einzigen großen. Dieser Parameter definiert, wie weit " -#~ "die Mittelpunkte von zwei kleineren Grundschichten entfernt sein soll. " -#~ "Wenn sie näher sind, werden sie zu einem Block zusammengeführt." - -#~ msgid "Pad wall slope" -#~ msgstr "Grundschicht Wandneigung" - -#~ msgid "" -#~ "The slope of the pad wall relative to the bed plane. 90 degrees means " -#~ "straight walls." -#~ msgstr "" -#~ "Die Neigung der Grundschichtwand in Bezug auf die Druckbettebene. 90 Grad " -#~ "bedeutet gerade Wände." - -#~ msgid "Create pad around object and ignore the support elevation" -#~ msgstr "" -#~ "Erstellt eine Grundschicht um das Objekt herum und ignoriert die " -#~ "Unterstützungshöhe" - -#~ msgid "Pad around object everywhere" -#~ msgstr "Grundschicht überall um Objekt" - -#~ msgid "Force pad around object everywhere" -#~ msgstr "Grundschicht überall um Objekt erzwingen" - -#~ msgid "Pad object gap" -#~ msgstr "Grundschicht Objekt Abstand" - -#~ msgid "" -#~ "The gap between the object bottom and the generated pad in zero elevation " -#~ "mode." -#~ msgstr "" -#~ "Der Abstand zwischen dem Objektboden und der erzeugten Grundschicht im " -#~ "Nullhöhenmodus." - -#~ msgid "Pad object connector stride" -#~ msgstr "Objektgrundschicht Verbindungsschritte" - -#~ msgid "" -#~ "Distance between two connector sticks which connect the object and the " -#~ "generated pad." -#~ msgstr "" -#~ "Abstand zwischen zwei Verbindungsstäben, die das Objekt mit der erzeugten " -#~ "Grundschicht verbinden." - -#~ msgid "Pad object connector width" -#~ msgstr "Objektgrundschicht Verbinderbreite" - -#~ msgid "" -#~ "Width of the connector sticks which connect the object and the generated " -#~ "pad." -#~ msgstr "" -#~ "Breite der Verbindungsstäbe, die das Objekt und die erzeugte Grundschicht " -#~ "verbinden." - -#~ msgid "Pad object connector penetration" -#~ msgstr "Objektgrundschicht Verbindungseindringtiefe" - -#~ msgid "How much should the tiny connectors penetrate into the model body." -#~ msgstr "" -#~ "Wie weit die kleinen Verbinder in den Modellkörper eindringen sollen." - -#~ msgid "Enable hollowing" -#~ msgstr "Aushöhlung aktivieren" - -#~ msgid "Hollow out a model to have an empty interior" -#~ msgstr "Ein Modell aushöhlen, um einen leeren Innenraum zu erhalten" - -#~ msgid "Wall thickness" -#~ msgstr "Wandstärke" - -#~ msgid "Minimum wall thickness of a hollowed model." -#~ msgstr "Mindestwandstärke eines ausgehöhlten Modells." - -#~ msgid "Accuracy" -#~ msgstr "Genauigkeit" - -#~ msgid "" -#~ "Performance vs accuracy of calculation. Lower values may produce unwanted " -#~ "artifacts." -#~ msgstr "" -#~ "Leistung vs. Genauigkeit der Berechnung. Niedrigere Werte können zu " -#~ "unerwünschten Artefakten führen." - -#~ msgid "Closing distance" -#~ msgstr "Schliessabstand" - -#~ msgid "" -#~ "Hollowing is done in two steps: first, an imaginary interior is " -#~ "calculated deeper (offset plus the closing distance) in the object and " -#~ "then it's inflated back to the specified offset. A greater closing " -#~ "distance makes the interior more rounded. At zero, the interior will " -#~ "resemble the exterior the most." -#~ msgstr "" -#~ "Das Aushöhlen erfolgt in zwei Schritten: Zuerst wird ein imaginärer " -#~ "Innenraum tiefer (Versatz plus Schließabstand) in das Objekt hinein " -#~ "berechnet und dann wird es wieder auf den angegebenen Versatz " -#~ "aufgeblasen. Ein größerer Schließabstand macht den Innenraum runder. Bei " -#~ "Null wird der Innenraum dem Außenraum am ähnlichsten sein." - -#~ msgid "" -#~ "A slower printing profile might be necessary when using materials with " -#~ "higher viscosity or with some hollowed parts. It slows down the tilt " -#~ "movement and adds a delay before exposure." -#~ msgstr "" -#~ "Bei der Verwendung von Materialien mit höherer Viskosität oder bei " -#~ "einigen ausgehöhlten Teilen kann ein langsameres Druckprofil erforderlich " -#~ "sein. Es verlangsamt die Kippbewegung und fügt eine Verzögerung vor der " -#~ "Belichtung hinzu." - -#~ msgid "Copying of the temporary G-code to the output G-code failed" -#~ msgstr "" -#~ "Das Kopieren des temporären G-Codes auf den Ausgabe-G-Code ist " -#~ "fehlgeschlagen" - -#~ msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" -#~ msgstr "" -#~ "Geplante Hochladung auf `%1%`. Siehe Fenster -> Druck-Host " -#~ "Uploadwarteschlange" - -#~ msgid "Simple mode" -#~ msgstr "Einfacher Modus" - -#~ msgid "Advanced mode" -#~ msgstr "Fortgeschrittener Modus" - -#~ msgid "The size of the object can be specified in inches" -#~ msgstr "Die Größe des Objekts kann in Zoll angegeben werden" - -#~ msgid "Use inches" -#~ msgstr "Zoll verwenden" - -#~ msgid "Pick another vendor supported by %s" -#~ msgstr "Wählen Sie einen anderen Hersteller, der von %s unterstützt wird" - -#~ msgid "Firmware Type" -#~ msgstr "Firmware Typ" - -#~ msgid "Choose the type of firmware used by your printer." -#~ msgstr "Wählen Sie den Typ der von Ihrem Drucker verwendeten Firmware." - -#~ msgid "Set extruder sequence for the entire print" -#~ msgstr "Extrudersequenz für den gesamten Druck einstellen" - -#~ msgid "Set extruder sequence" -#~ msgstr "Extrudersequenz einstellen" - -#~ msgid "Set extruder change for every" -#~ msgstr "Extruderwechsel bei jedem" - -#~ msgid "Random sequence" -#~ msgstr "Zufallsfolge" - -#~ msgid "If enabled, random sequence of the selected extruders will be used." -#~ msgstr "" -#~ "Wenn aktiviert, wird eine zufällige Reihenfolge der ausgewählten Extruder " -#~ "verwendet." - -#~ msgid "Allow next color repetition" -#~ msgstr "Nächste Farbwiederholung erlauben" - -#~ msgid "If enabled, a repetition of the next random color will be allowed." -#~ msgstr "" -#~ "Wenn aktiviert, wird eine Wiederholung der nächsten Zufallsfarbe " -#~ "zugelassen." - -#~ msgid "Set extruder(tool) sequence" -#~ msgstr "Extruder(werkzeug)sequenz einstellen" - -#~ msgid "Remove extruder from sequence" -#~ msgstr "Extruder aus der Sequenz entfernen" - -#~ msgid "Add extruder to sequence" -#~ msgstr "Extruder zur Sequenz hinzufügen" - -#~ msgid "Select by rectangle" -#~ msgstr "Auswahl über Rechteck" - -#~ msgid "Reset selection" -#~ msgstr "Auswahl zurücksetzen" - -#~ msgid "Simplify %1%" -#~ msgstr "Vereinfache %1%" - -#~ msgid "Rename Object" -#~ msgstr "Objekt umbenennen" - -#~ msgid "Load Part" -#~ msgstr "Teil laden" - -#~ msgid "Load Modifier" -#~ msgstr "Modifizierer laden" - -#~ msgid "Delete Settings" -#~ msgstr "Einstellungen löschen" - -#~ msgid "Instances to Separated Objects" -#~ msgstr "Kopien in einzelne Objekte wandeln" - -#~ msgid "Additional Settings" -#~ msgstr "Zusätzliche Einstellungen" - -#~ msgid "Delete Option %s" -#~ msgstr "Lösche Option %s" - -#~ msgid "Change Option %s" -#~ msgstr "Ändere Option %s" - -#~ msgid "NOTE:" -#~ msgstr "HINWEIS:" - -#~ msgid "Sliced object \"%1%\" looks like a logo or a sign" -#~ msgstr "Das Objekt \"%1%\" sieht aus wie ein Logo oder ein Schild" - -#~ msgid "Apply color change automatically" -#~ msgstr "Farbwechsel automatisch anwenden" - -#~ msgid "Retractions" -#~ msgstr "Einzüge" - -#~ msgid "Deretractions" -#~ msgstr "Wiedereinzüge" - -#~ msgid "Tool changes" -#~ msgstr "Werkzeugwechsel" - -#~ msgid "Color changes" -#~ msgstr "Farbwechsel" - -#~ msgid "Print pauses" -#~ msgstr "Druckpausen" - -#~ msgid "Custom G-codes" -#~ msgstr "Benutzerdefinierte G-Codes" - -#~ msgid "Shells" -#~ msgstr "Konturhüllen" - -#~ msgid "Tool marker" -#~ msgstr "Werkzeugposition" - -#~ msgid "Legend/Estimated printing time" -#~ msgstr "Legende/geschätzte Druckzeit" - -#~ msgid "ERROR: not enough resources to execute a new job." -#~ msgstr "FEHLER: Nicht genügend Ressourcen, um einen neuen Job auszuführen." - -#~ msgid "An unexpected error occured" -#~ msgstr "Unerwarteter Fehler aufgetreten" - -#~ msgid "G-code preview" -#~ msgstr "G-Code Vorschau" - -#~ msgid "Open G-code viewer" -#~ msgstr "G-Code-Viewer öffnen" - -#~ msgid "Open new G-code viewer" -#~ msgstr "Neuen G-Code-Viewer öffnen" - -#~ msgid "Printer Settings" -#~ msgstr "Druckereinstellungen" - -#~ msgid "based on Slic3r" -#~ msgstr "basiert auf Slic3r" - -#~ msgid "Show user configuration folder (datadir)" -#~ msgstr "Zeige Benutzerkonfigurationsordner (datadir)" - -#~ msgid "Show system information" -#~ msgstr "Systeminformationen anzeigen" - -#~ msgid "Show about dialog" -#~ msgstr "\"Über\"-Dialog anzeigen" - -#~ msgid "Iso View" -#~ msgstr "Iso Ansicht" - -#~ msgid "" -#~ "The selected project is no longer available.\n" -#~ "Do you want to remove it from the recent projects list?" -#~ msgstr "" -#~ "Das ausgewählte Projekt ist nicht mehr verfügbar.\n" -#~ "Wollen Sie es aus der Liste der letzten Projekte entfernen?" - -#~ msgid "Save current project file" -#~ msgstr "Speichere aktuelle Projektdatei" - -#~ msgid "Save current project file as" -#~ msgstr "Speichere aktuelle Projektdatei als" - -#~ msgid "Export plate as &STL" -#~ msgstr "Exportiere die Plattenbelegung als &STL" - -#~ msgid "Export current plate as STL" -#~ msgstr "Exportiere die aktuelle Plattenbelegung als STL" - -#~ msgid "Quick Slice" -#~ msgstr "Quick Slice" - -#~ msgid "Slice a file into a G-code" -#~ msgstr "Datei zu G-Code slicen" - -#~ msgid "Quick Slice and Save As" -#~ msgstr "Quick Slice und Speichern unter" - -#~ msgid "Slice a file into a G-code, save as" -#~ msgstr "Datei zu G-Code slicen, speichern als" - -#~ msgid "Repeat Last Quick Slice" -#~ msgstr "Letzten Quick Slice wiederholen" - -#~ msgid "Repeat last quick slice" -#~ msgstr "Letzten Quick Slice wiederholen" - -#~ msgid "Searc&h" -#~ msgstr "Suc&hen" - -#~ msgid "Search in settings" -#~ msgstr "Suche in Einstellungen" - -#~ msgid "" -#~ "Switching the language will trigger application restart.\n" -#~ "You will lose content of the plater." -#~ msgstr "" -#~ "Das Umschalten der Sprache löst einen Neustart der Anwendung aus.\n" -#~ "Sie verlieren den Inhalt der Druckplatte." - -#~ msgid "Do you want to proceed?" -#~ msgstr "Wollen Sie fortfahren?" - -#~ msgid "&Window" -#~ msgstr "&Fenster" - -#~ msgid "No previously sliced file." -#~ msgstr "Keine vorher gesclicete Datei." - -#~ msgid "Previously sliced file (" -#~ msgstr "Vorher geslicete Datei (" - -#~ msgid ") not found." -#~ msgstr ") nicht gefunden." - -#~ msgid "File Not Found" -#~ msgstr "Datei nicht gefunden" - -#~ msgid "Save %s file as:" -#~ msgstr "Speichere %s Datei als:" - -#~ msgid "SVG" -#~ msgstr "SVG" - -#~ msgid "G-code" -#~ msgstr "G-Code" - -#~ msgid "Save zip file as:" -#~ msgstr "Speichere Zip Datei als:" - -#~ msgid "Processing %s" -#~ msgstr "Berechne %s" - -#~ msgid "%1% was successfully sliced." -#~ msgstr "%1% wurde erfolgreich gesliced." - -#~ msgid "Slicing Done!" -#~ msgstr "Slicing abgeschlossen!" - -#~ msgid "Select the STL file to repair:" -#~ msgstr "Geben Sie die STL-Datei an, die repariert werden soll:" - -#~ msgid "Save OBJ file (less prone to coordinate errors than STL) as:" -#~ msgstr "" -#~ "Speichern als OBJ-Datei (weniger anfällig für Koordinatenfehler als STL):" - -#~ msgid "Your file was repaired." -#~ msgstr "Ihre Datei wurde repariert." - -#~ msgid "Loading of a configuration file" -#~ msgstr "Laden einer Konfigurationsdatei" - -#~ msgid "Select configuration to load:" -#~ msgstr "Konfiguration zum Laden auswählen:" - -#~ msgid "" -#~ "Some presets are modified and the unsaved changes will not be exported " -#~ "into configuration bundle." -#~ msgstr "" -#~ "Einige Voreinstellungen werden geändert und die nicht gespeicherten " -#~ "Änderungen werden nicht in das Konfigurationsbündel exportiert." - -#~ msgid "Exporting configuration bundle" -#~ msgstr "Konfigurationsbündel exportieren" - -#~ msgid "Save presets bundle as:" -#~ msgstr "Sichern der Voreinstellungssammlung unter:" - -#~ msgid "Loading of a configuration bundle" -#~ msgstr "Laden eines Konfigurationsbündels" - -#~ msgid "%d presets successfully imported." -#~ msgstr "%d Voreinstellungen erfolgreich importiert." - -#~ msgid "ERROR" -#~ msgstr "FEHLER" - -#~ msgid "CANCELED" -#~ msgstr "ABGEBROCHEN" - -#~ msgid "COMPLETED" -#~ msgstr "ABGESCHLOSSEN" - -#~ msgid "Cancel upload" -#~ msgstr "Upload abgebrochen" - -#~ msgid "You may need to update your graphics card driver." -#~ msgstr "Möglicherweise müssen Sie Ihren Grafikkartentreiber aktualisieren." - -#~ msgid "" -#~ "Unable to load the following shaders:\n" -#~ "%s" -#~ msgstr "" -#~ "Die folgenden Shader konnten nicht geladen werden:\n" -#~ "%s" - -#~ msgid "Delete this preset from this printer device" -#~ msgstr "Voreinstellung dieses Druckers löschen" - -#~ msgid "This printer will be shown in the presets list as" -#~ msgstr "Dieser Drucker wird in der Voreinstellungsliste angezeigt als" - -#~ msgid "Physical Printer" -#~ msgstr "Physischer Drucker" - -#~ msgid "Type here the name of your printer device" -#~ msgstr "Geben Sie hier den Namen Ihres Druckers ein" - -#~ msgid "Descriptive name for the printer" -#~ msgstr "Beschreibender Name des Druckers" - -#~ msgid "Add preset for this printer device" -#~ msgstr "Voreinstellung für diesen Drucker hinzufügen" - -#~ msgid "Connection to printers connected via the print host failed." -#~ msgstr "" -#~ "Die Verbindung zu Druckern, die über den Druck-Host angeschlossen sind, " -#~ "ist fehlgeschlagen." - -#~ msgid "Browse" -#~ msgstr "Suchen" - -#~ msgid "Test" -#~ msgstr "Test" - -#~ msgid "Could not get a valid Printer Host reference" -#~ msgstr "Es konnte keine gültige Drucker-Host-Referenz ermittelt werden" - -#~ msgid "Success!" -#~ msgstr "Erfolg!" - -#~ msgid "Refresh Printers" -#~ msgstr "Drucker aktualisieren" - -#~ msgid "" -#~ "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -#~ "signed certificate." -#~ msgstr "" -#~ "HTTPS-CA-Datei ist optional. Sie wird nur benötigt, wenn Sie HTTPS mit " -#~ "einem selbstsignierten Zertifikat verwenden." - -#~ msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -#~ msgstr "Zertifikatsdatei (*.crt, *.pem)|*.crt;*.pem|alle Dateien|*.*" - -#~ msgid "Open CA certificate file" -#~ msgstr "Open CA Zertifikat Datei" - -#~ msgid "HTTPS CA File" -#~ msgstr "HTTPS CA Datei" - -#~ msgid "" -#~ "On this system, %s uses HTTPS certificates from the system Certificate " -#~ "Store or Keychain." -#~ msgstr "" -#~ "Auf diesem System verwendet %s HTTPS-Zertifikate aus dem System " -#~ "Zertifikatsspeicher oder Schlüsselbund." - -#~ msgid "" -#~ "To use a custom CA file, please import your CA file into Certificate " -#~ "Store / Keychain." -#~ msgstr "" -#~ "Um eine benutzerdefinierte CA-Datei zu verwenden, importieren Sie bitte " -#~ "Ihre CA-Datei in den Zertifikatsspeicher / Schlüsselbund." - -#~ msgid "The supplied name is empty. It can't be saved." -#~ msgstr "Der angegebene Name ist leer. Die Speicherung kann nicht erfolgen." - -#~ msgid "You should change the name of your printer device." -#~ msgstr "Sie sollten den Namen Ihres Druckgeräts ändern." - -#~ msgid "Printer with name \"%1%\" already exists." -#~ msgstr "Drucker mit dem Namen \"%1%\" existiert bereits." - -#~ msgid "Replace?" -#~ msgstr "Ersetzen?" - -#~ msgid "" -#~ "Following printer preset is duplicated:%1%The above preset for printer " -#~ "\"%2%\" will be used just once." -#~ msgid_plural "" -#~ "Following printer presets are duplicated:%1%The above presets for printer " -#~ "\"%2%\" will be used just once." -#~ msgstr[0] "" -#~ "Die folgende Druckervoreinstellung wird dupliziert:%1%Die oben genannte " -#~ "Voreinstellung für den Drucker \"%2%\" wird nur einmal verwendet." -#~ msgstr[1] "" -#~ "Die folgenden Druckervoreinstellungen werden dupliziert:%1%Die oben " -#~ "genannten Voreinstellungen für den Drucker \"%2%\" werden nur einmal " -#~ "verwendet." - -#~ msgid "It's not possible to delete the last related preset for the printer." -#~ msgstr "" -#~ "Es ist nicht möglich, die letzte zugehörige Voreinstellung für den " -#~ "Drucker zu löschen." - -#~ msgid "Information" -#~ msgstr "Informationen" - -#~ msgid "The provided name is not valid;" -#~ msgstr "Der angegebene Name ist ungültig;" - -#~ msgid "the following characters are not allowed:" -#~ msgstr "die folgenden Zeichen sind nicht erlaubt:" - -#~ msgid "" -#~ "For a multipart object, this value isn't accurate.\n" -#~ "It doesn't take account of intersections and negative volumes." -#~ msgstr "" -#~ "Bei einem mehrteiligen Objekt ist dieser Wert nicht genau.\n" -#~ "Er berücksichtigt keine Überschneidungen und negativen Volumen." - -#~ msgid "Volume" -#~ msgstr "Volumen" - -#~ msgid "Facets" -#~ msgstr "Flächen" - -#~ msgid "Used Material (unit)" -#~ msgstr "Benutztes Material (Einheit)" - -#~ msgid "Cost (money)" -#~ msgstr "Kosten (Geld)" - -#~ msgid "Estimated printing time" -#~ msgstr "Erwartete Druckzeit" - -#~ msgid "Number of tool changes" -#~ msgstr "Anzahl der Werkzeugwechsel" - -#~ msgid "Hold Shift to Slice & Export G-code" -#~ msgstr "" -#~ "Halten Sie die Umschalttaste gedrückt, um zu slicen und den G-Code zu " -#~ "exportieren" - -#~ msgid "Fill bed" -#~ msgstr "Bett auffüllen" - -#~ msgid "Optimize Rotation" -#~ msgstr "Rotation optimieren" - -#~ msgid "Import SLA archive" -#~ msgstr "SLA-Archiv importieren" - -#~ msgid "Do you want to save the changes to \"%1%\"?" -#~ msgstr "Möchten Sie die Änderungen in \"%1%\" speichern?" - -#~ msgid "" -#~ "Successfully unmounted. The device %s(%s) can now be safely removed from " -#~ "the computer." -#~ msgstr "" -#~ "Erfolgreich ausgeworfen. Das Gerät %s(%s) kann nun sicher vom Computer " -#~ "entfernt werden." - -#~ msgid "Ejecting of device %s(%s) has failed." -#~ msgstr "Das Auswerfen von Gerät %s(%s) ist fehlgeschlagen." - -#~ msgid "Expand sidebar" -#~ msgstr "Seitenleiste aufklappen" - -#~ msgid "Collapse sidebar" -#~ msgstr "Seitenleiste zuklappen" - -#~ msgid "You cannot load SLA project with a multi-part object on the bed" -#~ msgstr "" -#~ "Sie können kein SLA-Projekt mit einem mehrteiligen Objekt auf das " -#~ "Druckbett laden" - -#~ msgid "Please check your object list before preset changing." -#~ msgstr "" -#~ "Bitte überprüfen Sie Ihre Objektliste, bevor Sie die Voreinstellungen " -#~ "ändern." - -#~ msgid "Failed loading file \"%1%\" due to an invalid configuration." -#~ msgstr "" -#~ "Das Laden der Datei \"%1%\" ist aufgrund einer ungültigen Konfiguration " -#~ "fehlgeschlagen." - -#~ msgid "" -#~ "Object size from file %s appears to be zero.\n" -#~ "This object has been removed from the model" -#~ msgid_plural "" -#~ "Objects size from file %s appears to be zero.\n" -#~ "These objects have been removed from the model" -#~ msgstr[0] "" -#~ "Die Objektgröße aus der Datei %s scheint Null zu sein.\n" -#~ "Dieses Objekt wurde aus dem Modell entfernt" -#~ msgstr[1] "" -#~ "Die Größe der Objekte aus der Datei %s scheint Null zu sein.\n" -#~ "Diese Objekte wurden aus dem Modell entfernt" - -#~ msgid "The size of the object is zero" -#~ msgstr "Die Größe des Objekts ist Null" - -#~ msgid "The object is too small" -#~ msgstr "Das Objekt ist zu klein" - -#~ msgid "Apply to all the remaining small objects being loaded." -#~ msgstr "" -#~ "Anwenden auf alle verbleibenden kleinen Objekte, die geladen werden." - -#~ msgid "" -#~ "This file contains several objects positioned at multiple heights.\n" -#~ "Instead of considering them as multiple objects, should \n" -#~ "the file be loaded as a single object having multiple parts?" -#~ msgstr "" -#~ "Diese Datei enthält mehrere Objekte, die auf verschiedenen Höhen " -#~ "positioniert sind.\n" -#~ "Anstatt sie als mehrere Objekte zu betrachten, sollte \n" -#~ "die Datei als ein einziges Objekt mit mehreren Teilen geladen werden?" - -#~ msgid "Multi-part object detected" -#~ msgstr "Objekt mit mehreren Teilen erkannt" - -#~ msgid "" -#~ "This file cannot be loaded in a simple mode. Do you want to switch to an " -#~ "advanced mode?" -#~ msgstr "" -#~ "Diese Datei kann nicht im einfachen Modus geladen werden. Möchten Sie in " -#~ "den fortgeschrittenen Modus wechseln?" - -#~ msgid "Detected advanced data" -#~ msgstr "Erweiterte Daten gefunden" - -#~ msgid "" -#~ "You can't to add the object(s) from %s because of one or some of them " -#~ "is(are) multi-part" -#~ msgstr "" -#~ "Sie können die Objekte aus %s nicht hinzufügen, weil eines oder einige " -#~ "von ihnen mehrteilig ist (sind)" - -#~ msgid "Delete Object" -#~ msgstr "Objekt löschen" - -#~ msgid "Delete All Objects" -#~ msgstr "Alle Objekte löschen" - -#~ msgid "Reset Project" -#~ msgstr "Projekt zurücksetzen" - -#~ msgid "" -#~ "The selected object couldn't be split because it contains only one solid " -#~ "part." -#~ msgstr "" -#~ "Das ausgewählte Objekt konnte nicht geteilt werden, da es nur ein solides " -#~ "Teil enthält." - -#~ msgid "All non-solid parts (modifiers) were deleted" -#~ msgstr "Alle nicht soliden Teile (Modifikatoren) wurden gelöscht" - -#~ msgid "Split to Objects" -#~ msgstr "In Objekte trennen" - -#~ msgid "" -#~ "An object has custom support enforcers which will not be used because " -#~ "supports are disabled." -#~ msgstr "" -#~ "Ein Objekt verfügt über benutzerdefinierte Stützverstärker, die nicht " -#~ "verwendet werden, weil Stützen deaktiviert sind." - -#~ msgid "Enable supports for enforcers only" -#~ msgstr "Stützen nur für Verstärker aktivieren" - -#~ msgid "Slice now" -#~ msgstr "Jetzt slicen" - -#~ msgid "Another export job is currently running." -#~ msgstr "Ein anderer Exportjob läuft zurzeit." - -#~ msgid "Select the new file" -#~ msgstr "Neue Datei auswählen" - -#~ msgid "File for the replace wasn't selected" -#~ msgstr "Datei zum Ersetzen wurde nicht ausgewählt" - -#~ msgid "Replace with STL" -#~ msgstr "Ersetzen durch STL" - -#~ msgid "Reload from disk" -#~ msgstr "Neuladen von Festplatte" - -#~ msgid "Please select the file to reload" -#~ msgstr "Bitte wählen Sie die neu zu ladende Datei aus" - -#~ msgid "differs from the original file" -#~ msgstr "weicht von der Originaldatei ab" - -#~ msgid "Reload all from disk" -#~ msgstr "Alles von der Festplatte neu laden" - -#~ msgid "There are active warnings concerning sliced models:" -#~ msgstr "Es gibt aktive Warnungen zu gesliceten Modellen:" - -#~ msgid "generated warnings" -#~ msgstr "erzeugte Warnungen" - -#~ msgid "Undo / Redo is processing" -#~ msgstr "Undo / Redo arbeitet" - -#~ msgid "" -#~ "Switching the printer technology from %1% to %2%.\n" -#~ "Some %1% presets were modified, which will be lost after switching the " -#~ "printer technology." -#~ msgstr "" -#~ "Umstellung der Druckertechnologie von %1% auf %2%.\n" -#~ "Es wurden einige %1%-Voreinstellungen geändert, die nach dem Wechsel der " -#~ "Druckertechnologie verloren gehen." - -#~ msgid "Creating a new project while the current project is modified." -#~ msgstr "" -#~ "Erstellen eines neuen Projekts, während das aktuelle Projekt geändert " -#~ "wurde." - -#~ msgid "Creating a new project while some presets are modified." -#~ msgstr "" -#~ "Erstellen eines neuen Projekts, während einige Voreinstellungen geändert " -#~ "wurden." - -#~ msgid "" -#~ "You can keep presets modifications to the new project or discard them" -#~ msgstr "" -#~ "Sie können die Änderungen an den Voreinstellungen für das neue Projekt " -#~ "beibehalten oder sie verwerfen." - -#~ msgid "" -#~ "You can keep presets modifications to the new project, discard them or " -#~ "save changes as new presets.\n" -#~ "Note, if changes will be saved then new project wouldn't keep them" -#~ msgstr "" -#~ "Sie können die Änderungen an den Voreinstellungen im neuen Projekt " -#~ "beibehalten, sie verwerfen oder als neue Voreinstellungen speichern.\n" -#~ "Hinweis: Wenn die Änderungen gespeichert werden, werden sie nicht in das " -#~ "neue Projekt übernommen." - -#~ msgid "Load Project" -#~ msgstr "Projekt laden" - -#~ msgid "Import Object" -#~ msgstr "Objekt importieren" - -#~ msgid "Import Objects" -#~ msgstr "Objekte importieren" - -#~ msgid "Error while loading .gcode file" -#~ msgstr "Fehler beim Laden einer .gcode-Datei" - -#~ msgid "%s - Drop project file" -#~ msgstr "%s - Drop Projektdatei" - -#~ msgid "Select an action to apply to the file" -#~ msgstr "Wählen Sie eine Aktion, die auf die Datei angewendet werden soll" - -#~ msgid "Import config only" -#~ msgstr "Nur Konfiguration importieren" - -#~ msgid "You can open only one .gcode file at a time." -#~ msgstr "Sie können immer nur eine .gcode-Datei gleichzeitig öffnen." - -#~ msgid "Load File" -#~ msgstr "Datei laden" - -#~ msgid "Load Files" -#~ msgstr "Dateien laden" - -#~ msgid "Delete Selected Objects" -#~ msgstr "Ausgewählte Objekte entfernen" - -#~ msgid "Increase Instances" -#~ msgstr "Kopien erhöhen" - -#~ msgid "Decrease Instances" -#~ msgstr "Kopien verringern" - -#~ msgid "Enter the number of copies:" -#~ msgstr "Geben Sie die Anzahl der Kopien ein:" - -#~ msgid "Set numbers of copies to %d" -#~ msgstr "Setze Anzahl der Kopien auf %d" - -#~ msgid "Convert from imperial units" -#~ msgstr "Von imperialen Einheiten umrechnen" - -#~ msgid "Revert conversion from imperial units" -#~ msgstr "Umrechnung von imperialen Einheiten rückgängig machen" - -#~ msgid "Convert from meters" -#~ msgstr "Umrechnen von Meter" - -#~ msgid "Revert conversion from meters" -#~ msgstr "Umrechnung von Metern umkehren" - -#~ msgid "Cut by Plane" -#~ msgstr "Schneiden durch Ebene" - -#~ msgid "Save SL1 / SL1S file as:" -#~ msgstr "SL1 / SL1S-Datei speichern unter:" - -#~ msgid "" -#~ "The plater is empty.\n" -#~ "Do you want to save the project?" -#~ msgstr "" -#~ "Die Plattform ist leer.\n" -#~ "Möchten Sie das Projekt speichern?" - -#~ msgid "" -#~ "Custom supports, seams and multimaterial painting were removed after " -#~ "repairing the mesh." -#~ msgstr "" -#~ "Individuelle Stützen, Nähte und Multimaterialbemalung wurden nach der " -#~ "Reparatur des Netzes entfernt." - -#~ msgid "Paste From Clipboard" -#~ msgstr "Aus Zwischenablage einfügen" - -#~ msgid "Delete Physical Printer" -#~ msgstr "Physischen Drucker löschen" - -#~ msgid "Add physical printer" -#~ msgstr "Physischen Drucker hinzufügen" - -#~ msgid "Edit physical printer" -#~ msgstr "Physischen Drucker bearbeiten" - -#~ msgid "Delete physical printer" -#~ msgstr "Physischen Drucker löschen" - -#~ msgid "Send G-Code to printer host" -#~ msgstr "Sende G-Code zum Druckerhost" - -#~ msgid "Upload to Printer Host with the following filename:" -#~ msgstr "Transferiere zum Druckerhost mit dem Dateinamen:" - -#~ msgid "Use forward slashes ( / ) as a directory separator if needed." -#~ msgstr "" -#~ "Benutzen Sie den Schrägstrich (/) als Verzeichnistrenner falls nötig." - -#~ msgid "Group" -#~ msgstr "Gruppe" - -#~ msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" -#~ msgstr "" -#~ "Der Dateiname der hochgeladenen Datei endet nicht mit \"%s\". Möchten Sie " -#~ "fortfahren?" - -#~ msgid "Upload and Print" -#~ msgstr "Hochladen und Drucken" - -#~ msgid "Upload and Simulate" -#~ msgstr "Hochladen und Simulieren" - -#~ msgid "Upload" -#~ msgstr "Hochladen" - -#~ msgid "ID" -#~ msgstr "ID" - -#~ msgid "Progress" -#~ msgstr "Fortschritt" - -#~ msgid "Host" -#~ msgstr "Host" - -#~ msgctxt "OfFile" -#~ msgid "Size" -#~ msgstr "OfFile||Größe" - -#~ msgid "Filename" -#~ msgstr "Dateiname" - -#~ msgid "Error Message" -#~ msgstr "Fehlermeldung" - -#~ msgid "Cancel selected" -#~ msgstr "Abbruch ausgewählt" - -#~ msgid "Show error message" -#~ msgstr "Fehlermeldungen anzeigen" - -#~ msgid "Enqueued" -#~ msgstr "In der Warteschlange" - -#~ msgid "Cancelling" -#~ msgstr "Abbrechen" - -#~ msgid "Cancelled" -#~ msgstr "Abgebrochen" - -#~ msgid "Completed" -#~ msgstr "Fertig" - -#~ msgid "Error uploading to print host:" -#~ msgstr "Fehler beim Hochloden zu Druckhost:" - -#~ msgid "Selection-Add Object" -#~ msgstr "Auswahl Objekt hinzufügen" - -#~ msgid "Selection-Remove Object" -#~ msgstr "Auswahl Objekt entfernen" - -#~ msgid "Selection-Add Instance" -#~ msgstr "Auswahl Kopie hinzufügen" - -#~ msgid "Selection-Remove Instance" -#~ msgstr "Auswahl Kopie entfernen" - -#~ msgid "Scale To Fit" -#~ msgstr "Passend skalieren" - -#~ msgid "It's a last preset for this physical printer." -#~ msgstr "" -#~ "Es handelt sich um die letzte Voreinstellung für diesen physischen " -#~ "Drucker." - -#~ msgid "" -#~ "Are you sure you want to delete \"%1%\" preset from the physical printer " -#~ "\"%2%\"?" -#~ msgstr "" -#~ "Sind Sie sicher, dass Sie die Voreinstellung \"%1%\" des physischen " -#~ "Drucker \"%2%\" löschen möchten?" - -#~ msgid "Update available" -#~ msgstr "Ein Update ist verfügbar" - -#~ msgid "New version of %s is available" -#~ msgstr "Eine neue Version von %s ist verfügbar" - -#~ msgid "Current version:" -#~ msgstr "Aktuelle Version:" - -#~ msgid "New version:" -#~ msgstr "Neue Version:" - -#~ msgid "Open changelog page" -#~ msgstr "Änderungsseite öffnen" - -#~ msgid "Open download page" -#~ msgstr "Downloadseite öffnen" - -#~ msgid "Don't notify about new releases any more" -#~ msgstr "Keine Benachrichtigung mehr über neue Releases" - -#~ msgid "Opening Configuration Wizard" -#~ msgstr "Öffne Konfigurationsassistent" - -#~ msgid "Configuration update is available" -#~ msgstr "Konfigurationsupdate ist verfügbar" - -#~ msgid "" -#~ "Would you like to install it?\n" -#~ "\n" -#~ "Note that a full configuration snapshot will be created first. It can " -#~ "then be restored at any time should there be a problem with the new " -#~ "version.\n" -#~ "\n" -#~ "Updated configuration bundles:" -#~ msgstr "" -#~ "Möchten Sie dies installieren?\n" -#~ "\n" -#~ "Beachten Sie, dass zuerst eine Momentaufnahme der gesamten Konfiguration " -#~ "erstellt wird. Diese kann dann jederzeit wiederhergestellt werden, falls " -#~ "es ein Problem mit der neuen Version gibt.\n" -#~ "\n" -#~ "Aktualisierte Konfigurationssammlungen:" - -#~ msgid "Install" -#~ msgstr "Installation" - -#~ msgid "Don't install" -#~ msgstr "Nicht installieren" - -#~ msgid "%s incompatibility" -#~ msgstr "%s-Inkompatibilität" - -#~ msgid "You must install a configuration update." -#~ msgstr "Ein Konfigurations-Update muss installiert werden." - -#~ msgid "" -#~ "%s will now start updates. Otherwise it won't be able to start.\n" -#~ "\n" -#~ "Note that a full configuration snapshot will be created first. It can " -#~ "then be restored at any time should there be a problem with the new " -#~ "version.\n" -#~ "\n" -#~ "Updated configuration bundles:" -#~ msgstr "" -#~ "%s beginnt nun mit der Aktualisierung. Andernfalls kann nicht gestartet " -#~ "werden.\n" -#~ "\n" -#~ "Beachten Sie, dass zuerst ein vollständiger Konfigurations-Snapshot " -#~ "erstellt wird. Er kann dann jederzeit wiederhergestellt werden, falls es " -#~ "ein Problem mit der neuen Version geben sollte.\n" -#~ "\n" -#~ "Aktualisierte Konfigurations-Bundles:" - -#~ msgid "%s configuration is incompatible" -#~ msgstr "%s Konfiguration ist nicht kompatibel" - -#~ msgid "" -#~ "This version of %s is not compatible with currently installed " -#~ "configuration bundles.\n" -#~ "This probably happened as a result of running an older %s after using a " -#~ "newer one.\n" -#~ "\n" -#~ "You may either exit %s and try again with a newer version, or you may re-" -#~ "run the initial configuration. Doing so will create a backup snapshot of " -#~ "the existing configuration before installing files compatible with this " -#~ "%s." -#~ msgstr "" -#~ "Diese Version von %s ist nicht kompatibel zu den aktuell installierten " -#~ "Konfigurationssammlungen.\n" -#~ "Dies wurde wahrscheinlich dadurch verursacht, dass Sie eine ältere %s " -#~ "Version benutzt haben, nachdem Sie eine neuere ausgeführt hatten.\n" -#~ "\n" -#~ "Sie können %s entweder beenden und es mit einer neueren Version nochmals " -#~ "versuchen, oder Sie können die erstmalige Startkonfiguration nochmals " -#~ "wiederholen. In diesem Fall wird eine Sicherungskopie der aktuellen " -#~ "Konfiguration erstellt, bevor die mit dieser %s-Version kompatiblen " -#~ "Dateien installiert werden." - -#~ msgid "This %s version: %s" -#~ msgstr "Diese %s Version: %s" - -#~ msgid "Incompatible bundles:" -#~ msgstr "Inkompatible Konfigurationssammlungen:" - -#~ msgid "Re-configure" -#~ msgstr "Neu konfigurieren" - -#~ msgid "" -#~ "%s now uses an updated configuration structure.\n" -#~ "\n" -#~ "So called 'System presets' have been introduced, which hold the built-in " -#~ "default settings for various printers. These System presets cannot be " -#~ "modified, instead, users now may create their own presets inheriting " -#~ "settings from one of the System presets.\n" -#~ "An inheriting preset may either inherit a particular value from its " -#~ "parent or override it with a customized value.\n" -#~ "\n" -#~ "Please proceed with the %s that follows to set up the new presets and to " -#~ "choose whether to enable automatic preset updates." -#~ msgstr "" -#~ "%s verwendet nun eine aktualisierte Konfigurationsstruktur.\n" -#~ "\n" -#~ "Sogenannte 'Systemeinstellungen' wurden eingeführt; diese enthalten die " -#~ "eingebauten Standardeinstellungen für verschiedene Drucker. Diese " -#~ "Systemeinstellungen können nicht verändert werden. Stattdessen können " -#~ "Benutzer nun ihre eigenen Voreinstellungen erstellen, die Werte von einer " -#~ "der Systemeinstellungen übernehmen.\n" -#~ "Eine übernehmende Voreinstellung kann entweder einen bestimmten Wert von " -#~ "ihrem Vorbild übernehmen, oder ihn mit einem eigenen Wert überschreiben.\n" -#~ "\n" -#~ "Bitte fahren Sie fort mit '%s'. Dies folgt nun, um die neuen " -#~ "Einstellungen einzurichten sowie auszuwählen, ob Einstellungen " -#~ "automatisch aktualisiert werden dürfen." - -#~ msgid "For more information please visit our wiki page:" -#~ msgstr "Für weitere Informationen besuchen Sie bitte unsere Wiki-Seite:" - -#~ msgid "No updates available" -#~ msgstr "Keine Updates verfügbar" - -#~ msgid "%s has no configuration updates available." -#~ msgstr "Für %s sind keine Konfigurationsaktualisierungen verfügbar." - -#~ msgid "Exporting source model" -#~ msgstr "Exportieren des Quellmodells" - -#~ msgid "Failed loading the input model." -#~ msgstr "Das Laden des Inputmodells ist fehlgeschlagen." - -#~ msgid "Repairing model by the Netfabb service" -#~ msgstr "Reparieren des Modells durch den Netfabb-Dienst" - -#~ msgid "Mesh repair failed." -#~ msgstr "Netzreparatur fehlgeschlagen." - -#~ msgid "Loading repaired model" -#~ msgstr "Lade repariertes Modell" - -#~ msgid "Saving mesh into the 3MF container failed." -#~ msgstr "Sichern des Netzes in einen 3MF-Container fehlgeschlagen." - -#~ msgid "Export of a temporary 3mf file failed" -#~ msgstr "Export einer temporären 3MF Datei fehlgeschlagen" - -#~ msgid "Import of the repaired 3mf file failed" -#~ msgstr "Import einer reparierten 3MF Datei fehlgeschlagen" - -#~ msgid "Repaired 3MF file does not contain any object" -#~ msgstr "Die reparierte 3MF Datei enhält keine Objekte" - -#~ msgid "Repaired 3MF file contains more than one object" -#~ msgstr "Die reparierte 3MF Datei enhält mehr als ein Objekt" - -#~ msgid "Repaired 3MF file does not contain any volume" -#~ msgstr "Die reparierte 3MF Datei enhält keine Volumen" - -#~ msgid "Repaired 3MF file contains more than one volume" -#~ msgstr "Die reparierte 3MF Datei enhält mehr als ein Volumen" - -#~ msgid "Model repair finished" -#~ msgstr "Modellreparatur beendet" - -#~ msgid "Model repair canceled" -#~ msgstr "Modellreparatur abgebrochen" - -#~ msgid "" -#~ "Configuration Updates causes a lost of preset modification.\n" -#~ "So, check unsaved changes and save them if necessary." -#~ msgstr "" -#~ "Bei einer Konfigurationsaktualisierung gehen voreingestellte Änderungen " -#~ "verloren.\n" -#~ "Überprüfen Sie daher nicht gespeicherte Änderungen und speichern Sie sie " -#~ "gegebenenfalls." - -#~ msgid "Updating" -#~ msgstr "Update" - -#~ msgid "requires min. %s and max. %s" -#~ msgstr "benötigt min. %s und max. %s" - -#~ msgid "requires min. %s" -#~ msgstr "benötigt min. %s" - -#~ msgid "requires max. %s" -#~ msgstr "benötigt max. %s" - -#~ msgid "" -#~ "To specify the system certificate store manually, please set the %1% " -#~ "environment variable to the correct CA bundle and restart the application." -#~ msgstr "" -#~ "Um den System-Zertifikatspeicher manuell anzugeben, setzen Sie bitte die " -#~ "Umgebungsvariable %1% auf das richtige CA-Bundle und starten Sie die " -#~ "Anwendung neu." - -#~ msgid "" -#~ "The selected amf file has been saved with a newer version of %1% and is " -#~ "not compatible." -#~ msgstr "" -#~ "Die ausgewählte amf-Datei wurde mit einer neueren Version von %1% " -#~ "gespeichert und ist nicht kompatibel." - -#~ msgid "invalid header or archive is corrupted" -#~ msgstr "ungültiger Dateiheader oder Archiv ist beschädigt" - -#~ msgid "unsupported multidisk archive" -#~ msgstr "nicht unterstütztes Multidisk-Archiv" - -#~ msgid "decompression failed or archive is corrupted" -#~ msgstr "Entpacken fehlgeschlagen oder Archiv defekt" - -#~ msgid "CRC-32 check failed" -#~ msgstr "CRC-32 Check fehlgeschlagen" - -#~ msgid "archive is too large" -#~ msgstr "Archiv ist zu groß" - -#~ msgid "write calledback failed" -#~ msgstr "Schreibabruf fehlgeschlagen" - -#~ msgid "SLA print" -#~ msgstr "SLA Druck" - -#~ msgid "Hostname, IP or URL" -#~ msgstr "Hostname, IP oder URL" - -#~ msgid "" -#~ "Slic3r can upload G-code files to a printer host. This field should " -#~ "contain the hostname, IP address or URL of the printer host instance. " -#~ "Print host behind HAProxy with basic auth enabled can be accessed by " -#~ "putting the user name and password into the URL in the following format: " -#~ "https://username:password@your-octopi-address/" -#~ msgstr "" -#~ "PrusaSlicer kann G-Code-Dateien auf einen Drucker-Host hochladen. Dieses " -#~ "Feld sollte den Hostnamen, die IP-Adresse oder die URL der Drucker-Host-" -#~ "Instanz enthalten. Auf einen Drucker-Host hinter HAProxy mit aktivierter " -#~ "Basisauthentifizierung kann zugegriffen werden, indem der Benutzername " -#~ "und das Passwort im folgenden Format in die URL eingegeben werden: " -#~ "https://username:password@Ihre-octopi-addresse/" - -#~ msgid "API Key / Password" -#~ msgstr "API Key / Kennwort" - -#~ msgid "" -#~ "Slic3r can upload G-code files to a printer host. This field should " -#~ "contain the API Key or the password required for authentication." -#~ msgstr "" -#~ "PrusaSlicer kann G-Code Dateien zu einem Druckerhost hochladen. Dieses " -#~ "Feld sollte den API-Schlüssel oder das Kennwort enthalten, die für die " -#~ "Authentifizierung erforderlich sind." - -#~ msgid "Name of the printer" -#~ msgstr "Name des Druckers" - -#~ msgid "" -#~ "Custom CA certificate file can be specified for HTTPS OctoPrint " -#~ "connections, in crt/pem format. If left blank, the default OS CA " -#~ "certificate repository is used." -#~ msgstr "" -#~ "Benutzerdefinierte CA-Zertifikatsdatei kann für HTTPS OctoPrint-" -#~ "Verbindungen im crt/pem-Format angegeben werden. Wenn das Feld leer " -#~ "bleibt, wird das standardmäßige Zertifikatsverzeichnis der Betriebssystem-" -#~ "Zertifizierungsstelle verwendet." - -#~ msgid "User" -#~ msgstr "Benutzer" - -#~ msgid "Password" -#~ msgstr "Kennwort" - -#~ msgid "Ignore HTTPS certificate revocation checks" -#~ msgstr "HTTPS-Zertifikatssperrprüfungen ignorieren" - -#~ msgid "" -#~ "Ignore HTTPS certificate revocation checks in case of missing or offline " -#~ "distribution points. One may want to enable this option for self signed " -#~ "certificates if connection fails." -#~ msgstr "" -#~ "Ignoriere HTTPS-Zertifikatssperrprüfungen bei fehlenden oder offline " -#~ "Verteilungspunkten. Sie können diese Option für selbst signierte " -#~ "Zertifikate aktivieren, wenn die Verbindung fehlschlägt." - -#~ msgid "Authorization Type" -#~ msgstr "Autorisierungs-Typ" - -#~ msgid "API key" -#~ msgstr "API Key" - -#~ msgid "HTTP digest" -#~ msgstr "HTTP Digest" - -#~ msgid "Error with zip archive" -#~ msgstr "Fehler beim ZIP-Archiv" - -#~ msgid "Volume to purge (mm³) when the filament is being" -#~ msgstr "Volumen zum Reinigen (mm³) wenn das Filament ist" - -#~ msgid "" -#~ "Switching to simple settings will discard changes done in the advanced " -#~ "mode!\n" -#~ "\n" -#~ "Do you want to proceed?" -#~ msgstr "" -#~ "Das Umschalten auf einfache Einstellungen verwirft die im erweiterten " -#~ "Modus vorgenommenen Änderungen!\n" -#~ "\n" -#~ "Wollen Sie fortfahren?" - -#~ msgid "The supplied name is not valid;" -#~ msgstr "Der angegebene Name ist ungültig;" - -#~ msgid "the following suffix is not allowed:" -#~ msgstr "das folgenden Suffix ist nicht erlaubt:" - -#~ msgid "The supplied name is not available." -#~ msgstr "Der angegebene Name ist nicht verfügbar." - -#~ msgid "Cannot overwrite a system profile." -#~ msgstr "Systemprofil kann nicht überschrieben werden." - -#~ msgid "Preset with name \"%1%\" already exists." -#~ msgstr "Eine Voreinstellung mit dem Namen \"%1%\" existiert bereits." - -#~ msgid "" -#~ "Preset with name \"%1%\" already exists and is incompatible with selected " -#~ "printer." -#~ msgstr "" -#~ "Die Voreinstellung mit dem Namen \"%1%\" existiert bereits und ist mit " -#~ "dem ausgewählten Drucker nicht kompatibel." - -#~ msgid "Note: This preset will be replaced after saving" -#~ msgstr "Hinweis: Diese Voreinstellung wird nach dem Speichern ersetzt" - -#~ msgid "The name cannot be empty." -#~ msgstr "Name kann nicht leer sein." - -#~ msgid "The name cannot start with space character." -#~ msgstr "Der Name darf nicht mit einem Leerzeichen beginnen." - -#~ msgid "The name cannot end with space character." -#~ msgstr "Der Name darf nicht mit einem Leerzeichen enden." - -#~ msgid "" -#~ "You have selected physical printer \"%1%\" \n" -#~ "with related printer preset \"%2%\"" -#~ msgstr "" -#~ "Sie haben den physischen Drucker \"%1%\" ausgewählt \n" -#~ "mit der zugehörigen Druckervoreinstellung \"%2%\"." - -#~ msgid "What would you like to do with \"%1%\" preset after saving?" -#~ msgstr "" -#~ "Was möchten Sie mit der Voreinstellung \"%1%\" nach dem Speichern machen?" - -#~ msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" -#~ msgstr "\"%1%\" in \"%2%\" für den physischen Drucker \"%3%\" ändern." - -#~ msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" -#~ msgstr "" -#~ "\"%1%\" als nächste Voreinstellung für den physischen Drucker \"%2%\" " -#~ "hinzufügen" - -#~ msgid "Just switch to \"%1%\" preset" -#~ msgstr "Wechseln Sie einfach zur \"%1%\" Voreinstellung" - -#~ msgid "Choose one file (3MF/AMF):" -#~ msgstr "Wählen Sie eine Datei (3MF/AMF):" - -#~ msgid "" -#~ "Select coordinate space, in which the transformation will be performed." -#~ msgstr "" -#~ "Koordinatenraum wählen, in dem die Transformation durchgeführt wird." - -#~ msgid "Toggle %c axis mirroring" -#~ msgstr "Umschalten der Spiegelung der %c-Achse" - -#~ msgid "" -#~ "You cannot use non-uniform scaling mode for multiple objects/parts " -#~ "selection" -#~ msgstr "" -#~ "Sie können den nichtgleichmäßigen Skalierungsmodus nicht für mehrere " -#~ "Objekte/Teileauswahlen verwenden" - -#~ msgid "" -#~ "The currently manipulated object is tilted (rotation angles are not " -#~ "multiples of 90°).\n" -#~ "Non-uniform scaling of tilted objects is only possible in the World " -#~ "coordinate system,\n" -#~ "once the rotation is embedded into the object coordinates." -#~ msgstr "" -#~ "Das aktuell manipulierte Objekt wird gekippt (Drehwinkel sind keine " -#~ "Vielfachen von 90°).\n" -#~ "Eine ungleiche Skalierung von geschwenkten Objekten ist nur im " -#~ "Weltkoordinatensystem möglich,\n" -#~ "sobald die Drehung in die Objektkoordinaten eingearbeitet wurde." - -#~ msgid "" -#~ "This operation is irreversible.\n" -#~ "Do you want to proceed?" -#~ msgstr "" -#~ "Dieser Vorgang ist nicht mehr rückgängig zu machen.\n" -#~ "Möchten Sie fortfahren?" - -#~ msgid "Seq." -#~ msgstr "Seq." - -#~ msgid "Switch to Settings" -#~ msgstr "Zu Einstellungen wechseln" - -#~ msgid "Print Settings Tab" -#~ msgstr "Druckeinstellungsreiter" - -#~ msgid "Filament Settings Tab" -#~ msgstr "Filamenteinstellungsreiter" - -#~ msgid "Material Settings Tab" -#~ msgstr "Materialeinstellungsreiter" - -#~ msgid "Printer Settings Tab" -#~ msgstr "Druckereinstellungsreiter" - -#~ msgid "Undo History" -#~ msgstr "Undo Verlauf" - -#~ msgid "Redo History" -#~ msgstr "Redo Verlauf" - -#~ msgid "Undo %1$d Action" -#~ msgid_plural "Undo %1$d Actions" -#~ msgstr[0] "Undo %1$d Aktion" -#~ msgstr[1] "Undo %1$d Aktionen" - -#~ msgid "Redo %1$d Action" -#~ msgid_plural "Redo %1$d Actions" -#~ msgstr[0] "Redo %1$d Aktion" -#~ msgstr[1] "Redo %1$d Aktionen" - -#~ msgid "Press %1%left mouse button to enter the exact value" -#~ msgstr "%1%linke Maustaste drücken, um den genauen Wert einzugeben" - -#~ msgid "Enable rotations (slow)" -#~ msgstr "Rotationen aktivieren (langsam)" - -#~ msgid "Click right mouse button to show arrangement options" -#~ msgstr "" -#~ "Klicken Sie mit der rechten Maustaste, um Anordnungsoptionen anzuzeigen" - -#~ msgid "Click right mouse button to open/close History" -#~ msgstr "" -#~ "Klicken Sie mit der rechten Maustaste, um die Historie zu öffnen/schließen" - -#~ msgid "Next Undo action: %1%" -#~ msgstr "Nächste Undo-Aktion: %1%" - -#~ msgid "Next Redo action: %1%" -#~ msgstr "Nächste Redo Aktion: %1%" - -#~ msgid "Selection-Add from rectangle" -#~ msgstr "Auswahl über Rechteck hinzufügen" - -#~ msgid "Selection-Remove from rectangle" -#~ msgstr "Auswahl über Rechteck entfernen" - -#~ msgid "Place on face" -#~ msgstr "Auf Fläche legen" - -#~ msgid "" -#~ "Your printer has more extruders than the multi-material painting gizmo " -#~ "supports. For this reason, only the first %1% extruders will be able to " -#~ "be used for painting." -#~ msgstr "" -#~ "Ihr Drucker hat mehr Extruder als der Multi-Material-Bemal-Gizmo " -#~ "unterstützt. Aus diesem Grund können nur die ersten %1% der Extruder zum " -#~ "Bemalen verwendet werden." - -#~ msgid "First color" -#~ msgstr "Erste Farbe" - -#~ msgid "Second color" -#~ msgstr "Zweite Farbe" - -#~ msgid "Painted using: Extruder %1%" -#~ msgstr "Bemalt mit: Extruder %1%" - -#~ msgid "" -#~ "ERROR: Please close all manipulators available from the left toolbar first" -#~ msgstr "" -#~ "FEHLER: Bitte schließen Sie zuerst alle in der linken Symbolleiste " -#~ "verfügbaren Manipulatoren" - -#~ msgid "Gizmo-Place on Face" -#~ msgstr "Gizmo Auf Fläche legen" - -#~ msgid "" -#~ "You are currently editing SLA support points. Please, apply or discard " -#~ "your changes first." -#~ msgstr "" -#~ "Sie sind gerade dabei, SLA-Stützpunkte zu bearbeiten. Bitte wenden Sie " -#~ "Ihre Änderungen zuerst an oder verwerfen Sie sie." - -#~ msgid "%1% was substituted with %2%" -#~ msgstr "%1% wurde durch %2% ersetzt" - -#~ msgid "The following values were substituted:" -#~ msgstr "Die folgenden Werte wurden ersetzt:" - -#~ msgid "Review the substitutions and adjust them if needed." -#~ msgstr "Überprüfen Sie die Ersetzungen und passen Sie sie bei Bedarf an." - -#~ msgid "SLA print settings" -#~ msgstr "SLA Druckeinstellungen" - -#~ msgid "" -#~ "Configuration bundle was loaded, however some configuration values were " -#~ "not recognized." -#~ msgstr "" -#~ "Konfigurations-Bundle wurde geladen, jedoch wurden einige " -#~ "Konfigurationswerte nicht erkannt." - -#~ msgid "" -#~ "Configuration file \"%1%\" was loaded, however some configuration values " -#~ "were not recognized." -#~ msgstr "" -#~ "Konfigurationsdatei \"%1%\" wurde geladen, jedoch wurden einige " -#~ "Konfigurationswerte nicht erkannt." - -#~ msgid "" -#~ "%s has encountered an error. It was likely caused by running out of " -#~ "memory. If you are sure you have enough RAM on your system, this may also " -#~ "be a bug and we would be glad if you reported it.\n" -#~ "\n" -#~ "The application will now terminate." -#~ msgstr "" -#~ "%s ist auf einen Fehler gestoßen. Es wurde wahrscheinlich dadurch " -#~ "verursacht, dass der Speicher knapp wird. Wenn Sie sicher sind, dass Sie " -#~ "genügend RAM auf Ihrem System haben, kann dies auch ein Programmfehler " -#~ "sein, und wir würden uns freuen, wenn Sie ihn melden würden.\n" -#~ "\n" -#~ "Die Anwendung wird nun beendet." - -#~ msgid "Internal error: %1%" -#~ msgstr "Interner Fehler: %1%" - -#~ msgid "You are opening %1% version %2%." -#~ msgstr "Sie öffnen %1% Version %2%." - -#~ msgid "" -#~ "The active configuration was created by %1% %2%,\n" -#~ "while a newer configuration was found in %3%\n" -#~ "created by %1% %4%.\n" -#~ "\n" -#~ "Shall the newer configuration be imported?\n" -#~ "If so, your active configuration will be backed up before importing the " -#~ "new configuration." -#~ msgstr "" -#~ "Die aktive Konfiguration wurde von %1% %2% erstellt,\n" -#~ "während eine neuere Konfiguration in %3% gefunden wurde\n" -#~ "erstellt von %1% %4%.\n" -#~ "\n" -#~ "Soll die neuere Konfiguration importiert werden?\n" -#~ "Wenn ja, wird Ihre aktive Konfiguration vor dem Importieren der neuen " -#~ "Konfiguration gesichert." - -#~ msgid "" -#~ "An existing configuration was found in %3%\n" -#~ "created by %1% %2%.\n" -#~ "\n" -#~ "Shall this configuration be imported?" -#~ msgstr "" -#~ "Eine bestehende Konfiguration wurde in %3% gefunden,\n" -#~ "erstellt von %1% %2%.\n" -#~ "\n" -#~ "Soll diese Konfiguration importiert werden?" - -#~ msgid "Import" -#~ msgstr "Importieren" - -#~ msgid "Don't import" -#~ msgstr "Nicht Importieren" - -#~ msgid "Preparing settings tabs" -#~ msgstr "Vorbereiten der Einstellungs-Registerkarten" - -#~ msgid "" -#~ "You have the following presets with saved options for \"Print Host upload" -#~ "\"" -#~ msgstr "" -#~ "Sie haben die folgenden Voreinstellungen mit gespeicherten Optionen für " -#~ "\"Hochladen zum Druckhost\"" - -#~ msgid "" -#~ "By default new Printer devices will be named as \"Printer N\" during its " -#~ "creation.\n" -#~ "Note: This name can be changed later from the physical printers settings" -#~ msgstr "" -#~ "Standardmäßig werden neue Drucker bei ihrer Erstellung als \"Drucker N\" " -#~ "bezeichnet.\n" -#~ "Hinweis: Dieser Name kann später über die Einstellungen für physische " -#~ "Drucker geändert werden." - -#~ msgid "Recreating" -#~ msgstr "Neu Erzeugen" - -#~ msgid "Loading of current presets" -#~ msgstr "Laden der aktuellen Voreinstellungen" - -#~ msgid "Loading of a mode view" -#~ msgstr "Lade Anzeigemodus" - -#~ msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" -#~ msgstr "Datei auswählen (GCODE/.GCO/.G/.ngc/NGC):" - -#~ msgid "modified" -#~ msgstr "geändert" - -#~ msgid "&Configuration Snapshots" -#~ msgstr "Konfi&gurations-Momentaufnahmen" - -#~ msgid "Inspect / activate configuration snapshots" -#~ msgstr "Inspiziere / aktiviere Konfigurations-Momentaufnahmen" - -#~ msgid "Take Configuration &Snapshot" -#~ msgstr "Erfa&ssen einer Konfigurations-Momentaufnahme" - -#~ msgid "Capture a configuration snapshot" -#~ msgstr "Erfassen einer Konfigurations-Momentaufnahme" - -#~ msgid "Desktop Integration" -#~ msgstr "Desktop Integration" - -#~ msgid "Simple View Mode" -#~ msgstr "EInfacher Anzeigemodus" - -#~ msgid "Advanced View Mode" -#~ msgstr "Erweiterter Anzeigemodus" - -#~ msgid "%s View Mode" -#~ msgstr "%s Anzeigemodus" - -#~ msgid "Flash Printer &Firmware" -#~ msgstr "Flashe Drucker &Firmware" - -#~ msgid "Upload a firmware image into an Arduino based printer" -#~ msgstr "Lade ein Firmware Image zu einem Arduino-basierten Drucker hoch" - -#~ msgid "Taking a configuration snapshot" -#~ msgstr "Schnappschuss der Konfiguration erstellen" - -#~ msgid "" -#~ "Some presets are modified and the unsaved changes will not be captured by " -#~ "the configuration snapshot." -#~ msgstr "" -#~ "Einige Voreinstellungen werden geändert und die nicht gespeicherten " -#~ "Änderungen werden vom Konfigurations-Snapshot nicht erfasst." - -#~ msgid "Snapshot name" -#~ msgstr "Name der Momentaufnahme" - -#~ msgid "The preset modifications are successfully saved" -#~ msgid_plural "The presets modifications are successfully saved" -#~ msgstr[0] "" -#~ "Die Änderungen der Voreinstellung wurden erfolgreich gespeichert." -#~ msgstr[1] "" -#~ "Die Änderungen der Voreinstellungen wurden erfolgreich gespeichert." - -#~ msgid "For new project all modifications will be reseted" -#~ msgstr "Bei einem neuen Projekt werden alle Änderungen zurückgesetzt" - -#~ msgid "The uploads are still ongoing" -#~ msgstr "Die Uploads sind noch im Gange" - -#~ msgid "Stop them and continue anyway?" -#~ msgstr "Stoppen und trotzdem weitermachen?" - -#~ msgid "Ongoing uploads" -#~ msgstr "Laufende Uploads" - -#~ msgid "It's impossible to print multi-part object(s) with SLA technology." -#~ msgstr "" -#~ "Es ist nicht möglich mehrteilige Objekte mit dem SLA-Verfahren zu drucken." - -#~ msgid "Configuration is editing from ConfigWizard" -#~ msgstr "Die Konfiguration wird vom ConfigWizard aus bearbeitet" - -#~ msgid "Pad and Support" -#~ msgstr "Grundschicht und Stützen" - -#~ msgid "Add negative volume" -#~ msgstr "Negatives Volumen hinzufügen" - -#~ msgid "Select showing settings" -#~ msgstr "Wähle Anzeigeeinstellungen" - -#~ msgid "Remove the selected object" -#~ msgstr "Ausgewähltes Objekt entfernen" - -#~ msgid "Slab" -#~ msgstr "Slab" - -#~ msgid "Height range Modifier" -#~ msgstr "Höhenbereich Modifizierer" - -#~ msgid "Set as a Separated Object" -#~ msgstr "Als separates Objekt festlegen" - -#~ msgid "Set as a Separated Objects" -#~ msgstr "Als separate Objekte festlegen" - -#~ msgid "Fix through the Netfabb" -#~ msgstr "Reparieren mittels Netfabb" - -#~ msgid "Reload the selected volumes from disk" -#~ msgstr "Die ausgewählten Volumen von der Festplatte neu laden" - -#~ msgid "Change extruder" -#~ msgstr "Wechsel Extruder" - -#~ msgid "Set extruder for selected items" -#~ msgstr "Extruder für die gewählten Elemente wählen" - -#~ msgid "Scale to print volume" -#~ msgstr "Auf Druckvolumen skalieren" - -#~ msgid "Scale the selected object to fit the print volume" -#~ msgstr "" -#~ "Skalieren des ausgewählten Objekts so, dass es in das Druckvolumen passt" - -#~ msgid "Merge objects to the one multipart object" -#~ msgstr "Objekte zu einem mehrteiligen Objekt zusammenführen" - -#~ msgid "Mirror the selected object along the X axis" -#~ msgstr "Ausgewähltes Objekt entlang der X-Achse spiegeln" - -#~ msgid "Mirror the selected object along the Y axis" -#~ msgstr "Ausgewähltes Objekt entlang der Y-Achse spiegeln" - -#~ msgid "Mirror the selected object along the Z axis" -#~ msgstr "Ausgewähltes Objekt entlang der Z-Achse spiegeln" - -#~ msgid "Mirror the selected object" -#~ msgstr "Ausgewähltes Objekt spiegeln" - -#~ msgid "Add Shape" -#~ msgstr "Form hinzufügen" - -#~ msgid "Split the selected object into individual objects" -#~ msgstr "Ausgewähltes Objekt in Einzelobjekte trennen" - -#~ msgid "Split the selected object into individual parts" -#~ msgstr "Das ausgewählte Objekt in einzelne Teile aufteilen" - -#~ msgid "Start at height" -#~ msgstr "Starte auf Höhe" - -#~ msgid "Stop at height" -#~ msgstr "Stoppe auf Höhe" - -#~ msgid "Remove layer range" -#~ msgstr "Schichtbereich entfernen" - -#~ msgid "Add layer range" -#~ msgstr "Schichtbereich hinzufügen" - -#~ msgid "No errors detected" -#~ msgstr "Keine Fehler gefunden" - -#~ msgid "Auto-repaired %1$d error" -#~ msgid_plural "Auto-repaired %1$d errors" -#~ msgstr[0] "Auto-reparierter %1$d Fehler" -#~ msgstr[1] "Auto-reparierte %1$d Fehler" - -#~ msgid "%1$d degenerate facet" -#~ msgid_plural "%1$d degenerate facets" -#~ msgstr[0] "%1$d degenerierte Fläche" -#~ msgstr[1] "%1$d degenerierte Flächen" - -#~ msgid "%1$d edge fixed" -#~ msgid_plural "%1$d edges fixed" -#~ msgstr[0] "%1$d Kante korrigiert" -#~ msgstr[1] "%1$d Kanten korrigiert" - -#~ msgid "%1$d facet removed" -#~ msgid_plural "%1$d facets removed" -#~ msgstr[0] "%1$d Fläche entfernt" -#~ msgstr[1] "%1$d Flächen entfernt" - -#~ msgid "%1$d facet reversed" -#~ msgid_plural "%1$d facets reversed" -#~ msgstr[0] "%1$d Fläche umgedreht" -#~ msgstr[1] "%1$d Flächen umgedreht" - -#~ msgid "%1$d backward edge" -#~ msgid_plural "%1$d backward edges" -#~ msgstr[0] "%1$d rückwärtige Kante" -#~ msgstr[1] "%1$d rückwärtige Kanten" - -#~ msgid "Right button click the icon to fix STL through Netfabb" -#~ msgstr "" -#~ "Klicken Sie mit der rechten Maustaste auf das Symbol, um die STL über " -#~ "Netfabb zu reparieren" - -#~ msgid "Rename Sub-object" -#~ msgstr "Subobjekt umbenennen" - -#~ msgid "Volumes in Object reordered" -#~ msgstr "Volumen in Objekt neu angeordnet" - -#~ msgid "Object reordered" -#~ msgstr "Objekt neu angeordnet" - -#~ msgid "Add Settings for Layers" -#~ msgstr "Schichten Einstellungen hinzufügen" - -#~ msgid "Add Settings for Sub-object" -#~ msgstr "Subobjekt Einstellungen hinzufügen" - -#~ msgid "Add Settings for Object" -#~ msgstr "Objekt Einstellungen hinzufügen" - -#~ msgid "Add Settings Bundle for Height range" -#~ msgstr "Höhenbreich Einstellungsbündel hinzufügen" - -#~ msgid "Add Settings Bundle for Sub-object" -#~ msgstr "Subobjekt Einstellungsbündel hinzufügen" - -#~ msgid "Add Settings Bundle for Object" -#~ msgstr "Objekt Einstellungsbündel hinzufügen" - -#~ msgid "Add Generic Subobject" -#~ msgstr "Generische Subobjekt hinzufügen" - -#~ msgid "Add Shape from Gallery" -#~ msgstr "Form aus Galerie hinzufügen" - -#~ msgid "Add Shapes from Gallery" -#~ msgstr "Formen aus Galerie hinzufügen" - -#~ msgid "Remove paint-on supports" -#~ msgstr "Aufmal-Stützen entfernen" - -#~ msgid "Remove paint-on seam" -#~ msgstr "Aufmal-Naht entfernen" - -#~ msgid "Remove Multi Material painting" -#~ msgstr "Multi Material Bemalung entfernen" - -#~ msgid "Shift objects to bed" -#~ msgstr "Objekte auf Bett verschieben" - -#~ msgid "Delete All Instances from Object" -#~ msgstr "Alle Kopien des Objektes löschen" - -#~ msgid "Delete Height Range" -#~ msgstr "Höhenbereich löschen" - -#~ msgid "From Object List You can't delete the last solid part from object." -#~ msgstr "" -#~ "Sie können nicht das letzte solide Teil des Objekts von der Objektliste " -#~ "löschen." - -#~ msgid "Delete Subobject" -#~ msgstr "Subobjekt löschen" - -#~ msgid "Last instance of an object cannot be deleted." -#~ msgstr "Letzte Kopie eines Objektes kann nicht gelöscht werden." - -#~ msgid "Delete Instance" -#~ msgstr "Kopie löschen" - -#~ msgid "" -#~ "The selected object couldn't be split because it contains only one part." -#~ msgstr "" -#~ "Das ausgewählte Objekt konnte nicht getrennt werden, da es nur aus einem " -#~ "Teil besteht." - -#~ msgid "Split to Parts" -#~ msgstr "In Teile trennen" - -#~ msgid "Merge all parts to the one single object" -#~ msgstr "Alle Teile zu einem einzigen Objekt zusammenfügen" - -#~ msgid "Add Layers" -#~ msgstr "Schichten hinzufügen" - -#~ msgid "Group manipulation" -#~ msgstr "Gruppenbearbeitung" - -#~ msgid "Object manipulation" -#~ msgstr "Objektbearbeitung" - -#~ msgid "Object Settings to modify" -#~ msgstr "Abweichende Objekteigenschaften" - -#~ msgid "Part Settings to modify" -#~ msgstr "Abweichende Teileigenschaften" - -#~ msgid "Layer range Settings to modify" -#~ msgstr "Schichtbereicheinstellungen zum Ändern" - -#~ msgid "Part manipulation" -#~ msgstr "Teilbearbeitung" - -#~ msgid "Instance manipulation" -#~ msgstr "Kopie Bearbeitung" - -#~ msgid "Height ranges" -#~ msgstr "Höhenbereiche" - -#~ msgid "Settings for height range" -#~ msgstr "Einstellungen für Höhenbereich" - -#~ msgid "Delete Selected Item" -#~ msgstr "Gewähltes Element löschen" - -#~ msgid "Delete Selected" -#~ msgstr "Löschen ausgewählt" - -#~ msgid "Add Height Range" -#~ msgstr "Höhenbereich hinzufügen" - -#~ msgid "" -#~ "Cannot insert a new layer range after the current layer range.\n" -#~ "The next layer range is too thin to be split to two\n" -#~ "without violating the minimum layer height." -#~ msgstr "" -#~ "Es kann kein neuer Schichtenbereich nach dem aktuellen Schichtenbereich " -#~ "eingefügt werden.\n" -#~ "Der nächste Schichtenbereich ist zu schmal, um auf zwei Schichten " -#~ "aufgeteilt zu werden ohne die Mindestschichthöhe zu verletzen." - -#~ msgid "" -#~ "Cannot insert a new layer range between the current and the next layer " -#~ "range.\n" -#~ "The gap between the current layer range and the next layer range\n" -#~ "is thinner than the minimum layer height allowed." -#~ msgstr "" -#~ "Es kann kein neuer Schichtenbereich zwischen dem aktuellen und dem " -#~ "nächsten Schichtenbereich eingefügt werden.\n" -#~ "Die Lücke zwischen dem aktuellen und dem nächsten Schichtenbereich ist " -#~ "ist schmaler als die minimal zulässige Schichthöhe." - -#~ msgid "" -#~ "Cannot insert a new layer range after the current layer range.\n" -#~ "Current layer range overlaps with the next layer range." -#~ msgstr "" -#~ "Es kann kein neuer Schichtenbereich nach dem aktuellen Schichtenbereich " -#~ "eingefügt werden.\n" -#~ "Der aktuelle Schichtenbereich überschneidet sich mit dem nächsten " -#~ "Schichtenbereich." - -#~ msgid "Edit Height Range" -#~ msgstr "Höhenbereich bearbeiten" - -#~ msgid "Object or Instance" -#~ msgstr "Objekt oder Kopie" - -#~ msgid "Unsupported selection" -#~ msgstr "Nicht unterstützte Auswahl" - -#~ msgid "You started your selection with %s Item." -#~ msgstr "Sie haben Ihre Auswahl mit %s Elementen begonnen." - -#~ msgid "In this mode you can select only other %s Items%s" -#~ msgstr "In diesem Modus wählen Sie nur andere %s Elemente%s" - -#~ msgid "of a current Object" -#~ msgstr "des aktuellen Objekts" - -#~ msgid "You can't change a type of the last solid part of the object." -#~ msgstr "" -#~ "Sie können nicht die Art des letzten soliden Teils des Objektes ändern." - -#~ msgid "Negative Volume" -#~ msgstr "Negatives Volumen" - -#~ msgid "Select type of part" -#~ msgstr "Wählen Sie den Typ des Teils" - -#~ msgid "Change Part Type" -#~ msgstr "Teil Typ ändern" - -#~ msgid "Repairing model" -#~ msgstr "Modell reparieren" - -#~ msgid "Fix through NetFabb" -#~ msgstr "Reparieren mittels Netfabb" - -#~ msgid "Fixing through NetFabb" -#~ msgstr "Reparieren durch NetFabb" - -#~ msgid "The following model was repaired successfully" -#~ msgid_plural "The following models were repaired successfully" -#~ msgstr[0] "Folgendes Modell wurde erfolgreich repariert" -#~ msgstr[1] "Folgende Modelle wurden erfolgreich repariert" - -#~ msgid "Folowing model repair failed" -#~ msgid_plural "Folowing models repair failed" -#~ msgstr[0] "Folgendes Modell wurde nicht repariert" -#~ msgstr[1] "Folgende Modelle wurden nicht repariert" - -#~ msgid "Set Printable group" -#~ msgstr "Setze druckbare Gruppe" - -#~ msgid "Set Unprintable group" -#~ msgstr "Gruppe \"Nicht druckbar\" setzen" - -#~ msgid "Set Printable Instance" -#~ msgstr "Setze druckbare Kopie" - -#~ msgid "Set Unprintable Instance" -#~ msgstr "Setze undruckbare Kopie" - -#~ msgid "&Plater Tab" -#~ msgstr "Druck&platte" - -#~ msgid "Show the plater" -#~ msgstr "Druckplatte anzeigen" - -#~ msgid "P&rint Settings Tab" -#~ msgstr "D&ruckeinstellungen" - -#~ msgid "Show the print settings" -#~ msgstr "Druckeinstellungen anzeigen" - -#~ msgid "&Filament Settings Tab" -#~ msgstr "&Filamenteinstellungen" - -#~ msgid "Show the filament settings" -#~ msgstr "Filamenteinstellungen anzeigen" - -#~ msgid "Print&er Settings Tab" -#~ msgstr "Druck&ereinstellungen" - -#~ msgid "Show the printer settings" -#~ msgstr "Druckereinstellungen anzeigen" - -#~ msgid "3&D" -#~ msgstr "3&D" - -#~ msgid "Show the 3D editing view" -#~ msgstr "Anzeigen des 3D Editiermodus" - -#~ msgid "Pre&view" -#~ msgstr "&Vorschau" - -#~ msgid "Show the 3D slices preview" -#~ msgstr "Vorschau der 3D-Schnitte anzeigen" - -#~ msgid "Shape Gallery" -#~ msgstr "Formen-Galerie" - -#~ msgid "Open the dialog to modify shape gallery" -#~ msgstr "Öffnen Sie den Dialog zum Ändern der Formengalerie" - -#~ msgid "Print &Host Upload Queue" -#~ msgstr "Druck&host Warteschlange" - -#~ msgid "Display the Print Host Upload Queue window" -#~ msgstr "Zeige das Druckhost Warteschlangenfenster" - -#~ msgid "Open New Instance" -#~ msgstr "Neue Instanz öffnen" - -#~ msgid "External perimeter" -#~ msgstr "Außenkontur" - -#~ msgid "Overhang perimeter" -#~ msgstr "Überhängende Außenkontur" - -#~ msgid "Internal infill" -#~ msgstr "Internes Infill" - -#~ msgid "Top solid infill" -#~ msgstr "Oberes massives Infill" - -#~ msgid "Bridge infill" -#~ msgstr "Überbrückungs-Infill" - -#~ msgid "Gap fill" -#~ msgstr "Lückenfüllung" - -#~ msgid "Support material interface" -#~ msgstr "Schnittstellenmaterial zum Stützmaterial" - -#~ msgid "Variable layer height" -#~ msgstr "Variable Schichthöhe" - -#~ msgid "Left mouse button:" -#~ msgstr "Linke Maustaste:" - -#~ msgid "Add detail" -#~ msgstr "Detail hinzufügen" - -#~ msgid "Right mouse button:" -#~ msgstr "Rechte Maustaste:" - -#~ msgid "Remove detail" -#~ msgstr "Detail entfernen" - -#~ msgid "Shift + Left mouse button:" -#~ msgstr "Gross + Linke Maustaste:" - -#~ msgid "Reset to base" -#~ msgstr "Zurücksetzen auf Basis" - -#~ msgid "Shift + Right mouse button:" -#~ msgstr "Gross + Rechte Maustaste:" - -#~ msgid "Smoothing" -#~ msgstr "Glätten" - -#~ msgid "Mouse wheel:" -#~ msgstr "Mausrad:" - -#~ msgid "Increase/decrease edit area" -#~ msgstr "Bearbeitungsbereich vergrößern/verkleinern" - -#~ msgid "Adaptive" -#~ msgstr "Adaptiv" - -#~ msgid "Quality / Speed" -#~ msgstr "Qualität / Geschwindigkeit" - -#~ msgid "Higher print quality versus higher print speed." -#~ msgstr "Höhere Druckqualität versus höhere Druckgeschwindigkeit." - -#~ msgid "Smooth" -#~ msgstr "Glätten" - -#~ msgid "Keep min" -#~ msgstr "Halte min" - -#~ msgid "Variable layer height - Manual edit" -#~ msgstr "Variable Schichthöhe - Manuell bearbeiten" - -#~ msgid "Variable layer height - Reset" -#~ msgstr "Variable Schichthöhe - Zurücksetzen" - -#~ msgid "Variable layer height - Adaptive" -#~ msgstr "Variable Schichthöhe - Adaptiv" - -#~ msgid "Variable layer height - Smooth all" -#~ msgstr "Variable Schichthöhe - Alles glätten" - -#~ msgid "Remove variable layer height" -#~ msgstr "Variable Schichthöhe entfernen" - -#~ msgid "%1$d Object was loaded with variable layer height." -#~ msgid_plural "%1$d Objects were loaded with variable layer height." -#~ msgstr[0] "%1$d Objekt wurde mit einer variablen Schichthöhe geladen." -#~ msgstr[1] "%1$d Objekte wurden mit einer variablen Schichthöhe geladen." - -#~ msgid "Are you sure you want to delete \"%1%\" printer?" -#~ msgstr "Sind Sie sicher, dass Sie den Drucker \"%1%\" löschen möchten?" - -#~ msgid "%s doesn't support percentage" -#~ msgstr "%s akzeptiert keine Prozentangaben" - -#~ msgid "" -#~ "Input value is out of range\n" -#~ "Are you sure that %s is a correct value and that you want to continue?" -#~ msgstr "" -#~ "Eingabewert liegt außerhalb des Bereichs\n" -#~ "Sind Sie sicher, dass %s ein korrekter Wert ist und Sie fortfahren " -#~ "möchten?" - -#~ msgid "Input value is out of range" -#~ msgstr "Der Eingabewert ist nicht im gültigen Bereich" - -#~ msgid "" -#~ "Do you mean %s%% instead of %s %s?\n" -#~ "Select YES if you want to change this value to %s%%, \n" -#~ "or NO if you are sure that %s %s is a correct value." -#~ msgstr "" -#~ "Meinen Sie%s anstelle von %s %s?\n" -#~ "Wählen Sie JA, wenn Sie diesen Wert auf %s%% ändern möchten, \n" -#~ "oder NEIN, wenn Sie sicher sind, dass %s %s ein korrekter Wert ist." - -#~ msgid "" -#~ "Invalid input format. Expected vector of dimensions in the following " -#~ "format: \"%1%\"" -#~ msgstr "" -#~ "Ungültiges Eingabeformat. Erwarteter Vektor der Abmessungen im folgenden " -#~ "Format: \"%1%\"" - -#~ msgid "Switch to the %s mode" -#~ msgstr "Wechseln zum %s Modus" - -#~ msgid "Current mode is %s" -#~ msgstr "Aktueller Modus ist %s" - -#~ msgctxt "Mode" -#~ msgid "Advanced" -#~ msgstr "Erweitert" - -#~ msgid "" -#~ "Here you can adjust required purging volume (mm³) for any given pair of " -#~ "tools." -#~ msgstr "" -#~ "Hier können Sie das erforderliche Reinigungsvolumen (mm³) für ein " -#~ "beliebiges Werkzeugpaar einstellen." - -#~ msgid "Extruder changed to" -#~ msgstr "Extruder geändert auf" - -#~ msgid "Tool #" -#~ msgstr "Werkzeug #" - -#~ msgid "" -#~ "Total purging volume is calculated by summing two values below, depending " -#~ "on which tools are loaded/unloaded." -#~ msgstr "" -#~ "Das gesamte Reinigungsvolumen wird durch die Addition folgender zwei " -#~ "Werte berechnet, je nachdem welche Werkzeuge geladen/entladen sind." - -#~ msgid "Change Extruder" -#~ msgstr "Wechsel Extruder" - -#~ msgid "Change Extruders" -#~ msgstr "Wechsel Extruder" - -#~ msgid "Quick Add Settings (%s)" -#~ msgstr "Schnelles Einstellen (%s)" - -#~ msgid "Add instance" -#~ msgstr "Kopie hinzufügen" - -#~ msgid "Add one more instance of the selected object" -#~ msgstr "Eine weitere Kopie des gewählten Objekts hinzufügen" - -#~ msgid "Remove instance" -#~ msgstr "Kopie entfernen" - -#~ msgid "Remove one instance of the selected object" -#~ msgstr "Entferne eine Kopie des gewählten Objekts" - -#~ msgid "Set number of instances" -#~ msgstr "Setze Anzahl der Kopien" - -#~ msgid "Change the number of instances of the selected object" -#~ msgstr "Anzahl der Kopien des gewählten Objektes ändern" - -#~ msgid "Fill bed with instances" -#~ msgstr "Bett mit Kopien auffüllen" - -#~ msgid "Fill the remaining area of bed with instances of the selected object" -#~ msgstr "" -#~ "Den verbleibenden Bereich des Bettes mit Kopien des ausgewählten Objekts " -#~ "auffüllen" - -#~ msgid "" -#~ "is based on Slic3r by Alessandro Ranellucci and the RepRap community." -#~ msgstr "" -#~ "basiert auf Slic3r von Alessandro Ranellucci und der RepRap Community." - -#~ msgid "" -#~ "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, " -#~ "Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous " -#~ "others." -#~ msgstr "" -#~ "Beiträge von Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " -#~ "Meszaros, Lukas Matena, Vojtech Kral, David Kocik und zahlreichen anderen." - -#~ msgid "Artwork model by M Boyer" -#~ msgstr "Kunstwerk Modell von M Boyer" - -#~ msgid "" -#~ "Starting with %1% 2.3, configuration directory on Linux has changed " -#~ "(according to XDG Base Directory Specification) to \n" -#~ "%2%.\n" -#~ "\n" -#~ "This directory did not exist yet (maybe you run the new version for the " -#~ "first time).\n" -#~ "However, an old %1% configuration directory was detected in \n" -#~ "%3%.\n" -#~ "\n" -#~ "Consider moving the contents of the old directory to the new location in " -#~ "order to access your profiles, etc.\n" -#~ "Note that if you decide to downgrade %1% in future, it will use the old " -#~ "location again.\n" -#~ "\n" -#~ "What do you want to do now?" -#~ msgstr "" -#~ "Beginnend mit %1% 2.3 hat sich das Konfigurationsverzeichnis unter Linux " -#~ "(gemäß XDG Base Directory Specification) geändert in \n" -#~ "%2%.\n" -#~ "\n" -#~ "Dieses Verzeichnis existierte noch nicht (vielleicht führen Sie die neue " -#~ "Version zum ersten Mal aus).\n" -#~ "Es wurde jedoch ein altes %1%-Konfigurationsverzeichnis entdeckt in \n" -#~ "%3%.\n" -#~ "\n" -#~ "Ziehen Sie in Betracht, den Inhalt des alten Verzeichnisses an den neuen " -#~ "Ort zu verschieben, um auf Ihre Profile usw. zuzugreifen.\n" -#~ "Beachten Sie, dass bei einem zukünftigen Downgrade von %1% wieder der " -#~ "alte Speicherort verwendet wird.\n" -#~ "\n" -#~ "Was möchten Sie jetzt tun?" - -#~ msgid "%s - BREAKING CHANGE" -#~ msgstr "%s - BREAKING CHANGE" - -#~ msgid "Quit, I will move my data now" -#~ msgstr "Beenden, ich werde meine Daten jetzt verschieben" - -#~ msgid "Start the application" -#~ msgstr "Anwendung starten" - -#~ msgid "NO RAMMING AT ALL" -#~ msgstr "ÜBERHAUPT KEIN RAMMEN" - -#~ msgid "Volumetric speed" -#~ msgstr "Volumengeschwindigkeit" - -#~ msgid "Ramming customization" -#~ msgstr "Einstellungen für das Rammen" - -#~ msgid "" -#~ "Ramming denotes the rapid extrusion just before a tool change in a single-" -#~ "extruder MM printer. Its purpose is to properly shape the end of the " -#~ "unloaded filament so it does not prevent insertion of the new filament " -#~ "and can itself be reinserted later. This phase is important and different " -#~ "materials can require different extrusion speeds to get the good shape. " -#~ "For this reason, the extrusion rates during ramming are adjustable.\n" -#~ "\n" -#~ "This is an expert-level setting, incorrect adjustment will likely lead to " -#~ "jams, extruder wheel grinding into filament etc." -#~ msgstr "" -#~ "Rammen steht für die beschleunigte Extrusion unmittelbar vor einem " -#~ "Werkzeugwechsel in einem MM-Drucker mit einem Extruder. Der Zweck ist, " -#~ "die Spitze des entladenen Filaments geeignet zu formen, damit es das " -#~ "Laden des neuen Filaments nicht behindert und später selber wieder " -#~ "eingeführt werden kann. Diese Phase ist wichtig und verschiedene " -#~ "Materialien können unterschiedliche Extrusionsgeschwindigkeiten " -#~ "benötigen, um die richtige Form zu erzielen. Aus diesem Grund können die " -#~ "Extrusionsraten für das Rammen angepasst werden.\n" -#~ "\n" -#~ "Dies ist eine Einstellung für fortgeschrittene Benutzer. Falsche " -#~ "Anpassungen werden sehr wahrscheinlich zu Verstopfungen führen oder dazu, " -#~ "dass die Zähne der Extruderwelle ins Filament einschneiden usw." - -#~ msgid "Total ramming time" -#~ msgstr "Gesamte Rammdauer" - -#~ msgid "Total rammed volume" -#~ msgstr "Gesamtes Rammvolumen" - -#~ msgid "Ramming line width" -#~ msgstr "Breite der Rammlinie" - -#~ msgid "Ramming line spacing" -#~ msgstr "Abstand der Rammlinien" - -#~ msgid "Network lookup" -#~ msgstr "Network Lookup" - -#~ msgid "Address" -#~ msgstr "Adresse" - -#~ msgid "Hostname" -#~ msgstr "Hostname" - -#~ msgid "Service name" -#~ msgstr "Name des Dienstes" - -#~ msgid "OctoPrint version" -#~ msgstr "OctoPrint Version" - -#~ msgid "Searching for devices" -#~ msgstr "Es wird nach Geräten gesucht" - -#~ msgid "Revert color to default" -#~ msgstr "Standardfarbe wiederherstellen" - -#~ msgid "Value is the same as the system value" -#~ msgstr "Der Wert ist gleich wie die Systemeinstellung" - -#~ msgid "" -#~ "Value was changed and is not equal to the system value or the last saved " -#~ "preset" -#~ msgstr "" -#~ "Der Wert wurde geändert und ist nicht gleich wie die Systemeinstellung " -#~ "oder die letzte abgespeicherte Voreinstellung" - -#~ msgid "Buttons And Text Colors Description" -#~ msgstr "Schaltflächen und Textfarben Beschreibung" - -#, fuzzy -#~ msgid "" -#~ "The Spiral Vase mode requires:\n" -#~ "- one perimeter\n" -#~ "- no top solid layers\n" -#~ "- 0% fill density\n" -#~ "- no support material\n" -#~ "- Ensure vertical shell thickness enabled\n" -#~ "- Detect thin walls disabled" -#~ msgstr "" -#~ "Der Spiralvasenmodus erfordert:\n" -#~ "- einen Perimeter\n" -#~ "- keine oberen massiven Schichten\n" -#~ "- 0% Fülldichte\n" -#~ "- kein Stützmaterial\n" -#~ "- Vertikale Schalenstärke sicherstellen aktiv\n" -#~ "- Dünne Wände erkennen nicht aktiv" - -#~ msgid "" -#~ "The Wipe Tower currently supports the non-soluble supports only\n" -#~ "if they are printed with the current extruder without triggering a tool " -#~ "change.\n" -#~ "(both support_material_extruder and support_material_interface_extruder " -#~ "need to be set to 0)." -#~ msgstr "" -#~ "Der Reinigungsturm unterstützt derzeit nur die unlöslichen Stützen, wenn " -#~ "sie mit dem aktuellen Extruder gedruckt werden, ohne einen " -#~ "Werkzeugwechsel auszulösen.\n" -#~ "(sowohl der Stützmaterial-Extruder als auch der Stützmaterial-" -#~ "Schnittstellen-Extruder müssen auf 0 eingestellt sein)" - -#~ msgid "Shall I adjust those settings in order to enable the Wipe Tower?" -#~ msgstr "" -#~ "Soll ich diese Einstellungen anpassen, um den Reinigungsturm zu " -#~ "aktivieren?" - -#~ msgid "Wipe Tower" -#~ msgstr "Reinigungsturm" - -#~ msgid "" -#~ "For the Wipe Tower to work with the soluble supports, the support layers\n" -#~ "need to be synchronized with the object layers." -#~ msgstr "" -#~ "Damit der Reinigungsturm mit den löslichen Trägermaterialien arbeiten " -#~ "kann, müssen die Stützschichten mit den Objektschichten synchronisiert " -#~ "sein." - -#~ msgid "" -#~ "Shall I synchronize support layers in order to enable the Wipe Tower?" -#~ msgstr "" -#~ "Soll ich die Stützschichten synchronisieren, um den Reinigungsturm zu " -#~ "aktivieren?" - -#~ msgid "Downgrade" -#~ msgstr "Downgrade" - -#~ msgid "Before roll back" -#~ msgstr "Vor dem Zurückwechseln" - -#~ msgid "Active" -#~ msgstr "Aktiv" - -#~ msgid "print" -#~ msgstr "Druck" - -#~ msgid "filaments" -#~ msgstr "Filamente" - -#~ msgid "printer" -#~ msgstr "Drucker" - -#~ msgid "version" -#~ msgstr "Version" - -#~ msgid "model" -#~ msgstr "Modell" - -#~ msgid "variants" -#~ msgstr "Varianten" - -#~ msgid "Incompatible with this %s" -#~ msgstr "Nicht kompatibel mit diesem %s" - -#~ msgid "Activate" -#~ msgstr "Aktivieren" - -#~ msgid "Configuration Snapshots" -#~ msgstr "Konfigurations-Momentaufnahmen" - -#~ msgid "Automatic updates" -#~ msgstr "Automatische Updates" - -#~ msgid "Updates" -#~ msgstr "Updates" - -#~ msgid "Check for application updates" -#~ msgstr "Nach Updates suchen" - -#~ msgid "" -#~ "If enabled, %s checks for new application versions 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 "" -#~ "Falls aktiviert, sucht %s online nach neuen Versionen der Anwendung. " -#~ "Falls eine neue Version verfügbar ist, wird eine Mitteilung beim nächsten " -#~ "Programmstart angezeigt (aber nie während der Programmausführung). Dies " -#~ "dient nur der Mitteilung; es findet keine automatische Installation statt." - -#~ msgid "Update built-in Presets automatically" -#~ msgstr "Eingebaute Voreinstellungen automatisch aktualisieren" - -#~ msgid "" -#~ "If enabled, %s downloads updates of built-in system presets in the " -#~ "background.These updates are downloaded into a separate temporary " -#~ "location.When a new preset version becomes available it is offered at " -#~ "application startup." -#~ msgstr "" -#~ "Wenn aktiviert, lädt %s Updates der eingebauten Systemvoreinstellungen im " -#~ "Hintergrund herunter. Diese Updates werden in einen separaten temporären " -#~ "Speicherort heruntergeladen. Wenn eine neue Voreinstellungsversion " -#~ "verfügbar wird, wird sie beim Programmstart angeboten." - -#~ msgid "" -#~ "Updates are never applied without user's consent and never overwrite " -#~ "user's customized settings." -#~ msgstr "" -#~ "Updates werden niemals ohne das Einverständnis des Benutzers ausgeführt, " -#~ "und werden niemals die vom Benutzer geänderten Einstellungen " -#~ "überschreiben." - -#~ msgid "" -#~ "Additionally a backup snapshot of the whole configuration is created " -#~ "before an update is applied." -#~ msgstr "" -#~ "Zusätzlich wird eine Momentaufnahme der gesamten Konfiguration als " -#~ "Sicherung erstellt, bevor ein Update durchgeführt wird." - -#~ msgid "" -#~ "Export full pathnames of models and parts sources into 3mf and amf files" -#~ msgstr "" -#~ "Exportieren Sie die vollständigen Pfadnamen der Modelle und Teilequellen " -#~ "in 3mf- und amf-Dateien" - -#~ msgid "" -#~ "If enabled, allows the Reload from disk command to automatically find and " -#~ "load the files when invoked.\n" -#~ "If not enabled, the Reload from disk command will ask to select each file " -#~ "using an open file dialog." -#~ msgstr "" -#~ "Wenn diese Option aktiviert ist, ermöglicht der Befehl Von Festplatte neu " -#~ "laden das automatische Suchen und Laden der Dateien, wenn er aufgerufen " -#~ "wird.\n" -#~ "Wenn nicht aktiviert, fordert der Befehl Von der Festplatte neu laden " -#~ "jede Datei über ein Dialogfeld zum Öffnen von Dateien zur Auswahl auf." - -#~ msgid "View mode" -#~ msgstr "Anzeigemodus" - -#~ msgid "Expert mode" -#~ msgstr "Expertenmodus" - -#~ msgid "Enter the temperature needed for extruding your filament." -#~ msgstr "" -#~ "Geben Sie die Temperatur ein, die für die Extrusion Ihres Filaments " -#~ "benötigt wird." - -#~ msgid "Do you want to continue changing the configuration?" -#~ msgstr "Möchten Sie die Konfiguration weiter ändern?" - -#~ msgid "Custom printer was installed and it will be activated." -#~ msgstr "" -#~ "Der benutzerdefinierte Drucker wurde installiert und wird aktiviert." - -#~ msgid "SLA Material Profiles Selection" -#~ msgstr "SLA Material Profile Auswahl" - -#~ msgid "" -#~ "Performing desktop integration failed - boost::filesystem::canonical did " -#~ "not return appimage path." -#~ msgstr "" -#~ "Die Desktop-Integration ist fehlgeschlagen - boost::filesystem::canonical " -#~ "hat den appimage-Pfad nicht zurückgegeben." - -#~ msgid "Performing desktop integration failed - Could not find executable." -#~ msgstr "" -#~ "Durchführen der Desktop-Integration fehlgeschlagen - Ausführbare Datei " -#~ "konnte nicht gefunden werden." - -#~ msgid "" -#~ "Performing desktop integration failed because the application directory " -#~ "was not found." -#~ msgstr "" -#~ "Die Durchführung der Desktop-Integration ist fehlgeschlagen, da das " -#~ "Anwendungsverzeichnis nicht gefunden wurde." - -#~ msgid "" -#~ "Desktop Integration sets this binary to be searchable by the system.\n" -#~ "\n" -#~ "Press \"Perform\" to proceed." -#~ msgstr "" -#~ "Die Desktop-Integration stellt diese Binärdatei so ein, dass sie vom " -#~ "System durchsucht werden kann.\n" -#~ "\n" -#~ "Drücken Sie auf \"Ausführen\", um fortzufahren." - -#~ msgid "Switch code to Change extruder" -#~ msgstr "Code umschalten auf Extruder wechseln" - -#~ msgid "Change extruder (N/A)" -#~ msgstr "Extruder wechseln (nv)" - -#~ msgid "Use another extruder" -#~ msgstr "Einen anderen Extruder verwenden" - -#~ msgid "Add custom G-code" -#~ msgstr "Benutzerdefinierten G-Code hinzufügen" - -#~ msgid "default color" -#~ msgstr "Standardfarbe" - -#~ msgid "Movement" -#~ msgstr "Bewegung" - -#~ msgid "Extrusion" -#~ msgstr "Extrusion" - -#~ msgid "Estimated printing times" -#~ msgstr "Geschätzte Druckzeiten" - -#~ msgid "Hollow this object" -#~ msgstr "Dieses Objekt aushöhlen" - -#~ msgid "Preview hollowed and drilled model" -#~ msgstr "Vorschau des ausgehöhlten und aufgebohrten Modells" - -#~ msgid "Offset" -#~ msgstr "Offset" - -#~ msgid "Hole diameter" -#~ msgstr "Lochdurchmesser" - -#~ msgid "Hole depth" -#~ msgstr "Lochtiefe" - -#~ msgid "Remove selected holes" -#~ msgstr "Ausgewählte Löcher entfernen" - -#~ msgid "Remove all holes" -#~ msgstr "Alle Löcher entfernen" - -#~ msgid "Show supports" -#~ msgstr "Stützen anzeigen" - -#~ msgid "Add drainage hole" -#~ msgstr "Drainageloch hinzufügen" - -#~ msgid "Delete drainage hole" -#~ msgstr "Drainageloch entfernen" - -#~ msgid "Hollowing parameter change" -#~ msgstr "Änderung der Aushöhlungsparameter" - -#~ msgid "Change drainage hole diameter" -#~ msgstr "Durchmesser des Drainagelochs ändern" - -#~ msgid "Hollow and drill" -#~ msgstr "Aushöhlen und Bohren" - -#~ msgid "Move drainage hole" -#~ msgstr "Drainageloch bewegen" - -#~ msgid "Paints neighboring facets that have the same color." -#~ msgstr "Bemalt benachbarte Flächen, die die gleiche Farbe haben." - -#~ msgid "Split bigger facets into smaller ones while the object is painted." -#~ msgstr "" -#~ "Teilt größere Flächen in kleinere auf, während das Objekt bemalt wird." - -#~ msgid "Loading a configuration snapshot" -#~ msgstr "Laden eines Konfigurations-Snapshots" - -#~ msgid "Continue to activate a configuration snapshot %1%?" -#~ msgstr "Aktivierung eines Konfigurations-Snapshots %1% fortsetzen?" - -#~ msgid "Failed to activate configuration snapshot." -#~ msgstr "Konfigurations-Snapshot konnte nicht aktiviert werden." - -#~ msgid "Open hyperlink in default browser?" -#~ msgstr "Hyperlink im Standardbrowser öffnen?" - -#~ msgid "Editing" -#~ msgstr "Bearbeitung" - -#~ msgid "Right button click the icon to change the object settings" -#~ msgstr "" -#~ "Klicken Sie mit der rechten Maustaste auf das Symbol, um die " -#~ "Objekteinstellungen zu ändern" - -#~ msgid "Click the icon to change the object settings" -#~ msgstr "Klicken Sie auf das Symbol, um die Objekteinstellungen zu ändern" - -#~ msgid "Right button click the icon to change the object printable property" -#~ msgstr "" -#~ "Klicken Sie mit der rechten Maustaste auf das Symbol, um die Druckbar-" -#~ "Eigenschaft des Objekts zu ändern" - -#~ msgid "Click the icon to change the object printable property" -#~ msgstr "" -#~ "Klicken Sie auf das Symbol, um die Druckbar-Eigenschaft des Objekts zu " -#~ "ändern" - -#~ msgid "Height" -#~ msgstr "Höhe" - -#~ msgid "Volumetric flow rate" -#~ msgstr "Volumetrische Flussrate" - -#~ msgid "Show" -#~ msgstr "Anzeigen" - -#~ msgid "Feature types" -#~ msgstr "Merkmalstypen" - -#~ msgid "Open Preferences." -#~ msgstr "Einstellungen öffnen." - -#~ msgid "Open Documentation in web browser." -#~ msgstr "Dokumentation im Webbrowser öffnen." - -#~ msgid "Suppress to open hyperlink in browser" -#~ msgstr "Öffnen des Hyperlinks im Browser unterdrücken" - -#~ msgid "You will not be asked about it again on label hovering." -#~ msgstr "" -#~ "Sie werden nicht mehr danach gefragt, wenn Sie mit der Maus über die " -#~ "Beschriftung fahren." - -#~ msgid "" -#~ "Visit \"Preferences\" and check \"%1%\"\n" -#~ "to changes your choice." -#~ msgstr "" -#~ "Besuchen Sie \"Einstellungen\" und prüfen Sie \"%1%\"\n" -#~ "um Ihre Auswahl zu ändern." - -#~ msgid "" -#~ "Multiple objects were loaded for a multi-material printer.\n" -#~ "Instead of considering them as multiple objects, should I consider\n" -#~ "these files to represent a single object having multiple parts?" -#~ msgstr "" -#~ "Für einen Multimaterialdrucker wurden mehrere Objekte geladen.\n" -#~ "Soll ich, anstatt sie als mehrere Objekte zu betrachten, \n" -#~ "diese Dateien als ein einzelnes Objekt mit mehreren Teilen behandeln?" - -#~ msgid "3D editor view" -#~ msgstr "3D Editiermodus" - -#~ msgid "Action" -#~ msgstr "Aktion" - -#~ msgid "Remember output directory" -#~ msgstr "Ausgabeverzeichnis merken" - -#~ msgid "" -#~ "If this is enabled, Slic3r will prompt the last output directory instead " -#~ "of the one containing the input files." -#~ msgstr "" -#~ "Wenn diese Option aktiviert ist, öffnet PrusaSlicer das letzte " -#~ "Ausgabeverzeichnis anstelle des Verzeichnisses, in dem sich die " -#~ "Eingabedateien befinden." - -#~ msgid "Auto-center parts" -#~ msgstr "Teile automatisch zentrieren" - -#~ msgid "" -#~ "If this is enabled, Slic3r will auto-center objects around the print bed " -#~ "center." -#~ msgstr "" -#~ "Wenn diese Option aktiviert ist, zentriert PrusaSlicer Objekte " -#~ "automatisch um die Mitte des Druckbettes." - -#~ msgid "Background processing" -#~ msgstr "Hintergrundberechnung" - -#~ msgid "" -#~ "If this is enabled, Slic3r will pre-process objects as soon as they're " -#~ "loaded in order to save time when exporting G-code." -#~ msgstr "" -#~ "Wenn diese Option aktiviert ist, wird PrusaSlicer Objekte vorverarbeiten, " -#~ "sobald sie geladen werden, um Zeit beim Export von G-Code zu sparen." - -#~ msgid "Export sources full pathnames to 3mf and amf" -#~ msgstr "Vollständige Pfadnamen der Quellen in 3mf und amf exportieren" - -#~ msgid "" -#~ "If enabled, allows the Reload from disk command to automatically find and " -#~ "load the files when invoked." -#~ msgstr "" -#~ "Wenn diese Option aktiviert ist, ermöglicht der Befehl \"Von Festplatte " -#~ "neu laden\" das automatische Suchen und Laden der Dateien, wenn er " -#~ "aufgerufen wird." - -#~ msgid "" -#~ "If enabled, Slic3r downloads updates of built-in system presets in the " -#~ "background. These updates are downloaded into a separate temporary " -#~ "location. When a new preset version becomes available it is offered at " -#~ "application startup." -#~ msgstr "" -#~ "Wenn aktiviert, lädt Slic3r Updates der eingebauten " -#~ "Systemvoreinstellungen im Hintergrund herunter. Diese Updates werden in " -#~ "einen separaten temporären Speicherort heruntergeladen. Wenn eine neue " -#~ "Voreinstellungsversion verfügbar wird, wird sie beim Programmstart " -#~ "angeboten." - -#~ msgid "Suppress \" - default - \" presets" -#~ msgstr "\"Standard\"-Einstellungen unterdrücken" - -#~ msgid "" -#~ "Suppress \" - default - \" presets in the Print / Filament / Printer " -#~ "selections once there are any other valid presets available." -#~ msgstr "" -#~ "\"Standard\"-Einstellungen in den Auswahlen für Druck / Filament / " -#~ "Drucker unterdrücken, falls andere gültige Voreinstellungen vorhanden " -#~ "sind." - -#~ msgid "Show incompatible print and filament presets" -#~ msgstr "Inkompatible Druck- und Filamenteinstellungen anzeigen" - -#~ msgid "" -#~ "When checked, the print and filament presets are shown in the preset " -#~ "editor even if they are marked as incompatible with the active printer" -#~ msgstr "" -#~ "Falls angekreuzt, werden Voreinstellungen für Druck und Filament im " -#~ "Voreinstellungseditor auch dann angezeigt, wenn sie als inkompatibel zum " -#~ "aktiven Drucker gekennzeichnet wurden" - -#~ msgid "Show drop project dialog" -#~ msgstr "Projekt-Drop-Dialog anzeigen" - -#~ msgid "" -#~ "When checked, whenever dragging and dropping a project file on the " -#~ "application, shows a dialog asking to select the action to take on the " -#~ "file to load." -#~ msgstr "" -#~ "Wenn dieses Kontrollkästchen aktiviert ist, wird beim Ziehen und Ablegen " -#~ "einer Projektdatei auf die Anwendung ein Dialogfeld angezeigt, in dem Sie " -#~ "die Aktion auswählen können, die mit der zu ladenden Datei ausgeführt " -#~ "werden soll." - -#~ msgid "" -#~ "On OSX there is always only one instance of app running by default. " -#~ "However it is allowed to run multiple instances of same app from the " -#~ "command line. In such case this settings will allow only one instance." -#~ msgstr "" -#~ "Unter OSX wird standardmäßig immer nur eine Instanz der Anwendung " -#~ "ausgeführt. Es ist jedoch erlaubt, mehrere Instanzen derselben Anwendung " -#~ "von der Befehlszeile aus auszuführen. In einem solchen Fall erlauben " -#~ "diese Einstellungen nur eine Instanz." - -#~ msgid "" -#~ "Ask to save unsaved changes when closing the application or when loading " -#~ "a new project" -#~ msgstr "" -#~ "Aufforderung zum Speichern nicht gespeicherter Änderungen beim Schließen " -#~ "der Anwendung oder beim Laden eines neuen Projekts" - -#~ msgid "Ask for unsaved changes when selecting new preset" -#~ msgstr "" -#~ "Nach nicht gespeicherten Änderungen fragen, wenn eine neue Voreinstellung " -#~ "ausgewählt wird" - -#~ msgid "" -#~ "Always ask for unsaved changes when selecting new preset or resetting a " -#~ "preset" -#~ msgstr "" -#~ "Immer nach nicht gespeicherten Änderungen fragen, wenn Sie eine neue " -#~ "Voreinstellung auswählen oder eine Voreinstellung zurücksetzen" - -#~ msgid "Ask for unsaved changes when creating new project" -#~ msgstr "" -#~ "Bei der Erstellung eines neuen Projekts nach ungesicherten Änderungen " -#~ "fragen" - -#~ msgid "Always ask for unsaved changes when creating new project" -#~ msgstr "" -#~ "Bei der Erstellung eines neuen Projekts immer nach ungespeicherten " -#~ "Änderungen fragen" - -#~ msgid "Use Retina resolution for the 3D scene" -#~ msgstr "Verwende Retina Auflösung für die 3D Anzeige" - -#~ msgid "" -#~ "If enabled, the 3D scene will be rendered in Retina resolution. If you " -#~ "are experiencing 3D performance problems, disabling this option may help." -#~ msgstr "" -#~ "Wenn aktiviert, wird die 3D-Szene in Retina-Auflösung gerendert. Wenn Sie " -#~ "Probleme mit der 3D-Leistung haben, kann es hilfreich sein, diese Option " -#~ "zu deaktivieren." - -#~ msgid "Show splash screen" -#~ msgstr "Startbildschirm anzeigen" - -#~ msgid "Clear Undo / Redo stack on new project" -#~ msgstr "Undo/Redo-Stapel bei neuem Projekt löschen" - -#~ msgid "" -#~ "Clear Undo / Redo stack on new project or when an existing project is " -#~ "loaded." -#~ msgstr "" -#~ "Undo / Redo-Stapel bei neuem Projekt oder beim Laden eines bestehenden " -#~ "Projekts löschen." - -#~ msgid "Enable support for legacy 3DConnexion devices" -#~ msgstr "Ältere 3DConnexion-Geräte unterstützen" - -#~ msgid "" -#~ "If enabled, the legacy 3DConnexion devices settings dialog is available " -#~ "by pressing CTRL+M" -#~ msgstr "" -#~ "Wenn aktiviert, ist der Einstellungsdialog für ältere 3DConnexion-Geräte " -#~ "durch Drücken von STRG+M verfügbar." - -#~ msgid "Camera" -#~ msgstr "Kamera" - -#~ msgid "Use perspective camera" -#~ msgstr "Benutze perspektivische Kamera" - -#~ msgid "" -#~ "If enabled, use perspective camera. If not enabled, use orthographic " -#~ "camera." -#~ msgstr "" -#~ "Wenn aktiviert, verwenden Sie eine perspektivische Kamera. Wenn nicht " -#~ "aktiviert, verwenden Sie eine orthographische Kamera." - -#~ msgid "Use free camera" -#~ msgstr "Benutze freie Kamera" - -#~ msgid "If enabled, use free camera. If not enabled, use constrained camera." -#~ msgstr "" -#~ "Wenn aktiviert, verwenden Sie eine freie Kamera. Wenn nicht aktiviert, " -#~ "verwenden Sie eine beschränkte Kamera." - -#~ msgid "Reverse direction of zoom with mouse wheel" -#~ msgstr "Umkehrung der Zoom-Richtung des Mausrads" - -#~ msgid "If enabled, reverses the direction of zoom with mouse wheel" -#~ msgstr "" -#~ "Wenn aktiviert, wird die Richtung des Zooms mit dem Mausrad umgekehrt" - -#~ msgid "Sequential slider applied only to top layer" -#~ msgstr "" -#~ "Sequentieller Schieberegler wird nur auf die oberste Schicht angewendet" - -#~ msgid "" -#~ "If enabled, changes made using the sequential slider, in preview, apply " -#~ "only to gcode top layer. If disabled, changes made using the sequential " -#~ "slider, in preview, apply to the whole gcode." -#~ msgstr "" -#~ "Wenn diese Option aktiviert ist, werden Änderungen, die Sie mit dem " -#~ "Schieberegler in der Vorschau vornehmen, nur auf den G-Code der obersten " -#~ "Schicht angewendet. Wenn Sie diese Option deaktivieren, werden die mit " -#~ "dem Schieberegler in der Vorschau vorgenommenen Änderungen auf den " -#~ "gesamten G-Code angewendet." - -#~ msgid "Show sidebar collapse/expand button" -#~ msgstr "Schaltfläche zum Zu-/Ausklappen der Seitenleiste zeigen" - -#~ msgid "" -#~ "If enabled, the button for the collapse sidebar will be appeared in top " -#~ "right corner of the 3D Scene" -#~ msgstr "" -#~ "Wenn aktiviert, wird die Schaltfläche zum Zusammenklappen der " -#~ "Seitenleiste in der oberen rechten Ecke der 3D-Szene angezeigt" - -#~ msgid "" -#~ "If enabled, the descriptions of configuration parameters in settings tabs " -#~ "wouldn't work as hyperlinks. If disabled, the descriptions of " -#~ "configuration parameters in settings tabs will work as hyperlinks." -#~ msgstr "" -#~ "Wenn aktiviert, funktionieren die Beschreibungen von " -#~ "Konfigurationsparametern in Einstellungsregistern nicht als Hyperlinks. " -#~ "Wenn diese Option deaktiviert ist, funktionieren die Beschreibungen von " -#~ "Konfigurationsparametern in Einstellungsregistern als Hyperlinks." - -#~ msgid "Use colors for axes values in Manipulation panel" -#~ msgstr "Farben für Achsenwerte im Manipulationsfenster verwenden" - -#~ msgid "" -#~ "If enabled, the axes names and axes values will be colorized according to " -#~ "the axes colors. If disabled, old UI will be used." -#~ msgstr "" -#~ "Wenn aktiviert, werden die Achsennamen und Achsenwerte entsprechend den " -#~ "Achsenfarben eingefärbt. Wenn deaktiviert, wird die alte " -#~ "Benutzeroberfläche verwendet." - -#~ msgid "Order object volumes by types" -#~ msgstr "Objektvolumen nach Typen ordnen" - -#~ msgid "" -#~ "If enabled, volumes will be always ordered inside the object. Correct " -#~ "order is Model Part, Negative Volume, Modifier, Support Blocker and " -#~ "Support Enforcer. If disabled, you can reorder Model Parts, Negative " -#~ "Volumes and Modifiers. But one of the model parts have to be on the first " -#~ "place." -#~ msgstr "" -#~ "Wenn diese Option aktiviert ist, werden die Volumen innerhalb des Objekts " -#~ "immer sortiert. Die korrekte Reihenfolge ist Modellteil, Negatives " -#~ "Volumen, Modifikator, Stützblocker und Stützverstärker. Wenn deaktiviert, " -#~ "können Sie Modellteile, Negative Volumen und Modifizierer neu anordnen. " -#~ "Allerdings muss eines der Modellteile an erster Stelle stehen." - -#~ msgid "Set settings tabs as menu items (experimental)" -#~ msgstr "Einstellungsregisterkarten als Menüpunkte festlegen (experimentell)" - -#~ msgid "" -#~ "If enabled, Settings Tabs will be placed as menu items. If disabled, old " -#~ "UI will be used." -#~ msgstr "" -#~ "Wenn diese Option aktiviert ist, werden die Registerkarten für die " -#~ "Einstellungen als Menüpunkte platziert. Wenn deaktiviert, wird die alte " -#~ "Benutzeroberfläche verwendet." - -#~ msgid "Show \"Tip of the day\" notification after start" -#~ msgstr "Benachrichtigung \"Tipp des Tages\" nach dem Start anzeigen" - -#~ msgid "If enabled, useful hints are displayed at startup." -#~ msgstr "" -#~ "Wenn diese Option aktiviert ist, werden beim Starten nützliche Hinweise " -#~ "angezeigt." - -#~ msgid "Notify about new releases" -#~ msgstr "Über neue Releases benachrichtigen" - -#~ msgid "" -#~ "You will be notified about new release after startup acordingly: All = " -#~ "Regular release and alpha / beta releases. Release only = regular release." -#~ msgstr "" -#~ "Sie werden nach dem Start entsprechend über neue Versionen " -#~ "benachrichtigt: Alle = Regelmäßige Veröffentlichung und Alpha-/Beta-" -#~ "Versionen. Nur Freigabe = reguläre Freigabe." - -#~ msgid "Release only" -#~ msgstr "Nur Vollversion" - -#~ msgid "Use custom size for toolbar icons" -#~ msgstr "Benutzerdefinierte Größe für Symbolleistensymbole verwenden" - -#~ msgid "If enabled, you can change size of toolbar icons manually." -#~ msgstr "" -#~ "Wenn aktiviert, können Sie die Größe der Symbolleistensymbole manuell " -#~ "ändern." - -#~ msgid "Render" -#~ msgstr "Render" - -#~ msgid "Use environment map" -#~ msgstr "Environment Map verwenden" - -#~ msgid "If enabled, renders object using the environment map." -#~ msgstr "" -#~ "Wenn aktiviert, wird das Objekt mit Hilfe der Environment Map gerendert." - -#~ msgid "Dark mode (experimental)" -#~ msgstr "Dunkler Modus (experimentell)" - -#~ msgid "Enable dark mode" -#~ msgstr "Dunkelmodus aktivieren" - -#~ msgid "" -#~ "If enabled, UI will use Dark mode colors. If disabled, old UI will be " -#~ "used." -#~ msgstr "" -#~ "Wenn aktiviert, verwendet die Benutzeroberfläche die Farben des dunklen " -#~ "Modus. Wenn deaktiviert, wird die alte Benutzeroberfläche verwendet." - -#~ msgid "Use system menu for application" -#~ msgstr "Systemmenü für Anwendung verwenden" - -#~ msgid "" -#~ "If enabled, application will use the standard Windows system menu,\n" -#~ "but on some combination of display scales it can looks ugly. If disabled, " -#~ "old UI will be used." -#~ msgstr "" -#~ "Wenn diese Option aktiviert ist, verwendet die Anwendung das Standard-" -#~ "Windows-Systemmenü,\n" -#~ "aber bei einigen Kombinationen von Bildschirmgrößen kann es hässlich " -#~ "aussehen. Wenn deaktiviert, wird die alte Benutzeroberfläche verwendet." - -#~ msgid "Changes for the critical options" -#~ msgstr "Änderungen bei den kritischen Optionen" - -#~ msgid "" -#~ "Changing some options will trigger application restart.\n" -#~ "You will lose the content of the plater." -#~ msgstr "" -#~ "Das Ändern einiger Optionen führt zu einem Neustart der Anwendung.\n" -#~ "Sie verlieren dann den Inhalt der Plattform." - -#~ msgid "Icon size in a respect to the default size" -#~ msgstr "Symbolgröße in Bezug auf die Standardgröße" - -#~ msgid "Select toolbar icon size in respect to the default one." -#~ msgstr "" -#~ "Wählen Sie die Symbolgröße der Symbolleiste in Bezug auf die " -#~ "Standardgröße." - -#~ msgid "Old regular layout with the tab bar" -#~ msgstr "Altes reguläres Layout mit der Registerleiste" - -#~ msgid "New layout, access via settings button in the top menu" -#~ msgstr "" -#~ "Neues Layout, Zugang über die Schaltfläche Einstellungen im oberen Menü" - -#~ msgid "Settings in non-modal window" -#~ msgstr "Einstellungen im nicht-modalen Fenster" - -#~ msgid "Layout Options" -#~ msgstr "Layout-Optionen" - -#~ msgid "Text colors" -#~ msgstr "Textfarben" - -#~ msgid "Save %s as:" -#~ msgstr "Speichere %s als:" - -#~ msgid "Extrusion width" -#~ msgstr "Extrusionbreite" - -#~ msgid "Vertical shells" -#~ msgstr "Vertikale Konturhüllen" - -#~ msgid "Horizontal shells" -#~ msgstr "Horizontale Konturhüllen" - -#~ msgid "Minimum shell thickness" -#~ msgstr "Minimale Schalenstärke" - -#~ msgid "Raft" -#~ msgstr "Raft" - -#~ msgid "Options for support material and raft" -#~ msgstr "Optionen für Stützmaterial und Raft" - -#~ msgid "Speed for print moves" -#~ msgstr "Geschwindigkeit für Druckbewegungen" - -#~ msgid "Speed for non-print moves" -#~ msgstr "Geschwindigkeit für Bewegungen zwischen den Druckvorgängen" - -#~ msgid "Acceleration control (advanced)" -#~ msgstr "Beschleunigungskontrolle (fortgeschritten)" - -#~ msgid "Autospeed (advanced)" -#~ msgstr "Automatische Geschwindigkeit (fortgeschritten)" - -#~ msgid "Ooze prevention" -#~ msgstr "Vermeidung von Nachsickern (Ooze)" - -#~ msgid "Spiral vase" -#~ msgstr "Spiralvasenmodus" - -#~ msgid "Sequential printing" -#~ msgstr "Sequentielles Drucken" - -#~ msgid "Extruder clearance" -#~ msgstr "Extruder Freiraum" - -#~ msgid "Fuzzy skin (experimental)" -#~ msgstr "Fuzzy skin (experimentell)" - -#~ msgid "Notes" -#~ msgstr "Anmerkungen" - -#~ msgid "Toolchange parameters with single extruder MM printers" -#~ msgstr "Werkzeugwechsel-Parameter für MM-Drucker mit einem Extruder" - -#~ msgid "Ramming settings" -#~ msgstr "Einstellungen für das Rammen" - -#~ msgid "Color Change G-code" -#~ msgstr "G-Code für Farbwechsel" - -#~ msgid "Pause Print G-code" -#~ msgstr "Druckpausen G-Code" - -#~ msgid "Template Custom G-code" -#~ msgstr "Vorlage Benutzerdefinierter G-Code" - -#~ msgid "Maximum feedrates" -#~ msgstr "Maximaler Vorschub" - -#~ msgid "Maximum accelerations" -#~ msgstr "Maximale Beschleunigungen" - -#~ msgid "Jerk limits" -#~ msgstr "Ruck-Begrenzungen" - -#~ msgid "Minimum feedrates" -#~ msgstr "Minimaler Vorschub" - -#~ msgid "Only lift Z" -#~ msgstr "Nur Z anheben" - -#~ msgid "" -#~ "Retraction when tool is disabled (advanced settings for multi-extruder " -#~ "setups)" -#~ msgstr "" -#~ "Einzug, wenn das Werkzeug deaktiviert ist (weiterführende Einstellungen " -#~ "für Multi-Extruder-Einrichtungen)" - -#~ 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 "" -#~ "Die Reinigungsoption ist nicht verfügbar, wenn der Firmware-Einzug " -#~ "verwendet wird.\n" -#~ "\n" -#~ "Soll ich sie ausschalten, um den Firmware-Einzug zu aktivieren?" - -#~ msgid "Firmware Retraction" -#~ msgstr "Firmware Einzug" - -#~ msgid "" -#~ "Machine limits will be emitted to G-code and used to estimate print time." -#~ msgstr "" -#~ "Maschinengrenzen werden im G-Code ausgegeben und zur Schätzung der " -#~ "Druckzeit verwendet." - -#~ msgid "" -#~ "Machine limits will NOT be emitted to G-code, however they will be used " -#~ "to estimate print time, which may therefore not be accurate as the " -#~ "printer may apply a different set of machine limits." -#~ msgstr "" -#~ "Maschinenlimits werden NICHT im G-Code ausgegeben, sie werden jedoch zur " -#~ "Schätzung der Druckzeit verwendet, die daher möglicherweise nicht genau " -#~ "ist, da der Drucker möglicherweise eine andere Reihe von Maschinenlimits " -#~ "anwendet." - -#~ msgid "" -#~ "Machine limits are not set, therefore the print time estimate may not be " -#~ "accurate." -#~ msgstr "" -#~ "Maschinengrenzen sind nicht gesetzt, daher ist die Schätzung der " -#~ "Druckzeit möglicherweise nicht genau." - -#~ msgid "LOCKED LOCK" -#~ msgstr "GESCHLOSSENES SCHLOSS" - -#~ msgid "" -#~ "indicates that the settings are the same as the system (or default) " -#~ "values for the current option group" -#~ msgstr "" -#~ "zeigt an, dass die Einstellungen mit den System- (oder Standard-) Werten " -#~ "für die aktuelle Optionsgruppe übereinstimmen" - -#~ msgid "UNLOCKED LOCK" -#~ msgstr "OFFENES SCHLOSS" - -#~ msgid "" -#~ "indicates that some settings were changed and are not equal to the system " -#~ "(or default) values for the current option group.\n" -#~ "Click the UNLOCKED LOCK icon to reset all settings for current option " -#~ "group to the system (or default) values." -#~ msgstr "" -#~ "zeigt an, dass einige Einstellungen geändert wurden und nicht mit den " -#~ "System- (oder Standard-) Werten für die aktuelle Optionsgruppe " -#~ "übereinstimmen.\n" -#~ "Klicken Sie auf das Symbol GEÖFFNETES SCHLOSS, um alle Einstellungen für " -#~ "die aktuelle Optionsgruppe auf die System- (oder Standard-) Werte " -#~ "zurückzusetzen." - -#~ msgid "WHITE BULLET" -#~ msgstr "WEISSER PUNKT" - -#~ msgid "" -#~ "for the left button: indicates a non-system (or non-default) preset,\n" -#~ "for the right button: indicates that the settings hasn't been modified." -#~ msgstr "" -#~ "Beim linken Knopf: zeigt eine Nicht-System- (oder Nicht-Standard-) " -#~ "Einstellung an.\n" -#~ "Beim rechten Knopf: zeigt an, dass die Einstellung nicht geändert wurde." - -#~ msgid "BACK ARROW" -#~ msgstr "PFEIL ZURÜCK" - -#~ msgid "" -#~ "indicates that the settings were changed and are not equal to the last " -#~ "saved preset for the current option group.\n" -#~ "Click the BACK ARROW icon to reset all settings for the current option " -#~ "group to the last saved preset." -#~ msgstr "" -#~ "zeigt an, dass die Einstellungen geändert wurden und nicht mit dem " -#~ "zuletzt gespeicherten Preset für die aktuelle Optionsgruppe " -#~ "übereinstimmen.\n" -#~ "Klicken Sie auf das Symbol PFEIL ZURÜCK, um alle Einstellungen für die " -#~ "aktuelle Optionsgruppe auf das zuletzt gespeicherte Preset zurückzusetzen." - -#~ msgid "" -#~ "You will not be asked about the unsaved changes the next time you create " -#~ "new project" -#~ msgstr "" -#~ "Wenn Sie das nächste Mal ein neues Projekt erstellen, werden Sie nicht " -#~ "mehr nach den ungespeicherten Änderungen gefragt" - -#~ msgid "" -#~ "You will not be asked about the unsaved changes the next time you switch " -#~ "a preset" -#~ msgstr "" -#~ "Wenn Sie das nächste Mal eine Voreinstellung wechseln, werden Sie nicht " -#~ "nach den nicht gespeicherten Änderungen gefragt." - -#~ msgid "" -#~ "Visit \"Preferences\" and check \"%1%\"\n" -#~ "to be asked about unsaved changes again." -#~ msgstr "" -#~ "Besuchen Sie \"Einstellungen\" und überprüfen Sie \"%1%\",\n" -#~ "um über nicht gespeicherte Änderungen wieder gefragt zu werden." - -#~ msgid "Comment:" -#~ msgstr "Kommentar:" - -#~ msgid "Wipe tower - Purging volume adjustment" -#~ msgstr "Reinigungsturm - Anpassung des Reinigungsvolumens" - -#~ msgid "Expert" -#~ msgstr "Experte" - -#~ msgid "Continue and install configuration updates?" -#~ msgstr "Fortfahren und Konfigurationsupdates installieren?" - -#~ msgid "" -#~ "Only a single object may be printed at a time in Spiral Vase mode. Either " -#~ "remove all but the last object, or enable sequential mode by " -#~ "\"complete_objects\"." -#~ msgstr "" -#~ "Im Modus \"Spiralvase\" darf immer nur ein einziges Objekt gedruckt " -#~ "werden. Entfernen Sie entweder alle bis auf das letzte Objekt, oder " -#~ "aktivieren Sie den sequenziellen Modus durch \"complete_objects\"." - -#~ msgid "" -#~ "The Wipe Tower is currently only supported with the relative extruder " -#~ "addressing (use_relative_e_distances=1)." -#~ msgstr "" -#~ "Der Wischturm wird derzeit nur mit relativer Extruder-Adressierung " -#~ "unterstützt ((use_relative_e_distances=1)." - -#~ msgid "" -#~ "The Wipe Tower currently does not support volumetric E " -#~ "(use_volumetric_e=0)." -#~ msgstr "" -#~ "Der Reinigungsturm unterstützt derzeit kein volumetrisches E " -#~ "(use_volumetric_e=0)." - -#~ msgid "" -#~ "The Wipe Tower is only supported for multiple objects if they are printed " -#~ "with the same support_material_contact_distance" -#~ msgstr "" -#~ "Der Wischturm wird nur für mehrere Objekte unterstützt, wenn diese mit " -#~ "der gleichen support_material_contact_distance gedruckt werden" - -#~ msgid "" -#~ "For the Wipe Tower to work with the soluble supports, the support layers " -#~ "need to be synchronized with the object layers." -#~ msgstr "" -#~ "Damit der Reinigungsturm mit den löslichen Trägermaterialien arbeiten " -#~ "kann, müssen die Stützschichten mit den Objektschichten synchronisiert " -#~ "sein." - -#~ msgid "" -#~ "The Wipe Tower currently supports the non-soluble supports only if they " -#~ "are printed with the current extruder without triggering a tool change. " -#~ "(both support_material_extruder and support_material_interface_extruder " -#~ "need to be set to 0)." -#~ msgstr "" -#~ "Der Reinigungsturm unterstützt zur Zeit nichtlösliche Stützen nur, falls " -#~ "sie mit dem aktuellen Extruder ohne einen Werkzeugwechsel gedruckt werden " -#~ "(sowohl support_material_extruder wie auch " -#~ "support_material_interface_extruder müssen auf null gesetzt werden)." - -#~ msgid "Failed processing of the output_filename_format template." -#~ msgstr "" -#~ "Die Verarbeitung der output_filename_format Vorlage ist fehlgeschlagen." - -#~ msgid "Bed shape" -#~ msgstr "Druckbettkontur" - -#~ msgid "Bed custom texture" -#~ msgstr "Druckbett individuelle Textur" - -#~ msgid "Bed custom model" -#~ msgstr "Druckbett individuelles Modell" - -#~ msgid "Max print height" -#~ msgstr "Max. Druckhöhe" - -#~ msgid "Avoid crossing perimeters" -#~ msgstr "Kreuzen der Kontur vermeiden" - -#~ msgid "Avoid crossing perimeters - Max detour length" -#~ msgstr "Kreuzen von Perimetern Vermeiden - Maximale Umleitungslänge" - -#~ msgid "mm or % (zero to disable)" -#~ msgstr "mm oder % (Null zum Deaktivieren)" - -#~ msgid "" -#~ "This code is inserted between objects when using sequential printing. By " -#~ "default extruder and bed temperature are reset using non-wait command; " -#~ "however if M104, M109, M140 or M190 are detected in this custom code, " -#~ "Slic3r will not add temperature commands. Note that you can use " -#~ "placeholder variables for all Slic3r settings, so you can put a \"M109 " -#~ "S[first_layer_temperature]\" command wherever you want." -#~ msgstr "" -#~ "Dieser Code wird beim sequentiellen Drucken zwischen Objekten eingefügt. " -#~ "Standardmäßig werden Extruder- und Betttemperatur mit dem Befehl, der " -#~ "nicht auf die Änderung wartet, zurückgesetzt. Wenn jedoch M104, M109, " -#~ "M140 oder M190 in diesem benutzerdefinierten Code erkannt werden, fügt " -#~ "Slic3r keine Temperaturbefehle hinzu. Beachten Sie, dass Sie " -#~ "Platzhaltervariablen für alle PrusaSlicer-Einstellungen verwenden können, " -#~ "so dass Sie einen \"M109 S[first_layer_temperature]\"-Befehl an " -#~ "beliebiger Stelle platzieren können." - -#~ msgid "" -#~ "The number of bottom solid layers is increased above bottom_solid_layers " -#~ "if necessary to satisfy minimum thickness of bottom shell." -#~ msgstr "" -#~ "Die Anzahl der unteren Massivschichten wird über bottom_solid_layers " -#~ "erhöht, wenn es notwendig ist, um die Mindeststärke der Bodenschale zu " -#~ "erfüllen." - -#~ msgid "" -#~ "This is the acceleration your printer will use for bridges. Set zero to " -#~ "disable acceleration control for bridges." -#~ msgstr "" -#~ "Die Beschleunigung, die Ihr Drucker für Brücken verwendet. Setzen Sie " -#~ "dies auf null, um die Beschleunigungskontrolle bei Brücken zu " -#~ "deaktivieren." - -#~ msgid "Bridging angle" -#~ msgstr "Überbrückungswinkel" - -#~ msgid "" -#~ "Bridging angle override. If left to zero, the bridging angle will be " -#~ "calculated automatically. Otherwise the provided angle will be used for " -#~ "all bridges. Use 180° for zero angle." -#~ msgstr "" -#~ "Überbrückungswinkel Übersteuerung. Wird der Wert auf null gesetzt, wird " -#~ "der Überbrückungswinkel automatisch berechnet. Andernfalls wird der " -#~ "angegebene Winkel für alle Brücken verwendet. Verwenden Sie 180° für den " -#~ "Nullwinkel." - -#~ msgid "Bridge flow ratio" -#~ msgstr "Brückenflussverhältnis" - -#~ msgid "Brim separation gap" -#~ msgstr "Rand Trennungsspalt" - -#~ msgid "Clip multi-part objects" -#~ msgstr "Beschneiden von Objekten aus mehreren Teilen" - -#~ msgid "" -#~ "When printing multi-material objects, this settings will make Slic3r to " -#~ "clip the overlapping object parts one by the other (2nd part will be " -#~ "clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -#~ msgstr "" -#~ "Wenn Multi-Material-Objekte gedruckt werden, wird Slic3r mit diesen " -#~ "Einstellungen einen überlappenden Teil des Objekts durch den anderen " -#~ "einschränken (zweiter Teil wird durch den ersten Teil eingeschränkt, " -#~ "dritter Teil wird durch den ersten und zweiten eingeschränkt usw.)." - -#~ msgid "Colorprint height" -#~ msgstr "Colorprint Höhe" - -#~ msgid "Heights at which a filament change is to occur." -#~ msgstr "Höhen, bei denen eine Filamentwechsel stattfinden soll." - -#~ msgid "Complete individual objects" -#~ msgstr "Objekte nacheinander drucken" - -#~ msgid "" -#~ "When printing multiple objects or copies, this feature will complete each " -#~ "object before moving onto next one (and starting it from its bottom " -#~ "layer). This feature is useful to avoid the risk of ruined prints. Slic3r " -#~ "should warn and prevent you from extruder collisions, but beware." -#~ msgstr "" -#~ "Wenn mehrere Objekte oder Kopien gedruckt werden, wird bei dieser " -#~ "Einstellung jedes Objekt vollständig gedruckt, bevor das nächste " -#~ "(angefangen mit der Bodenschicht) begonnen wird. Diese Einstellung ist " -#~ "nützlich, um Fehldrucke zu vermeiden. PrusaSlicer sollte vor " -#~ "Extruderkollisionen warnen und diese verhindern, aber seien Sie trotzdem " -#~ "aufmerksam." - -#~ msgid "Cooling tube position" -#~ msgstr "Position des Kühlschlauchs" - -#~ msgid "" -#~ "Distance of the center-point of the cooling tube from the extruder tip." -#~ msgstr "Abstand des Mittelpunktes des Kühlrohres von der Extruderspitze." - -#~ msgid "Cooling tube length" -#~ msgstr "Länge des Kühlschlauchs" - -#~ msgid "" -#~ "Length of the cooling tube to limit space for cooling moves inside it." -#~ msgstr "" -#~ "Länge des Kühlschlauchs, um den Raum für Kühlbewegungen im Inneren zu " -#~ "begrenzen." - -#~ msgid "Ensure vertical shell thickness" -#~ msgstr "Stelle die vertikale Hüllenstärke sicher" - -#~ msgid "" -#~ "Add solid infill near sloping surfaces to guarantee the vertical shell " -#~ "thickness (top+bottom solid layers)." -#~ msgstr "" -#~ "Fügen Sie massives Infill in der Nähe von schrägen Flächen hinzu, um die " -#~ "vertikale Schalenstärke zu gewährleisten (obere und untere massive " -#~ "Schichten)." - -#~ msgid "Top fill pattern" -#~ msgstr "Deckenfüllmuster" - -#~ msgid "Bottom fill pattern" -#~ msgstr "Bodenfüllmuster" - -#~ msgid "External perimeters" -#~ msgstr "Außenkonturen" - -#~ msgid "External perimeters first" -#~ msgstr "Außenkonturen zuerst drucken" - -#~ msgid "" -#~ "Print contour perimeters from the outermost one to the innermost one " -#~ "instead of the default inverse order." -#~ msgstr "" -#~ "Drucken Sie Konturumfänge von der äußersten zur innersten Kontur anstatt " -#~ "der standardmäßigen umgekehrten Reihenfolge." - -#~ msgid "Extrusion axis" -#~ msgstr "Extrusionsachse" - -#~ msgid "" -#~ "Use this option to set the axis letter associated to your printer's " -#~ "extruder (usually E but some printers use A)." -#~ msgstr "" -#~ "Verwenden Sie diese Einstellung, um den Buchstaben der Achse anzugeben, " -#~ "die mit Ihrem Extruder verknüpft ist (normalerweise E, aber bei manchen " -#~ "Druckern ist dies A)." - -#~ msgid "Default extrusion width" -#~ msgstr "Standardextrusionsbreite" - -#~ msgid "approximate seconds" -#~ msgstr "ungefähre Sekunden" - -#~ msgid "Filament notes" -#~ msgstr "Filament Bemerkungen" - -#~ msgid "You can put your notes regarding the filament here." -#~ msgstr "Sie können Ihre Notizen zum Filament hier eingeben." - -#~ msgid "Loading speed" -#~ msgstr "Ladegeschwindigkeit" - -#~ msgid "Speed used for loading the filament on the wipe tower." -#~ msgstr "" -#~ "Geschwindigkeit, mit der Filament auf dem Reinigungsturm geladen wird." - -#~ msgid "Loading speed at the start" -#~ msgstr "Ladegeschwindigkeit zu Beginn" - -#~ msgid "Speed used at the very beginning of loading phase." -#~ msgstr "Geschwindigkeit, die zu Beginn der Ladephase verwendet wird." - -#~ msgid "Unloading speed" -#~ msgstr "Entladegeschwindigkeit" - -#~ msgid "" -#~ "Speed used for unloading the filament on the wipe tower (does not affect " -#~ "initial part of unloading just after ramming)." -#~ msgstr "" -#~ "Geschwindigkeit, mit der Filament auf dem Reinigungsturm entladen wird " -#~ "(betrifft nicht den ersten Teil des Entladens direkt nach dem Rammen)." - -#~ msgid "Unloading speed at the start" -#~ msgstr "Entladegeschwindigkeit zu Beginn" - -#~ msgid "" -#~ "Speed used for unloading the tip of the filament immediately after " -#~ "ramming." -#~ msgstr "" -#~ "Geschwindigkeit, mit der die Spitze des Filaments unmittelbar nach dem " -#~ "Rammen entladen wird." - -#~ msgid "Delay after unloading" -#~ msgstr "Verzögerung nach dem Entladen" - -#~ msgid "" -#~ "Time to wait after the filament is unloaded. May help to get reliable " -#~ "toolchanges with flexible materials that may need more time to shrink to " -#~ "original dimensions." -#~ msgstr "" -#~ "Wartezeit, nachdem das Filament entladen wurde. Dies kann zu " -#~ "zuverlässigeren Werkzeugwechseln beitragen bei flexiblen Materialien, die " -#~ "mehr Zeit zum Schrumpfen auf ihre ursprüngliche Größe brauchen." - -#~ msgid "Number of cooling moves" -#~ msgstr "Anzahl der Kühlbewegungen" - -#~ msgid "" -#~ "Filament is cooled by being moved back and forth in the cooling tubes. " -#~ "Specify desired number of these moves." -#~ msgstr "" -#~ "Das Filament wird durch Hin- und Herbewegen in den Kühlschläuchen " -#~ "abgekühlt. Geben Sie die gewünschte Anzahl dieser Bewegungen an." - -#~ msgid "Speed of the first cooling move" -#~ msgstr "Geschwindigkeit der ersten Kühlbewegung" - -#~ msgid "Cooling moves are gradually accelerating beginning at this speed." -#~ msgstr "Kühlbewegungen beschleunigen von dieser Anfangsgeschwindigkeit aus." - -#~ msgid "Speed of the last cooling move" -#~ msgstr "Geschwindigkeit der letzten Kühlbewegung" - -#~ msgid "Cooling moves are gradually accelerating towards this speed." -#~ msgstr "Kühlbewegungen beschleunigen auf diese Geschwindigkeit hin." - -#~ msgid "" -#~ "Time for the printer firmware (or the Multi Material Unit 2.0) to load a " -#~ "new filament during a tool change (when executing the T code). This time " -#~ "is added to the total print time by the G-code time estimator." -#~ msgstr "" -#~ "Zeit, in der die Druckerfirmware (oder die Multi-Material-Einheit 2.0) " -#~ "während eines Werkzeugwechsels (bei Ausführung des T-Codes) ein anderes " -#~ "Filament lädt. Diese Zeit wird vom G-Code Zeitschätzer zur " -#~ "Gesamtdruckzeit addiert." - -#~ msgid "Ramming parameters" -#~ msgstr "Rammparameter" - -#~ msgid "" -#~ "This string is edited by RammingDialog and contains ramming specific " -#~ "parameters." -#~ msgstr "" -#~ "Diese Zeichenfolge wird vom RammDialog angepasst und enthält für das " -#~ "Rammen spezifische Parameter." - -#~ msgid "" -#~ "Time for the printer firmware (or the Multi Material Unit 2.0) to unload " -#~ "a filament during a tool change (when executing the T code). This time is " -#~ "added to the total print time by the G-code time estimator." -#~ msgstr "" -#~ "Zeit, in der die Druckerfirmware (oder die Multi-Material-Einheit 2.0) " -#~ "während eines Werkzeugwechsels (bei Ausführung des T-Codes) ein Filament " -#~ "entlädt. Diese Zeit wird vom G-Code Zeitschätzer zur Gesamtdruckzeit " -#~ "addiert." - -#~ msgid "Filament type" -#~ msgstr "Filament Typ" - -#~ msgid "Spool weight" -#~ msgstr "Gewicht der Spule" - -#~ msgid "" -#~ "Enter weight of the empty filament spool. One may weigh a partially " -#~ "consumed filament spool before printing and one may compare the measured " -#~ "weight with the calculated weight of the filament with the spool to find " -#~ "out whether the amount of filament on the spool is sufficient to finish " -#~ "the print." -#~ msgstr "" -#~ "Gewicht der leeren Filament-Spule eingeben. Man kann eine teilweise " -#~ "verbrauchte Filament-Spule vor dem Drucken wiegen und das gemessene " -#~ "Gewicht mit dem berechneten Gewicht des Filaments mit der Spule " -#~ "vergleichen, um herauszufinden, ob die Menge des Filaments auf der Spule " -#~ "ausreicht, um den Druck zu beenden." - -#~ msgid "g" -#~ msgstr "g" - -#~ msgid "Fill angle" -#~ msgstr "Füllwinkel" - -#~ msgid "Fill density" -#~ msgstr "Fülldichte" - -#~ msgid "Fill pattern" -#~ msgstr "Füllmuster" - -#~ msgid "First layer speed" -#~ msgstr "Druckgeschwindigkeit der ersten Schicht" - -#~ msgid "Speed of object first layer over raft interface" -#~ msgstr "" -#~ "Geschwindigkeit der ersten Schicht des Objekts über der Oberfläche des " -#~ "Rafts" - -#~ msgid "" -#~ "If expressed as absolute value in mm/s, this speed will be applied to all " -#~ "the print moves of the first object layer above raft interface, " -#~ "regardless of their type. If expressed as a percentage (for example: 40%) " -#~ "it will scale the default speeds." -#~ msgstr "" -#~ "Als absoluter Wert in mm/s ausgedrückt, wird diese Geschwindigkeit auf " -#~ "alle Druckbewegungen der ersten Objektschicht über der Raft-Schnittstelle " -#~ "angewendet, unabhängig von deren Typ. Wird sie als Prozentsatz " -#~ "ausgedrückt (z. B. 40 %), so werden die Standardgeschwindigkeiten " -#~ "skaliert." - -#~ msgid "" -#~ "Fan speed will be ramped up linearly from zero at layer " -#~ "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer" -#~ "\". \"full_fan_speed_layer\" will be ignored if lower than " -#~ "\"disable_fan_first_layers\", in which case the fan will be running at " -#~ "maximum allowed speed at layer \"disable_fan_first_layers\" + 1." -#~ msgstr "" -#~ "Die Lüfterdrehzahl wird linear von Null bei der Schicht " -#~ "\"disable_fan_first_layers\" bis zum Maximum bei der Schicht " -#~ "\"full_fan_speed_layer\" hochgefahren. \"full_fan_speed_layer\" wird " -#~ "ignoriert, wenn sie niedriger ist als \"disable_fan_first_layers\", in " -#~ "diesem Fall läuft der Lüfter mit der maximal zulässigen Drehzahl auf " -#~ "Schicht \"disable_fan_first_layers\" + 1." - -#~ msgid "Verbose G-code" -#~ msgstr "Ausführlicher G-Code" - -#~ msgid "" -#~ "Enable this to get a commented G-code file, with each line explained by a " -#~ "descriptive text. If you print from SD card, the additional weight of the " -#~ "file could make your firmware slow down." -#~ msgstr "" -#~ "Aktivieren Sie diese Option, um eine kommentierte G-Code-Datei zu " -#~ "erhalten, wobei jede Zeile durch einen beschreibenden Text erklärt wird. " -#~ "Wenn Sie von einer SD-Karte drucken, kann die zusätzliche Dateigröße dazu " -#~ "führen, dass Ihre Firmware langsamer wird." - -#~ msgid "High extruder current on filament swap" -#~ msgstr "Hohe Extruderstromstärke beim Filamentwechsel" - -#~ msgid "" -#~ "It may be beneficial to increase the extruder motor current during the " -#~ "filament exchange sequence to allow for rapid ramming feed rates and to " -#~ "overcome resistance when loading a filament with an ugly shaped tip." -#~ msgstr "" -#~ "Es kann vorteilhaft sein, den Extrudermotorstrom während des " -#~ "Filamentwechselvorgangs zu erhöhen, um schnelle Rammvorschübe zu " -#~ "ermöglichen und den Widerstand beim Laden eines Filaments mit einer " -#~ "ungünstig geformten Spitze zu überwinden." - -#~ msgid "" -#~ "This is the acceleration your printer will use for infill. Set zero to " -#~ "disable acceleration control for infill." -#~ msgstr "" -#~ "Diese Stellung bestimmt die Beschleunigung des Druckers für Infill. " -#~ "Setzen Sie dies auf null, um die Beschleunigungskontrolle für das Infill " -#~ "zu deaktivieren." - -#~ msgid "Infill before perimeters" -#~ msgstr "Infill vor Kontur" - -#~ msgid "" -#~ "This option will switch the print order of perimeters and infill, making " -#~ "the latter first." -#~ msgstr "" -#~ "Diese Einstellungen kehrt die Druckreihenfolge von Außenkonturen und " -#~ "Infill um, sodass der Infill zuerst gedruckt wird." - -#~ msgid "" -#~ "This option will limit infill to the areas actually needed for supporting " -#~ "ceilings (it will act as internal support material). If enabled, slows " -#~ "down the G-code generation due to the multiple checks involved." -#~ msgstr "" -#~ "Diese Einstellung beschränkt den Infill auf die Bereiche, die tatsächlich " -#~ "für das Stützen von Decken benötigt werden (der Infill dient hier als " -#~ "internes Stützmaterial). Falls aktiviert, kann dies die Erstellung des G-" -#~ "Codes wegen zusätzlichen Kontrollschritten verlangsamen." - -#~ msgid "Infill/perimeters overlap" -#~ msgstr "Infill/Kontur Überlappung" - -#~ msgid "Enable ironing" -#~ msgstr "Bügeln aktivieren" - -#~ msgid "" -#~ "Enable ironing of the top layers with the hot print head for smooth " -#~ "surface" -#~ msgstr "" -#~ "Ermöglicht das Bügeln der oberen Schichten mit dem heißen Druckkopf für " -#~ "eine glatte Oberfläche" - -#~ msgid "Flow rate" -#~ msgstr "Flussrate" - -#~ msgid "Spacing between ironing passes" -#~ msgstr "Abstand zwischen Bügelwegen" - -#~ msgid "Supports remaining times" -#~ msgstr "Unterstützt Restzeit" - -#~ msgid "How to apply limits" -#~ msgstr "Wie man Grenzen anwendet" - -#~ msgid "Purpose of Machine Limits" -#~ msgstr "Zweck der Maschinengrenzen" - -#~ msgid "How to apply the Machine Limits" -#~ msgstr "Wie man Maschinengrenzen anwendet" - -#~ msgid "Emit to G-code" -#~ msgstr "In G-Code ausgeben" - -#~ msgid "Use for time estimate" -#~ msgstr "Zur Zeitschätzung verwenden" - -#~ msgid "Ignore" -#~ msgstr "Ignorieren" - -#~ msgid "Maximum feedrate X" -#~ msgstr "Maximaler Vorschub X" - -#~ msgid "Maximum feedrate Y" -#~ msgstr "Maximaler Vorschub Y" - -#~ msgid "Maximum feedrate Z" -#~ msgstr "Maximaler Vorschub Z" - -#~ msgid "Maximum feedrate E" -#~ msgstr "Maximaler Vorschub E" - -#~ msgid "Maximum feedrate of the X axis" -#~ msgstr "Maximaler Vorschub auf der X-Achse" - -#~ msgid "Maximum feedrate of the Y axis" -#~ msgstr "Maximaler Vorschub auf der Y-Achse" - -#~ msgid "Maximum feedrate of the Z axis" -#~ msgstr "Maximaler Vorschub auf der Z-Achse" - -#~ msgid "Maximum feedrate of the E axis" -#~ msgstr "Maximaler Vorschub auf der E-Achse" - -#~ msgid "Minimal filament extrusion length" -#~ msgstr "Minimale Filament Extrusionlänge" - -#~ msgid "" -#~ "Generate no less than the number of skirt loops required to consume the " -#~ "specified amount of filament on the bottom layer. For multi-extruder " -#~ "machines, this minimum applies to each extruder." -#~ msgstr "" -#~ "Erzeugt nicht weniger als die Anzahl der Schürzenschleifen, die benötigt " -#~ "wird, um die angegebene Menge an Filament auf der unteren Schicht zu " -#~ "verbrauchen. Bei Multiextruder-Maschinen gilt dieses Minimum für jeden " -#~ "Extruder." - -#~ msgid "Configuration notes" -#~ msgstr "Konfigurationsnotizen" - -#~ msgid "" -#~ "You can put here your personal notes. This text will be added to the G-" -#~ "code header comments." -#~ msgstr "" -#~ "Sie können hier Ihre persönlichen Notizen eingeben. Der Text wird dem " -#~ "Header vom G-Code hinzugefügt." - -#~ msgid "Host Type" -#~ msgstr "Host Typ" - -#~ msgid "" -#~ "Slic3r can upload G-code files to a printer host. This field must contain " -#~ "the kind of the host." -#~ msgstr "" -#~ "PrusaSlicer kann G-Code Dateien auf einen Drucker-Host hochladen. Dieses " -#~ "Feld sollte den Typ des Hosts enthalten." - -#~ msgid "Only retract when crossing perimeters" -#~ msgstr "Nur bei Umfangsüberquerungen einziehen" - -#~ msgid "Output filename format" -#~ msgstr "Ausgabe Dateinamen Format" - -#~ msgid "" -#~ "You can use all configuration options as variables inside this template. " -#~ "For example: [layer_height], [fill_density] etc. You can also use " -#~ "[timestamp], [year], [month], [day], [hour], [minute], [second], " -#~ "[version], [input_filename], [input_filename_base]." -#~ msgstr "" -#~ "Sie können alle Konfigurationsoptionen als Variablen in dieser Vorlage " -#~ "benutzen. Zum Beispiel: [layer_height], [fill_density] usw. Sie können " -#~ "auch [timestamp], [year], [month], [day], [hour], [minute], [second], " -#~ "[version], [input_filename], und [input_filename_base] benutzen." - -#~ msgid "Detect bridging perimeters" -#~ msgstr "Umfangbrücken entdecken" - -#~ msgid "Filament parking position" -#~ msgstr "Filament Parkposition" - -#~ msgid "" -#~ "Distance of the extruder tip from the position where the filament is " -#~ "parked when unloaded. This should match the value in printer firmware." -#~ msgstr "" -#~ "Abstand der Extruderspitze von der Position, an der das Filament beim " -#~ "Entladen abgestellt wird. Dies sollte mit dem Wert in der Drucker-" -#~ "Firmware übereinstimmen." - -#~ msgid "Extra loading distance" -#~ msgstr "Zusätzliche Ladestrecke" - -#~ msgid "" -#~ "When set to zero, the distance the filament is moved from parking " -#~ "position during load is exactly the same as it was moved back during " -#~ "unload. When positive, it is loaded further, if negative, the loading " -#~ "move is shorter than unloading." -#~ msgstr "" -#~ "Wenn auf null gesetzt, ist der Weg, den das Filament während der Beladung " -#~ "aus der Parkposition zurücklegt, genau der gleiche wie beim Entladen. Im " -#~ "positiven Fall wird sie weiter geladen, im negativen Fall ist die " -#~ "Ladebewegung kürzer als die Entladung." - -#~ msgid "Perimeters" -#~ msgstr "Konturen" - -#~ msgid "" -#~ "This is the acceleration your printer will use for perimeters. Set zero " -#~ "to disable acceleration control for perimeters." -#~ msgstr "" -#~ "Dies ist die Beschleunigung, die Ihr Drucker für Perimeter verwendet. " -#~ "Setzen Sie Null, um die Beschleunigungssteuerung für Perimeter zu " -#~ "deaktivieren." - -#~ msgid "Printer notes" -#~ msgstr "Drucker Anmerkungen" - -#~ msgid "You can put your notes regarding the printer here." -#~ msgstr "Sie können Ihre Bemerkungen zum Drucker hier eingeben." - -#~ msgid "Printer vendor" -#~ msgstr "Druckerhersteller" - -#~ msgid "Name of the printer vendor." -#~ msgstr "Name des Druckerherstellers." - -#~ msgid "Slice resolution" -#~ msgstr "Slice Auflösung" - -#~ msgid "" -#~ "Minimum detail resolution, used to simplify the input file for speeding " -#~ "up the slicing job and reducing memory usage. High-resolution models " -#~ "often carry more detail than printers can render. Set to zero to disable " -#~ "any simplification and use full resolution from input." -#~ msgstr "" -#~ "Minimale Detailauflösung, die verwendet wird, um die Eingabedatei zu " -#~ "vereinfachen, um den Slicingjob zu beschleunigen und den " -#~ "Speicherverbrauch zu reduzieren. Hochauflösende Modelle weisen oft mehr " -#~ "Details auf, als der Drucker wiedergeben kann. Setzen Sie den Wert auf " -#~ "Null, um die Vereinfachung zu deaktivieren und die volle Auflösung des " -#~ "Eingangsdatei zu verwenden." - -#~ msgid "G-code resolution" -#~ msgstr "G-Code Auflösung" - -#~ msgid "Above Z" -#~ msgstr "Über Z" - -#~ msgid "Only lift Z above" -#~ msgstr "Z nur Anheben über" - -#~ msgid "" -#~ "If you set this to a positive value, Z lift will only take place above " -#~ "the specified absolute Z. You can tune this setting for skipping lift on " -#~ "the first layers." -#~ msgstr "" -#~ "Wenn Sie diesen Wert auf einen positiven Wert setzen, erfolgt der Z-Hub " -#~ "nur oberhalb des angegebenen absoluten Z-Wertes. Sie können diese " -#~ "Einstellung für das Auslassen von Z-Hüben auf den ersten Ebenen " -#~ "einstellen." - -#~ msgid "Below Z" -#~ msgstr "Unter Z" - -#~ msgid "Only lift Z below" -#~ msgstr "Z anheben nur unter" - -#~ msgid "" -#~ "If you set this to a positive value, Z lift will only take place below " -#~ "the specified absolute Z. You can tune this setting for limiting lift to " -#~ "the first layers." -#~ msgstr "" -#~ "Wenn Sie diesen Wert auf einen positiven Wert setzen, erfolgt der Z-Hub " -#~ "nur unterhalb des angegebenen absoluten Z-Wertes. Sie können diese " -#~ "Einstellung so einstellen, dass der Z-Hub auf die ersten Lagen begrenzt " -#~ "wird." - -#~ msgid "Distance from brim/object" -#~ msgstr "Abstand vom Rand/Objekt" - -#~ msgid "Loops (minimum)" -#~ msgstr "Schleifen (minimal)" - -#~ msgid "Solid infill threshold area" -#~ msgstr "Massives Infill Flächen Schwellwert" - -#~ msgid "Solid infill every" -#~ msgstr "Massives Infill alle" - -#~ msgid "" -#~ "This feature allows to force a solid layer every given number of layers. " -#~ "Zero to disable. You can set this to any value (for example 9999); Slic3r " -#~ "will automatically choose the maximum possible number of layers to " -#~ "combine according to nozzle diameter and layer height." -#~ msgstr "" -#~ "Diese Einstellung erzwingt eine massive Schicht nach einer vorgegebenen " -#~ "Anzahl von Schichten. Null deaktiviert diese Einstellung. Sie können " -#~ "jeden Wert eingeben (z.B. 9999); PrusaSlicer wird automatisch die " -#~ "größtmögliche Anzahl von Schichten wählen, die in Abhängigkeit von " -#~ "Düsendurchmesser und Schichthöhe kombiniert werden können." - -#~ msgid "Color change G-code" -#~ msgstr "G-Code für Farbwechsel" - -#~ msgid "This G-code will be used as a code for the color change" -#~ msgstr "Dieser G-Code wird als Code für den Farbwechsel verwendet" - -#~ msgid "This G-code will be used as a code for the pause print" -#~ msgstr "Dieser G-Code wird als Code für die Druckpause verwendet" - -#~ msgid "This G-code will be used as a custom code" -#~ msgstr "Dieser G-Code wird als benutzerdefinierter Code verwendet" - -#~ msgid "Top contact Z distance" -#~ msgstr "Decke Kontakt Z Abstand" - -#~ msgid "" -#~ "The vertical distance between object and support material interface. " -#~ "Setting this to 0 will also prevent Slic3r from using bridge flow and " -#~ "speed for the first object layer." -#~ msgstr "" -#~ "Der vertikale Abstand zwischen Objekt und Trägermaterialschnittstelle. " -#~ "Wenn Sie diesen Wert auf 0 setzen, wird PrusaSlicer auch verhindern, dass " -#~ "Bridge-Flow und -Geschwindigkeit für die erste Objektschicht verwendet " -#~ "werden." - -#~ msgid "" -#~ "The vertical distance between the object top surface and the support " -#~ "material interface. If set to zero, support_material_contact_distance " -#~ "will be used for both top and bottom contact Z distances." -#~ msgstr "" -#~ "Der vertikale Abstand zwischen der Oberseite des Objekts und der " -#~ "Schnittstelle des Trägermaterials. Wenn er auf Null gesetzt ist, wird " -#~ "support_material_contact_distance sowohl für den oberen als auch für den " -#~ "unteren Z-Abstand verwendet." - -#~ msgid "" -#~ "Number of interface layers to insert between the object(s) and support " -#~ "material. Set to -1 to use support_material_interface_layers" -#~ msgstr "" -#~ "Anzahl der Schnittstellenschichten, die zwischen Objekt(en) und " -#~ "Trägermaterial eingefügt werden. Auf -1 gesetzt, um " -#~ "support_material_interface_layers zu verwenden" - -#~ msgid "Pattern" -#~ msgstr "Muster" - -#~ msgid "Pattern spacing" -#~ msgstr "Muster Abstand" - -#~ msgid "Synchronize with object layers" -#~ msgstr "Mit Objektschichten synchronisieren" - -#~ msgid "" -#~ "Synchronize support layers with the object print layers. This is useful " -#~ "with multi-material printers, where the extruder switch is expensive." -#~ msgstr "" -#~ "Stützschichten mit den Druckschichten des Objekts synchronisieren. Dies " -#~ "ist nützlich bei Multi-Material-Druckern, bei denen der Wechsel des " -#~ "Extruders kostenaufwendig ist." - -#~ msgid "Overhang threshold" -#~ msgstr "Überhangsschwellwert" - -#~ msgid "Detect thin walls" -#~ msgstr "Dünne Wände erkennen" - -#~ msgid "Threads" -#~ msgstr "Threads" - -#~ msgid "" -#~ "Threads are used to parallelize long-running tasks. Optimal threads " -#~ "number is slightly above the number of available cores/processors." -#~ msgstr "" -#~ "Threads werden benutzt, um mehrere zeitaufwendige Berechnungen " -#~ "gleichzeitig auszuführen. Die optimale Anzahl beträgt etwas mehr als die " -#~ "Anzahl der verfügbaren Kerne/Prozessoren." - -#~ msgid "" -#~ "The number of top solid layers is increased above top_solid_layers if " -#~ "necessary to satisfy minimum thickness of top shell. This is useful to " -#~ "prevent pillowing effect when printing with variable layer height." -#~ msgstr "" -#~ "Die Anzahl der obersten Massivschichten wird über top_solid_layers " -#~ "erhöht, wenn es notwendig ist, um die Mindeststärke der Oberschale zu " -#~ "erfüllen. Dies ist nützlich, um einen Kisseneffekt beim Drucken mit " -#~ "variabler Lagenhöhe zu verhindern." - -#~ msgid "Use firmware retraction" -#~ msgstr "Firmware-Einzug aktivieren" - -#~ msgid "" -#~ "This experimental setting uses G10 and G11 commands to have the firmware " -#~ "handle the retraction. This is only supported in recent Marlin." -#~ msgstr "" -#~ "Diese experimentelle Einstellung benutzt G10 und G11 Befehle, damit die " -#~ "Druckerfirmware den Einzug übernimmt. Dies wird nur von neueren Marlin-" -#~ "Versionen unterstützt." - -#~ msgid "Use relative E distances" -#~ msgstr "Relative Abstände für Extrusion benutzen" - -#~ msgid "" -#~ "If your firmware requires relative E values, check this, otherwise leave " -#~ "it unchecked. Most firmwares use absolute values." -#~ msgstr "" -#~ "Wenn Ihre Firmware relative E-Werte benötigt, diese Option aktivieren, " -#~ "ansonsten lassen Sie sie unmarkiert. Die meisten Firmwares verwenden " -#~ "absolute Werte." - -#~ msgid "Use volumetric E" -#~ msgstr "Volumetrisches E benutzen" - -#~ msgid "" -#~ "This experimental setting uses outputs the E values in cubic millimeters " -#~ "instead of linear millimeters. If your firmware doesn't already know " -#~ "filament diameter(s), you can put commands like 'M200 " -#~ "D[filament_diameter_0] T0' in your start G-code in order to turn " -#~ "volumetric mode on and use the filament diameter associated to the " -#~ "filament selected in Slic3r. This is only supported in recent Marlin." -#~ msgstr "" -#~ "Diese experimentelle Einstellung generiert E-Koordinaten in " -#~ "Kubikmillimetern stat in linearen Millimetern. Wenn die Firmware den " -#~ "Filamentdurchmesser noch nicht kennt, können Sie Befehle wie 'M200 " -#~ "D[filament_diameter_0] T0' in den Start-G-Code eingeben, um den " -#~ "volumetrischen Modus zu aktivieren und den in PrusaSlicer angegebenen " -#~ "Filamentdurchmesser zu benutzen. Dies wird nur von neueren Marlin-" -#~ "Versionen unterstützt." - -#~ msgid "Enable variable layer height feature" -#~ msgstr "Variable Schichthöhen aktivieren" - -#~ msgid "" -#~ "Some printers or printer setups may have difficulties printing with a " -#~ "variable layer height. Enabled by default." -#~ msgstr "" -#~ "Mit einigen Druckern oder Druckerkonfigurationen ist es schwierig, mit " -#~ "einer variablen Schichthöhe zu drucken. Standardmäßig aktiviert." - -#~ msgid "XY Size Compensation" -#~ msgstr "XY-Größenausgleich" +#~ "Do you want to synchronize your personal data from Bambu Cloud? \n" +#~ "Contains the following information:\n" +#~ "1. Process presets\n" +#~ "2. Filament presets\n" +#~ "3. Printer presets\n" #~ msgid "" -#~ "The object will be grown/shrunk in the XY plane by the configured value " -#~ "(negative = inwards, positive = outwards). This might be useful for fine-" -#~ "tuning hole sizes." +#~ "Don't retract when the travel is in infill area absolutely. That means " +#~ "the oozing can't been seen" #~ msgstr "" -#~ "Das Objekt wird in der XY-Ebene um den konfigurierten Wert (negativ = " -#~ "einwärts, positiv = auswärts) vergrößert/verkleinert. Dies kann bei der " -#~ "Feinabstimmung von Lochgrößen hilfreich sein." +#~ "Ziehen Sie nicht zurück, wenn sich der Weg im Füllbereich befindet. Das " +#~ "bedeutet, dass man die Quellung nicht sehen kann" -#~ msgid "SLA print material notes" -#~ msgstr "SLA Druckmaterial-Anmerkungen" +#~ msgid "Fix model locally" +#~ msgstr "Modell lokal reparieren" -#~ msgid "You can put your notes regarding the SLA print material here." -#~ msgstr "Sie können Ihre Notizen zum SLA Druckmaterial hier eingeben." - -#~ msgid "Export OBJ" -#~ msgstr "Exportiere OBJ" - -#~ msgid "Export the model(s) as OBJ." -#~ msgstr "Exportiert das/die Modell(e) als OBJ Datei." - -#~ msgid "Export SLA" -#~ msgstr "Exportiere SLA" - -#~ msgid "Slice the model and export SLA printing layers as PNG." -#~ msgstr "Slice das Modell und Export von SLA-Druckschichten als PNG." - -#~ msgid "Export the model(s) as 3MF." -#~ msgstr "Exportiert das/die Modell(e) als 3MF Datei." - -#~ msgid "Export AMF" -#~ msgstr "Exportiere AMF" - -#~ msgid "Export the model(s) as AMF." -#~ msgstr "Exportiert das/die Modell(e) als AMF Datei." - -#~ msgid "Export STL" -#~ msgstr "Exportiere STL" - -#~ msgid "Export the model(s) as STL." -#~ msgstr "Exportiert das/die Modell(e) als STL Datei." - -#~ msgid "Slice the model and export toolpaths as G-code." -#~ msgstr "Modell slicen und Werkzeugwege als G-Code exportieren." - -#~ msgid "" -#~ "Slice the model as FFF or SLA based on the printer_technology " -#~ "configuration value." -#~ msgstr "" -#~ "Slice das Modell als FFF oder SLA basierend auf dem Konfigurationswert " -#~ "von printer_technology." - -#~ msgid "Show this help." -#~ msgstr "Diese Hilfe zeigen." - -#~ msgid "Help (FFF options)" -#~ msgstr "Hilfe (FFF Optionen)" - -#~ msgid "Show the full list of print/G-code configuration options." -#~ msgstr "" -#~ "Zeigt die vollständige Liste der Konfigurationsmöglichkeiten für Druck/" -#~ "GCode an." - -#~ msgid "Help (SLA options)" -#~ msgstr "Hilfe (SLA Optionen)" - -#~ msgid "Show the full list of SLA print configuration options." -#~ msgstr "" -#~ "Zeigt die vollständige Liste der Konfigurationsmöglichkeiten für SLA " -#~ "Druck an." - -#~ msgid "Write information about the model to the console." -#~ msgstr "Schreibt Informationen über das Modell auf die Konsole." - -#~ msgid "Save config file" -#~ msgstr "Speichere Konfigurationsdatei" - -#~ msgid "Save configuration to the specified file." -#~ msgstr "Sichert die Konfiguration in der angegebenen Datei." - -#~ msgid "Align XY" -#~ msgstr "Ausrichten von XY" - -#~ msgid "Align the model to the given point." -#~ msgstr "Das Modell auf den angegebenen Punkt ausrichten." - -#~ msgid "Cut model at the given Z." -#~ msgstr "Schneidet Modell am gegebenen Z-Wert." - -#~ msgid "Center" -#~ msgstr "Mitte" - -#~ msgid "Center the print around the given center." -#~ msgstr "Zentriert den Druck um den angegebenen Mittelpunkt." - -#~ msgid "Ensure on bed" -#~ msgstr "Auf dem Bett sicherstellen" - -#~ msgid "" -#~ "Lift the object above the bed when it is partially below. Enabled by " -#~ "default, use --no-ensure-on-bed to disable." -#~ msgstr "" -#~ "Hebt das Objekt über das Bett, wenn es sich teilweise darunter befindet. " -#~ "Standardmäßig aktiviert, zum Deaktivieren --no-ensure-on-bed verwenden." - -#~ msgid "Duplicate" -#~ msgstr "Duplizieren" - -#~ msgid "Multiply copies by this factor." -#~ msgstr "Mehrfache Kopien mit diesem Faktor." - -#~ msgid "Duplicate by grid" -#~ msgstr "Duplizieren nach Raster" - -#~ msgid "Multiply copies by creating a grid." -#~ msgstr "Multiple Kopien durch Erstellen eines Rasters." - -#~ msgid "" -#~ "Arrange the supplied models in a plate and merge them in a single model " -#~ "in order to perform actions once." -#~ msgstr "" -#~ "Die zur Verfügung stehenden Modelle in einer Platte anordnen und zu einem " -#~ "einzigen Modell zusammenführen, um Aktionen zusammen durchführen zu " -#~ "können." - -#~ msgid "" -#~ "Try to repair any non-manifold meshes (this option is implicitly added " -#~ "whenever we need to slice the model to perform the requested action)." -#~ msgstr "" -#~ "Repariere alle ungeschlossenen Netze (diese Option wird implizit " -#~ "hinzugefügt, wenn wir das Modell slicen müssen, um die gewünschte Aktion " -#~ "ausführen zu können)." - -#~ msgid "Rotation angle around the Z axis in degrees." -#~ msgstr "Rotationswinkel um die Z-Achse in Grad." - -#~ msgid "Rotate around X" -#~ msgstr "Rotiere um X" - -#~ msgid "Rotation angle around the X axis in degrees." -#~ msgstr "Rotationswinkel um die X-Achse in Grad." - -#~ msgid "Rotate around Y" -#~ msgstr "Rotiere um Y" - -#~ msgid "Rotation angle around the Y axis in degrees." -#~ msgstr "Rotationswinkel um die Y-Achse in Grad." - -#~ msgid "Scaling factor or percentage." -#~ msgstr "Skalierungsfaktor oder Prozentsatz." +#~ msgid "Fix model through cloud" +#~ msgstr "Modell durch die Cloud reparieren" #~ msgid "" -#~ "Detect unconnected parts in the given model(s) and split them into " -#~ "separate objects." -#~ msgstr "" -#~ "Erkennung nicht zusammenhängender Teile in den angegebenen Modellen und " -#~ "Aufteilung in einzelne Objekte." - -#~ msgid "Scale to Fit" -#~ msgstr "Passend skalieren" - -#~ msgid "Scale to fit the given volume." -#~ msgstr "Auf das gegebene Volumen skalieren." - -#~ msgid "Ignore non-existent config files" -#~ msgstr "Ignoriere fehlende Konfigurationsdateien" - -#~ msgid "Do not fail if a file supplied to --load does not exist." -#~ msgstr "" -#~ "Nicht abbrechen, wenn eine an --load übergebene Datei nicht existiert." - -#~ msgid "" -#~ "Forward-compatibility rule when loading configurations from config files " -#~ "and project files (3MF, AMF)." -#~ msgstr "" -#~ "Vorwärtskompatibilitätsregel beim Laden von Konfigurationen aus " -#~ "Konfigurationsdateien und Projektdateien (3MF, AMF)." - -#~ msgid "Bail out on unknown configuration values" -#~ msgstr "Verhalten bei unbekannten Konfigurationswerten" +#~ "Heat the nozzle to target \n" +#~ "temperature" +#~ msgstr "Die Druckdüse auf die Zieltemperatur heitzen" -#~ msgid "" -#~ "Enable reading unknown configuration values by verbosely substituting " -#~ "them with defaults." -#~ msgstr "" -#~ "Ermöglicht das Lesen unbekannter Konfigurationswerte, indem sie " -#~ "interaktiv durch Standardwerte ersetzt werden." +#~ msgid "In the calibration of extrusion flow" +#~ msgstr "In the calibration of extrusion flow" -#~ msgid "" -#~ "Enable reading unknown configuration values by silently substituting them " -#~ "with defaults." -#~ msgstr "" -#~ "Ermöglicht das Lesen unbekannter Konfigurationswerte, indem sie " -#~ "stillschweigend durch Standardwerte ersetzt werden." +#~ msgid "In the calibration of laser scanner" +#~ msgstr "In the calibration of laser scanner" -#~ msgid "Load config file" -#~ msgstr "Lade Konfigurationsdatei" +#~ msgid "Module" +#~ msgstr "Modul" -#~ msgid "" -#~ "Load configuration from the specified file. It can be used more than once " -#~ "to load options from multiple files." -#~ msgstr "" -#~ "Lädt die Konfiguration aus der angegebenen Datei. Es kann mehr als einmal " -#~ "verwendet werden, um Optionen aus mehreren Dateien zu laden." +#~ msgid "New version of Bambu Studio" +#~ msgstr "Neue Version von Bambu Studio" -#~ msgid "Output File" +#~ msgid "Output file" #~ msgstr "Ausgabedatei" -#~ msgid "" -#~ "The file where the output will be written (if not specified, it will be " -#~ "based on the input file)." -#~ msgstr "" -#~ "Die Datei, in die die Ausgabe geschrieben wird (falls nicht angegeben, " -#~ "basiert sie auf der Eingabedatei)." - -#~ msgid "Single instance mode" -#~ msgstr "Einzelinstanz-Modus" - -#~ msgid "Data directory" -#~ msgstr "Datenverzeichnis" - -#~ msgid "" -#~ "Load and store settings at the given directory. This is useful for " -#~ "maintaining different profiles or including configurations from a network " -#~ "storage." -#~ msgstr "" -#~ "Lädt und speichert Einstellungen im angegebenen Verzeichnis. Dies ist " -#~ "nützlich, um verschiedene Profile zu pflegen oder Konfigurationen aus " -#~ "einem Netzwerkspeicher zu übernehmen." - -#~ msgid "Logging level" -#~ msgstr "Logging-Level" - -#~ msgid "" -#~ "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" -#~ "trace\n" -#~ "For example. loglevel=2 logs fatal, error and warning level messages." -#~ msgstr "" -#~ "Stellt die Empfindlichkeit der Protokollierung ein. 0:fatal, 1:Fehler, 2:" -#~ "Warnung, 3:Info, 4:Debug, 5: Trace.\n" -#~ "Zum Beispiel. loglevel=2 protokolliert fatale, Fehler- und " -#~ "Warnstufenmeldungen." - -#~ msgid "Render with a software renderer" -#~ msgstr "Rendern mit einem Software-Renderer" - -#~ msgid "" -#~ "Render with a software renderer. The bundled MESA software renderer is " -#~ "loaded instead of the default OpenGL driver." -#~ msgstr "" -#~ "Rendern mit einem Software-Renderer. Der mitgelieferte MESA-Software-" -#~ "Renderer wird anstelle des standardmäßigen OpenGL-Treibers geladen." - -#~ msgid "" -#~ "Fuzzy skin\n" -#~ "Did you know that you can create rough fibre-like texture on the sides of " -#~ "your models using theFuzzy skinfeature? You can also use modifiers " -#~ "to apply fuzzy-skin only to a portion of your model." -#~ msgstr "" -#~ "Fuzzy Skin\n" -#~ "Wussten Sie schon, dass Sie mit der Funktion \"Fuzzy Skin\" raue, " -#~ "faserähnliche Texturen an den Seiten Ihres Modells erstellen können? Sie " -#~ "können auch Modifizierer verwenden, um Fuzzy-Skin nur auf einen Teil " -#~ "Ihres Modells anzuwenden." - -#~ msgid "" -#~ "Arrange settings\n" -#~ "Did you know that you can right-click theArrange iconto adjust the " -#~ "size of the gap between objects and to allow automatic rotations?" -#~ msgstr "" -#~ "Anordnungs-Einstellungen\n" -#~ "Wussten Sie, dass Sie mit der rechten Maustaste aufArrange iconklicken können, um die Größe des Abstands zwischen den Objekten " -#~ "anzupassen und automatische Drehungen zu ermöglichen?" - -#~ msgid "" -#~ "Simplify mesh\n" -#~ "Did you know that you can reduce the number of triangles in a mesh using " -#~ "the Simplify mesh feature? Right-click the model and select Simplify " -#~ "model. Read more in the documentation." -#~ msgstr "" -#~ "Netz vereinfachen\n" -#~ "Wussten Sie schon, dass Sie die Anzahl der Dreiecke in einem Netz mit der " -#~ "Funktion Netz vereinfachen reduzieren können? Klicken Sie mit der rechten " -#~ "Maustaste auf das Modell und wählen Sie Modell vereinfachen. Weitere " -#~ "Informationen finden Sie in der Dokumentation." - -#~ msgid "" -#~ "Hiding sidebar\n" -#~ "Did you know that you can hide the right sidebar using the shortcut " -#~ "Shift+Tab? You can also enable the icon for this from " -#~ "thePreferences." -#~ msgstr "" -#~ "Seitenleiste ausblenden\n" -#~ "Wussten Sie, dass Sie die rechte Seitenleiste mit der Tastenkombination " -#~ "Shift+Tab ausblenden können? Sie können das Symbol dafür auch in " -#~ "denEinstellungen aktivieren." - -#~ msgid "" -#~ "Perspective camera\n" -#~ "Did you know that you can use the K key to quickly switch between " -#~ "an orthographic and perspective camera?" -#~ msgstr "" -#~ "Perspektivische Kamera\n" -#~ "Wussten Sie, dass Sie mit der Taste K schnell zwischen " -#~ "orthografischer und perspektivischer Kamera wechseln können?" - -#~ msgid "" -#~ "Camera Views\n" -#~ "Did you know that you can use the number keys 0-6 to quickly " -#~ "switch between predefined camera angles?" -#~ msgstr "" -#~ "Kamera-Ansichten\n" -#~ "Wussten Sie, dass Sie mit den Zifferntasten 0-6 schnell zwischen " -#~ "vordefinierten Kamerawinkeln wechseln können?" - -#~ msgid "" -#~ "Place on face\n" -#~ "Did you know that you can quickly orient a model so that one of its faces " -#~ "sits on the print bed? Select thePlace on facefunction or press " -#~ "the F key." -#~ msgstr "" -#~ "Auf Fläche legen\n" -#~ "Wussten Sie, dass Sie ein Modell schnell so ausrichten können, dass eine " -#~ "seiner Flächen auf dem Druckbett sitzt? Wählen Sie die Funktion Auf " -#~ "Fläche legen oder drücken Sie die Taste F." - -#~ msgid "" -#~ "Set number of instances\n" -#~ "Did you know that you can right-click a model and set an exact number of " -#~ "instances instead of copy-pasting it several times?" -#~ msgstr "" -#~ "Anzahl der Kopien festlegen\n" -#~ "Wussten Sie schon, dass Sie mit der rechten Maustaste auf ein Modell " -#~ "klicken und die genaue Anzahl der Kopien festlegen können, anstatt es " -#~ "mehrmals zu kopieren und einzufügen?" - -#~ msgid "" -#~ "Combine infill\n" -#~ "Did you know that you can print the infill with a higher layer height " -#~ "compared to perimeters to save print time using the settingCombine " -#~ "infill every." -#~ msgstr "" -#~ "Infill kombinieren\n" -#~ "Wussten Sie, dass Sie den Infill mit einer höheren Schichthöhe als den " -#~ "Perimeter drucken können, um Druckzeit zu sparen, indem Sie die " -#~ "EinstellungInfill kombinieren alle verwenden." - -#~ msgid "" -#~ "Variable layer height\n" -#~ "Did you know that you can print different regions of your model with a " -#~ "different layer height and smooth the transitions between them? Try " -#~ "theVariable layer height tool.(Not available for SLA printers.)" -#~ msgstr "" -#~ "Variable Schichthöhe\n" -#~ "Wussten Sie schon, dass Sie verschiedene Bereiche Ihres Modells mit einer " -#~ "unterschiedlichen Schichthöhe drucken und die Übergänge zwischen ihnen " -#~ "glätten können? Versuchen Sie es mit demWerkzeug für variable " -#~ "Schichthöhen.(Nicht verfügbar für SLA-Drucker.)" - -#~ msgid "" -#~ "Undo/redo history\n" -#~ "Did you know that you can right-click theundo/redo arrowsto see " -#~ "the history of changes and to undo or redo several actions at once?" -#~ msgstr "" -#~ "Undo/Redo-Verlauf\n" -#~ "Wussten Sie schon, dass Sie mit der rechten Maustaste auf die Undo/" -#~ "Redo Pfeile klicken können, um den Änderungsverlauf zu sehen und " -#~ "mehrere Aktionen auf einmal rückgängig zu machen oder wiederherzustellen?" - -#~ msgid "" -#~ "Different layer height for each model\n" -#~ "Did you know that you can print each model on the plater with a different " -#~ "layer height? Right-click the model in the 3D view, choose Layers and " -#~ "Perimeters and adjust the values in the right panel. Read more in the " -#~ "documentation." -#~ msgstr "" -#~ "Unterschiedliche Schichthöhen für jedes Modell\n" -#~ "Wussten Sie, dass Sie jedes Modell auf der Platform mit einer anderen " -#~ "Schichthöhe drucken können? Klicken Sie mit der rechten Maustaste auf das " -#~ "Modell in der 3D-Ansicht, wählen Sie Schichten und Umfänge und passen Sie " -#~ "die Werte im rechten Fenster an. Lesen Sie mehr in der Dokumentation." - -#~ msgid "" -#~ "Solid infill threshold area\n" -#~ "Did you know that you can make parts of your model with a small cross-" -#~ "section be filled with solid infill automatically? Set theSolid infill " -#~ "threshold area.(Expert mode only.)" -#~ msgstr "" -#~ "Solid Infill Schwellenbereich\n" -#~ "Wussten Sie, dass Sie Teile Ihres Modells mit einem kleinen Querschnitt " -#~ "automatisch mit Solid Infill füllen lassen können? Stellen Sie " -#~ "denSchwellenwertbereich für Solid Infill ein (nur im " -#~ "Expertenmodus)." - -#~ msgid "" -#~ "Box selection\n" -#~ "Did you know that you can do a box selection with Shift+Mouse drag? You " -#~ "can also box-deselect objects with Alt+Mouse drag." -#~ msgstr "" -#~ "Box-Auswahl\n" -#~ "Wussten Sie, dass Sie mit Umschalt+Maus-Ziehen eine Kastenauswahl treffen " -#~ "können? Mit Alt+Maus ziehen können Sie auch die Auswahl von " -#~ "Objekten aufheben." - -#~ msgid "" -#~ "Zoom on selected objects or on all objects if none selected\n" -#~ "Did you know that you can zoom in on selected objects by pressing the " -#~ "Z key? If none are selected, the camera will zoom on all objects " -#~ "in the scene." -#~ msgstr "" -#~ "Zoom auf ausgewählte Objekte oder auf alle Objekte, wenn keine ausgewählt " -#~ "sind\n" -#~ "Wussten Sie, dass Sie auf ausgewählte Objekte zoomen können, indem Sie " -#~ "die Taste Z drücken? Wenn keine Objekte ausgewählt sind, zoomt die " -#~ "Kamera auf alle Objekte in der Szene." - -#~ msgid "" -#~ "Printable toggle\n" -#~ "Did you know that you can disable the G-code generation for the selected " -#~ "model without having to move or delete it? Toggle the Printable property " -#~ "of a model from the Right-click context menu." -#~ msgstr "" -#~ "Druckbar Umschaltfunktion\n" -#~ "Wussten Sie, dass Sie die G-Code-Erzeugung für das ausgewählte Modell " -#~ "deaktivieren können, ohne es verschieben oder löschen zu müssen? Schalten " -#~ "Sie die Eigenschaft \"Druckbar\" eines Modells über das Kontextmenü der " -#~ "rechten Maustaste um." - -#~ msgid "" -#~ "Mirror\n" -#~ "Did you know that you can mirror the selected model to create a reversed " -#~ "version of it? Right-click the model, select Mirror and pick the mirror " -#~ "axis." -#~ msgstr "" -#~ "Spiegeln\n" -#~ "Wussten Sie schon, dass Sie das ausgewählte Modell spiegeln können, um " -#~ "eine umgekehrte Version davon zu erstellen? Klicken Sie mit der rechten " -#~ "Maustaste auf das Modell, wählen Sie Spiegeln und wählen Sie die " -#~ "Spiegelachse." - -#~ msgid "" -#~ "PageUp / PageDown quick rotation by 45 degrees\n" -#~ "Did you know that you can quickly rotate selected models by 45 degrees " -#~ "around the Z-axis clockwise or counter-clockwise by pressing Page Up or Page Down respectively?" -#~ msgstr "" -#~ "BildAuf / BildAb schnelle Drehung um 45 Grad\n" -#~ "Wussten Sie, dass Sie ausgewählte Modelle schnell um 45 Grad um die Z-" -#~ "Achse im oder gegen den Uhrzeigersinn drehen können, indem Sie Bild " -#~ "nach oben bzw. Bild nach unten drücken?" - -#~ msgid "" -#~ "Load config from G-code\n" -#~ "Did you know that you can use File-Import-Import Config to load print, " -#~ "filament and printer profiles from an existing G-code file? Similarly, " -#~ "you can use File-Import-Import SL1 / SL1S archive, which also lets you " -#~ "reconstruct 3D models from the voxel data." -#~ msgstr "" -#~ "Konfiguration aus G-Code laden\n" -#~ "Wussten Sie, dass Sie File-Import-Import Konfig verwenden können, um " -#~ "Druck-, Filament- und Druckerprofile aus einer vorhandenen G-Code-Datei " -#~ "zu laden? In ähnlicher Weise können Sie mit File-Import-Import SL1 / SL1S " -#~ "Archive verwenden, mit denen Sie ebenfalls 3D-Modelle aus den Voxel-Daten " -#~ "rekonstruieren können." - -#~ msgid "" -#~ "Ironing\n" -#~ "Did you know that you can smooth top surfaces of prints using Ironing? " -#~ "The nozzle will run a special second infill phase at the same layer to " -#~ "fill in holes and flatten any lifted plastic. Read more in the " -#~ "documentation. (Requires Advanced or Expert mode.)" -#~ msgstr "" -#~ "Bügeln\n" -#~ "Wussten Sie, dass Sie die Oberseite von Drucken mit Hilfe des Bügelns " -#~ "glätten können? Die Düse führt eine spezielle zweite Infill-Phase in " -#~ "derselben Schicht durch, um Löcher aufzufüllen und angehobenen Kunststoff " -#~ "zu glätten. Weitere Informationen finden Sie in der Dokumentation. " -#~ "(Erfordert den Modus Erweitert oder Experte.)" - -#~ msgid "" -#~ "Paint-on supports\n" -#~ "Did you know that you can paint directly on the object and select areas, " -#~ "where supports should be enforced or blocked? Try thePaint-on " -#~ "supportsfeature. (Requires Advanced or Expert mode.)" -#~ msgstr "" -#~ "Aufmal Stützen\n" -#~ "Wussten Sie, dass Sie direkt auf das Objekt malen und Bereiche auswählen " -#~ "können, in denen Stützen erzwungen oder blockiert werden sollen? " -#~ "Probieren Sie die Funktion Aufmal-Stützen aus. (Erfordert den " -#~ "Modus \"Fortgeschritten\" oder \"Experte\")." - -#~ msgid "" -#~ "Paint-on seam\n" -#~ "Did you know that you can paint directly on the object and select where " -#~ "to place the start/endpoint of each perimeter loop? Try theSeam " -#~ "paintingfeature. (Requires Advanced or Expert mode.)" -#~ msgstr "" -#~ "Aufmae Nähte\n" -#~ "Wussten Sie schon, dass Sie direkt auf das Objekt malen und auswählen " -#~ "können, wo der Start-/Endpunkt jeder Umfangsschleife liegen soll? " -#~ "Probieren Sie die FunktionAufmal-Naht aus. (Erfordert den Modus " -#~ "\"Fortgeschritten\" oder \"Experte\")." - -#~ msgid "" -#~ "Insert Pause\n" -#~ "Did you know that you can schedule the print to pause at a specific " -#~ "layer? Right-click the layer slider in the Preview and select Add pause " -#~ "print (M601). This can be used to insert magnets, weights or nuts into " -#~ "your prints. Read more in the documentation." -#~ msgstr "" -#~ "Pause einfügen\n" -#~ "Wussten Sie, dass Sie den Druck auf einer bestimmten Schicht unterbrechen " -#~ "können? Klicken Sie mit der rechten Maustaste auf den Schieberegler der " -#~ "Schicht in der Vorschau und wählen Sie Druckpause hinzufügen (M601). Auf " -#~ "diese Weise können Sie Magnete, Gewichte oder Muttern in Ihre Drucke " -#~ "einfügen. Weitere Informationen finden Sie in der Dokumentation." - -#~ msgid "" -#~ "Insert Custom G-code\n" -#~ "Did you know that you can insert a custom G-code at a specific layer? " -#~ "Left-click the layer in the Preview, Right-click the plus icon and select " -#~ "Add custom G-code. With this function you can, for example, create a " -#~ "temperature tower. Read more in the documentation." -#~ msgstr "" -#~ "Benutzerdefinierten G-Code einfügen\n" -#~ "Wussten Sie, dass Sie einen benutzerdefinierten G-Code in eine bestimmte " -#~ "Schicht einfügen können? Klicken Sie mit der linken Maustaste auf die " -#~ "Schicht in der Vorschau, klicken Sie mit der rechten Maustaste auf das " -#~ "Plus-Symbol und wählen Sie Benutzerdefinierten G-Code hinzufügen. Mit " -#~ "dieser Funktion können Sie z.B. einen Temperaturturm erstellen. Lesen Sie " -#~ "mehr in der Dokumentation." - -#~ msgid "" -#~ "Configuration snapshots\n" -#~ "Did you know that roll back to a complete backup of all system and user " -#~ "profiles? You can view and move back and forth between snapshots using " -#~ "the Configuration - Configuration snapshots menu." -#~ msgstr "" -#~ "Konfigurations-Schnappschüsse\n" -#~ "Wussten Sie, dass ein Rollback zu einem vollständigen Backup aller " -#~ "System- und Benutzerprofile führt? Sie können Snapshots über das Menü " -#~ "Konfiguration - Konfigurations-Schnappschuss anzeigen und zwischen " -#~ "ihnen hin- und herwechseln." - -#~ msgid "" -#~ "Minimum shell thickness\n" -#~ "Did you know that instead of the number of top and bottom layers, you can " -#~ "define theMinimum shell thicknessin millimeters? This feature is " -#~ "especially useful when using the variable layer height function." -#~ msgstr "" -#~ "Minimale Hüllenstärke\n" -#~ "Wussten Sie, dass Sie anstelle der Anzahl der oberen und unteren " -#~ "Schichten auch die Mindesthüllenstärke in Millimetern angeben " -#~ "können? Diese Funktion ist besonders nützlich, wenn Sie die Funktion der " -#~ "variablen Schichthöhe verwenden." - -#~ msgid "" -#~ "Settings in non-modal window\n" -#~ "Did you know that you can open the Settings in a new non-modal window? " -#~ "This means you can have settings open on one screen and the G-code " -#~ "Preview on the other. Go to thePreferencesand select Settings in " -#~ "non-modal window." -#~ msgstr "" -#~ "Einstellungen in nicht-modalem Fenster\n" -#~ "Wussten Sie schon, dass Sie die Einstellungen in einem neuen, nicht-" -#~ "modalen Fenster öffnen können? Das bedeutet, dass Sie die Einstellungen " -#~ "auf einem Bildschirm und die G-Code-Vorschau auf dem anderen öffnen " -#~ "können. Gehen Sie zu den Einstellungen und wählen Sie " -#~ "Einstellungen in nicht-modalem Fenster." - -#~ msgid "" -#~ "Adaptive infills\n" -#~ "Did you know that you can use the Adaptive cubic and Support cubic " -#~ "infills to decrease the print time and lower the filament consumption? " -#~ "Read more in the documentation." -#~ msgstr "" -#~ "Adaptive Füllungen\n" -#~ "Wussten Sie schon, dass Sie die kubischen Füllungen Adaptiv kubisch und " -#~ "Stütz kubisch verwenden können, um die Druckzeit zu verkürzen und den " -#~ "Filamentverbrauch zu senken? Lesen Sie mehr in der Dokumentation." - -#~ msgid "Interface pattern spacing" -#~ msgstr "Schnittstellenmuster Abstand" - -#~ msgid "" -#~ "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " -#~ "community." -#~ msgstr "" -#~ "PrusaSlicer basiert auf Slic3r von Alessandro Ranellucci und der RepRap " -#~ "Community." - -#~ msgid "" -#~ "Please save your project and restart PrusaSlicer. We would be glad if you " -#~ "reported the issue." -#~ msgstr "" -#~ "Bitte speichern Sie Ihr Projekt und starten Sie PrusaSlicer neu. Wir " -#~ "würden uns freuen, wenn Sie das Problem melden würden." - -#~ msgid "PrusaSlicer version" -#~ msgstr "PrusaSlicer Version" - -#~ msgid "min PrusaSlicer version" -#~ msgstr "min PrusaSlicer Version" - -#~ msgid "max PrusaSlicer version" -#~ msgstr "max PrusaSlicer Version" - -#~ msgid "Associate .3mf files to PrusaSlicer" -#~ msgstr ".3mf-Dateien mit PrusaSlicer verknüpfen" - -#~ msgid "Associate .stl files to PrusaSlicer" -#~ msgstr ".stl-Dateien mit PrusaSlicer verknüpfen" - -#~ msgid "" -#~ "PrusaSlicer's user interfaces comes in three variants:\n" -#~ "Simple, Advanced, and Expert.\n" -#~ "The Simple mode shows only the most frequently used settings relevant for " -#~ "regular 3D printing. The other two offer progressively more sophisticated " -#~ "fine-tuning, they are suitable for advanced and expert users, " -#~ "respectively." -#~ msgstr "" -#~ "Die Benutzeroberflächen von PrusaSlicer sind in drei Varianten " -#~ "erhältlich:\n" -#~ "Einfach, Fortgeschritten und Experte.\n" -#~ "Der einfache Modus zeigt nur die am häufigsten verwendeten Einstellungen, " -#~ "die für den regulären 3D-Druck relevant sind. Die beiden anderen bieten " -#~ "eine immer anspruchsvollere Feinabstimmung, sie sind für fortgeschrittene " -#~ "bzw. erfahrene Anwender geeignet." - -#~ msgid "The following SLA printer models have no materials selected:" -#~ msgstr "" -#~ "Bei den folgenden SLA-Druckermodellen wurden keine Materialien ausgewählt:" - -#~ msgid "" -#~ "Do you want to select default SLA materials for these printer models?" -#~ msgstr "" -#~ "Möchten Sie Standard-SLA-Materialien für diese Druckermodelle auswählen?" - -#~ msgid "Some SLA materials were uninstalled." -#~ msgstr "Einige SLA-Materialien wurden deinstalliert." - -#~ msgid "" -#~ "Performing desktop integration failed - could not create Gcodeviewer " -#~ "desktop file. PrusaSlicer desktop file was probably created successfully." -#~ msgstr "" -#~ "Desktop-Integration fehlgeschlagen - Gcodeviewer-Desktop-Datei konnte " -#~ "nicht erstellt werden. Die PrusaSlicer-Desktopdatei wurde wahrscheinlich " -#~ "erfolgreich erstellt." - -#~ msgid "Flash!" -#~ msgstr "Flash!" - -#~ msgid "Flashing in progress. Please do not disconnect the printer!" -#~ msgstr "Es wird geflashed. Bitte nicht den Drucker abklemmen!" - -#~ msgid "Flashing failed" -#~ msgstr "Flashen fehlgeschlagen" - -#~ msgid "Flashing succeeded!" -#~ msgstr "Flashen erfolgreich!" - -#~ msgid "Flashing failed. Please see the avrdude log below." -#~ msgstr "Flashen misslungen. Bitte überprüfen Sie das Avrdude log unterhalb." - -#~ msgid "Flashing cancelled." -#~ msgstr "Flashen abgebrochen." - -#~ msgid "" -#~ "This firmware hex file does not match the printer model.\n" -#~ "The hex file is intended for: %s\n" -#~ "Printer reported: %s\n" -#~ "\n" -#~ "Do you want to continue and flash this hex file anyway?\n" -#~ "Please only continue if you are sure this is the right thing to do." -#~ msgstr "" -#~ "Diese Firmware-Hex-Datei stimmt nicht mit dem Druckermodell überein.\n" -#~ "Die Hex-Datei ist für: %s\n" -#~ "Drucker erkannt: %s\n" -#~ "\n" -#~ "Möchtest Sie fortfahren und diese Hex-Datei trotzdem flashen?\n" -#~ "Bitte fahren Sie nur fort, wenn Sie der festen Überzeugung sind, dass " -#~ "dies das Richtige ist." - -#~ msgid "" -#~ "Multiple %s devices found. Please only connect one at a time for flashing." -#~ msgstr "" -#~ "Mehrere %s Geräte gefunden. Bitte immer nur eins zum Flashen anschließen." - -#~ msgid "" -#~ "The %s device was not found.\n" -#~ "If the device is connected, please press the Reset button next to the USB " -#~ "connector ..." -#~ msgstr "" -#~ "Das %s-Gerät wurde nicht gefunden.\n" -#~ "Wenn das Gerät angeschlossen ist, drücken Sie bitte die Reset-Taste neben " -#~ "dem USB-Anschluss...." - -#~ msgid "The %s device could not have been found" -#~ msgstr "Das %s-Gerät konnte nicht gefunden werden" - -#~ msgid "Error accessing port at %s: %s" -#~ msgstr "Fehler beim Zugriff auf Port bei %s:%s" - -#~ msgid "Error: %s" -#~ msgstr "Fehler: %s" - -#~ msgid "Firmware flasher" -#~ msgstr "Firmware Flasher" - -#~ msgid "Firmware image:" -#~ msgstr "Firmware Image:" - -#~ msgid "Serial port:" -#~ msgstr "Serieller Port:" - -#~ msgid "Autodetected" -#~ msgstr "Automatisch erkannt" - -#~ msgid "Rescan" -#~ msgstr "Rescan" - -#~ msgid "Progress:" -#~ msgstr "Fortschritt:" - -#~ msgid "Status:" -#~ msgstr "Status:" - -#~ msgid "Ready" -#~ msgstr "Fertig" - -#~ msgid "Advanced: Output log" -#~ msgstr "Fortgeschritten: Ausgabeprotokoll" - -#~ msgid "" -#~ "Are you sure you want to cancel firmware flashing?\n" -#~ "This could leave your printer in an unusable state!" -#~ msgstr "" -#~ "Sind Sie sicher, dass Sie das Flashen der Firmware abbrechen wollen? Dies " -#~ "könnte Ihren Drucker in einen unbrauchbaren Zustand versetzen!" - -#~ msgid "Confirmation" -#~ msgstr "Bestätigung" - -#~ msgid "Cancelling..." -#~ msgstr "Abbrechen..." - -#~ msgid "Select shape from the gallery" -#~ msgstr "Form aus der Galerie auswählen" - -#~ msgid "Add to bed" -#~ msgstr "Zum Bett hinzufügen" - -#~ msgid "Add selected shape(s) to the bed" -#~ msgstr "Ausgewählte Form(en) zum Bett hinzufügen" - -#~ msgid "Add one or more custom shapes" -#~ msgstr "Eine oder mehrere benutzerdefinierte Formen hinzufügen" - -#~ msgid "Delete one or more custom shape. You can't delete system shapes" -#~ msgstr "" -#~ "Löschen Sie eine oder mehrere benutzerdefinierte Formen. Sie können keine " -#~ "Systemformen löschen" - -#~ msgid "Choose one or more files (STL, OBJ):" -#~ msgstr "Wählen Sie eine oder mehrere Dateien (STL, OBJ):" - -#~ msgid "" -#~ "It looks like selected %1%-file has an error or is destructed.\n" -#~ "We can't load this file" -#~ msgstr "" -#~ "Es sieht so aus, als ob die ausgewählte %1%-Datei einen Fehler hat oder " -#~ "zerstört wurde.\n" -#~ "Diese Datei kann nicht geladen werden." - -#~ msgid "Choose one PNG file:" -#~ msgstr "Choose one PNG file:" - -#~ msgid "Replacing of the PNG" -#~ msgstr "Ersetzen der PNG-Datei" - -#~ msgid "Change thumbnail" -#~ msgstr "Vorschaubild ändern" - -#~ msgid "Loading of the \"%1%\"" -#~ msgstr "Laden der \"%1%\"" - -#~ msgid "Head diameter" -#~ msgstr "Kopfdurchmesser" - -#~ msgid "Lock supports under new islands" -#~ msgstr "Fixiere Stützen unter neuen Inseln" - -#~ msgid "Remove selected points" -#~ msgstr "Ausgewählte Punkte entfernen" - -#~ msgid "Remove all points" -#~ msgstr "Alle Punkte entfernen" - -#~ msgid "Apply changes" -#~ msgstr "Änderungen anwenden" - -#~ msgid "Discard changes" -#~ msgstr "Änderungen verwerfen" - -#~ msgid "Minimal points distance" -#~ msgstr "Minimaler Prunktabstand" - -#~ msgid "Auto-generate points" -#~ msgstr "Punkte automatisch generieren" - -#~ msgid "Manual editing" -#~ msgstr "Manuelle Bearbeitung" - -#~ msgid "Add support point" -#~ msgstr "Stützpunkt hinzufügen" - -#~ msgid "Delete support point" -#~ msgstr "Stützpunkt löschen" - -#~ msgid "Change point head diameter" -#~ msgstr "Ändern des Stützpunkt-Kopfdurchmessers" - -#~ msgid "Support parameter change" -#~ msgstr "Stützparameter Änderung" - -#~ msgid "SLA Support Points" -#~ msgstr "SLA Stützpunkte" - -#~ msgid "Do you want to save your manually edited support points?" -#~ msgstr "Möchten Sie Ihre manuell bearbeiteten Stützpunkte speichern?" - -#~ msgid "Save support points?" -#~ msgstr "Stützpunkte speichern?" - -#~ msgid "Move support point" -#~ msgstr "Stützpunkt bewegen" - -#~ msgid "Support points edit" -#~ msgstr "Stützpunkte editieren" - -#~ msgid "Autogeneration will erase all manually edited points." -#~ msgstr "" -#~ "Die automatische Generierung löscht alle manuell bearbeiteten Punkte." - -#~ msgid "Are you sure you want to do it?" -#~ msgstr "Sind Sie sicher, dass Sie es tun wollen?" - -#~ msgid "Autogenerate support points" -#~ msgstr "Stützpunkte automatisch generieren" - -#~ msgid "SLA gizmo keyboard shortcuts" -#~ msgstr "SLA Gizmo Tastaturkürzel" - -#~ msgid "Note: some shortcuts work in (non)editing mode only." -#~ msgstr "" -#~ "Hinweis: Einige Tastenkombinationen funktionieren nur im " -#~ "(Nicht-)Bearbeitungsmodus." - -#~ msgid "Left click" -#~ msgstr "Linker Mausklick" - -#~ msgid "Add point" -#~ msgstr "Punkt hinzufügen" - -#~ msgid "Right click" -#~ msgstr "Rechter Mausklick" - -#~ msgid "Remove point" -#~ msgstr "Punkt entfernen" - -#~ msgid "Drag" -#~ msgstr "Ziehen" - -#~ msgid "Move point" -#~ msgstr "Punkt bewegen" - -#~ msgid "Add point to selection" -#~ msgstr "Punkt zur Auswahl hinzufügen" - -#~ msgid "Remove point from selection" -#~ msgstr "Punkt von Auswahl entfernen" - -#~ msgid "Deselect by rectangle" -#~ msgstr "Abwahl über Rechteck" - -#~ msgid "Select all points" -#~ msgstr "Alle Punkte auswählen" - -#~ msgid "Move clipping plane" -#~ msgstr "Beschnittebene bewegen" - -#~ msgid "Reset clipping plane" -#~ msgstr "Beschnittebene zurücksetzen" - -#~ msgid "Switch to editing mode" -#~ msgstr "Zum Bearbeitungsmodus umschalten" - -#~ msgid "" -#~ "Most likely the configuration was produced by a newer version of " -#~ "PrusaSlicer or by some PrusaSlicer fork." -#~ msgstr "" -#~ "Höchstwahrscheinlich wurde die Konfiguration von einer neueren Version " -#~ "des PrusaSlicer oder von einem PrusaSlicer-Ableger erzeugt." - -#~ msgid "Developed by Prusa Research." -#~ msgstr "Entwickelt von Prusa Research." - -#~ msgid "" -#~ "PrusaSlicer has encountered a localization error. Please report to " -#~ "PrusaSlicer team, what language was active and in which scenario this " -#~ "issue happened. Thank you.\n" -#~ "\n" -#~ "The application will now terminate." -#~ msgstr "" -#~ "PrusaSlicer ist auf einen Lokalisierungsfehler gestoßen. Bitte melden Sie " -#~ "dem PrusaSlicer-Team, welche Sprache aktiv war und in welchem Szenario " -#~ "dieses Problem aufgetreten ist. Wir danken Ihnen.\n" -#~ "\n" -#~ "Die Anwendung wird nun beendet." - -#~ msgid "" -#~ "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " -#~ "manually delete the file to recover from the error. Your user profiles " -#~ "will not be affected." -#~ msgstr "" -#~ "Fehler beim Parsen der PrusaSlicer-Konfigurationsdatei, sie ist " -#~ "wahrscheinlich beschädigt. Versuchen Sie, die Datei manuell zu löschen, " -#~ "um den Fehler zu beheben. Ihre Benutzerprofile sind davon nicht betroffen." - -#~ msgid "" -#~ "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try " -#~ "to manually delete the file to recover from the error." -#~ msgstr "" -#~ "Fehler beim Parsen der PrusaGCodeViewer-Konfigurationsdatei, sie ist " -#~ "wahrscheinlich beschädigt. Versuchen Sie, die Datei manuell zu löschen, " -#~ "um den Fehler zu beheben." - -#~ msgid "" -#~ "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" -#~ "32 bit build of PrusaSlicer will likely not be able to utilize all the " -#~ "RAM available in the system.\n" -#~ "Please download and install a 64 bit build of PrusaSlicer from https://" -#~ "www.prusa3d.cz/prusaslicer/.\n" -#~ "Do you wish to continue?" -#~ msgstr "" -#~ "Sie verwenden eine 32-Bit-Version von PrusaSlicer unter 64-Bit-Windows.\n" -#~ "Ein 32-Bit-Build von PrusaSlicer ist wahrscheinlich nicht in der Lage, " -#~ "das gesamte im System verfügbare RAM zu nutzen.\n" -#~ "Bitte laden Sie einen 64-Bit-Build von PrusaSlicer von https://www." -#~ "prusa3d.com/prusaslicer/ herunter und installieren Sie ihn.\n" -#~ "Möchten Sie fortfahren?" - -#~ msgid "" -#~ "But since this version of PrusaSlicer we don't show this information in " -#~ "Printer Settings anymore.\n" -#~ "Settings will be available in physical printers settings." -#~ msgstr "" -#~ "Seit dieser Version von PrusaSlicer zeigen wir diese Informationen nicht " -#~ "mehr in den Druckereinstellungen an.\n" -#~ "Die Einstellungen sind in den Einstellungen für physische Drucker " -#~ "verfügbar." - -#~ msgid "PrusaSlicer: Open hyperlink" -#~ msgstr "PrusaSlicer: Hyperlink öffnen" - -#~ msgid "Choose SLA archive:" -#~ msgstr "SLA Archiv wählen:" - -#~ msgid "Import file" -#~ msgstr "Datei importieren" - -#~ msgid "Import model and profile" -#~ msgstr "Modell und Profil importieren" - -#~ msgid "Import profile only" -#~ msgstr "Nur Profil importieren" - -#~ msgid "Import model only" -#~ msgstr "Nur Modell importieren" - -#~ msgid "Accurate" -#~ msgstr "Akkurat" - -#~ msgid "Balanced" -#~ msgstr "Balanziert" - -#~ msgid "Quick" -#~ msgstr "Schnell" - -#~ msgid "Importing SLA archive" -#~ msgstr "Importiere SLA-Archiv" - -#~ msgid "" -#~ "The SLA archive doesn't contain any presets. Please activate some SLA " -#~ "printer preset first before importing that SLA archive." -#~ msgstr "" -#~ "Das SLA-Archiv enthält keine Voreinstellungen. Bitte aktivieren Sie " -#~ "zunächst eine SLA-Druckervoreinstellung, bevor Sie das SLA-Archiv " -#~ "importieren." - -#~ msgid "Importing canceled." -#~ msgstr "Importieren abgebrochen." - -#~ msgid "Importing done." -#~ msgstr "Importieren abgeschlossen." - -#~ msgid "" -#~ "The imported SLA archive did not contain any presets. The current SLA " -#~ "presets were used as fallback." -#~ msgstr "" -#~ "Das importierte SLA-Archiv enthielt keine Voreinstellungen. Die aktuellen " -#~ "SLA-Voreinstellungen wurden als Ersatz verwendet." - -#~ msgid "Open a new PrusaSlicer instance" -#~ msgstr "Öffne eine neue PrusaSlicer-Instanz" - -#~ msgid "PrusaSlicer is closing" -#~ msgstr "PrusaSlicer schließt" - -#~ msgid "Closing PrusaSlicer while some presets are modified." -#~ msgstr "" -#~ "Schließen von PrusaSlicer, während einige Voreinstellungen geändert " -#~ "wurden." - -#~ msgid "Closing PrusaSlicer. Current project is modified." -#~ msgstr "PrusaSlicer schließen. Das aktuelle Projekt wurde geändert." - -#~ msgid "" -#~ "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run " -#~ "correctly, \n" -#~ "while OpenGL version %s, render %s, vendor %s was detected." -#~ msgstr "" -#~ "PrusaSlicer benötigt einen OpenGL 2.0-fähigen Grafiktreiber, um korrekt " -#~ "zu laufen, während die OpenGL-Version %s, Render %s, Hersteller %s " -#~ "erkannt wurde." - -#~ msgid "" -#~ "As a workaround, you may run PrusaSlicer with a software rendered 3D " -#~ "graphics by running prusa-slicer.exe with the --sw-renderer parameter." -#~ msgstr "" -#~ "Als Abhilfe können Sie PrusaSlicer mit einer softwaregerenderten 3D-" -#~ "Grafik ausführen, indem Sie prusa-slicer.exe mit dem Parameter --sw-" -#~ "renderer starten." - -#~ msgid "PrusaSlicer will remember your choice." -#~ msgstr "PrusaSlicer wird sich an Ihre Wahl erinnern." - -#~ msgid "PrusaSlicer: Don't ask me again" -#~ msgstr "PrusaSlicer: Fragen Sie mich nicht noch einmal" - -#~ msgid "" -#~ "The dimensions of the object from file %s seem to be defined in meters.\n" -#~ "The internal unit of PrusaSlicer is a millimeter. Do you want to " -#~ "recalculate the dimensions of the object?" -#~ msgid_plural "" -#~ "The dimensions of some objects from file %s seem to be defined in " -#~ "meters.\n" -#~ "The internal unit of PrusaSlicer is a millimeter. Do you want to " -#~ "recalculate the dimensions of these objects?" -#~ msgstr[0] "" -#~ "Die Abmessungen des Objekts aus der Datei %s scheinen in Metern definiert " -#~ "zu sein. Die interne Einheit von PrusaSlicer ist ein Millimeter. Möchten " -#~ "Sie die Abmessungen des Objekts neu berechnen?" -#~ msgstr[1] "" -#~ "Die Abmessungen einiger Objekte aus der Datei %s scheinen in Metern " -#~ "definiert zu sein. Die interne Einheit von PrusaSlicer ist ein " -#~ "Millimeter. Möchten Sie die Abmessungen der Objekte neu berechnen?" - -#~ msgid "" -#~ "The dimensions of the object from file %s seem to be defined in inches.\n" -#~ "The internal unit of PrusaSlicer is a millimeter. Do you want to " -#~ "recalculate the dimensions of the object?" -#~ msgid_plural "" -#~ "The dimensions of some objects from file %s seem to be defined in " -#~ "inches.\n" -#~ "The internal unit of PrusaSlicer is a millimeter. Do you want to " -#~ "recalculate the dimensions of these objects?" -#~ msgstr[0] "" -#~ "Die Abmessungen einiger Objekte aus der Datei %s scheinen in Zoll " -#~ "definiert zu sein.\n" -#~ "Die interne Einheit von PrusaSlicer ist ein Millimeter. Möchten Sie die " -#~ "Abmessungen dieser Objekte neu berechnen?" -#~ msgstr[1] "" -#~ "Die Abmessungen einiger Objekte aus den Dateien %s scheinen in Zoll " -#~ "definiert zu sein.\n" -#~ "Die interne Einheit von PrusaSlicer ist ein Millimeter. Möchten Sie die " -#~ "Abmessungen dieser Objekte neu berechnen?" - -#~ msgid "" -#~ "If enabled, sets PrusaSlicer as default application to open .3mf files." -#~ msgstr "" -#~ "Wenn aktiviert, legt PrusaSlicer als Standardanwendung fest, um .3mf-" -#~ "Dateien zu öffnen." - -#~ msgid "" -#~ "If enabled, sets PrusaSlicer as default application to open .stl files." -#~ msgstr "" -#~ "Wenn aktiviert, legt PrusaSlicer als Standardanwendung zum Öffnen von ." -#~ "stl-Dateien fest." - -#~ msgid "Allow just a single PrusaSlicer instance" -#~ msgstr "Nur eine einzige PrusaSlicer-Instanz zulassen" - -#~ msgid "" -#~ "If this is enabled, when starting PrusaSlicer and another instance of the " -#~ "same PrusaSlicer is already running, that instance will be reactivated " -#~ "instead." -#~ msgstr "" -#~ "Wenn dies aktiviert ist, wird beim Starten von PrusaSlicer, wenn bereits " -#~ "eine andere Instanz desselben PrusaSlicers läuft, diese Instanz " -#~ "stattdessen reaktiviert." - -#~ msgid "" -#~ "Always ask for unsaved changes, when: \n" -#~ "- Closing PrusaSlicer while some presets are modified,\n" -#~ "- Loading a new project while some presets are modified" -#~ msgstr "" -#~ "Immer nach nicht gespeicherten Änderungen fragen, beim: \n" -#~ "- Schließen von PrusaSlicer, während einige Voreinstellungen geändert " -#~ "wurden,\n" -#~ "- Laden eines neuen Projekts, während einige Voreinstellungen geändert " -#~ "wurden" - -#~ msgid "Associate .gcode files to PrusaSlicer G-code Viewer" -#~ msgstr ".gcode-Dateien mit dem PrusaSlicer G-Code-Viewer verknüpfen" - -#~ msgid "" -#~ "If enabled, sets PrusaSlicer G-code Viewer as default application to " -#~ "open .gcode files." -#~ msgstr "" -#~ "Wenn aktiviert, legt PrusaSlicer G-Code-Viewer als Standardanwendung zum " -#~ "Öffnen von .gcode-Dateien fest." - -#~ msgid "" -#~ "We do not send any personal information nor anything that would allow us " -#~ "to identify you later. To detect duplicate entries, a unique number " -#~ "derived from your system is sent, but the source information cannot be " -#~ "reconstructed. Apart from that, only general data about your OS, hardware " -#~ "and OpenGL installation are sent. PrusaSlicer is open source, if you want " -#~ "to inspect the code actually performing the communication, see %1%." -#~ msgstr "" -#~ "Es werden weder persönliche Daten noch Informationen übermittelt, die " -#~ "eine spätere Identifizierung ermöglichen würden. Zur Erkennung von " -#~ "doppelten Einträgen wird eine eindeutige, von Ihrem System abgeleitete " -#~ "Nummer übermittelt, deren Herkunft jedoch nicht rekonstruiert werden " -#~ "kann. Darüber hinaus werden nur allgemeine Daten über Ihr Betriebssystem, " -#~ "Ihre Hardware und Ihre OpenGL-Installation übermittelt. PrusaSlicer ist " -#~ "quelloffen, wenn Sie den Code, der die Kommunikation tatsächlich " -#~ "durchführt, einsehen wollen, siehe %1%." - -#~ msgid "Blacklisted libraries loaded into PrusaSlicer process:" -#~ msgstr "" -#~ "Blackgelistete Bibliotheken wurden in den PrusaSlicer-Prozess geladen:" - -#~ msgid "" -#~ "You will not be asked about the unsaved changes the next time you: \n" -#~ "- Closing PrusaSlicer while some presets are modified,\n" -#~ "- Loading a new project while some presets are modified" -#~ msgstr "" -#~ "Sie werden beim nächsten Mal nicht nach den nicht gespeicherten " -#~ "Änderungen gefragt: \n" -#~ "- Schließen von PrusaSlicer, während einige Voreinstellungen geändert " -#~ "wurden\n" -#~ "- Ein neues Projekt laden, während einige Voreinstellungen geändert wurden" - -#~ msgid "PrusaSlicer will remember your action." -#~ msgstr "PrusaSlicer wird sich an Ihre Aktion erinnern." - -#~ msgid "" -#~ "PrusaSlicer is not using the newest configuration available.\n" -#~ "Configuration Wizard may not offer the latest printers, filaments and SLA " -#~ "materials to be installed." -#~ msgstr "" -#~ "Der PrusaSlicer verwendet nicht die neueste verfügbare Konfiguration.\n" -#~ "Der Konfigurationsassistent bietet möglicherweise nicht die neuesten zu " -#~ "installierenden Drucker, Filamente und SLA-Materialien an. " - -#~ msgid "Mismatched type of print host: %s" -#~ msgstr "Nicht übereinstimmender Typ des Druckhosts: %s" - -#~ msgid "Connection to AstroBox works correctly." -#~ msgstr "Die Verbindung zur AstroBox funktioniert korrekt." - -#~ msgid "Could not connect to AstroBox" -#~ msgstr "Konnte keine Verbindung zur AstroBox herstellen" - -#~ msgid "Note: AstroBox version at least 1.1.0 is required." -#~ msgstr "Hinweis: Die AstroBox-Version 1.1.0 oder höher ist erforderlich." - -#~ msgid "Connection to Duet works correctly." -#~ msgstr "Verbindung zu Duet funktioniert einwandfrei." - -#~ msgid "Could not connect to Duet" -#~ msgstr "Ich konnte keine Verbindung zum Duet herstellen" - -#~ msgid "Unknown error occured" -#~ msgstr "Unbekannter Fehler aufgetreten" - -#~ msgid "Wrong password" -#~ msgstr "Ungültiges Kennwort" - -#~ msgid "Could not get resources to create a new connection" -#~ msgstr "" -#~ "Ressourcen zum Erstellen einer neuen Verbindung konnten nicht bezogen " -#~ "werden" - -#~ msgid "Upload not enabled on FlashAir card." -#~ msgstr "Hochladen nicht auf der FlashAir-Karte aktiviert." - -#~ msgid "Connection to FlashAir works correctly and upload is enabled." -#~ msgstr "" -#~ "Die Verbindung zu FlashAir funktioniert einwandfrei und der Upload ist " -#~ "aktiviert." - -#~ msgid "Could not connect to FlashAir" -#~ msgstr "Die Verbindung zu FlashAir konnte nicht hergestellt werden" - -#~ msgid "" -#~ "Note: FlashAir with firmware 2.00.02 or newer and activated upload " -#~ "function is required." -#~ msgstr "" -#~ "Hinweis: FlashAir mit Firmware 2.00.02 oder neuer und aktivierter Upload-" -#~ "Funktion ist erforderlich." - -#~ msgid "Connection to OctoPrint works correctly." -#~ msgstr "Verbindung zu OctoPrint funktioniert einwandfrei." - -#~ msgid "Could not connect to OctoPrint" -#~ msgstr "Ich konnte keine Verbindung zu OctoPrint herstellen" - -#~ msgid "Note: OctoPrint version at least 1.1.0 is required." -#~ msgstr "" -#~ "Hinweis: Es ist mindestens die OctoPrint-Version 1.1.0 erforderlich." - -#~ msgid "Connection to Prusa SL1 / SL1S works correctly." -#~ msgstr "Verbindung zum Prusa SL1 / SL1S funktioniert einwandfrei." - -#~ msgid "Could not connect to Prusa SLA" -#~ msgstr "Ich konnte keine Verbindung zum Prusa SLA herstellen" - -#~ msgid "Connection to PrusaLink works correctly." -#~ msgstr "Die Verbindung zu PrusaLink funktioniert einwandfrei." - -#~ msgid "Could not connect to PrusaLink" -#~ msgstr "Konnte keine Verbindung zu PrusaLink herstellen." - -#~ msgid "" -#~ "Could not detect system SSL certificate store. PrusaSlicer will be unable " -#~ "to establish secure network connections." -#~ msgstr "" -#~ "Konnte den System-SSL-Zertifikatspeicher nicht erkennen. PrusaSlicer kann " -#~ "keine sicheren Netzwerkverbindungen herstellen." - -#~ msgid "PrusaSlicer detected system SSL certificate store in: %1%" -#~ msgstr "PrusaSlicer erkannte System-SSL-Zertifikatspeicher in: %1%" - -#~ msgid "" -#~ "CURL init has failed. PrusaSlicer will be unable to establish network " -#~ "connections. See logs for additional details." -#~ msgstr "" -#~ "CURL Init ist fehlgeschlagen. PrusaSlicer ist nicht in der Lage, " -#~ "Netzwerkverbindungen herzustellen. Siehe Protokolle für weitere Details." - -#~ msgid "Connection to Repetier works correctly." -#~ msgstr "Die Verbindung zu Repetier funktioniert korrekt." - -#~ msgid "Could not connect to Repetier" -#~ msgstr "Keine Verbindung zu Repetier möglich" - -#~ msgid "Note: Repetier version at least 0.90.0 is required." -#~ msgstr "" -#~ "Hinweis: Eine Repetierversion von mindestens 0.90.0 ist erforderlich." - -#~ msgid "" -#~ "HTTP status: %1%\n" -#~ "Message body: \"%2%\"" -#~ msgstr "" -#~ "HTTP-Status: %1%\n" -#~ "Nachrichtentext: \"%2%\"" - -#~ msgid "" -#~ "Parsing of host response failed.\n" -#~ "Message body: \"%1%\"\n" -#~ "Error: \"%2%\"" -#~ msgstr "" -#~ "Das Parsen der Host-Antwort ist fehlgeschlagen.\n" -#~ "Nachrichtentext: \"%1%\"\n" -#~ "Fehler: \"%2%\"" - -#~ msgid "" -#~ "Enumeration of host printers failed.\n" -#~ "Message body: \"%1%\"\n" -#~ "Error: \"%2%\"" -#~ msgstr "" -#~ "Aufzählung der Hostdrucker fehlgeschlagen.\n" -#~ "Nachrichtentext: \"%1%\"\n" -#~ "Fehler: \"%2%\"" - -#~ msgid "" -#~ "The selected 3mf file has been saved with a newer version of %1% and is " -#~ "not compatible." -#~ msgstr "" -#~ "Die ausgewählte 3mf-Datei wurde mit einer neueren Version von %1% " -#~ "gespeichert und ist nicht kompatibel." - -#~ msgid "" -#~ "The selected 3MF contains FDM supports painted object using a newer " -#~ "version of PrusaSlicer and is not compatible." -#~ msgstr "" -#~ "Das ausgewählte 3MF enthält Objekte mit bemalten FDM-Stützen, die eine " -#~ "neuere Version von PrusaSlicer verwenden und nicht kompatibel sind." - -#~ msgid "" -#~ "The selected 3MF contains seam painted object using a newer version of " -#~ "PrusaSlicer and is not compatible." -#~ msgstr "" -#~ "Das ausgewählte 3MF enthält ein Aufmal-Naht Objekt, das eine neuere " -#~ "Version von PrusaSlicer verwendet und nicht kompatibel ist." - -#~ msgid "" -#~ "The selected 3MF contains multi-material painted object using a newer " -#~ "version of PrusaSlicer and is not compatible." -#~ msgstr "" -#~ "Das ausgewählte 3MF enthält ein mit Multimaterial Aufmal Objekt, das eine " -#~ "neuere Version von PrusaSlicer verwendet und nicht kompatibel ist." - -#~ msgid "Pad brim size is too small for the current configuration." -#~ msgstr "" -#~ "Die Randgröße der Grundschicht ist für die aktuelle Konfiguration zu " -#~ "klein." - -#~ msgid "" -#~ "Cannot proceed without support points! Add support points or disable " -#~ "support generation." -#~ msgstr "" -#~ "Ohne Stützpunkte kann nicht weitergearbeitet werden! Fügen Sie " -#~ "Stützpunkte hinzu oder deaktivieren Sie die Stützen-Generierung." - -#~ msgid "" -#~ "Elevation is too low for object. Use the \"Pad around object\" feature to " -#~ "print the object without elevation." -#~ msgstr "" -#~ "Die Erhöhung ist zu niedrig für das Objekt. Verwenden Sie die Funktion " -#~ "\"Grundschicht um Object\", um das Objekt ohne Erhöhung zu drucken." +#~ msgid "Pause(heated bed temperature error)" +#~ msgstr "Pause(heated bed temperature error)" -#~ msgid "" -#~ "The endings of the support pillars will be deployed on the gap between " -#~ "the object and the pad. 'Support base safety distance' has to be greater " -#~ "than the 'Pad object gap' parameter to avoid this." -#~ msgstr "" -#~ "Die Enden der Stützpfeiler werden auf dem Spalt zwischen dem Objekt und " -#~ "der Grundschicht eingesetzt. Der \"Sicherheitsabstand der Stützbasis\" " -#~ "muss größer sein als der Parameter \"Objektabstand Grundschicht\", um " -#~ "dies zu vermeiden." - -#~ msgid "Exposition time is out of printer profile bounds." -#~ msgstr "Belichtungszeit ist außerhalb der Druckerprofilgrenzen." - -#~ msgid "Initial exposition time is out of printer profile bounds." -#~ msgstr "Anfang-Belichtungszeit ist außerhalb der Druckerprofilgrenzen." - -#~ msgid "Slicing done" -#~ msgstr "Slicing abgeschlossen" - -#~ msgid "Hollowing model" -#~ msgstr "Aushöhlen des Modells" - -#~ msgid "Drilling holes into model." -#~ msgstr "Löcher in das Modell bohren." - -#~ msgid "Slicing model" -#~ msgstr "Slice das Modell" - -#~ msgid "Generating support points" -#~ msgstr "Erzeuge Stützpunkte" - -#~ msgid "Generating support tree" -#~ msgstr "Erzeuge Baumstützstruktur" - -#~ msgid "Generating pad" -#~ msgstr "Generiere Grundschicht" - -#~ msgid "Slicing supports" -#~ msgstr "Slice Stützen" - -#~ msgid "Merging slices and calculating statistics" -#~ msgstr "Zusammenführung der Slices und Berechnung der Statistiken" - -#~ msgid "Rasterizing layers" -#~ msgstr "Schichten werden gerastert" - -#~ msgid "Too many overlapping holes." -#~ msgstr "Zu viele überlappende Löcher." - -#~ msgid "" -#~ "Mesh to be hollowed is not suitable for hollowing (does not bound a " -#~ "volume)." -#~ msgstr "" -#~ "Das auszuhöhlende Netz ist nicht zum Aushöhlen geeignet (es begrenzt kein " -#~ "Volumen)." - -#~ msgid "Unable to drill the current configuration of holes into the model." -#~ msgstr "" -#~ "Es ist nicht möglich, die aktuelle Konfiguration von Löchern in das " -#~ "Modell zu bohren." - -#~ msgid "" -#~ "Drilling holes into the mesh failed. This is usually caused by broken " -#~ "model. Try to fix it first." -#~ msgstr "" -#~ "Das Bohren von Löchern in das Netz ist fehlgeschlagen. Dies wird " -#~ "normalerweise durch ein beschädigtes Modell verursacht. Versuchen Sie " -#~ "zuerst, es zu reparieren." - -#~ msgid "Failed to drill some holes into the model" -#~ msgstr "Das Bohren einiger Löcher in das Modell ist fehlgeschlagen" - -#~ msgid "" -#~ "Slicing had to be stopped due to an internal error: Inconsistent slice " -#~ "index." -#~ msgstr "" -#~ "Das Slicen wurde wegen eines internen Fehlers gestoppt: Defekter " -#~ "Sliceindex." - -#~ msgid "Visualizing supports" -#~ msgstr "Anzeigen der Stützen" - -#~ msgid "" -#~ "No pad can be generated for this model with the current configuration" -#~ msgstr "" -#~ "Für dieses Modell kann mit der aktuellen Konfiguration keine Grundschicht " -#~ "generiert werden" - -#~ msgid "" -#~ "There are unprintable objects. Try to adjust support settings to make the " -#~ "objects printable." -#~ msgstr "" -#~ "Es gibt nicht druckbare Objekte. Versuchen Sie, die Stützeinstellungen " -#~ "anzupassen, um die Objekte druckbar zu machen." - -#~ msgid "" -#~ "This end procedure is inserted at the end of the output file. Note that " -#~ "you can use placeholder variables for all PrusaSlicer settings." -#~ msgstr "" -#~ "Diese Endprozedur wird am Ende der Ausgabedatei eingefügt. Beachten Sie, " -#~ "dass Sie Platzhaltervariablen für alle PrusaSlicer-Einstellungen " -#~ "verwenden können." - -#~ msgid "" -#~ "This end procedure is inserted at the end of the output file, before the " -#~ "printer end gcode (and before any toolchange from this filament in case " -#~ "of multimaterial printers). Note that you can use placeholder variables " -#~ "for all PrusaSlicer settings. If you have multiple extruders, the gcode " -#~ "is processed in extruder order." -#~ msgstr "" -#~ "Dieser Endvorgang wird am Ende der Ausgabedatei, vor dem G-Code des " -#~ "Druckerendes (und vor jedem Werkzeugwechsel von diesem Filament bei " -#~ "Multimaterialdruckern) eingefügt. Beachten Sie, dass Sie " -#~ "Platzhaltervariablen für alle PrusaSlicer-Einstellungen verwenden können. " -#~ "Wenn Sie mehrere Extruder haben, wird der gcode in Extruderreihenfolge " -#~ "verarbeitet." - -#~ msgid "" -#~ "Some G/M-code commands, including temperature control and others, are not " -#~ "universal. Set this option to your printer's firmware to get a compatible " -#~ "output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting " -#~ "any extrusion value at all." -#~ msgstr "" -#~ "Einige G/M-Code Befehle, einschließlich Temperaturregelung und andere, " -#~ "sind nicht universell einsetzbar. Stellen Sie diese Option auf die " -#~ "Firmware Ihres Druckers ein, um eine kompatible Ausgabe zu erhalten. Der " -#~ "Zusatz \"No Extrusion\" verhindert, dass PrusaSlicer überhaupt einen " -#~ "Extrusionswert exportiert." - -#~ msgid "" -#~ "Connect an infill line to an internal perimeter with a short segment of " -#~ "an additional perimeter. If expressed as percentage (example: 15%) it is " -#~ "calculated over infill extrusion width. PrusaSlicer tries to connect two " -#~ "close infill lines to a short perimeter segment. If no such perimeter " -#~ "segment shorter than infill_anchor_max is found, the infill line is " -#~ "connected to a perimeter segment at just one side and the length of the " -#~ "perimeter segment taken is limited to this parameter, but no longer than " -#~ "anchor_length_max. Set this parameter to zero to disable anchoring " -#~ "perimeters connected to a single infill line." -#~ msgstr "" -#~ "Verbindet eine Infill-Linie mit einem kurzen Segment eines zusätzlichen " -#~ "Perimeters mit einem internen Perimeter. Wenn sie als Prozentsatz " -#~ "ausgedrückt wird (Beispiel: 15%), wird sie über die Breite der Infill-" -#~ "Extrusion berechnet. PrusaSlicer versucht, zwei nahe beieinander liegende " -#~ "Infill-Linien mit einem kurzen Umfangssegment zu verbinden. Wenn kein " -#~ "solches Perimetersegment gefunden wird, das kürzer als infill_anchor_max " -#~ "ist, wird die Infill-Linie nur an einer Seite mit einem Perimetersegment " -#~ "verbunden und die Länge des genommenen Perimetersegments ist auf diesen " -#~ "Parameter begrenzt, aber nicht länger als anchor_length_max. Setzen Sie " -#~ "diesen Parameter auf Null, um die Verankerung von Perimetern zu " -#~ "deaktivieren, die mit einer einzelnen Infill-Linie verbunden sind." - -#~ msgid "" -#~ "Connect an infill line to an internal perimeter with a short segment of " -#~ "an additional perimeter. If expressed as percentage (example: 15%) it is " -#~ "calculated over infill extrusion width. PrusaSlicer tries to connect two " -#~ "close infill lines to a short perimeter segment. If no such perimeter " -#~ "segment shorter than this parameter is found, the infill line is " -#~ "connected to a perimeter segment at just one side and the length of the " -#~ "perimeter segment taken is limited to infill_anchor, but no longer than " -#~ "this parameter. Set this parameter to zero to disable anchoring." -#~ msgstr "" -#~ "Verbindet eine Infill-Linie mit einem kurzen Segment eines zusätzlichen " -#~ "Perimeters mit einem internen Perimeter. Wenn sie als Prozentsatz " -#~ "ausgedrückt wird (Beispiel: 15%), wird sie über die Breite der Infill-" -#~ "Extrusion berechnet. PrusaSlicer versucht, zwei nahe beieinander liegende " -#~ "Infill-Linien mit einem kurzen Umfangssegment zu verbinden. Wenn kein " -#~ "solches Perimetersegment gefunden wird, das kürzer als dieser Parameter " -#~ "ist, wird die Infill-Linie nur an einer Seite mit einem Perimetersegment " -#~ "verbunden und die Länge des genommenen Perimetersegments wird auf " -#~ "infill_anchor begrenzt, aber nicht länger als dieser Parameter. Setzen " -#~ "Sie diesen Parameter auf Null, um die Verankerung zu deaktivieren." - -#~ msgid "" -#~ "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " -#~ "intervals into the G-code to let the firmware show accurate remaining " -#~ "time. As of now only the Prusa i3 MK3 firmware recognizes M73. Also the " -#~ "i3 MK3 firmware supports M73 Qxx Sxx for the silent mode." -#~ msgstr "" -#~ "Schreibt M73 P[Prozent gedruckt] R[Restzeit in Minuten] im Abstand von 1 " -#~ "Minute in den G-Code, damit die Firmware die genaue Restzeit anzeigt. Ab " -#~ "sofort erkennt nur noch die Prusa i3 MK3 Firmware das M73. Die i3 MK3 " -#~ "Firmware unterstützt auch das M73 Qxx Sxx für den Silent Mode." - -#~ msgid "" -#~ "This start procedure is inserted at the beginning, after bed has reached " -#~ "the target temperature and extruder just started heating, and before " -#~ "extruder has finished heating. If PrusaSlicer detects M104 or M190 in " -#~ "your custom codes, such commands will not be prepended automatically so " -#~ "you're free to customize the order of heating commands and other custom " -#~ "actions. Note that you can use placeholder variables for all PrusaSlicer " -#~ "settings, so you can put a \"M109 S[first_layer_temperature]\" command " -#~ "wherever you want." -#~ msgstr "" -#~ "Dieser Startvorgang wird am Anfang eingefügt, nachdem das Bett die " -#~ "Solltemperatur erreicht hat und der Extruder gerade mit dem Erwärmen " -#~ "begonnen hat, und bevor der Extruder das Erwärmen beendet hat. Wenn " -#~ "PrusaSlicer M104 oder M190 in Ihren benutzerdefinierten Codes erkennt, " -#~ "werden solche Befehle nicht automatisch vorangestellt, so dass Sie die " -#~ "Reihenfolge der Heizbefehle und andere benutzerdefinierte Aktionen " -#~ "anpassen können. Beachten Sie, dass Sie Platzhaltervariablen für alle " -#~ "PrusaSlicer-Einstellungen verwenden können, so dass Sie einen Befehl " -#~ "\"M109 S[first_layer_temperature]\" beliebig platzieren können." - -#~ msgid "" -#~ "This start procedure is inserted at the beginning, after any printer " -#~ "start gcode (and after any toolchange to this filament in case of multi-" -#~ "material printers). This is used to override settings for a specific " -#~ "filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom " -#~ "codes, such commands will not be prepended automatically so you're free " -#~ "to customize the order of heating commands and other custom actions. Note " -#~ "that you can use placeholder variables for all PrusaSlicer settings, so " -#~ "you can put a \"M109 S[first_layer_temperature]\" command wherever you " -#~ "want. If you have multiple extruders, the gcode is processed in extruder " -#~ "order." -#~ msgstr "" -#~ "Dieser Startvorgang wird am Anfang, nach jedem Drucker-Startgcode (und " -#~ "nach jedem Werkzeugwechsel zu diesem Filament bei Multi-Material-" -#~ "Druckern) eingefügt. Dies wird verwendet, um die Einstellungen für einen " -#~ "bestimmten Filament zu überschreiben. Wenn PrusaSlicer M104, M109, M140 " -#~ "oder M190 in Ihren benutzerdefinierten Codes erkennt, werden solche " -#~ "Befehle nicht automatisch vorangestellt, so dass Sie die Reihenfolge der " -#~ "Heizbefehle und andere benutzerdefinierte Aktionen anpassen können. " -#~ "Beachten Sie, dass Sie Platzhaltervariablen für alle PrusaSlicer-" -#~ "Einstellungen verwenden können, so dass Sie einen Befehl \"M109 " -#~ "S[first_layer_temperature]\" beliebig platzieren können. Wenn Sie mehrere " -#~ "Extruder haben, wird der gcode in Extruderreihenfolge verarbeitet." - -#~ msgid "" -#~ "This custom code is inserted before every toolchange. Placeholder " -#~ "variables for all PrusaSlicer settings as well as {toolchange_z}, " -#~ "{previous_extruder} and {next_extruder} can be used. When a tool-changing " -#~ "command which changes to the correct extruder is included (such as " -#~ "T{next_extruder}), PrusaSlicer will emit no other such command. It is " -#~ "therefore possible to script custom behaviour both before and after the " -#~ "toolchange." -#~ msgstr "" -#~ "Dieser benutzerdefinierte Code wird vor jedem Werkzeugwechsel eingefügt. " -#~ "Es können Platzhaltervariablen für alle PrusaSlicer-Einstellungen sowie " -#~ "{toolchange_z}, {previous_extruder} und {next_extruder} verwendet werden. " -#~ "Wenn ein Werkzeugwechsel-Befehl enthalten ist, der zum richtigen Extruder " -#~ "wechselt (z.B. T{next_extruder}), wird PrusaSlicer keinen weiteren " -#~ "solchen Befehl ausgeben. Es ist daher möglich, ein benutzerdefiniertes " -#~ "Verhalten sowohl vor als auch nach dem Werkzeugwechsel zu programmieren." - -#~ msgid "" -#~ "This version of PrusaSlicer may not understand configurations produced by " -#~ "the newest PrusaSlicer versions. For example, newer PrusaSlicer may " -#~ "extend the list of supported firmware flavors. One may decide to bail out " -#~ "or to substitute an unknown value with a default silently or verbosely." -#~ msgstr "" -#~ "Diese Version von PrusaSlicer versteht möglicherweise keine " -#~ "Konfigurationen, die von den neuesten PrusaSlicer-Versionen erzeugt " -#~ "werden. Neuere PrusaSlicer können zum Beispiel die Liste der " -#~ "unterstützten Firmware-Varianten erweitern. Sie können sich entscheiden, " -#~ "das Programm zu verlassen oder einen unbekannten Wert stillschweigend " -#~ "oder interaktiv durch einen Standardwert zu ersetzen." - -#~ msgid "" -#~ "If enabled, the command line arguments are sent to an existing instance " -#~ "of GUI PrusaSlicer, or an existing PrusaSlicer window is activated. " -#~ "Overrides the \"single_instance\" configuration value from application " -#~ "preferences." -#~ msgstr "" -#~ "Wenn aktiviert, werden die Befehlszeilenargumente an eine vorhandene " -#~ "Instanz der GUI PrusaSlicer gesendet, oder ein vorhandenes PrusaSlicer-" -#~ "Fenster wird aktiviert. Übersteuert den Konfigurationswert " -#~ "\"single_instance\" aus den Anwendungseinstellungen." - -#~ msgid "Prusa FFF Technology Printers" -#~ msgstr "Prusa FFF Technologie Drucker" - -#~ msgid "Prusa MSLA Technology Printers" -#~ msgstr "Prusa MSLA Technologie Drucker" - -#~ msgid "Block supports by angle" -#~ msgstr "Stützen nach Winkel blockieren" - -#~ msgid "Add supports by angle" -#~ msgstr "Stützen nach Winkel hinzufügen" - -#~ msgid "New release version %1% is available." -#~ msgstr "Die neue Release-Version %1% ist verfügbar." - -#~ msgid "See Download page." -#~ msgstr "Siehe Download-Seite." - -#~ msgid "New prerelease version %1% is available." -#~ msgstr "Die neue Vorabversion %1% ist verfügbar." - -#~ msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" -#~ msgstr "Wählen Sie eine oder mehrere Dateien (STL/OBJ/AMF/3MF/PRUSA):" - -#~ msgid "Expert View Mode" -#~ msgstr "Experten Anzeigemodus" - -#~ msgid "Loading a new project while the current project is modified." -#~ msgstr "" -#~ "Laden eines neuen Projekts, während das aktuelle Projekt geändert wurde." - -#~ msgid "Project is loading" -#~ msgstr "Projekt wird geladen" - -#~ msgid "Opening new project while some presets are unsaved." -#~ msgstr "" -#~ "Öffnen eines neuen Projekts, während einige Voreinstellungen nicht " -#~ "gespeichert sind." - -#~ msgid "PrusaSlicer GUI initialization failed" -#~ msgstr "PrusaSlicer GUI-Initialisierung fehlgeschlagen" - -#~ msgid "Gallery" -#~ msgstr "Gallerie" - -#~ msgid "Replace the selected volume with new STL" -#~ msgstr "Das ausgewählte Volumen durch eine neue STL ersetzen" - -#~ msgid "Selection-Remove from list" -#~ msgstr "Auswahl aus Liste entfernen" - -#~ msgid "Selection-Add from list" -#~ msgstr "Auswahl aus Liste hinzufügen" - -#~ msgid "Open project STL/OBJ/AMF/3MF with config, clear plater" -#~ msgstr "Öffne Projekt STL/OBJ/AMF/3MF mit Konfiguration, Druckplatte leeren" - -#~ msgid "Prusa 3D &Drivers" -#~ msgstr "Prusa 3&D Treiber" - -#~ msgid "Open the Prusa3D drivers download page in your browser" -#~ msgstr "Download-Seite für die Prusa3D-Treiber in Ihrem Browser öffnen" - -#~ msgid "Software &Releases" -#~ msgstr "Software &Release" - -#~ msgid "Open the software releases page in your browser" -#~ msgstr "Seite mit Programmversionen in Ihrem Browser öffnen" - -#~ msgid "%s &Website" -#~ msgstr "%s &Webseite" - -#~ msgid "Open the %s website in your browser" -#~ msgstr "%s-Website in Ihrem Browser öffnen" - -#~ msgid "System &Info" -#~ msgstr "System&informationen" - -#~ msgid "Report an I&ssue" -#~ msgstr "Ein &Problem melden" - -#~ msgid "Report an issue on %s" -#~ msgstr "Einen Problem melden über %s" - -#~ msgid "Show Tip of the Day" -#~ msgstr "Tipp des Tages anzeigen" - -#~ msgid "" -#~ "Opens Tip of the day notification in bottom right corner or shows another " -#~ "tip if already opened." -#~ msgstr "" -#~ "Öffnet die Benachrichtigung über den Tipp des Tages in der unteren " -#~ "rechten Ecke oder zeigt einen anderen Tipp an, wenn er bereits geöffnet " -#~ "ist." - -#~ msgid "Iso" -#~ msgstr "Iso" - -#~ msgid "Import STL/OBJ/AM&F/3MF" -#~ msgstr "Importiere STL/OBJ/AM&F/3MF" - -#~ msgid "Import STL (Imperial Units)" -#~ msgstr "STL importieren (imperiale Einheiten)" - -#~ msgid "Load an model saved with imperial units" -#~ msgstr "Laden eines mit imperialen Einheiten gespeicherten Modells" - -#~ msgid "Import SL1 / SL1S Archive" -#~ msgstr "Import SL1 / SL1S Archiv" - -#~ msgid "Load an SL1 / Sl1S archive" -#~ msgstr "Laden eines SL1 / SL1S Archiv" - -#~ msgid "Import &Config" -#~ msgstr "Importiere &Konfiguration" - -#~ msgid "Load exported configuration file" -#~ msgstr "Laden einer exportierten Konfigurationsdatei" - -#~ msgid "Import Config from &Project" -#~ msgstr "Importiere Konfiguration von &Projekt" - -#~ msgid "Load configuration from project file" -#~ msgstr "Lade Konfiguration aus Projektdatei" - -#~ msgid "Import Config &Bundle" -#~ msgstr "Importiere Konfi&gurationssamlung" - -#~ msgid "Load presets from a bundle" -#~ msgstr "Lade Voreinstellungen aus einer Sammlung" - -#~ msgid "&Import" -#~ msgstr "&Import" - -#~ msgid "S&end G-code" -#~ msgstr "S&ende G-code" - -#~ msgid "Send to print current plate as G-code" -#~ msgstr "Sende die aktuelle Plattenbelegung als G-Code zum Drucken" - -#~ msgid "Export G-code to SD Card / Flash Drive" -#~ msgstr "G-Code auf SD-Karte/Flash-Laufwerk exportieren" - -#~ msgid "Export current plate as G-code to SD card / Flash drive" -#~ msgstr "" -#~ "Aktuelle Druckplatte als G-Code auf SD-Karte/Flash-Laufwerk exportieren" - -#~ msgid "Export Plate as &STL" -#~ msgstr "Exportiere die Plattenbelegung als &STL" - -#~ msgid "Export Plate as STL &Including Supports" -#~ msgstr "Exportiere Plattenbelegung als STL einschließlich Stützen" - -#~ msgid "Export current plate as STL including supports" -#~ msgstr "" -#~ "Exportiert die aktuelle Plattenbelegung als STL einschließlich Stützen" - -#~ msgid "Export &Config" -#~ msgstr "Export &Konfiguration" - -#~ msgid "Export current configuration to file" -#~ msgstr "Exportiere die aktuelle Konfiguration in eine Datei" - -#~ msgid "Export Config &Bundle" -#~ msgstr "Konfigurationssa&mlung exportieren" - -#~ msgid "Export all presets to file" -#~ msgstr "Exportiere alle Voreinstellungen in eine Datei" - -#~ msgid "Export Config Bundle With Physical Printers" -#~ msgstr "Konfigurations-Bundle mit physischen Druckern exportieren" - -#~ msgid "Export all presets including physical printers to file" -#~ msgstr "" -#~ "Alle Voreinstellungen einschließlich physischer Drucker in eine Datei " -#~ "exportieren" - -#~ msgid "Ejec&t SD Card / Flash Drive" -#~ msgstr "SD-Kar&te/Flash-Laufwerk auswerfen" - -#~ msgid "Eject SD card / Flash drive after the G-code was exported to it." -#~ msgstr "" -#~ "SD-Karte / Flash-Laufwerk auswerfen, nachdem der G-Code dorthin " -#~ "exportiert wurde." - -#~ msgid "(Re)Slice No&w" -#~ msgstr "(Re)Slice jet&zt" - -#~ msgid "Start new slicing process" -#~ msgstr "Neuen Slicing-Prozess starten" - -#~ msgid "&Repair STL file" -#~ msgstr "STL-Datei &reparieren" - -#~ msgid "Automatically repair an STL file" -#~ msgstr "Repariere automatisch die STL Datei" - -#~ msgid "&G-code Preview" -#~ msgstr "&G-Code-Vorschau" - -#~ msgid "&Select All" -#~ msgstr "Alle&s auswählen" - -#~ msgid "D&eselect All" -#~ msgstr "All&es Abwählen" - -#~ msgid "&Delete Selected" -#~ msgstr "Löschen ausgewählte (&D)" - -#~ msgid "Delete &All" -#~ msgstr "&Alles löschen" - -#~ msgid "Show &Labels" -#~ msgstr "Anzeigen Beschriftungen (&L)" - -#~ msgid "Show object/instance labels in 3D scene" -#~ msgstr "Objekt-/Kopiebeschriftungen in der 3D-Szene anzeigen" - -#~ msgid "&Collapse Sidebar" -#~ msgstr "Seitenleiste s&chließen" - -#~ msgid "&Fullscreen" -#~ msgstr "Vollbild (&F)" - -#~ msgid "Fullscreen" -#~ msgstr "Vollbild" - -#~ msgid "E&xport" -#~ msgstr "E&xport" - -#~ msgid "S&end to print" -#~ msgstr "Zum Drucken s&enden" - -#~ msgid "Mate&rial Settings Tab" -#~ msgstr "Mate&rial Einstellungen" - -#~ msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" -#~ msgstr "Wählen Sie eine Datei zum Slicen (STL/OBJ/AMF/3MF/PRUSA):" - -#~ msgid "%1% (%2$d shell)" -#~ msgid_plural "%1% (%2$d shells)" -#~ msgstr[0] "%1% (%2$d Wand)" -#~ msgstr[1] "%1% (%2$d Wände)" - -#~ msgid "Used Material (ml)" -#~ msgstr "Benutztes Material (ml)" - -#~ msgid "object" -#~ msgid_plural "objects" -#~ msgstr[0] "Objekt" -#~ msgstr[1] "Objekte" - -#~ msgid "supports and pad" -#~ msgstr "Stützen und Grundschicht" - -#~ msgid "Used Filament (in)" -#~ msgstr "Filamentbedarf (Zoll)" - -#~ msgid "objects" -#~ msgstr "Objekte" - -#~ msgid "wipe tower" -#~ msgstr "Reinigungsturm" - -#~ msgid "Used Filament (in³)" -#~ msgstr "Filamentbedarf (Zoll³)" - -#~ msgid "Filament at extruder %1%" -#~ msgstr "Filament auf Extruder %1%" - -#~ msgid "(including spool)" -#~ msgstr "(einschließlich Spule)" - -#~ msgid "normal mode" -#~ msgstr "Normaler Modus" - -#~ msgid "stealth mode" -#~ msgstr "Stealth Modus" - -#~ msgid "" -#~ "The preset below was temporarily installed on the active instance of " -#~ "PrusaSlicer" -#~ msgid_plural "" -#~ "The presets below were temporarily installed on the active instance of " -#~ "PrusaSlicer" -#~ msgstr[0] "" -#~ "Die folgende Voreinstellung wurde vorübergehend auf der aktiven Instanz " -#~ "von PrusaSlicer installiert" -#~ msgstr[1] "" -#~ "Die folgenden Voreinstellungen wurden vorübergehend auf der aktiven " -#~ "Instanz von PrusaSlicer installiert" - -#~ msgid "" -#~ "Your object appears to be too large, so it was automatically scaled down " -#~ "to fit your print bed." -#~ msgstr "" -#~ "Ihr Objekt scheint zu groß zu sein. Es wurde deshalb automatisch " -#~ "verkleinert, um auf Ihre Druckplatte zu passen." - -#~ msgid "Object too large?" -#~ msgstr "Objekt zu groß?" - -#~ msgid "Physical printers" -#~ msgstr "Physische Drucker" - -#~ msgid "Cannot overwrite an external profile." -#~ msgstr "Ein externes Profil kann nicht überschrieben werden." - -#~ msgid "Selection-Add" -#~ msgstr "Auswahl hinzufügen" - -#~ msgid "Selection-Remove" -#~ msgstr "Auswahl entfernen" - -#~ msgid "Selection-Add All" -#~ msgstr "Auswahl Alles hinzufügen" - -#~ msgid "Selection-Remove All" -#~ msgstr "Auswahl Alles entfernen" - -#~ msgid "" -#~ "Hover the cursor over buttons to find more information \n" -#~ "or click this button." -#~ msgstr "" -#~ "Bewegen Sie den Mauszeiger über die Schaltflächen, um weitere " -#~ "Informationen zu erhalten,\n" -#~ "oder klicken Sie auf diese Schaltfläche." - -#~ msgid "Search in settings [%1%]" -#~ msgstr "Suche in Einstellungen [%1%]" - -#~ msgid "Quality (slower slicing)" -#~ msgstr "Qualität (langsameres Slicen)" - -#~ msgid "Reducing printing time" -#~ msgstr "Druckzeit wird verkürzt" - -#~ msgid "Modifiers" -#~ msgstr "Veränderer" - -#~ msgid "Multiple Extruders" -#~ msgstr "Mehrere Extruder" - -#~ msgid "Overlap" -#~ msgstr "Überlappung" - -#~ msgid "Filament Overrides" -#~ msgstr "Filament Übersteuerung" - -#~ msgid "Filament properties" -#~ msgstr "Filament Eigenschaften" - -#~ msgid "" -#~ "Note: All parameters from this group are moved to the Physical Printer " -#~ "settings (see changelog).\n" -#~ "\n" -#~ "A new Physical Printer profile is created by clicking on the \"cog\" icon " -#~ "right of the Printer profiles combo box, by selecting the \"Add physical " -#~ "printer\" item in the Printer combo box. The Physical Printer profile " -#~ "editor opens also when clicking on the \"cog\" icon in the Printer " -#~ "settings tab. The Physical Printer profiles are being stored into " -#~ "PrusaSlicer/physical_printer directory." -#~ msgstr "" -#~ "Hinweis: Alle Parameter aus dieser Gruppe werden in die Einstellungen des " -#~ "physischen Druckers verschoben (siehe Changelog).\n" -#~ "\n" -#~ "Ein neues physisches Druckerprofil wird erstellt, indem man auf das " -#~ "\"Zahnrad\"-Symbol rechts vom Auswahlfeld \"Druckerprofile\" klickt, " -#~ "indem man den Punkt \"Physischen Drucker hinzufügen\" im Auswahlfeld " -#~ "\"Drucker\" auswählt. Der Profil-Editor für physische Drucker wird auch " -#~ "durch Klicken auf das \"Zahnrad\"-Symbol in der Registerkarte " -#~ "\"Druckereinstellungen\" geöffnet. Die Profile des physischen Druckers " -#~ "werden im Verzeichnis PrusaSlicer/physical_printer gespeichert." - -#~ msgid "remove" -#~ msgstr "Entfernen" - -#~ msgid "delete" -#~ msgstr "löschen" - -#~ msgid "Show simplified settings" -#~ msgstr "Vereinfachte Einstellungen anzeigen" - -#~ msgid "Show advanced settings" -#~ msgstr "Ausführliche Einstellungen anzeigen" +#~ msgid "Pause(hotend temperature error)" +#~ msgstr "Pause(hotend temperature error)" -#~ msgid "Some objects are too close; your extruder will collide with them." -#~ msgstr "" -#~ "Einige Objekte sind zu nahe; Ihr Extruder wird mit ihnen zusammenstoßen." - -#~ msgid "" -#~ "Some objects are too tall and cannot be printed without extruder " -#~ "collisions." -#~ msgstr "" -#~ "Einige Objekte sind zu hoch und können nicht ohne Zusammenstoß mit dem " -#~ "Extruder gedruckt werden." - -#~ msgid "Combine infill every" -#~ msgstr "Infill kombinieren alle" - -#~ msgid "" -#~ "This feature allows to combine infill and speed up your print by " -#~ "extruding thicker infill layers while preserving thin perimeters, thus " -#~ "accuracy." -#~ msgstr "" -#~ "Diese Einstellung erlaubt es, Infill zu kombinieren und die Druckdauer zu " -#~ "verringern, indem stärkere Infill-Schichten gedruckt werden, während " -#~ "gleichzeitig dünne Außenkonturen und damit die Genauigkeit erhalten " -#~ "bleiben." - -#~ msgid "Combine infill every n layers" -#~ msgstr "Kombiniere das Infill all n Schichten" - -#~ msgid "Infill extruder" -#~ msgstr "Infill Extruder" - -#~ msgid "Only infill where needed" -#~ msgstr "Infill nur wo es notwendig ist drucken" - -#~ msgid "Perimeter extruder" -#~ msgstr "Umfang Extruder" - -#~ msgid "Solid infill extruder" -#~ msgstr "Massives Infill Extruder" - -#~ msgid "Generate support material" -#~ msgstr "Generiere Stützmaterial" - -#~ msgid "Enable support material generation." -#~ msgstr "Aktiviert Generierung von Stützmaterial." - -#~ msgid "Auto generated supports" -#~ msgstr "Stützen automatisch generieren" +#~ msgid "Pause(toolhead shell off)" +#~ msgstr "Pause(toolhead shell off)" -#~ msgid "" -#~ "If checked, supports will be generated automatically based on the " -#~ "overhang threshold value. If unchecked, supports will be generated inside " -#~ "the \"Support Enforcer\" volumes only." -#~ msgstr "" -#~ "Wenn dieses Kontrollkästchen aktiviert ist, werden Stützen automatisch " -#~ "basierend auf dem Schwellenwert für den Überhang generiert. Wenn diese " -#~ "Option nicht aktiviert ist, werden Stützen nur innerhalb der Volumen der " -#~ "\"Stützverstärker\" generiert." - -#~ msgid "0.1 (detachable)" -#~ msgstr "0,1 (lösbar)" - -#~ msgid "Support material/raft/skirt extruder" -#~ msgstr "Stützmaterial/Raft/Schürzen Extruder" - -#~ msgid "Support material/raft interface extruder" -#~ msgstr "Stützmaterial/Raft Schnittstellen Extruder" - -#~ msgid "Don't arrange" -#~ msgstr "Nicht Anordnen" - -#~ msgid "" -#~ "Do not rearrange the given models before merging and keep their original " -#~ "XY coordinates." -#~ msgstr "" -#~ "Die angegebenen Modelle werden vor dem Zusammenführen nicht neu " -#~ "angeordnet und behalten ihre ursprünglichen XY-Koordinaten." - -#~ msgid "" -#~ "Shapes gallery\n" -#~ "Did you know that PrusaSlicer has a Shapes Gallery? You can use the " -#~ "included models as modifiers, negative volumes or as printable objects. " -#~ "Right-click the platter and selectAdd Shape - Gallery." -#~ msgstr "" -#~ "Formen-Galerie\n" -#~ "Wussten Sie, dass PrusaSlicer eine Formen-Galerie hat? Sie können die " -#~ "enthaltenen Modelle als Modifizierer, negative Volumen oder als druckbare " -#~ "Objekte verwenden. Klicken Sie mit der rechten Maustaste auf die " -#~ "Plattform und wählen SieForm hinzufügen - Galerie." +#~ msgid "Please upgrade your printer first" +#~ msgstr "Please upgrade your printer first" #~ msgid "" -#~ "Negative volume\n" -#~ "Did you know that you can subtract one mesh from another using the " -#~ "Negative volume modifier? That way you can, for example, create easily " -#~ "resizable holes directly in PrusaSlicer. Read more in the documentation. " -#~ "(Requires Advanced or Expert mode.)" +#~ "Preview only mode:\n" +#~ "The loaded file contains gcode only." #~ msgstr "" -#~ "Negatives Volumen\n" -#~ "Wussten Sie, dass Sie mit dem Modifizierer \"Negatives Volumen\" ein Netz " -#~ "von einem anderen subtrahieren können? Auf diese Weise können Sie z.B. " -#~ "leicht veränderbare Löcher direkt in PrusaSlicer erstellen. Lesen Sie " -#~ "mehr in der Dokumentation. (Erfordert den Fortgeschrittenen- oder " -#~ "Expertenmodus.)" +#~ "Preview only mode:\n" +#~ "The loaded file contains gcode only." -#~ msgid "" -#~ "Reload from disk\n" -#~ "Did you know that if you created a newer version of your model, you can " -#~ "simply reload it in PrusaSlicer? Right-click the model in the 3D view and " -#~ "choose Reload from disk. Read more in the documentation." -#~ msgstr "" -#~ "Neu laden von der Festplatte\n" -#~ "Wussten Sie, dass Sie, wenn Sie eine neuere Version Ihres Modells " -#~ "erstellt haben, diese einfach in PrusaSlicer neu laden können? Klicken " -#~ "Sie mit der rechten Maustaste auf das Modell in der 3D-Ansicht und wählen " -#~ "Sie Von Festplatte neu laden. Lesen Sie mehr in der Dokumentation." - -#~ msgid "" -#~ "Search functionality\n" -#~ "Did you know that you use theSearchtool to quickly find a specific " -#~ "PrusaSlicer setting? Or use the familiar shortcut Ctrl+F." -#~ msgstr "" -#~ "Die Suchfunktion\n" -#~ "Wussten Sie schon, dass Sie mit demSuchen-Werkzeug schnell eine " -#~ "bestimmte PrusaSlicer-Einstellung finden können? Oder verwenden Sie den " -#~ "bekannten Shortcut Strg+F." +#~ msgid "Preview only mode for gcode file." +#~ msgstr "Preview only mode for gcode file." #~ msgid "" -#~ "Fullscreen mode\n" -#~ "Did you know that you can switch PrusaSlicer to fullscreen mode? Use the " -#~ "F11 hotkey." -#~ msgstr "" -#~ "Vollbildmodus\n" -#~ "Wussten Sie, dass Sie PrusaSlicer in den Vollbildmodus schalten können? " -#~ "Verwenden Sie die Tastenkombination F11." - -#~ msgid "&Collapse sidebar" -#~ msgstr "Seitenleiste zuklappen (&C)" - -#~ msgid "&Full screen" -#~ msgstr "Vollbildschirm (&F)" - -#~ msgid "&G-code preview" -#~ msgstr "&G-Code-Vorschau" - -#~ msgid "0.1" -#~ msgstr "0,1" - -#~ msgid "0.2" -#~ msgstr "0,2" - -#~ msgid "Ask for unsaved changes when ??closing application??" -#~ msgstr "" -#~ "Nach nicht gespeicherten Änderungen fragen, wenn ??closing application??" - -#~ msgid "Changelog && Download" -#~ msgstr "Changelog && Download" - -#~ msgid "Compare %1% Presets" -#~ msgstr "%1% Voreinstellungen vergleichen" - -#~ msgid "Delete &all" -#~ msgstr "&Alles löschen" +#~ "Push new filament \n" +#~ "into extruder" +#~ msgstr "Neues Filament in den Extruder drücken" -#~ msgid "Ejec&t SD card / Flash drive" -#~ msgstr "SD-Kar&te/Flash-Laufwerk auswerfen" +#~ msgid "Shift + Any arrow" +#~ msgstr "Umschalttaste + beliebiger Pfeil" -#~ msgid "Export &toolpaths as OBJ" -#~ msgstr "&Werkzeugwege als OBJ exportieren" +#~ msgid "Shift + Mouse wheel" +#~ msgstr "Umschalttaste + Mausrad" -#~ msgid "Export G-code to SD card / Flash drive" -#~ msgstr "G-Code auf SD-Karte/Flash-Laufwerk exportieren" +#~ msgid "Show Model Mesh(TODO)" +#~ msgstr "Modell Mesh anzeigen(TODO)" -#~ msgid "Export plate as STL &including supports" -#~ msgstr "Export&iere Plattenbelegung als STL einschließlich Stützen" +#~ msgid "Show Model Shadow(TODO)" +#~ msgstr "Modellschatten anzeigen(TODO)" -#~ msgid "Flash printer &firmware" -#~ msgstr "Flashe Drucker &Firmware" - -#~ msgid "Full screen" -#~ msgstr "Vollbildschirm" - -#~ msgid "" -#~ "If enabled, application will use the standart Windows system menu,\n" -#~ "but on some combination of display scales it can looks ugly. If disabled, " -#~ "old UI will be used." -#~ msgstr "" -#~ "Wenn diese Option aktiviert ist, verwendet die Anwendung das Standard-" -#~ "Windows-Systemmenü,\n" -#~ "aber bei einigen Kombinationen von Bildschirmgrößen kann es hässlich " -#~ "aussehen. Wenn deaktiviert, wird die alte Benutzeroberfläche verwendet." +#~ msgid "Show Printable Box(TODO)" +#~ msgstr "Druckbare Box anzeigen(TODO)" -#~ msgid "" -#~ "If enabled, changes made using the sequential slider, in preview, apply " -#~ "only to gcode top layer.If disabled, changes made using the sequential " -#~ "slider, in preview, apply to the whole gcode." +#~ msgid "Successfully sent.Will automatically jump to the device page in %s s" #~ msgstr "" -#~ "Wenn diese Option aktiviert ist, werden Änderungen, die mit dem " -#~ "sequenziellen Schieberegler in der Vorschau vorgenommen werden, nur auf " -#~ "dem G-Code der obersten Ebene angewandt. Wenn sie deaktiviert ist, werden " -#~ "Änderungen, die mit dem sequenziellen Schieberegler in der Vorschau " -#~ "vorgenommen werden, auf den gesamten G-Code angewandt." - -#~ msgid "Import Config from &project" -#~ msgstr "Importiere Konfiguration von &Projekt" - -#~ msgid "Import SL1 / SL1S archive" -#~ msgstr "Import SL1 / SL1S Archiv" - -#~ msgid "Import STL (imperial units)" -#~ msgstr "STL importieren (imperiale Einheiten)" +#~ "Successfully sent.Will automatically jump to the device page in %s s" -#~ msgid "PrusaSlicer" -#~ msgstr "PrusaSlicer" +#~ msgid "Swith cloud environment, Please login again!" +#~ msgstr "Cloud-Umgebung wechseln, bitte erneut anmelden!" #~ msgid "" -#~ "PrusaSlicer detected another configuration folder at %s.\n" -#~ "Its version is %s.\n" -#~ "Last version you used in current configuration folder is %s.\n" -#~ "Please note that PrusaSlicer uses different folders to save configuration " -#~ "of alpha, beta and full release versions.\n" -#~ "Would you like to copy found configuration to your current configuration " -#~ "folder?\n" -#~ "\n" -#~ "If you select yes, PrusaSlicer will copy all profiles and other files " -#~ "from found folder to the current one. Overwriting any existing file with " -#~ "matching name.\n" -#~ "If you select no, you will continue with current configuration." +#~ "The firmware versions of printer and AMS are too low.Please update to the " +#~ "latest version before sending the print job" #~ msgstr "" -#~ "PrusaSlicer hat einen weiteren Konfigurationsordner bei %s entdeckt.\n" -#~ "Seine Version ist %s.\n" -#~ "Die letzte Version, die Sie im aktuellen Konfigurationsordner verwendet " -#~ "haben, ist %s.\n" -#~ "Bitte beachten Sie, dass PrusaSlicer unterschiedliche Ordner verwendet, " -#~ "um die Konfiguration von Alpha-, Beta- und Vollversionen zu speichern.\n" -#~ "Möchten Sie die gefundene Konfiguration in Ihren aktuellen " -#~ "Konfigurationsordner kopieren?\n" -#~ "\n" -#~ "Wenn Sie ja wählen, kopiert PrusaSlicer alle Profile und andere Dateien " -#~ "aus dem gefundenen Ordner in den aktuellen Ordner. Dabei werden alle " -#~ "vorhandenen Dateien mit dem gleichen Namen überschrieben.\n" -#~ "Wenn Sie \"Nein\" wählen, werden Sie mit der aktuellen Konfiguration " -#~ "fortfahren." - -#~ msgid "" -#~ "PrusaSlicer detected another configuration folder at %s.\n" -#~ "Its version is %s.\n" -#~ "There is no configuration file in current configuration folder.\n" -#~ "Please note that PrusaSlicer uses different folders to save configuration " -#~ "of alpha, beta and full release versions.\n" -#~ "Would you like to copy found configuration to your current configuration " -#~ "folder?\n" -#~ "\n" -#~ "If you select yes, PrusaSlicer will copy all profiles and other files " -#~ "from found folder to the current one.\n" -#~ "If you select no, you will start with clean installation with " -#~ "configuration wizard." -#~ msgstr "" -#~ "PrusaSlicer hat einen weiteren Konfigurationsordner bei %s entdeckt.\n" -#~ "Seine Version ist %s.\n" -#~ "Es gibt keine Konfigurationsdatei im aktuellen Konfigurationsordner.\n" -#~ "Bitte beachten Sie, dass PrusaSlicer unterschiedliche Ordner verwendet, " -#~ "um die Konfiguration von Alpha-, Beta- und Vollversionen zu speichern.\n" -#~ "Möchten Sie die gefundene Konfiguration in Ihren aktuellen " -#~ "Konfigurationsordner kopieren?\n" -#~ "\n" -#~ "Wenn Sie Ja wählen, kopiert PrusaSlicer alle Profile und andere Dateien " -#~ "aus dem gefundenen Ordner in den aktuellen Ordner.\n" -#~ "Wenn Sie Nein wählen, beginnen Sie mit einer Neuinstallation mit dem " -#~ "Konfigurationsassistenten." - -#~ msgid "Re&load from disk" -#~ msgstr "Erneutes &Laden von der Festplatte" +#~ "The firmware versions of printer and AMS are too low.Please update to the " +#~ "latest version before sending the print job" -#~ msgid "Remaning errors" -#~ msgstr "Verbleibende Fehler" - -#~ msgid "same as top" -#~ msgstr "gleich wie oben" - -#~ msgid "Save project &as" -#~ msgstr "Projekt speichern &als" - -#~ msgid "Show &labels" -#~ msgstr "Anzeigen &Beschriftungen" - -#~ msgid "Show all preset (including incompatible)" -#~ msgstr "Alle Voreinstellungen anzeigen (auch inkompatible)" - -#~ msgid "Show Tip of the day" -#~ msgstr "Tipp des Tages anzeigen" - -#~ msgid "" -#~ "You will not be asked about the unsaved changes the next time you: \n" -#~ "- close the application,\n" -#~ "- load project,\n" -#~ "- process Undo / Redo with a change of print technology,\n" -#~ "- take/load snapshot,\n" -#~ "- load config file/bundle,\n" -#~ "- export config_bundle" -#~ msgstr "" -#~ "Sie werden nicht nach den ungesicherten Änderungen gefragt, wenn Sie das " -#~ "nächste Mal: \n" -#~ "- die Anwendung schließen,\n" -#~ "- das Projekt laden,\n" -#~ "- Rückgängig / Wiederherstellen mit einem Wechsel der Drucktechnologie " -#~ "bearbeiten,\n" -#~ "- einen Schnappschuss machen/laden,\n" -#~ "- Konfigurationsdatei/Bundle laden,\n" -#~ "- Konfig_Bundle exportieren" +#~ msgid "User pause" +#~ msgstr "User pause" diff --git a/bbl/i18n/en/BambuStudio_en.po b/bbl/i18n/en/BambuStudio_en.po index 697885ff9e..26900e11f5 100644 --- a/bbl/i18n/en/BambuStudio_en.po +++ b/bbl/i18n/en/BambuStudio_en.po @@ -1,8 +1,8 @@ msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-15 10:25+0800\n" +"POT-Creation-Date: 2022-07-22 18:39+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -10,11 +10,11 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=(n==1) ? 0 : 1;\n" "X-Generator: Poedit 3.0.1\n" msgid "Supports Painting" -msgstr "Support painting" +msgstr "Support Painting" msgid "Section view" msgstr "Section view" @@ -46,8 +46,8 @@ msgstr "Erase all painting" msgid "Highlight overhang areas" msgstr "Highlight overhangs" -msgid "Fragment filter" -msgstr "Fragment filter" +msgid "Gap fill" +msgstr "" msgid "Perform" msgstr "Perform" @@ -79,8 +79,8 @@ msgstr "Sphere" msgid "Fill" msgstr "Fill" -msgid "Fragment Filter" -msgstr "Fragment Filter" +msgid "Gap Fill" +msgstr "" msgid "Highlight faces according to overhang angle." msgstr "Highlight faces according to overhang angle." @@ -92,7 +92,7 @@ msgid "Support Generated" msgstr "Support generated" msgid "Lay on face" -msgstr "Lay on face" +msgstr "Lay on Face" #, boost-format msgid "" @@ -229,15 +229,12 @@ msgstr "World coordinates" msgid "°" msgstr "°" -msgid "Position:" -msgstr "Position:" +msgid "Size" +msgstr "Size" msgid "%" msgstr "%" -msgid "Size" -msgstr "Size" - msgid "uniform scale" msgstr "Uniform scale" @@ -328,7 +325,7 @@ msgid "%1%" msgstr "%1%" msgid "Can't apply when proccess preview." -msgstr "Can't apply when proccess preview." +msgstr "Unable to apply when processing preview" msgid "Cancel" msgstr "Cancel" @@ -424,6 +421,13 @@ msgstr "Critical error" msgid "BambuStudio got an unhandled exception: %1%" msgstr "BambuStudio got an unhandled exception: %1%" +msgid "Downloading Bambu Network plug-in" +msgstr "" + +#, c-format, boost-format +msgid "Connect %s[SN:%s] failed!" +msgstr "" + msgid "" "BambuStudio configuration file may be corrupted and is not abled to be " "parsed.Please delete the file and try again." @@ -449,11 +453,14 @@ msgstr "Loading configuration" msgid "Click to download new version in default browser: %s" msgstr "Click to download new version in default browser: %s" -msgid "New version of Bambu Studio" -msgstr "New version of Bambu Studio" - msgid "The Bambu Studio needs an upgrade" -msgstr "The Bambu Studio needs an upgrade" +msgstr "Bambu Studio needs an update!" + +msgid "This is the newest version." +msgstr "This is the newest version." + +msgid "Info" +msgstr "Info" msgid "Loading user presets..." msgstr "Loading user presets..." @@ -476,9 +483,6 @@ msgstr "Choose one or more files (3mf/step/stl/obj/amf):" msgid "Choose one file (gcode/.gco/.g/.ngc/ngc):" msgstr "Choose one file (.gcode/.gco/.g/.ngc/ngc):" -msgid "Login information expired. Please login again." -msgstr "Login information expired. Please login again." - msgid "" "The version of Bambu studio is too low and needs to be updated to the latest " "version before it can be used normally" @@ -486,11 +490,8 @@ msgstr "" "The version of Bambu studio is too low and needs to be updated to the latest " "version before it can be used normally" -msgid "This is the newest version." -msgstr "This is the newest version." - -msgid "Info" -msgstr "Info" +msgid "Login information expired. Please login again." +msgstr "Login information expired. Please login again." msgid "Loading" msgstr "Loading" @@ -572,7 +573,7 @@ msgid "Wipe options" msgstr "Wipe options" msgid "Bed adhension" -msgstr "Bed adhension" +msgstr "Bed adhesion" msgid "Advanced" msgstr "Advanced" @@ -875,13 +876,14 @@ msgstr "Selection conflicts" msgid "" "If first selected item is an object, the second one should also be object." msgstr "" -"If first selected item is an object, the second one should also be an object." +"If the first selected item is an object, the second one should also be an " +"object." msgid "" "If first selected item is a part, the second one should be part in the same " "object." msgstr "" -"If first selected item is a part, the second one should be a part in the " +"If the first selected item is a part, the second one should be a part in the " "same object." msgid "The type of the last solid object part is not to be changed." @@ -953,7 +955,7 @@ msgid "No-brim" msgstr "No-brim" msgid " " -msgstr " " +msgstr "" msgid "Layer height" msgstr "Layer height" @@ -991,12 +993,8 @@ msgstr "Line type" msgid "No printer" msgstr "No printer" -msgid "" -"Heat the nozzle to target \n" -"temperature" +msgid "Heat the nozzle to target temperature" msgstr "" -"Heat the nozzle to target \n" -"temperature" msgid "Cut filament" msgstr "Cut filament" @@ -1004,12 +1002,8 @@ msgstr "Cut filament" msgid "Pull back current filament" msgstr "Pull back current filament" -msgid "" -"Push new filament \n" -"into extruder" +msgid "Push new filament into extruder" msgstr "" -"Push new filament \n" -"into extruder" msgid "Purge old filament" msgstr "Purge old filament" @@ -1051,8 +1045,8 @@ msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " "load or unload filiament." msgstr "" -"Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " -"load or unload filiament." +"Choose an AMS slot then press \"Load\" or \"Unload\" to automatically load " +"or unload filament." msgid "Edit" msgstr "Edit" @@ -1071,8 +1065,8 @@ msgid "" "This plate is locked,\n" "We can not do auto-arrange on this plate." msgstr "" -"This plate is locked,\n" -"We can not do auto-arrange on this plate." +"This plate is locked.\n" +"We can not auto-arrange this plate." msgid "Arranging..." msgstr "Arranging..." @@ -1082,15 +1076,9 @@ msgid "" msgstr "" "Arrange failed. Found some exceptions when processing object geometries." -msgid "Arranging" -msgstr "" - msgid "Arranging canceled." msgstr "Arranging canceled." -# [Cory] I think this works as an explanation, but I want to see if you think it’s clear enough. -# [Yifan] “spacing” is a setting value for “Arrange tool”. So I suggest to keep it. -# [Cory] Got it; sounds good! msgid "" "Arranging is done but there are unpacked items. Reduce spacing and try again." msgstr "" @@ -1121,8 +1109,8 @@ msgid "" "This plate is locked,\n" "We can not do auto-orient on this plate." msgstr "" -"This plate is locked,\n" -"We can not do auto-orient on this plate." +"This plate is locked.\n" +"We can not auto-orient this plate." msgid "Orienting..." msgstr "Orienting..." @@ -1143,7 +1131,7 @@ msgid "Login failed" msgstr "Login failed" msgid "The region parameter is incorrrect" -msgstr "The region parameter is incorrrect" +msgstr "The region parameter is incorrrect." msgid "Failure of printer login" msgstr "Failure of printer login" @@ -1194,15 +1182,42 @@ msgstr "Sending print job over LAN" msgid "Sending print job through cloud service" msgstr "Sending print job through cloud service" +msgid "Service Unavailable" +msgstr "" + +msgid "Unkown Error." +msgstr "" + msgid "Sending print configuration" msgstr "Sending print configuration" #, c-format, boost-format -msgid "Successfully sent.Will automatically jump to the device page in %s s" -msgstr "Successfully sent.Will automatically jump to the device page in %s s" +msgid "Successfully sent. Will automatically jump to the device page in %s s" +msgstr "" + +msgid "An SD card needs to be inserted before printing via LAN." +msgstr "" + +msgid "Downloading" +msgstr "" + +msgid "Download failed" +msgstr "" + +msgid "Cancelled" +msgstr "" + +msgid "Finish" +msgstr "" + +msgid "Installing" +msgstr "" + +msgid "Install failed" +msgstr "" msgid "Portions copyright" -msgstr "Portions copyright" +msgstr "License Info" msgid "Copyright" msgstr "Copyright" @@ -1237,6 +1252,28 @@ msgstr "" msgid "About %s" msgstr "About %s" +msgid "" +"Bambu Studio is based on PrusaSlicer by PrusaResearch and SuperSlicer by " +"Merill(supermerill)." +msgstr "" + +msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." +msgstr "" + +msgid "" +"Slic3r was created by Alessandro Ranellucci with the help of many other " +"contributors." +msgstr "" + +msgid "Bambu Studio also referenced some ideas from Cura by Ultimaker." +msgstr "" + +msgid "" +"There many parts of the software that come from community contributions, so " +"we're unable to list them one-by-one, and instead, they'll be attributed in " +"the corresponding code comments." +msgstr "" + msgid "Colour" msgstr "Colour" @@ -1311,6 +1348,9 @@ msgstr "" msgid "File" msgstr "File" +msgid "Close" +msgstr "Close" + msgid "" "A error occurred. Maybe memory of system is not enough or it's a bug of the " "program" @@ -1467,16 +1507,17 @@ msgid "" "layer for more than %d degree centigrade.\n" "This may cause model broken free from build plate during printing" msgstr "" -"Bed temperature of other layer is lower than bed temperature of initial " -"layer for more than %d degree centigrade.\n" -"This may cause model broken free from build plate during printing" +"The bed temperature of other layers is lower than bed temperature of initial " +"layer by more than %d degree centigrade.\n" +"This may cause models to break free from the build plate during printing." msgid "" "Bed temperature is higher than vitrification temperature of this filament.\n" "This may cause nozzle blocked and printing failure" msgstr "" -"Bed temperature is higher than vitrification temperature of this filament.\n" -"This may cause nozzle blocked and printing failure" +"The bed temperature is higher than the vitrification temperature of this " +"filament.\n" +"This may cause a nozzle blockage or print failure" msgid "" "Too small layer height.\n" @@ -1659,7 +1700,7 @@ msgid "Pause of front cover falling" msgstr "Pause of front cover falling" msgid "Calibrating the micro lida" -msgstr "Calibrating the micro lida" +msgstr "Calibrating the micro lidar" msgid "Calibrating extrusion flow" msgstr "Calibrating extrusion flow" @@ -1709,6 +1750,9 @@ msgstr "Verification failed." msgid "Update failed." msgstr "Update failed." +msgid "Failed to start printing job" +msgstr "" + msgid "N/A" msgstr "N/A" @@ -1945,19 +1989,19 @@ msgid "Add" msgstr "Add" msgid "Add plate" -msgstr "Add plate" +msgstr "Add Plate" msgid "Auto orient" -msgstr "Auto orient" +msgstr "Auto Orient" msgid "Auto arrange" -msgstr "Auto arrange" +msgstr "Auto Arrange" msgid "Split to objects" -msgstr "Split to objects" +msgstr "Split to Objects" msgid "Split to parts" -msgstr "Split to parts" +msgstr "Split to Parts" msgid "Assembly View" msgstr "Assembly View" @@ -1990,20 +2034,19 @@ msgid "Size:" msgstr "Size:" msgid "An object is layed over the boundary of plate." -msgstr "An object is layed over the boundary of plate." +msgstr "An object is laid over the boundary of the plate." msgid "A G-code path goes beyond the boundary of plate." -msgstr "A G-code path goes beyond the boundary of plate." +msgstr "A G-code path goes beyond plate boundaries." msgid "Only the object being edit is visible." msgstr "Only the object being edit is visible." msgid "" -"An object is layed over the boundary of plate.\n" -"Please solve the problem by moving it totally inside or outside plate." +"An object is laid over the boundary of plate or exceeds the height limit.\n" +"Please solve the problem by moving it totally on or off the plate, and " +"confirming that the height is within the build volume." msgstr "" -"An object is laid over the edge of the plate.\n" -"Please solve the problem by moving it totally on or off the plate." msgid "Calibration" msgstr "Calibration" @@ -2026,6 +2069,9 @@ msgstr "Calibration Flow" msgid "Start Calibration" msgstr "Start Calibration" +msgid "Completed" +msgstr "" + msgid "Calibrating" msgstr "Calibrating" @@ -2048,36 +2094,6 @@ msgstr "" "You can find it in \"Settings > Network > Connection code\"\n" "on the printer, as shown in the figure:" -msgid "Creating" -msgstr "Creating" - -msgid "Uploading" -msgstr "Uploading" - -msgid "Waiting" -msgstr "Waiting" - -msgid "Sending" -msgstr "Sending" - -msgid "Finished" -msgstr "Finished" - -msgid "Please fill report first." -msgstr "Please fill report first." - -msgid "Unable to create zip file" -msgstr "Unable to create zip file" - -msgid "Enter a search term" -msgstr "Enter a search term" - -msgid "Online" -msgstr "Online" - -msgid "Offline" -msgstr "Offline" - msgid "Application is closing" msgstr "Closing application" @@ -2099,9 +2115,6 @@ msgstr "Device" msgid "Project" msgstr "Project" -msgid "Debug" -msgstr "Debug" - msgid "Slice" msgstr "Slice" @@ -2133,7 +2146,7 @@ msgid "Show Configuration Folder" msgstr "Show Configuration Folder" msgid "Check for Update" -msgstr "Check for Update" +msgstr "Check for Updates" #, c-format, boost-format msgid "&About %s" @@ -2219,6 +2232,12 @@ msgstr "Export All Object as STL" msgid "Export current Sliced file" msgstr "Export current Sliced file" +msgid "Export G-code" +msgstr "Export G-code" + +msgid "Export current plate as G-code" +msgstr "" + msgid "Export" msgstr "Export" @@ -2276,24 +2295,6 @@ msgstr "Deselect All" msgid "Deselects all objects" msgstr "Deselects all objects" -msgid "Show Model Mesh(TODO)" -msgstr "Show Model Mesh(TODO)" - -msgid "Display triangles of models" -msgstr "Display triangles of models" - -msgid "Show Model Shadow(TODO)" -msgstr "Show Model Shadow(TODO)" - -msgid "Display shadow of objects" -msgstr "Display shadow of objects" - -msgid "Show Printable Box(TODO)" -msgstr "Show Printable Box(TODO)" - -msgid "Display printable box" -msgstr "Display printable box" - msgid "Use Perspective View" msgstr "Use Perspective View" @@ -2363,16 +2364,11 @@ msgstr "Filament settings" msgid "" "Do you want to synchronize your personal data from Bambu Cloud? \n" -"Contains the following information:\n" +"It contains the following information:\n" "1. The Process presets\n" "2. The Filament presets\n" "3. The Printer presets\n" msgstr "" -"Do you want to synchronize your personal data from Bambu Cloud? \n" -"Contains the following information:\n" -"1. The Process presets\n" -"2. The Filament presets\n" -"3. The Printer presets\n" msgid "Synchronization" msgstr "Synchronization" @@ -2424,11 +2420,11 @@ msgstr "Options:" msgid "Swap Y/Z axes" msgstr "Swap Y/Z axes" -msgid "Close" -msgstr "Close" +msgid "Camera" +msgstr "" -msgid "Monitoring" -msgstr "Monitoring" +msgid "Video" +msgstr "" msgid "Printing Progress" msgstr "Printing progress" @@ -2469,6 +2465,9 @@ msgstr "Debug Info" msgid "Printing List" msgstr "Printing list" +msgid "Downloading..." +msgstr "" + msgid "Resume" msgstr "Resume" @@ -2496,15 +2495,15 @@ msgstr "Update" msgid "HMS" msgstr "HMS" -msgid "Please upgrade your printer first" -msgstr "Please upgrade your printer first" - msgid "Failed to connect to the server" msgstr "Failed to connect to the server" msgid "Failed to connect to the printer" msgstr "Failed to connect to the printer" +msgid "Connecting..." +msgstr "" + msgid "OK" msgstr "OK" @@ -2598,10 +2597,6 @@ msgstr "Slice complete" msgid "Export G-Code." msgstr "Export to G-code" -# We’ve got to check on this one -# [Yifan] This is used as hypertext at the end a popup message. -# Hypertext is displayed with underline and can be clicked with left mouse button. -# [Cory] Got it! I took out the period msgid "Export." msgstr "Export" @@ -2620,20 +2615,23 @@ msgstr "Export ok." msgid " (Repair)" msgstr " (Repair)" +msgid " Click here to install it." +msgstr "" + msgid "WARNING:" msgstr "WARNING:" msgid "Your model needs support ! Please make support material enable." -msgstr "Your model needs support ! Please make support material enable." +msgstr "Your model needs support! Please enable support material." msgid "Gcode path overlap" msgstr "G-code path overlap" msgid "Support painting" -msgstr "Support painting" +msgstr "Support Painting" msgid "Color painting" -msgstr "Color painting" +msgstr "Color Painting" msgid "Layers" msgstr "Layers" @@ -2807,7 +2805,7 @@ msgid "" "The object from file %s is too small, and maybe in meters or inches.\n" " Do you want to scale to millimeters?" msgstr "" -"The object from file %s is too small, and maybe in meters or inches.\n" +"The object from file %s is too small, and may be in meters or inches.\n" " Do you want to scale to millimeters?" msgid "Object too small" @@ -2819,13 +2817,6 @@ msgstr "Load these files as a single object with multiple parts?\n" msgid "Object with multiple parts was detected" msgstr "An object with multiple parts was detected" -msgid "" -"Preview only mode:\n" -"The loaded file contains gcode only." -msgstr "" -"Preview only mode:\n" -"The loaded file contains gcode only." - msgid "The file does not contain any geometry data." msgstr "The file does not contain any geometry data." @@ -2863,6 +2854,17 @@ msgstr "Slicing Plate %d" msgid "Please resolve the slicing errors and publish again." msgstr "Please resolve the slicing errors and publish again." +msgid "" +"Network Plug-in is not detected. Network related features are unavailable." +msgstr "" + +msgid "" +"Preview only mode:\n" +"The loaded file contains gcode only, Can not enter the Prepare page" +msgstr "" +"Preview only mode:\n" +"The loaded file contains G-code only and can not enter the Prepare page" + msgid "Some presets are modified." msgstr "Some presets are modified." @@ -2882,9 +2884,6 @@ msgstr "Creating a new project" msgid "Load project" msgstr "Load project" -msgid "Preview only mode for gcode file." -msgstr "Preview only mode for gcode file." - msgid "The selected file" msgstr "The selected file" @@ -2910,7 +2909,7 @@ msgid "Only one G-code file can be opened at the same time." msgstr "Only one G-code file can be opened at a time." msgid "Can not add models when in preview mode!" -msgstr "Can not add models when in preview mode!" +msgstr "Unable to add models in preview mode" msgid "Add Models" msgstr "Add Models" @@ -2945,9 +2944,6 @@ msgstr "" "Print By Object: \n" "Suggest to use auto-arrange to avoid collisions when printing." -msgid "Export G-code" -msgstr "Export G-code" - msgid "Send G-code" msgstr "Send G-code" @@ -3004,7 +3000,7 @@ msgid "Changing application language" msgstr "Changing application language" msgid "Changing the region will log out your account.\n" -msgstr "Changing the region will log out your account.\n" +msgstr "Changing the region will log you out of your account.\n" msgid "Region selection" msgstr "Region selection" @@ -3042,7 +3038,6 @@ msgstr "Imperial" msgid "Units" msgstr "Units" -# [Yifan] Will be removed msgid "User sync" msgstr "User sync" @@ -3060,21 +3055,24 @@ msgstr "Associate .3mf files to Bambu Studio" msgid "If enabled, sets BambuStudio as default application to open .3mf files" msgstr "" -"If enabled, sets Bambu Studio as the default application to open .3mf files" +"If enabled, this sets Bambu Studio as the default application to open .3mf " +"files." msgid "Associate .stl files to BambuStudio" msgstr "Associate .stl files to Bambu Studio" msgid "If enabled, sets BambuStudio as default application to open .stl files" msgstr "" -"If enabled, sets Bambu Studio as the default application to open .stl files" +"If enabled, this sets Bambu Studio as the default application to open .stl " +"files." msgid "Associate .step/.stp files to BambuStudio" msgstr "Associate .step/.stp files to BambuStudio" msgid "If enabled, sets BambuStudio as default application to open .step files" msgstr "" -"If enabled, sets Bambu Studio as the default application to open .step files" +"If enabled, this sets Bambu Studio as the default application to open .step " +"files." msgid "Backup" msgstr "Backup" @@ -3091,21 +3089,12 @@ msgstr "Home page and daily tips" msgid "Show home page on startup" msgstr "Show home page on startup" -# [Yifan] It is a setting name in Preference Menu. -# Is it better to use “Synchronization settings”? -# [Cory] I think “Sync” is probably more common than “Synchronization,” actually. I don’t think we need to change anything. msgid "Sync settings" msgstr "Sync settings" -# [Yifan] It is a setting name in Preference Menu. -# Is it better to use “Preset synchronization”? -# [Cory] I like “Sync,” but depending on how the setting is toggled, it might make sense to say “Sync Presets” msgid "Preset sync" msgstr "Preset sync" -# [Yifan] It is a setting name in Preference Menu. -# Is it better to use “Preference synchronization”? -# [Cory] Same as with presets, it might make sense to say “Sync Preferences” msgid "Preferences sync" msgstr "Preferences sync" @@ -3178,8 +3167,8 @@ msgstr "save debug settings" msgid "DEBUG settings have saved successfully!" msgstr "Debug settings have been saved successfully!" -msgid "Swith cloud environment, Please login again!" -msgstr "Swith cloud environment, Please login again!" +msgid "Switch cloud environment, Please login again!" +msgstr "" msgid "System presets" msgstr "System presets" @@ -3191,7 +3180,7 @@ msgid "Incompatible presets" msgstr "Incompatible presets" msgid "AMS filaments" -msgstr "AMS filaments" +msgstr "AMS filament" msgid "Click to pick filament color" msgstr "Click to pick filament color" @@ -3218,7 +3207,7 @@ msgid "Jump to model publish web page" msgstr "Jump to model publish web page" msgid "Note: The preparation may takes several minutes. Please be patiant." -msgstr "Note: The preparation may takes several minutes. Please be patiant." +msgstr "Note: The preparation may take several minutes. Please be patient." msgid "Publish" msgstr "Publish" @@ -3276,10 +3265,10 @@ msgid "The name is not allowed to be empty." msgstr "The name field is not allowed to be empty." msgid "The name is not allowed to start with space character." -msgstr "The name is not allowed to start with space character." +msgstr "The name is not allowed to start with a space." msgid "The name is not allowed to end with space character." -msgstr "The name is not allowed to end with space character." +msgstr "The name is not allowed to end with a space." msgid "The name cannot be the same as a preset alias name." msgstr "The name cannot be the same as a preset alias name." @@ -3311,6 +3300,12 @@ msgstr "For \"%1%\", add \"%2%\" as a new preset" msgid "Simply switch to \"%1%\"" msgstr "Simply switch to \"%1%\"" +msgid "Online" +msgstr "Online" + +msgid "Offline" +msgstr "Offline" + msgid "My Device" msgstr "My Device" @@ -3320,6 +3315,9 @@ msgstr "Other Device" msgid "Input access code" msgstr "Input access code" +msgid "Log out successful." +msgstr "Log out successful." + msgid "Busy" msgstr "Busy" @@ -3327,10 +3325,10 @@ msgid "Bambu Cool Plate" msgstr "Bambu Cool Plate" msgid "Bamabu Engineering Plate" -msgstr "Bamabu Engineering Plate" +msgstr "Bambu Engineering Plate" msgid "Bamabu High Temperature Plate" -msgstr "Bamabu High Temperature Plate" +msgstr "Bambu High Temperature Plate" msgid "Send print job to" msgstr "Send print job to" @@ -3371,14 +3369,10 @@ msgstr "" "The printer is executing instructions. Please restart printing after it ends" msgid "The printer is busy on other print job" -msgstr "The printer is busy on other print job" +msgstr "The printer is busy with another print job." -msgid "" -"The firmware versions of printer and AMS are too low.Please update to the " -"latest version before sending the print job" +msgid "Printer firmware does not support material = >ams slot mapping." msgstr "" -"The firmware versions of printer and AMS are too low.Please update to the " -"latest version before sending the print job" msgid "" "Filaments to AMS slots mappings have been established. You can click a " @@ -3404,7 +3398,7 @@ msgid "Log in printer" msgstr "Log in printer" msgid "Would you like to log in this printer with current account?" -msgstr "Would you like to log in this printer with current account?" +msgstr "Would you like to log in this printer with the current account?" msgid "Log in successful." msgstr "Log in successful." @@ -3421,9 +3415,6 @@ msgstr "Please log in first." msgid "There was a problem connecting to the printer. Please try again." msgstr "There was a problem connecting to the printer. Please try again." -msgid "Log out successful." -msgstr "Log out successful." - msgid "Failed to log out." msgstr "Failed to log out." @@ -3486,8 +3477,8 @@ msgstr "Flush options" msgid "Special mode" msgstr "Special mode" -msgid "Output file" -msgstr "Output file" +msgid "G-code output" +msgstr "" msgid "Frequent" msgstr "Frequent" @@ -3503,11 +3494,11 @@ msgid_plural "" "estimation." msgstr[0] "" "Following line %s contains reserved keywords.\n" -"Please remove it, or will beat G-code visualization and printing time " +"Please remove it, or will break G-code visualization and printing time " "estimation." msgstr[1] "" "Following lines %s contain reserved keywords.\n" -"Please remove them, or will beat G-code visualization and printing time " +"Please remove them, or will break G-code visualization and printing time " "estimation." msgid "Reserved keywords found" @@ -3547,8 +3538,8 @@ msgid "" "Bed temperature when cool plate is installed. Value 0 means the filament " "does not support to print on the Cool Plate" msgstr "" -"Bed temperature when cool plate is installed. Value 0 means the filament " -"does not support to print on the Cool Plate" +"This is the bed temperature when the cool plate is installed. A value of 0 " +"means the filament does not support printing on the Cool Plate." msgid "Engineering plate" msgstr "Engineering plate" @@ -3557,8 +3548,8 @@ msgid "" "Bed temperature when engineering plate is installed. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" -"Bed temperature when engineering plate is installed. Value 0 means the " -"filament does not support to print on the Engineering Plate" +"This is the bed temperature when the engineering plate is installed. A value " +"of 0 means the filament does not support printing on the Engineering Plate." msgid "High Temp Plate" msgstr "High Temp Plate" @@ -3567,8 +3558,9 @@ msgid "" "Bed temperature when high temperature plate is installed. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" -"Bed temperature when high temperature plate is installed. Value 0 means the " -"filament does not support to print on the High Temp Plate" +"This is the bed temperature when the high temperature plate is installed. A " +"value of 0 means the filament does not support printing on the High Temp " +"Plate." msgid "Volumetric speed limitation" msgstr "Volumetric speed limitation" @@ -3604,7 +3596,7 @@ msgid "" "than the setting value" msgstr "" "Part cooling fan speed will be max when the estimated layer time is shorter " -"than the setting value" +"than the set value." msgid "Auxiliary part cooling fan" msgstr "Auxiliary part cooling fan" @@ -3834,7 +3826,7 @@ msgid "Configuration update" msgstr "Configuration update" msgid "A new configuration package available, Do you want to install it?" -msgstr "A new configuration package available. Do you want to install it?" +msgstr "A new configuration package is available. Do you want to install it?" msgid "Description:" msgstr "Description:" @@ -4166,7 +4158,7 @@ msgid "Copying directory %1% to %2% failed: %3%" msgstr "Copying directory %1% to %2% failed: %3%" msgid "Need to check the unsaved changes before configuration updates." -msgstr "Please check the unsaved changes before updating the configuration." +msgstr "Please check any unsaved changes before updating the configuration." msgid "Configuration package updated to " msgstr "Configuration package updated to " @@ -4203,7 +4195,7 @@ msgid "" "Failed to generate gcode for invalid custom G-code.\n" "\n" msgstr "" -"Failed to generate gcode for invalid custom G-code.\n" +"Failed to generate G-code for invalid custom G-code.\n" "\n" msgid "Please check the custom G-code or use the default custom G-code." @@ -4390,9 +4382,9 @@ msgid "" "together. Otherwise, the extruder and nozzle may be blocked or damaged " "during printing" msgstr "" -"Can not print multiple filaments which have large difference of temperature " +"Unable to print multiple filaments which have large temperature differences " "together. Otherwise, the extruder and nozzle may be blocked or damaged " -"during printing" +"during printing." msgid "No extrusions under current settings." msgstr "No extrusions under current settings." @@ -4515,7 +4507,8 @@ msgstr "Avoid walls when traveling" msgid "Detour and avoid to travel across wall which may cause blob on surface" msgstr "" -"Detour to avoid traveling across walls, which may cause blobs on the surface" +"This detours to avoid traveling across walls, which may cause blobs on the " +"surface" msgid "Max travel detour distance" msgstr "Max travel detour distance" @@ -4534,8 +4527,8 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Cool Plate" msgstr "" -"Bed temperature for layers except the initial one. Value 0 means the " -"filament does not support to print on the Cool Plate" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the Cool Plate." msgid "°C" msgstr "°C" @@ -4547,15 +4540,15 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" -"Bed temperature for layers except the initial one. Value 0 means the " -"filament does not support to print on the Engineering Plate" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the Engineering Plate." msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" -"Bed temperature for layers except the initial one. Value 0 means the " -"filament does not support to print on the High Temp Plate" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the High Temp Plate." msgid "Initial layer" msgstr "First layer" @@ -4567,22 +4560,22 @@ msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Cool Plate" msgstr "" -"Bed temperature of the initial layer. Value 0 means the filament does not " -"support to print on the Cool Plate" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the Cool Plate." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Engineering Plate" msgstr "" -"Bed temperature of the initial layer. Value 0 means the filament does not " -"support to print on the Engineering Plate" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the Engineering Plate." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the High Temp Plate" msgstr "" -"Bed temperature of the initial layer. Value 0 means the filament does not " -"support to print on the High Temp Plate" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the High Temp Plate." msgid "Bed types supported by the printer" msgstr "Bed types supported by the printer" @@ -4631,8 +4624,8 @@ msgid "" "Enable this option to optimize part cooling fan speed for overhang and " "bridge to get better cooling" msgstr "" -"Enable this option to optimize part cooling fan speed for overhang and " -"bridge to get better cooling" +"Enable this option to optimize the part cooling fan speed for overhangs and " +"bridges to get better cooling" msgid "Fan speed for overhang" msgstr "Fan speed for overhang" @@ -4753,10 +4746,10 @@ msgid "" "that layer can be cooled for longer time. This can improve the cooling " "quality for needle and small details" msgstr "" -"Enable this option to slow printing speed down to make the final layer time " -"not shorter than the layer time threshold in \"Max fan speed threshold\", so " -"that layer can be cooled for longer time. This can improve the cooling " -"quality for needle and small details" +"Enable this option to slow printing speed down to ensure that the final " +"layer time is not shorter than the layer time threshold in \"Max fan speed " +"threshold\", so that the layer can be cooled for a longer time. This can " +"improve the cooling quality for needle and small details" msgid "Normal printing" msgstr "Normal printing" @@ -4807,6 +4800,18 @@ msgstr "" "Bridges can usually be printed directly without support if they are not very " "long." +msgid "Thick bridges" +msgstr "" + +msgid "Layers and Perimeters" +msgstr "" + +msgid "" +"If enabled, bridges are more reliable, can bridge longer distances, but may " +"look worse. If disabled, bridges look better but are reliable just for " +"shorter bridged distances." +msgstr "" + msgid "Max bridge length" msgstr "Max bridge length" @@ -4950,9 +4955,9 @@ msgid "" "shorter than this value. Fan speed is interpolated between the minimum and " "maximum fan speeds according to layer printing time" msgstr "" -"Part cooling fan will be enabled for layers of which estimated time is " +"Part cooling fan will be enabled for layers where the estimated time is " "shorter than this value. Fan speed is interpolated between the minimum and " -"maximum fan speeds according to layer printing time" +"maximum fan speeds according to layer printing time." msgid "s" msgstr "s" @@ -5239,8 +5244,8 @@ msgid "" "The metallic material of nozzle. This determines the abrasive resistance of " "nozzle, and what kind of filament can be printed" msgstr "" -"The metallic material of nozzle. This determines the abrasive resistance of " -"nozzle, and what kind of filament can be printed" +"The metallic material of the nozzle: This determines the abrasive resistance " +"of the nozzle and what kind of filament can be printed." msgid "Hardened steel" msgstr "Hardened steel" @@ -5252,7 +5257,7 @@ msgid "Brass" msgstr "Brass" msgid "Enable this option if machine has auxiliary part cooling fan" -msgstr "Enable this option if machine has auxiliary part cooling fan" +msgstr "Enable this option if the machine has an auxiliary part cooling fan" msgid "G-code flavor" msgstr "G-code flavor" @@ -5341,9 +5346,6 @@ msgstr "This G-code is inserted at every layer change after lift z." msgid "Supports silent mode" msgstr "Silent Mode" -# Is this a user-toggled setting for them to turn on silent mode? -# [Yifan] Yes. But for now, this setting is invisible to user. -# [Cory] Got it! For now, I’ll leave the comment on this, so we can come back to it if this setting becomes visible. msgid "" "Whether the machine supports silent mode in which machine use lower " "acceleration to print" @@ -5464,7 +5466,7 @@ msgid "" "is the maximum speed limitation of part cooling fan" msgstr "" "Part cooling fan speed may be increased when auto cooling is enabled. This " -"is the maximum speed limitation of part cooling fan" +"is the maximum speed limitation of the part cooling fan." msgid "Max" msgstr "Max" @@ -5498,8 +5500,6 @@ msgstr "" "The lowest printable layer height for extruder. Used tp limits the minimum " "layer hight when enable adaptive layer height" -# We might want to think about a guideline for when to use abbreviated terms (Min, Max, etc) and when to use full terms. I think the usage here is fine, I just wanted to bring it up. -# [Yifan] I agree. To make it simple, I suggest use Min and Max. msgid "Min print speed" msgstr "Min print speed" @@ -5523,10 +5523,9 @@ msgstr "Reduce infill retraction" msgid "" "Don't retract when the travel is in infill area absolutely. That means the " -"oozing can't been seen" +"oozing can't been seen. This can reduce times of retraction for complex " +"model and save printing time, but make slicing and G-code generating slower" msgstr "" -"This disables retraction when travel is entirely within an infill area and " -"oozing can’t be seen." msgid "Enable" msgstr "Enable" @@ -5545,8 +5544,8 @@ msgid "" "Detect the overhang percentage relative to line width and use different " "speed to print. For 100%% overhang, bridge speed is used." msgstr "" -"Detect the overhang percentage relative to line width and use different " -"speed to print. For 100%% overhang, bridge speed is used." +"This detects the overhang percentage relative to line width and uses a " +"different speed to print. For 100%% overhang, bridging speed is used." msgid "Line width of inner wall" msgstr "Line width of inner wall" @@ -5986,9 +5985,9 @@ msgid "" "layer for more than this threshold. Too low bed temperature of other layer " "may cause the model broken free from build plate" msgstr "" -"Do not recommand bed temperature of other layer to be lower than initial " -"layer for more than this threshold. Too low bed temperature of other layer " -"may cause the model broken free from build plate" +"It is not recommended to have the bed temperature of other layers to be " +"lower than initial layer for more than this threshold. Bed temperatures that " +"are too low may cause models to break free from the build plate." msgid "Detect thin wall" msgstr "Detect thin walls" @@ -6099,8 +6098,7 @@ msgid "" msgstr "" "Purging after filament change will be done inside objects' infills. This may " "lower the amount of waste and decrease the print time. If the walls are " -"printed with transparent filament, the mixed color infill will be seen " -"outside" +"printed with transparent filament, the mixed color infill will be visible." msgid "Flush into objects' support" msgstr "Flush into objects' support" @@ -6110,7 +6108,7 @@ msgid "" "lower the amount of waste and decrease the print time" msgstr "" "Purging after filament change will be done inside objects' support. This may " -"lower the amount of waste and decrease the print time" +"lower the amount of waste and decrease the print time." msgid "Flush into this object" msgstr "Flush into this object" @@ -6172,7 +6170,6 @@ msgstr "This exports the project as a 3mf." msgid "Slice the plates: 0-all plates, i-plate i, others-invalid" msgstr "Slice the plates: 0-all plates, i-plate i, others-invalid" -#, fuzzy msgid "Show command help." msgstr "This shows command help." @@ -6320,771 +6317,177 @@ msgstr "Support: fix holes at layer %d" msgid "Support: propagate branches at layer %d" msgstr "Support: propagate branches at layer %d" -#~ msgid "Fix model through cloud" -#~ msgstr "Fix model through cloud" +#~ msgid "Creating" +#~ msgstr "Creating" -#~ msgid "Fix model locally" -#~ msgstr "Fix model locally" +#~ msgid "Uploading" +#~ msgstr "Uploading" -#~ msgid "Module" -#~ msgstr "Module" +#~ msgid "Waiting" +#~ msgstr "Waiting" -#~ msgid "Ctrl + Left mouse button" -#~ msgstr "Ctrl + Left mouse button" +#~ msgid "Sending" +#~ msgstr "Sending" -#~ msgid "Shift + Any arrow" -#~ msgstr "Shift + Any arrow" +#~ msgid "Finished" +#~ msgstr "Finished" -#~ msgid "Ctrl + Any arrow" -#~ msgstr "Ctrl + Any arrow" +#~ msgid "Please fill report first." +#~ msgstr "Please fill report first." + +#~ msgid "Unable to create zip file" +#~ msgstr "Unable to create zip file" + +#~ msgid "Enter a search term" +#~ msgstr "Enter a search term" + +#~ msgid "Debug" +#~ msgstr "Debug" + +#~ msgid "Monitoring" +#~ msgstr "Monitoring" + +#~ msgid "Fragment filter" +#~ msgstr "Fragment filter" + +#~ msgid "Fragment Filter" +#~ msgstr "Fragment Filter" + +#~ msgid "Position:" +#~ msgstr "Position:" #~ msgid "Alt + Mouse wheel" #~ msgstr "Alt + Mouse wheel" +#~ msgid "" +#~ "An object is layed over the boundary of plate.\n" +#~ "Please solve the problem by moving it totally inside or outside plate." +#~ msgstr "" +#~ "An object is laid over the edge of the plate or exceeds the height " +#~ "limit.\n" +#~ "Please solve the problem by moving it totally on or off the plate, and " +#~ "confirming that the height is within the build volume." + +#~ msgid "Ctrl + Any arrow" +#~ msgstr "Ctrl + Any arrow" + +#~ msgid "Ctrl + Left mouse button" +#~ msgstr "Ctrl + Left mouse button" + +#~ msgid "Display printable box" +#~ msgstr "Display printable box" + +#~ msgid "Display shadow of objects" +#~ msgstr "Display shadow of objects" + +#~ msgid "Display triangles of models" +#~ msgstr "Display triangles of models" + +#~ msgid "" +#~ "Do you want to synchronize your personal data from Bambu Cloud? \n" +#~ "Contains the following information:\n" +#~ "1. The Process presets\n" +#~ "2. The Filament presets\n" +#~ "3. The Printer presets\n" +#~ msgstr "" +#~ "Do you want to synchronize your personal data from Bambu Cloud? \n" +#~ "Contains the following information:\n" +#~ "1. Process presets\n" +#~ "2. Filament presets\n" +#~ "3. Printer presets\n" + +#~ msgid "" +#~ "Don't retract when the travel is in infill area absolutely. That means " +#~ "the oozing can't been seen" +#~ msgstr "" +#~ "This disables retraction when travel is entirely within an infill area " +#~ "and oozing can’t be seen." + +#~ msgid "Fix model locally" +#~ msgstr "Fix model locally" + +#~ msgid "Fix model through cloud" +#~ msgstr "Fix model through cloud" + +#~ msgid "" +#~ "Heat the nozzle to target \n" +#~ "temperature" +#~ msgstr "" +#~ "Heat the nozzle to target \n" +#~ "temperature" + +#~ msgid "In the calibration of extrusion flow" +#~ msgstr "In the calibration of extrusion flow" + +#~ msgid "In the calibration of laser scanner" +#~ msgstr "In the calibration of laser scanner" + +#~ msgid "Module" +#~ msgstr "Module" + +#~ msgid "New version of Bambu Studio" +#~ msgstr "New version of Bambu Studio" + +#~ msgid "Output file" +#~ msgstr "Output file" + +#~ msgid "Pause(heated bed temperature error)" +#~ msgstr "Pause(heated bed temperature error)" + +#~ msgid "Pause(hotend temperature error)" +#~ msgstr "Pause(hotend temperature error)" + +#~ msgid "Pause(toolhead shell off)" +#~ msgstr "Pause(toolhead shell off)" + +#~ msgid "Please upgrade your printer first" +#~ msgstr "Please upgrade your printer first" + +#~ msgid "" +#~ "Preview only mode:\n" +#~ "The loaded file contains gcode only." +#~ msgstr "" +#~ "Preview only mode:\n" +#~ "The loaded file contains gcode only." + +#~ msgid "Preview only mode for gcode file." +#~ msgstr "Preview only mode for gcode file." + +#~ msgid "" +#~ "Push new filament \n" +#~ "into extruder" +#~ msgstr "" +#~ "Push new filament \n" +#~ "into extruder" + +#~ msgid "Shift + Any arrow" +#~ msgstr "Shift + Any arrow" + #~ msgid "Shift + Mouse wheel" #~ msgstr "Shift + Mouse wheel" -#~ msgid "Associate .step files to BambuStudio" -#~ msgstr "Associate .step files to Bambu Studio" +#~ msgid "Show Model Mesh(TODO)" +#~ msgstr "Show Model Mesh(TODO)" -#~ msgid "Vibration Calibration" -#~ msgstr "Vibration calibration" +#~ msgid "Show Model Shadow(TODO)" +#~ msgstr "Show Model Shadow(TODO)" -# Do we want a more technical term for spaghetti in the explanation? -# [Yifan] “Spaghetti” is generally used in 3D print videos and papers. We have not found other technical term for this yet. -# [Cory] Gotcha; that’s what I figured. It’s the general term I’ve seen everywhere too, it just doesn’t sound as technical, haha. -#~ msgid "Enable the camera on printer to check spaghetti" +#~ msgid "Show Printable Box(TODO)" +#~ msgstr "Show Printable Box(TODO)" + +#~ msgid "Successfully sent.Will automatically jump to the device page in %s s" #~ msgstr "" -#~ "Enable this to allow the camera on the printer to watch for spaghetti." +#~ "Successfully sent.Will automatically jump to the device page in %s s" -#~ msgid "Per Object Setting" -#~ msgstr "Per object setting" - -#~ msgid "Machine Control" -#~ msgstr "Machine control" - -#~ msgid "Record Timelapse" -#~ msgstr "Record timelapse" - -#~ msgid "Bed temperature of the initial layer" -#~ msgstr "Bed temperature for the first layer" - -#~ msgid "Temperature and Axis Control" -#~ msgstr "Temperature and axis control" - -#~ msgid "prepare 3mf file..." -#~ msgstr "Prepare 3mf file…" - -#~ msgid "downloading project ..." -#~ msgstr "Downloading project …" - -#~ msgid "preparing, export 3mf failed!" -#~ msgstr "Preparing, export to 3mf failed!" - -#~ msgid "Upload has been canceled." -#~ msgstr "Uploading has been canceled." - -#~ msgid "Uploading is timed out. Please try again!" -#~ msgstr "Uploading has timed out. Please try again!" - -#~ msgid "X/Y Axis" -#~ msgstr "X/Y axis" - -#~ msgid "Bed temperature for layers except the initial one" -#~ msgstr "Bed temperature after first layer" - -#~ msgid "Use BBL private temperature gcode instead of standard M140/M190" -#~ msgstr "Use BBL private temperature G-code instead of standard M140/M190." - -#~ msgid "Material for support" -#~ msgstr "Support material" - -#~ msgid "Filament to print support and skirt." -#~ msgstr "This is the filament for printing support and skirts." - -#~ msgid "Filament to print support interface" -#~ msgstr "This is the filament for support interfaces." - -#~ msgid "AMS Control" -#~ msgstr "AMS control" - -#~ msgid "Fan speed when printing bridge and overhang wall" -#~ msgstr "Fan speed when printing bridges and overhang walls." - -# I need a little more context to update this one -# [Yifan] It the explanation for setting “cooling overhang threshold”. It controls when the coolin fan should be on. -# The setting is ususally used for filament like ABS which disables the cooling fan by default. -# I will explian overhang concept first. -# overhang 0%: -# ____ upper layer -# ____ lower layer -# overhang 25%: -# ____ upper layer -# ____ lower layer -# overhang 50%: -# ____ upper layer -# ____ lower layer -# overhang 75% -# ____ upper layer -# ____ lower layer -# overhang 100% -# ____ upper layer -# ____ lower layer -# [Cory] I think I get it. Please check for accuracy to confirm. -# [Yifan] Maybe we can replace overhang_fan_speed with “Overhang fan speed”, which is a setting name. -# [Cory] Got it! I think I assumed that it was some sort of set value with the underlining. Updated. -#~ msgid "" -#~ "Force cooling fan speed to be overhang_fan_speed when overhang degree of " -#~ "printed part exceeds this value. Expressed as percentage which indicides " -#~ "how many width of the line without support from lower layer" -#~ msgstr "" -#~ "Force cooling fan speed to match overhang fan speed when the overhang " -#~ "degree of printed parts exceeds this value. This is expressed as " -#~ "percentage which indicates the width of lines without support." +#~ msgid "Swith cloud environment, Please login again!" +#~ msgstr "Swith cloud environment, Please login again!" #~ msgid "" -#~ "Enable auto cooling to adjust printing speed and fan speed according to " -#~ "layer printing time automatically" +#~ "The firmware versions of printer and AMS are too low.Please update to the " +#~ "latest version before sending the print job" #~ msgstr "" -#~ "Enable auto cooling to adjust printing speed and fan speed according to " -#~ "layer printing time automatically." +#~ "The firmware versions of printer and AMS are too low.Please update to the " +#~ "latest version before sending the print job" -#~ msgid "" -#~ "Close cooling fan for the first certain layers. We usually close fan for " -#~ "the initial layer to get better build plate adhesion" -#~ msgstr "" -#~ "Close cooling fan for the first certain layers. We usually close fan for " -#~ "the first layer to get better build plate adhesion" - -#~ msgid "" -#~ "Starting fan from stop state usually costs lots's of time. If enable this " -#~ "setting, fan will never be stoped and will run at least at minimum speed " -#~ "to reduce the frequency of starting and stoping" -#~ msgstr "" -#~ "Starting a fan from a fully stopped state takes a long time. If this " -#~ "setting is enabled, the fan will run at a minimum speed to reduce the " -#~ "frequency of starting and stopping." - -#~ msgid "" -#~ "Cooling fan will be enabled for layers of which estimated time is shorter " -#~ "than this value. Fan speed is interpolated between the minimum and " -#~ "maximum fan speeds according to layer printing time" -#~ msgstr "" -#~ "The cooling fan will be enabled for layers with an estimated time shorter " -#~ "than this value. Fan speed is interpolated between minimum and maximum " -#~ "fan speeds according to layer printing time." - -#~ msgid "Additional cooling fan speed" -#~ msgstr "Auxiliary cooling fan speed" - -#~ msgid "Speed of additional cooling fan" -#~ msgstr "This is the speed for the auxiliary cooling fan." - -#~ msgid "" -#~ "Speed for different overhang degree. Overhang degree is expressed as " -#~ "percentage of line width" -#~ msgstr "" -#~ "This is the speed for various overhang degrees. Overhand degrees are " -#~ "expressed as a percentage of line width." - -#~ msgid "Send Task to" -#~ msgstr "Send task to" - -#~ msgid "Extrusion width value is too low." -#~ msgstr "Extrusion width is too low." - -#~ msgid "Extrusion width value is too high." -#~ msgstr "Extrusion width is too high." - -#~ msgid "" -#~ "Line width of initial layer. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "Line width of first layer: this is relative to nozzle diameter if " -#~ "expressed as a percentage." - -#~ msgid "" -#~ "Line width of internal sparse infill. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "This determines the line width of internal sparse infill. It’s relative " -#~ "to nozzle diameter if expressed as a percentage." - -#~ msgid "" -#~ "Line width of inner wall. It's relative to nozzle diameter if expressed " -#~ "as percentage" -#~ msgstr "" -#~ "Line width of inner walls; it’s relative to nozzle diameter if expressed " -#~ "as a percentage." - -#~ msgid "" -#~ "Line width of internal solid infill. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "This is the line ridge of internal solid infill. It’s relative to nozzle " -#~ "diameter if expressed as a percentage." - -#~ msgid "" -#~ "Used to set line width for support. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "This is used to set line width for support. It’s relative to nozzle " -#~ "diameter if expressed as a percentage." - -#~ msgid "" -#~ "Used to set line width for support transition. It's relative to nozzle " -#~ "diameter if expressed as percentage" -#~ msgstr "" -#~ "This is used to set line width for support transition. It’s relative to " -#~ "nozzle diameter if expressed as a percentage." - -#~ msgid "" -#~ "Used to set line width for top surfaces. It's relative to nozzle diameter " -#~ "if expressed as percentage" -#~ msgstr "" -#~ "This is used to set line width for top surfaces. It’s relative to nozzle " -#~ "diameter if expressed as a percentage." - -# please check for accuracy -# C-See if I can make this more concise/less complex -# Maybe: This is the number of solid layers of top shell, including the surface layer. When the thickness calculated by this is thinner than the top shell thickness, additional top shell layers will be added when slicing. -# [Yifan] “top shell thickness” is a setting name. Maybe it can be expressed as the following. -# This is the number of solid layers of top shell, including the surface layer. When the thickness calculated by this is thinner than “Top shell thickness”, additional top shell layers will be added when slicing. -# [Cory] Updated a bit with the feedback here, and I updated the title of “Top Shell Thickness” to add Title Casing so that it’s in the explanation here and in the name of that item. -#~ msgid "" -#~ "The number of solid layers of top shell, including top surface layer. " -#~ "When the thickness calculated by this value is thinner than top shell " -#~ "thickness, the top shell layers number will be increased when slicing" -#~ msgstr "" -#~ "This is the number of solid layers of top shell, including the surface " -#~ "layer. When the thickness calculated by this value is thinner than top " -#~ "shell thickness, more top shell layers will be added when slicing." - -#~ msgid "" -#~ "The number of solid layers of bottom shell, including bottom surface " -#~ "layer. When the thickness calculated by this value is thinner than bottom " -#~ "shell thickness, the bottom shell layers number will be increased when " -#~ "slicing." -#~ msgstr "" -#~ "This is the number of solid layers of bottom shell, including the bottom " -#~ "surface layer. When the thickness calculated by this value is thinner " -#~ "than bottom shell thickness, the bottom shell layers will be increased." - -#~ msgid "" -#~ "The number of bottom solid layers is increased when slicing if the " -#~ "thickness calculated by bottom_shell_layers is thinner than this value. " -#~ "This can avoid too thin shell when layer height is small" -#~ msgstr "" -#~ "The number of bottom solid layers is increased when slicing if the " -#~ "thickness calculated by bottom shell layers is thinner than this value. " -#~ "This can avoid having shells that are too thin when layer height is small." - -#~ msgid "" -#~ "The number of top solid layers is increased when slicing if the thickness " -#~ "calculated by top_shell_layers is thinner than this value. This can avoid " -#~ "too thin shell when layer height is small" -#~ msgstr "" -#~ "The number of top solid layers is increased when slicing if the thickness " -#~ "calculated by top shell layers is thinner than this value. This can avoid " -#~ "having too thin a shell when layer height is small." - -#~ msgid "Unable to connect server" -#~ msgstr "Unable to connect to server" - -#~ msgid "" -#~ "Speed of outer wall which is outermost and visible. It's used to be " -#~ "slower than inner wall speed to get better quality" -#~ msgstr "" -#~ "This is the speed for the outermost visible wall. It should be slower " -#~ "than inner wall speed for higher quality." - -#~ msgid "Remove frequency sweep gcode" -#~ msgstr "Remove frequency sweep G-code" - -#~ msgid "Enable this to skip frequency sweep when start printing" -#~ msgstr "Enable this to skip frequency sweeping when you start printing." - -#~ msgid "Remove bed leveling gcode" -#~ msgstr "Remove bed leveling G-code" - -#~ msgid "Enable this to skip bed leveling when start printing" -#~ msgstr "Enable this to skip bed leveling when you start printing." - -#~ msgid "Remove extrusion calibration gcode" -#~ msgstr "Remove extrusion calibration G-code" - -#~ msgid "Enable this to skip extrusion calibration when start printing" -#~ msgstr "" -#~ "Enable this to skip the extrusion calibration when you start printing." - -#~ msgid "" -#~ "Speed for line of wall which has degree of overhang between 0% and 25% " -#~ "line width. 0 means using original wall speed" -#~ msgstr "" -#~ "Speed for lines of walls which have a degree of overhang between 0% and " -#~ "25% line width. 0 means using original wall speed." - -#~ msgid "Bmabu Cool Plate" -#~ msgstr "Bambu cool plate" - -#~ msgid "Bmabu Engineering Plate" -#~ msgstr "Bambu engineering plate" - -#~ msgid "Bmabu High Temperature Plate" -#~ msgstr "Bambu high temperature plate" - -#~ msgid "" -#~ "Detect the overhang percentage relative to line width and use different " -#~ "speed to print. For 100% overhang, bridge speed is used" -#~ msgstr "" -#~ "This enables detecting the overhang percentage relative to line width and " -#~ "uses different speed to print. For 100% overhang, bridge speed is used." - -#~ msgid "" -#~ "This plate is locked,\n" -#~ "We can not do auto-arrange on this plate!" -#~ msgstr "" -#~ "This plate is locked.\n" -#~ "Cannot auto-arrange this plate." - -#~ msgid "" -#~ "Arrange failed! Found some exceptions when processing object Geometries" -#~ msgstr "" -#~ "Arrange failed. Exception were found when processing object geometries." - -#~ msgid "" -#~ "All the selected objects are on the locked plate,\n" -#~ "We can not do auto-orient on these objects!" -#~ msgstr "" -#~ "All the selected objects are on a locked plate.\n" -#~ "We cannot auto-orient these objects!" - -#~ msgid "" -#~ "This plate is locked,\n" -#~ "We can not do auto-orient on this plate!" -#~ msgstr "" -#~ "This plate is locked.\n" -#~ "We cannot auto-orient objects on this plate!" - -#~ msgid "Whether to synchronize cloud user data?\n" -#~ msgstr "Synchronize cloud user data?\n" - -#~ msgid "" -#~ "Holes of object will be grown or shrunk in XY plane by the configured " -#~ "value. Negative value makes holes bigger. Positive value makes holes " -#~ "smaller. This function is used to adjust size when the object has " -#~ "assembling issue" -#~ msgstr "" -#~ "Holes in the object will be grown or shrunk in the XY plane by the " -#~ "configured value. Negative values make holes bigger while positive values " -#~ "makes them smaller. This function is used to adjust size when the object " -#~ "has assembly issues." - -#~ msgid "" -#~ "Contour of object will be grown or shrunk in XY plane by the configured " -#~ "value. Positive value makes contour bigger. Negative value makes contour " -#~ "smaller. This function is used to adjust size when the object has " -#~ "assembling issue" -#~ msgstr "" -#~ "Contours of objects will be grown or shrunk in the XY plane by the set " -#~ "value. Positive values will make contours bigger while negative values " -#~ "will make them smaller. This function is used to adjust size when the " -#~ "object has assembly issues." - -#~ msgid "Hotend Fan" -#~ msgstr "Part cooling fan" - -#~ msgid "Big Fan" -#~ msgstr "Aux. cooling fan" - -#~ msgid "Switching Presets: Unsaved Changes" -#~ msgstr "Switching presets: unsaved changes" - -#~ msgid "Show daily tip on startup" -#~ msgstr "Show Daily Tip on Startup" - -#~ msgid "" -#~ "XY separation between an object and its support. It's relative to outer " -#~ "wall line width if expressed as percentage" -#~ msgstr "" -#~ "This determines the XY separation between an object and its support. It’s " -#~ "relative to outer wall line width if expressed as a percentage." - -#~ msgid "" -#~ "Failed to save gcode file\n" -#~ "Error message: %1%" -#~ msgstr "" -#~ "Failed to save G-code file\n" -#~ "Error message: %1%" - -#~ msgid "" -#~ "Speed of outer wall which is outermost and visible. It's expressed as " -#~ "percentage relative to inner wall speed. It's used to be slower than " -#~ "inner wall speed to get better quality" -#~ msgstr "" -#~ "Speed of outer wall which is outermost and visible. It's expressed as " -#~ "percentage relative to inner wall speed. It's used to be slower than " -#~ "inner wall speed to get better quality." - -#~ msgid "Filament to print support, raft and skirt" -#~ msgstr "Filament to print support, raft and skirt" - -#~ msgid "preparing your project" -#~ msgstr "Preparing your project" - -#~ msgid "uploading..." -#~ msgstr "Uploading…" - -#~ msgid "Experimental option for adding support for sharp tails" -#~ msgstr "This is an experimental option to add support for sharp tails." - -#~ msgid "Experimental option for removing support for small overhangs" -#~ msgstr "" -#~ "This is an experimental option to remove support for small overhangs." - -#~ msgid "" -#~ "Enable this option and height of every layer except initial one will be " -#~ "automatically calculated when slicing according to the slope of model " -#~ "surface" -#~ msgstr "" -#~ "Enabling this option means the height of every layer except the first " -#~ "will be automatically calculated when slicing according to the slope of " -#~ "the model’s surface" - -#~ msgid "The z gap between the bottom support interface and object" -#~ msgstr "" -#~ "This determines the z gap between the bottom support interface and the " -#~ "object." - -# I need a little clarification on what this does -# [Yifan] It is a setting which creates a single shell around the supports to makes them sturdier. -# [Cory] Does support wall make sense, or does that conflict with other terminology? -# [Yifan] I agree. It behaves much like a wall around infill. Could you give some suggestions? -# Note: word “shell” has also been used in other place. -# [Cory] I think “Support Wall” is good, but if you want to stress that it makes the support more sturdy, you could call it “Support Fortification Wall” -#~ msgid "Wall around the support" -#~ msgstr "Support Wall" - -#~ msgid "" -#~ "If enabled, bridges may look worse but can cover longer distance. If " -#~ "disabled, bridges look better but just for shorter distance." -#~ msgstr "" -#~ "If enabled, bridges may look worse but can cover longer distance. If " -#~ "disabled, bridges look better but cover shorter distances." - -#~ msgid "Tool Rotate" -#~ msgstr "Tool rotate" - -#~ msgid "Check for Configuration Updates" -#~ msgstr "Check for configuration updates" - -#~ msgid "Enter copies Number" -#~ msgstr "Enter number of copies" - -#~ msgid "" -#~ "Switching the language will trigger the application restart.\n" -#~ "Please confirm to switch?" -#~ msgstr "" -#~ "Switching languages will trigger an application restart.\n" -#~ "Please confirm to switch." - -#~ msgid "" -#~ "Speed of internal solid infill, not the top and bottom surface. It's " -#~ "relative to sparse infill speed if it's percentage" -#~ msgstr "" -#~ "This is the speed of internal solid infill, not the top and bottom " -#~ "surface. It’s relative to sparse infill speed if it is a percentage." - -#~ msgid "" -#~ "Speed of support interface. It's relative to support speed if expressed " -#~ "as percentage" -#~ msgstr "" -#~ "This is the speed of printing support interfaces. It’s relative to " -#~ "support speed if expressed as a percentage." - -#~ msgid "" -#~ "Speed for printing support transition layers in which support infill " -#~ "direction is changed.If expressed as percentage (for example 50%) it will " -#~ "be calculated over support speed." -#~ msgstr "" -#~ "This is the speed for printing support transition layers in which support " -#~ "infill direction is changed. If expressed as a percentage (for example, " -#~ "50%), it will be calculated over support speed." - -#~ msgid "" -#~ "Speed of top surface infill which is solid. It's relative to internal " -#~ "solid infill speed if it's percentage" -#~ msgstr "" -#~ "This determines the speed of the top surface infill, which is solid. It’s " -#~ "relative to internal solid infill speed if expressed as a percentage." - -#~ msgid "" -#~ "The sequential print is on.\n" -#~ "It's impossible to apply any custom G-code for objects printing " -#~ "sequentually.\n" -#~ "This code won't be processed during G-code generation." -#~ msgstr "" -#~ "The sequential print is on.\n" -#~ "It's impossible to apply any custom G-code for objects printing " -#~ "sequentially.\n" -#~ "This code won't be processed during G-code generation." - -#~ msgid "" -#~ "One or more object were assigned an extruder that the printer does not " -#~ "have." -#~ msgstr "" -#~ "One or more objects were assigned an extruder that the printer does not " -#~ "have." - -#~ msgid "Retraction Length (Toolchange)" -#~ msgstr "Retraction Length (Tool change)" - -#~ msgid "" -#~ "A boolean expression using the configuration values of an active printer " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active printer profile." -#~ msgstr "" -#~ "A Boolean expression using the configuration values of an active printer " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active printer profile." - -#~ msgid "" -#~ "A boolean expression using the configuration values of an active print " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active print profile." -#~ msgstr "" -#~ "A Boolean expression using the configuration values of an active print " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active print profile." - -#~ msgid "" -#~ "Set this to a non-zero value to allow a manual extrusion width. If left " -#~ "to zero, Slic3r derives extrusion widths from the nozzle diameter (see " -#~ "the tooltips for perimeter extrusion width, infill extrusion width etc). " -#~ "If expressed as percentage (for example: 230%), it will be computed over " -#~ "layer height." -#~ msgstr "" -#~ "Set this to a non-zero value to allow a manual extrusion width. If left " -#~ "to zero, Slic3r derives extrusion widths from the nozzle diameter (see " -#~ "the tooltips for perimeter extrusion width, infill extrusion width etc.). " -#~ "If expressed as percentage (for example: 230%), it will be computed over " -#~ "layer height." - -#~ msgid "Density of internal infill, expressed in the range 0% - 100%." -#~ msgstr "Density of internal infill, expressed in the range 0 % - 100 %." - -#~ msgid "" -#~ "If enabled, the wipe tower will not be printed on layers with no " -#~ "toolchanges. On layers with a toolchange, extruder will travel downward " -#~ "to print the wipe tower. User is responsible for ensuring there is no " -#~ "collision with the print." -#~ msgstr "" -#~ "If enabled, the wipe tower will not be printed on layers with no tool " -#~ "changes. On layers with a tool change, extruder will travel downward to " -#~ "print the wipe tower. User is responsible for ensuring there is no " -#~ "collision with the print." - -#~ msgid "" -#~ "Support material will not be generated for overhangs whose slope angle " -#~ "(90° = vertical) is above the given threshold. In other words, this value " -#~ "represent the most horizontal slope (measured from the horizontal plane) " -#~ "that you can print without support material. Set to zero for automatic " -#~ "detection (recommended)." -#~ msgstr "" -#~ "Support material will not be generated for overhangs whose slope angle " -#~ "(90° = vertical) is above the given threshold. In other words, this value " -#~ "represents the most horizontal slope (measured from the horizontal plane) " -#~ "that you can print without support material. Set to zero for automatic " -#~ "detection (recommended)." - -#~ msgid "" -#~ "This matrix describes volumes (in cubic milimetres) required to purge the " -#~ "new filament on the wipe tower for any given pair of tools." -#~ msgstr "" -#~ "This matrix describes volumes (in cubic millimetres) required to purge " -#~ "the new filament on the wipe tower for any given pair of tools." - -#~ msgid "" -#~ "Object will be used to purge the nozzle after a toolchange to save " -#~ "material that would otherwise end up in the wipe tower and decrease print " -#~ "time. Colours of the objects will be mixed as a result." -#~ msgstr "" -#~ "Object will be used to purge the nozzle after a tool change to save " -#~ "material that would otherwise end up in the wipe tower and decrease print " -#~ "time. Colours of the objects will be mixed as a result." - -#~ msgid "WHITE BULLET icon indicates a non system (or non default) preset." -#~ msgstr "WHITE BULLET icon indicates a non-system (or non-default) preset." - -#~ msgid "" -#~ "Some objects can get along with a few smaller pads instead of a single " -#~ "big one. This parameter defines how far the center of two smaller pads " -#~ "should be. If theyare closer, they will get merged into one pad." -#~ msgstr "" -#~ "Some objects can get along with a few smaller pads instead of a single " -#~ "big one. This parameter defines how far the center of two smaller pads " -#~ "should be. If they are closer, they will get merged into one pad." - -#~ msgid "Don't notify about new releases any more" -#~ msgstr "Don't notify about new releases anymore" - -#~ msgid "Buttons And Text Colors Description" -#~ msgstr "Buttons and Text Colors Description" - -#~ msgid "Before roll back" -#~ msgstr "Before rollback" - -#~ msgid "" -#~ "If enabled, %s checks for new application versions 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 "" -#~ "If enabled, %s checks for new application versions 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 mechanism, no automatic installation is done." - -#~ msgid "" -#~ "If enabled, %s downloads updates of built-in system presets in the " -#~ "background.These updates are downloaded into a separate temporary " -#~ "location.When a new preset version becomes available it is offered at " -#~ "application startup." -#~ msgstr "" -#~ "If enabled, %s downloads updates of built-in system presets in the " -#~ "background. These updates are downloaded into a separate temporary " -#~ "location. When a new preset version becomes available it is offered at " -#~ "application startup." - -#~ msgid "" -#~ "Additionally a backup snapshot of the whole configuration is created " -#~ "before an update is applied." -#~ msgstr "" -#~ "Additionally, a backup snapshot of the whole configuration is created " -#~ "before an update is applied." - -#~ msgid "Autospeed (advanced)" -#~ msgstr "Auto Speed (advanced)" - -#~ msgid "Toolchange parameters with single extruder MM printers" -#~ msgstr "Toolchange parameters with single extruder MM printers" - -#~ msgid "" -#~ "When printing multi-material objects, this settings will make Slic3r to " -#~ "clip the overlapping object parts one by the other (2nd part will be " -#~ "clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -#~ msgstr "" -#~ "When printing multi-material objects, this settings will make Slic3r to " -#~ "clip the overlapping object parts one by the other (2nd part will be " -#~ "clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc.)." - -#~ msgid "" -#~ "Add solid infill near sloping surfaces to guarantee the vertical shell " -#~ "thickness (top+bottom solid layers)." -#~ msgstr "" -#~ "Add solid infill near sloping surfaces to guarantee the vertical shell " -#~ "thickness (top + bottom solid layers)." - -#~ msgid "" -#~ "Speed used for unloading the filament on the wipe tower (does not affect " -#~ "initial part of unloading just after ramming)." -#~ msgstr "" -#~ "Speed used for unloading the filament on the wipe tower (does not affect " -#~ "initial part of unloading just after ramming)." - -#~ msgid "" -#~ "Time to wait after the filament is unloaded. May help to get reliable " -#~ "toolchanges with flexible materials that may need more time to shrink to " -#~ "original dimensions." -#~ msgstr "" -#~ "Time to wait after the filament is unloaded. May help to get reliable " -#~ "tool changes with flexible materials that may need more time to shrink to " -#~ "original dimensions." - -#~ msgid "" -#~ "When set to zero, the distance the filament is moved from parking " -#~ "position during load is exactly the same as it was moved back during " -#~ "unload. When positive, it is loaded further, if negative, the loading " -#~ "move is shorter than unloading." -#~ msgstr "" -#~ "When set to zero, the distance the filament is moved from parking " -#~ "position during load is exactly the same as it was moved back during " -#~ "unload. When positive, it is loaded further, if negative, the loading " -#~ "move is shorter than unloading." - -#~ msgid "Autogeneration will erase all manually edited points." -#~ msgstr "Auto Generation will erase all manually edited points." - -#~ msgid "Unknown error occured" -#~ msgstr "Unknown error occurred" - -#~ msgid "" -#~ "This end procedure is inserted at the end of the output file, before the " -#~ "printer end gcode (and before any toolchange from this filament in case " -#~ "of multimaterial printers). Note that you can use placeholder variables " -#~ "for all PrusaSlicer settings. If you have multiple extruders, the gcode " -#~ "is processed in extruder order." -#~ msgstr "" -#~ "This end procedure is inserted at the end of the output file, before the " -#~ "printer end gcode (and before any tool change from this filament in case " -#~ "of multimaterial printers). Note that you can use placeholder variables " -#~ "for all PrusaSlicer settings. If you have multiple extruders, the gcode " -#~ "is processed in extruder order." - -#~ msgid "" -#~ "This start procedure is inserted at the beginning, after any printer " -#~ "start gcode (and after any toolchange to this filament in case of multi-" -#~ "material printers). This is used to override settings for a specific " -#~ "filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom " -#~ "codes, such commands will not be prepended automatically so you're free " -#~ "to customize the order of heating commands and other custom actions. Note " -#~ "that you can use placeholder variables for all PrusaSlicer settings, so " -#~ "you can put a \"M109 S[first_layer_temperature]\" command wherever you " -#~ "want. If you have multiple extruders, the gcode is processed in extruder " -#~ "order." -#~ msgstr "" -#~ "This start procedure is inserted at the beginning, after any printer " -#~ "start gcode (and after any tool change to this filament in case of multi-" -#~ "material printers). This is used to override settings for a specific " -#~ "filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom " -#~ "codes, such commands will not be prepended automatically so you're free " -#~ "to customize the order of heating commands and other custom actions. Note " -#~ "that you can use placeholder variables for all PrusaSlicer settings, so " -#~ "you can put a \"M109 S[first_layer_temperature]\" command wherever you " -#~ "want. If you have multiple extruders, the gcode is processed in extruder " -#~ "order." - -#~ 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 "" -#~ "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 mechanism, no automatic installation is done." - -#~ msgid "" -#~ "Purging after toolchange will done inside this object's infills. This " -#~ "lowers the amount of waste but may result in longer print time due to " -#~ "additional travel moves." -#~ msgstr "" -#~ "Purging after tool change will done inside this object's infills. This " -#~ "lowers the amount of waste but may result in longer print time due to " -#~ "additional travel moves." - -#~ msgid "" -#~ "This custom code is inserted before every toolchange. Placeholder " -#~ "variables for all PrusaSlicer settings as well as {previous_extruder} and " -#~ "{next_extruder} can be used. When a tool-changing command which changes " -#~ "to the correct extruder is included (such as T{next_extruder}), " -#~ "PrusaSlicer will emit no other such command. It is therefore possible to " -#~ "script custom behaviour both before and after the toolchange." -#~ msgstr "" -#~ "This custom code is inserted before every tool change. Placeholder " -#~ "variables for all PrusaSlicer settings as well as {previous_extruder} and " -#~ "{next_extruder} can be used. When a tool-changing command which changes " -#~ "to the correct extruder is included (such as T{next_extruder}), " -#~ "PrusaSlicer will emit no other such command. It is therefore possible to " -#~ "script custom behaviour both before and after the tool change." +#~ msgid "User pause" +#~ msgstr "User pause" diff --git a/bbl/i18n/es/BambuStudio_es.po b/bbl/i18n/es/BambuStudio_es.po index 00b2b1752a..6c761238de 100644 --- a/bbl/i18n/es/BambuStudio_es.po +++ b/bbl/i18n/es/BambuStudio_es.po @@ -1,15 +1,17 @@ msgid "" msgstr "" +"Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-15 10:25+0800\n" +"POT-Creation-Date: 2022-07-22 18:39+0800\n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Phrase (phrase.com)\n" -"X-Language: es\n" -"X-Source-Language: C\n" +"Plural-Forms: nplurals=2; plural=(n==1) ? 0 : 1;\n" +"X-Generator: Poedit 3.1\n" msgid "Supports Painting" msgstr "Pintando Soportes" @@ -44,14 +46,14 @@ msgstr "Borrar todo lo pintado" msgid "Highlight overhang areas" msgstr "Resaltar las zonas de voladizos" -msgid "Fragment filter" +msgid "Gap fill" msgstr "" msgid "Perform" msgstr "Realizar" msgid "Fragment area" -msgstr "" +msgstr "Fragment area" msgid "Set pen size" msgstr "Ajustar el tamaño del lápiz" @@ -75,9 +77,9 @@ msgid "Sphere" msgstr "Esfera" msgid "Fill" -msgstr "" +msgstr "Fill" -msgid "Fragment Filter" +msgid "Gap Fill" msgstr "" msgid "Highlight faces according to overhang angle." @@ -147,10 +149,10 @@ msgid "Shortcut Key " msgstr "Tecla de acceso directo " msgid "Triangle" -msgstr "" +msgstr "Triangle" msgid "Height Range" -msgstr "" +msgstr "Height Range" msgid "Remove painted color" msgstr "Eliminar color pintado" @@ -229,15 +231,12 @@ msgstr "Coordenadas mundiales" msgid "°" msgstr "°" -msgid "Position:" -msgstr "Posición:" +msgid "Size" +msgstr "Tamaño" msgid "%" msgstr "%" -msgid "Size" -msgstr "Tamaño" - msgid "uniform scale" msgstr "Escala uniforme" @@ -338,10 +337,10 @@ msgid "Operation already cancelling. Please wait few seconds." msgstr "Operación ya cancelada. Por favor, espere unos segundos." msgid "Face recognition" -msgstr "" +msgstr "Face recognition" msgid "Perform Recognition" -msgstr "" +msgstr "Perform Recognition" msgid "Cube" msgstr "Cubo" @@ -353,7 +352,7 @@ msgid "Cone" msgstr "Cono" msgid "Timelapse Wipe Tower" -msgstr "" +msgstr "Timelapse Wipe Tower" msgid "Add Modifier" msgstr "Añadir modificador" @@ -431,6 +430,13 @@ msgstr "Error crítico" msgid "BambuStudio got an unhandled exception: %1%" msgstr "BambuStudio recibió una notificación de excepción no controlada: %1%." +msgid "Downloading Bambu Network plug-in" +msgstr "" + +#, c-format, boost-format +msgid "Connect %s[SN:%s] failed!" +msgstr "" + msgid "" "BambuStudio configuration file may be corrupted and is not abled to be " "parsed.Please delete the file and try again." @@ -457,12 +463,15 @@ msgid "Click to download new version in default browser: %s" msgstr "" "Haga clic para descargar la nueva versión en el navegador por defecto: %s" -msgid "New version of Bambu Studio" -msgstr "Nueva versión de Bambu Studio" - msgid "The Bambu Studio needs an upgrade" msgstr "Bambu Studio necesita una actualización" +msgid "This is the newest version." +msgstr "Esta es la versión más reciente." + +msgid "Info" +msgstr "Información" + msgid "Loading user presets..." msgstr "Cargando los preajustes del usuario..." @@ -484,25 +493,21 @@ msgstr "Elija uno o varios archivos (3mf/step/stl/obj/amf):" msgid "Choose one file (gcode/.gco/.g/.ngc/ngc):" msgstr "Elija un archivo (gcode/.gco/.g/.ngc/ngc):" -msgid "Login information expired. Please login again." -msgstr "Los datos de acceso han caducado. Por favor, inicie sesión de nuevo." - msgid "" "The version of Bambu studio is too low and needs to be updated to the latest " "version before it can be used normally" msgstr "" +"The version of Bambu studio is too low and needs to be updated to the latest " +"version before it can be used normally" -msgid "This is the newest version." -msgstr "Esta es la versión más reciente." - -msgid "Info" -msgstr "Información" +msgid "Login information expired. Please login again." +msgstr "Los datos de acceso han caducado. Por favor, inicie sesión de nuevo." msgid "Loading" msgstr "Cargando" msgid "Loading user preset" -msgstr "" +msgstr "Loading user preset" msgid "Switching application language" msgstr "Cambio de idioma de la aplicación" @@ -968,7 +973,7 @@ msgid "No-brim" msgstr "Sin borde" msgid " " -msgstr " " +msgstr "" msgid "Layer height" msgstr "Altura de la capa" @@ -1006,12 +1011,8 @@ msgstr "Tipo de línea" msgid "No printer" msgstr "Sin impresión" -msgid "" -"Heat the nozzle to target \n" -"temperature" +msgid "Heat the nozzle to target temperature" msgstr "" -"Calentar la boquilla a la temperatura deseada \n" -"temperatura" msgid "Cut filament" msgstr "Cortar filamento" @@ -1019,15 +1020,11 @@ msgstr "Cortar filamento" msgid "Pull back current filament" msgstr "Extraer el filamento actual" -msgid "" -"Push new filament \n" -"into extruder" +msgid "Push new filament into extruder" msgstr "" -"Empujar el nuevo filamento \n" -"en el extrusor" msgid "Purge old filament" -msgstr "" +msgstr "Purge old filament" msgid "?" msgstr "?" @@ -1039,10 +1036,10 @@ msgid "Click the pencil icon to edit the filament." msgstr "Haga clic en el icono del lápiz para editar el filamento." msgid "Load Filament" -msgstr "Cargar" +msgstr "Load" msgid "Unload Filament" -msgstr "" +msgstr "Unload" msgid "Tips" msgstr "Consejos" @@ -1100,9 +1097,6 @@ msgstr "" "El posicionamiento ha fallado. Se han encontrado algunas excepciones al " "procesar las geometrías de los objetos." -msgid "Arranging" -msgstr "Organizando" - msgid "Arranging canceled." msgstr "Ordenamiento cancelado." @@ -1152,66 +1146,95 @@ msgid "Exception" msgstr "Excepción" msgid "Logging in" -msgstr "" +msgstr "Logging in" msgid "Login failed" -msgstr "" +msgstr "Login failed" msgid "The region parameter is incorrrect" -msgstr "" +msgstr "The region parameter is incorrrect." msgid "Failure of printer login" -msgstr "" +msgstr "Failure of printer login" msgid "Failed to get ticket" -msgstr "" +msgstr "Failed to get ticket" msgid "User authorization timeout" -msgstr "" +msgstr "User authorization timeout" msgid "Failure of bind" -msgstr "" +msgstr "Failure of bind" msgid "Unknown Failure" -msgstr "" +msgstr "Unknown Failure" msgid "Abnormal print file data. Please slice again" -msgstr "" +msgstr "Abnormal print file data. Please slice again" msgid "Task canceled" -msgstr "" +msgstr "Task canceled" msgid "Upload task timed out. Please check the network problem and try again" -msgstr "" +msgstr "Upload task timed out. Please check the network problem and try again" msgid "Cloud service connection failed. Please try again." -msgstr "" +msgstr "Cloud service connection failed. Please try again." msgid "Print file not found, please slice again" -msgstr "" +msgstr "Print file not found, please slice again" msgid "" "The print file exceeds the maximum allowable size (1GB). Please simplify the " "model and slice again" msgstr "" +"The print file exceeds the maximum allowable size (1GB). Please simplify the " +"model and slice again" msgid "Failed uploading print file" -msgstr "" +msgstr "Failed uploading print file" msgid "Wrong Access code" -msgstr "" +msgstr "Wrong Access code" msgid "Sending print job over LAN" -msgstr "" +msgstr "Sending print job over LAN" msgid "Sending print job through cloud service" +msgstr "Sending print job through cloud service" + +msgid "Service Unavailable" +msgstr "" + +msgid "Unkown Error." msgstr "" msgid "Sending print configuration" -msgstr "" +msgstr "Sending print configuration" #, c-format, boost-format -msgid "Successfully sent.Will automatically jump to the device page in %s s" +msgid "Successfully sent. Will automatically jump to the device page in %s s" +msgstr "" + +msgid "An SD card needs to be inserted before printing via LAN." +msgstr "" + +msgid "Downloading" +msgstr "" + +msgid "Download failed" +msgstr "" + +msgid "Cancelled" +msgstr "" + +msgid "Finish" +msgstr "" + +msgid "Installing" +msgstr "" + +msgid "Install failed" msgstr "" msgid "Portions copyright" @@ -1224,7 +1247,7 @@ msgid "License" msgstr "Licencia" msgid "Bambu Studio is licensed under " -msgstr "" +msgstr "Bambu Studio is licensed under " msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, versión 3" @@ -1233,79 +1256,122 @@ msgid "" "Bambu Studio is based on PrusaSlicer by Prusa Research, which is from Slic3r " "by Alessandro Ranellucci and the RepRap community" msgstr "" +"Bambu Studio is based on PrusaSlicer by Prusa Research, which is from Slic3r " +"by Alessandro Ranellucci and the RepRap community" msgid "Libraries" -msgstr "" +msgstr "Libraries" msgid "" "This software uses open source components whose copyright and other " "proprietary rights belong to their respective owners" msgstr "" +"This software uses open source components whose copyright and other " +"proprietary rights belong to their respective owners" #, c-format, boost-format msgid "About %s" msgstr "Acerca de %s" -msgid "Colour" +msgid "" +"Bambu Studio is based on PrusaSlicer by PrusaResearch and SuperSlicer by " +"Merill(supermerill)." msgstr "" -msgid "SN" +msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." msgstr "" +msgid "" +"Slic3r was created by Alessandro Ranellucci with the help of many other " +"contributors." +msgstr "" + +msgid "Bambu Studio also referenced some ideas from Cura by Ultimaker." +msgstr "" + +msgid "" +"There many parts of the software that come from community contributions, so " +"we're unable to list them one-by-one, and instead, they'll be attributed in " +"the corresponding code comments." +msgstr "" + +msgid "Colour" +msgstr "Colour" + +msgid "SN" +msgstr "SN" + msgid "" "Nozzle\n" "Temperature" msgstr "" +"Nozzle\n" +"Temperature" msgid "max" -msgstr "" +msgstr "max" msgid "min" -msgstr "" +msgstr "min" #, boost-format msgid "The input value should be greater than %1% and less than %2%" -msgstr "" +msgstr "The input value should be greater than %1% and less than %2%" msgid "Confirm" msgstr "Confirmar" msgid "Insertion update" -msgstr "" +msgstr "Insertion update" msgid "" "The AMS will automatically read the filament information when inserting a " "new Bambu Lab filament. This takes about 20 seconds." msgstr "" +"The AMS will automatically read the filament information when inserting a " +"new Bambu Lab filament. This takes about 20 seconds." msgid "" "Note: if new filament is inserted during printing, the AMS will not " "automatically read any information until printing is completed." msgstr "" +"Note: if new filament is inserted during printing, the AMS will not " +"automatically read any information until printing is completed." msgid "" "When inserting a new filament, the AMS will not automatically read its " "information, leaving it blank for you to enter manually." msgstr "" +"When inserting a new filament, the AMS will not automatically read its " +"information, leaving it blank for you to enter manually." msgid "Power on update" -msgstr "" +msgstr "Power on update" msgid "" "The AMS will automatically read the information of inserted filament on " "start-up. It will take about 1 minute.The reading process will roll filament " "spools." msgstr "" +"The AMS will automatically read the information of inserted filament on " +"start-up. It will take about 1 minute.The reading process will roll filament " +"spools." msgid "" "The AMS will not automatically read information from inserted filament " "during startup and will continue to use the information recorded before the " "last shutdown." msgstr "" +"The AMS will not automatically read information from inserted filament " +"during startup and will continue to use the information recorded before the " +"last shutdown." msgid "File" msgstr "Archivo" +msgid "Close" +msgstr "Cerrar" + msgid "" "A error occurred. Maybe memory of system is not enough or it's a bug of the " "program" @@ -1615,67 +1681,67 @@ msgstr "" "del 100%.\n" msgid "Auto bed leveling" -msgstr "" +msgstr "Auto bed leveling" msgid "Heatbed preheating" -msgstr "" +msgstr "Heatbed preheating" msgid "Sweeping XY mech mode" -msgstr "" +msgstr "Sweeping XY mech mode" msgid "Changing filament" -msgstr "" +msgstr "Changing filament" msgid "M400 pause" -msgstr "" +msgstr "M400 pause" msgid "Paused due to filament runout" -msgstr "" +msgstr "Paused due to filament runout" msgid "Heating hotend" -msgstr "" +msgstr "Heating hotend" msgid "Calibrating extrusion" -msgstr "" +msgstr "Calibrating extrusion" msgid "Scanning bed surface" -msgstr "" +msgstr "Scanning bed surface" msgid "Inspecting first layer" -msgstr "" +msgstr "Inspecting first layer" msgid "Identifying build plate type" -msgstr "" +msgstr "Identifying build plate type" msgid "Calibrating Micro Lidar" -msgstr "" +msgstr "Calibrating Micro Lidar" msgid "Homing toolhead" -msgstr "" +msgstr "Homing toolhead" msgid "Cleaning nozzle tip" -msgstr "" +msgstr "Cleaning nozzle tip" msgid "Checking extruder temperature" -msgstr "" +msgstr "Checking extruder temperature" msgid "Printing was paused by the user" -msgstr "" +msgstr "Printing was paused by the user" msgid "Pause of front cover falling" -msgstr "" +msgstr "Pause of front cover falling" msgid "Calibrating the micro lida" -msgstr "" +msgstr "Calibrating the micro lidar" msgid "Calibrating extrusion flow" -msgstr "" +msgstr "Calibrating extrusion flow" msgid "Paused due to nozzle temperature malfunction" -msgstr "" +msgstr "Paused due to nozzle temperature malfunction" msgid "Paused due to heat bed temperature malfunction" -msgstr "" +msgstr "Paused due to heat bed temperature malfunction" msgid "MC" msgstr "MC" @@ -1716,6 +1782,9 @@ msgstr "Verificación fallida." msgid "Update failed." msgstr "Actualización fallida." +msgid "Failed to start printing job" +msgstr "" + msgid "N/A" msgstr "N/A" @@ -1868,10 +1937,10 @@ msgid "Filament 1" msgstr "Filamento 1" msgid "Flushed filament" -msgstr "" +msgstr "Flushed filament" msgid "Filament change times" -msgstr "" +msgstr "Filament change times" msgid "Color change" msgstr "Cambio de color" @@ -2006,12 +2075,10 @@ msgid "Only the object being edit is visible." msgstr "Sólo es visible el objeto que se está editando." msgid "" -"An object is layed over the boundary of plate.\n" -"Please solve the problem by moving it totally inside or outside plate." +"An object is laid over the boundary of plate or exceeds the height limit.\n" +"Please solve the problem by moving it totally on or off the plate, and " +"confirming that the height is within the build volume." msgstr "" -"Un objeto está colocado sobre el límite de la placa.\n" -"Por favor, resuelva el problema moviéndolo totalmente dentro o fuera de la " -"placa." msgid "Calibration" msgstr "Calibración" @@ -2024,6 +2091,9 @@ msgid "" "minimize deviation.\n" "It keeps the device performing optimally." msgstr "" +"The calibration program detects the status of your device automatically to " +"minimize deviation.\n" +"It keeps the device performing optimally." msgid "Calibration Flow" msgstr "Calibración del flujo" @@ -2031,6 +2101,9 @@ msgstr "Calibración del flujo" msgid "Start Calibration" msgstr "Iniciar Calibración" +msgid "Completed" +msgstr "" + msgid "Calibrating" msgstr "Calibrando" @@ -2038,48 +2111,20 @@ msgid "Timelapse" msgstr "Timelapse" msgid "Monitoring Recording" -msgstr "" +msgstr "Monitoring Recording" msgid "ConnectPrinter(LAN)" -msgstr "" +msgstr "ConnectPrinter(LAN)" msgid "Please input the printer access code:" -msgstr "" +msgstr "Please input the printer access code:" msgid "" "You can find it in \"Settings > Network > Connection code\"\n" "on the printer, as shown in the figure:" msgstr "" - -msgid "Creating" -msgstr "Creando" - -msgid "Uploading" -msgstr "Subiendo" - -msgid "Waiting" -msgstr "Esperando" - -msgid "Sending" -msgstr "Enviando" - -msgid "Finished" -msgstr "Terminado" - -msgid "Please fill report first." -msgstr "Por favor, rellene primero el informe." - -msgid "Unable to create zip file" -msgstr "" - -msgid "Enter a search term" -msgstr "Teclea un término de búsqueda" - -msgid "Online" -msgstr "En línea" - -msgid "Offline" -msgstr "Fuera de línea" +"You can find it in \"Settings > Network > Connection code\"\n" +"on the printer, as shown in the figure:" msgid "Application is closing" msgstr "La aplicación se está cerrando" @@ -2097,14 +2142,11 @@ msgid "Preview" msgstr "Previsualización" msgid "Device" -msgstr "" +msgstr "Device" msgid "Project" msgstr "Proyecto" -msgid "Debug" -msgstr "Depurar" - msgid "Slice" msgstr "Laminar" @@ -2222,6 +2264,12 @@ msgstr "Exportar todos los objetos como STL" msgid "Export current Sliced file" msgstr "Exportar el archivo rebanado actual" +msgid "Export G-code" +msgstr "Exportar código G" + +msgid "Export current plate as G-code" +msgstr "" + msgid "Export" msgstr "Exportar" @@ -2279,24 +2327,6 @@ msgstr "Deseleccionar todo" msgid "Deselects all objects" msgstr "Deseleccionar todos los objetos" -msgid "Show Model Mesh(TODO)" -msgstr "Mostrar modelo de malla(TODO)" - -msgid "Display triangles of models" -msgstr "Mostrar los triángulos de los modelos" - -msgid "Show Model Shadow(TODO)" -msgstr "Mostrar sombra del modelo(TODO)" - -msgid "Display shadow of objects" -msgstr "Mostrar la sombra de los objetos" - -msgid "Show Printable Box(TODO)" -msgstr "Mostrar caja imprimible(TODO)" - -msgid "Display printable box" -msgstr "Caja de visualización imprimible " - msgid "Use Perspective View" msgstr "Utilizar vista en perspectiva" @@ -2366,7 +2396,7 @@ msgstr "Configuración del filamento" msgid "" "Do you want to synchronize your personal data from Bambu Cloud? \n" -"Contains the following information:\n" +"It contains the following information:\n" "1. The Process presets\n" "2. The Filament presets\n" "3. The Printer presets\n" @@ -2422,11 +2452,11 @@ msgstr "Opciones:" msgid "Swap Y/Z axes" msgstr "Intercambiar los ejes Y/Z" -msgid "Close" -msgstr "Cerrar" +msgid "Camera" +msgstr "" -msgid "Monitoring" -msgstr "Monitorizando" +msgid "Video" +msgstr "" msgid "Printing Progress" msgstr "Progreso de impresión" @@ -2441,13 +2471,13 @@ msgid "0%" msgstr "0%" msgid "Control" -msgstr "" +msgstr "Control" msgid "100%" msgstr "100%" msgid "Lamp" -msgstr "Lámpara" +msgstr "Luz" msgid "Part Cooling" msgstr "Refrigeración de Piezas" @@ -2459,7 +2489,7 @@ msgid "Bed" msgstr "Cama" msgid "Unload" -msgstr "Descargar" +msgstr "Descarga" msgid "Debug Info" msgstr "Información de Depuración" @@ -2467,6 +2497,9 @@ msgstr "Información de Depuración" msgid "Printing List" msgstr "Imprimiendo Lista" +msgid "Downloading..." +msgstr "" + msgid "Resume" msgstr "Reanudar" @@ -2476,7 +2509,6 @@ msgstr "Silencio" msgid "Standard" msgstr "Estándar" -# I don't know exactly what you mean when you use the word Sport, the literal translation has to do with sport, football, basketball etc, another translation would be sportive, but I don't know what you mean msgid "Sport" msgstr "Deportivo" @@ -2495,15 +2527,15 @@ msgstr "Actualizar" msgid "HMS" msgstr "HMS" -msgid "Please upgrade your printer first" -msgstr "" - msgid "Failed to connect to the server" msgstr "No se ha podido conectar con el servidor" msgid "Failed to connect to the printer" msgstr "No se ha podido conectar a la impresora" +msgid "Connecting..." +msgstr "" + msgid "OK" msgstr "OK" @@ -2615,6 +2647,9 @@ msgstr "Exportación correcta." msgid " (Repair)" msgstr " (Reparación)" +msgid " Click here to install it." +msgstr "" + msgid "WARNING:" msgstr "AVISO:" @@ -2688,7 +2723,7 @@ msgid "Objects" msgstr "Objetos" msgid "Advance" -msgstr "Avance" +msgstr "Avanzado" msgid "Compare presets" msgstr "Comparar justes" @@ -2824,13 +2859,8 @@ msgstr "¿Cargar estos archivos como un objeto único con múltiples partes?\n" msgid "Object with multiple parts was detected" msgstr "Se ha detectado un objeto con varias partes" -msgid "" -"Preview only mode:\n" -"The loaded file contains gcode only." -msgstr "" - msgid "The file does not contain any geometry data." -msgstr "" +msgstr "The file does not contain any geometry data." msgid "Export STL file:" msgstr "Exportar archivo STL:" @@ -2866,6 +2896,15 @@ msgstr "Placa de corte %d" msgid "Please resolve the slicing errors and publish again." msgstr "Por favor, resuelve los errores de corte y publica de nuevo." +msgid "" +"Network Plug-in is not detected. Network related features are unavailable." +msgstr "" + +msgid "" +"Preview only mode:\n" +"The loaded file contains gcode only, Can not enter the Prepare page" +msgstr "" + msgid "Some presets are modified." msgstr "Algunos preajustes se modifican." @@ -2887,9 +2926,6 @@ msgstr "Creando un nuevo proyecto" msgid "Load project" msgstr "Carga de Proyecto" -msgid "Preview only mode for gcode file." -msgstr "" - msgid "The selected file" msgstr "El archivo seleccionado" @@ -2915,10 +2951,10 @@ msgid "Only one G-code file can be opened at the same time." msgstr "Sólo se puede abrir un archivo de código G al mismo tiempo." msgid "Can not add models when in preview mode!" -msgstr "" +msgstr "Unable to add models in preview mode" msgid "Add Models" -msgstr "" +msgstr "Add Models" msgid "All objects will be removed, continue?" msgstr "Todos los objetos serán eliminados, deseas continuar?" @@ -2949,9 +2985,6 @@ msgstr "" "Imprimir por objeto: \n" "Sugiere utilizar el auto-posicionamiento para evitar colisiones al imprimir." -msgid "Export G-code" -msgstr "Exportar código G" - msgid "Send G-code" msgstr "Enviar código G" @@ -2984,7 +3017,7 @@ msgstr "Tamaño: %1% x %2% x %3% mm\n" #, boost-format msgid "Volume: %1% in³\n" -msgstr "" +msgstr "Volume: %1% in³\n" #, boost-format msgid "Volume: %1% mm³\n" @@ -3012,34 +3045,34 @@ msgid "Changing application language" msgstr "Cambiar el idioma de la aplicación" msgid "Changing the region will log out your account.\n" -msgstr "" +msgstr "Changing the region will log you out of your account.\n" msgid "Region selection" -msgstr "" +msgstr "Region selection" msgid "Second" msgstr "Segundo" msgid "General Settings" -msgstr "" +msgstr "General Settings" msgid "Asia-Pacific" -msgstr "" +msgstr "Asia-Pacific" msgid "China" -msgstr "" +msgstr "China" msgid "Europe" -msgstr "" +msgstr "Europe" msgid "North America" -msgstr "" +msgstr "North America" msgid "Others" msgstr "Otros" msgid "Login Region" -msgstr "" +msgstr "Login Region" msgid "Metric" msgstr "Métrico" @@ -3054,10 +3087,10 @@ msgid "User sync" msgstr "Sincronización del usuario" msgid "Auto sync user presets(Printer/Filament/Process)" -msgstr "" +msgstr "Auto sync user presets(Printer/Filament/Process)" msgid "User Sync" -msgstr "" +msgstr "User Sync" msgid "Associate files to BambuStudio" msgstr "Asociar archivos a BambuStudio" @@ -3079,7 +3112,7 @@ msgstr "" "archivos .stl" msgid "Associate .step/.stp files to BambuStudio" -msgstr "" +msgstr "Associate .step/.stp files to BambuStudio" msgid "If enabled, sets BambuStudio as default application to open .step files" msgstr "" @@ -3156,7 +3189,7 @@ msgid "trace" msgstr "traza" msgid "Host Setting" -msgstr "" +msgstr "Host Setting" msgid "DEV host: api-dev.bambu-lab.com/v1" msgstr "DEV host: api-dev.bambu-lab.com/v1" @@ -3179,8 +3212,8 @@ msgstr "guardar los ajustes de depuración" msgid "DEBUG settings have saved successfully!" msgstr "¡Los ajustes de depuración se han guardado con éxito!" -msgid "Swith cloud environment, Please login again!" -msgstr "Cambiar el entorno de la nube, ¡Por favor, inicie sesión de nuevo!" +msgid "Switch cloud environment, Please login again!" +msgstr "" msgid "System presets" msgstr "Ajustes del sistema" @@ -3316,6 +3349,12 @@ msgstr "Para \"%1%\", añada \"%2%\" como un nuevo preajuste" msgid "Simply switch to \"%1%\"" msgstr "Simplemente cambia a \"%1%\"" +msgid "Online" +msgstr "En línea" + +msgid "Offline" +msgstr "Fuera de línea" + msgid "My Device" msgstr "Mi dispositivo" @@ -3323,10 +3362,13 @@ msgid "Other Device" msgstr "Otro dispositivo" msgid "Input access code" -msgstr "" +msgstr "Input access code" + +msgid "Log out successful." +msgstr "Cierre de sesión con éxito." msgid "Busy" -msgstr "" +msgstr "Busy" msgid "Bambu Cool Plate" msgstr "Placa frío Bambu" @@ -3341,7 +3383,7 @@ msgid "Send print job to" msgstr "Enviar el trabajo de impresión a" msgid "Refresh" -msgstr "" +msgstr "Refresh" msgid "Bed Leveling" msgstr "Nivelación de la cama" @@ -3356,47 +3398,50 @@ msgid "send completed" msgstr "envío completo" msgid "No login account, only printers in LAN mode are displayed" -msgstr "" +msgstr "No login account, only printers in LAN mode are displayed" msgid "Connecting to server" -msgstr "" +msgstr "Connecting to server" msgid "Synchronizing device information" -msgstr "" +msgstr "Synchronizing device information" msgid "Synchronizing device information time out" -msgstr "" +msgstr "Synchronizing device information time out" msgid "Cannot send the print task when the upgrade is in progress" -msgstr "" +msgstr "Cannot send the print task when the upgrade is in progress" msgid "" "The printer is executing instructions. Please restart printing after it ends" msgstr "" +"The printer is executing instructions. Please restart printing after it ends" msgid "The printer is busy on other print job" -msgstr "" +msgstr "The printer is busy with another print job." -msgid "" -"The firmware versions of printer and AMS are too low.Please update to the " -"latest version before sending the print job" +msgid "Printer firmware does not support material = >ams slot mapping." msgstr "" msgid "" "Filaments to AMS slots mappings have been established. You can click a " "filament above to change its mapping AMS slot" msgstr "" +"Filaments to AMS slots mappings have been established. You can click a " +"filament above to change its mapping AMS slot" msgid "" "Please click each filament above to specify its mapping AMS slot before " "sending the print job" msgstr "" +"Please click each filament above to specify its mapping AMS slot before " +"sending the print job" msgid "Preparing print job" -msgstr "" +msgstr "Preparing print job" msgid "Modifying the device name" -msgstr "" +msgstr "Modifying the device name" msgid "Log in printer" msgstr "Iniciar sesión en la impresora" @@ -3421,9 +3466,6 @@ msgstr "" "Ha habido un problema de conexión con la impresora. Por favor, inténtelo de " "nuevo." -msgid "Log out successful." -msgstr "Cierre de sesión con éxito." - msgid "Failed to log out." msgstr "No se ha podido cerrar la sesión." @@ -3482,13 +3524,13 @@ msgid "Prime tower" msgstr "Torre Principal" msgid "Flush options" -msgstr "" +msgstr "Opciones de purga" msgid "Special mode" msgstr "Modo especial" -msgid "Output file" -msgstr "Archivo de salida" +msgid "G-code output" +msgstr "" msgid "Frequent" msgstr "Frecuente" @@ -3515,7 +3557,7 @@ msgid "Reserved keywords found" msgstr "Palabras clave utilizadas y encontradas" msgid "Setting Overrides" -msgstr "" +msgstr "Setting Overrides" msgid "Retraction" msgstr "Retracción" @@ -3550,6 +3592,8 @@ msgid "" "Bed temperature when cool plate is installed. Value 0 means the filament " "does not support to print on the Cool Plate" msgstr "" +"This is the bed temperature when the cool plate is installed. A value of 0 " +"means the filament does not support printing on the Cool Plate." msgid "Engineering plate" msgstr "Placa de ingeniería" @@ -3558,6 +3602,8 @@ msgid "" "Bed temperature when engineering plate is installed. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" +"This is the bed temperature when the engineering plate is installed. A value " +"of 0 means the filament does not support printing on the Engineering Plate." msgid "High Temp Plate" msgstr "Placa de alta temperatura" @@ -3566,6 +3612,9 @@ msgid "" "Bed temperature when high temperature plate is installed. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" +"This is the bed temperature when the high temperature plate is installed. A " +"value of 0 means the filament does not support printing on the High Temp " +"Plate." msgid "Volumetric speed limitation" msgstr "Limitación de la velocidad volumétrica" @@ -3805,7 +3854,7 @@ msgid "The name \"%1%\" already exists." msgstr "El nombre \"%1%\" ya existe." msgid "Basic Info" -msgstr "" +msgstr "Basic Info" msgid "Pictures" msgstr "Fotos" @@ -3872,7 +3921,7 @@ msgid "The configuration is up to date." msgstr "La configuración está actualizada." msgid "Auto-Calc" -msgstr "" +msgstr "Auto-Calc" msgid "Flushing volumes for filament change" msgstr "Volúmenes de limpieza para el cambio de filamentos" @@ -4374,11 +4423,11 @@ msgstr "" #, boost-format msgid "%1% is too close to others, and collisions may be caused." -msgstr "" +msgstr "%1% is too close to others, and collisions may be caused." #, boost-format msgid "%1% is too tall, and collisions will be caused." -msgstr "" +msgstr "%1% is too tall, and collisions will be caused." msgid " is too close to others, there will be collisions when printing.\n" msgstr " está demasiado cerca de otros, habrá colisiones al imprimir.\n" @@ -4392,10 +4441,10 @@ msgid "Prime Tower" msgstr "Torre principal" msgid " is too close to others, and collisions may be caused.\n" -msgstr "" +msgstr " is too close to others, and collisions may be caused.\n" msgid " is too close to exclusion area, and collisions will be caused.\n" -msgstr "" +msgstr " is too close to exclusion area, and collisions will be caused.\n" msgid "" "Can not print multiple filaments which have large difference of temperature " @@ -4551,6 +4600,8 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Cool Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the Cool Plate." msgid "°C" msgstr "°C" @@ -4562,11 +4613,15 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the Engineering Plate." msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the High Temp Plate." msgid "Initial layer" msgstr "Capa inicial" @@ -4578,16 +4633,22 @@ msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Cool Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the Cool Plate." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Engineering Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the Engineering Plate." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the High Temp Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the High Temp Plate." msgid "Bed types supported by the printer" msgstr "Tipos de cama que admite la impresora" @@ -4676,12 +4737,14 @@ msgstr "" "de material para el puente, para mejorar el hundimiento" msgid "Only one wall on top surfaces" -msgstr "" +msgstr "Sólo una pared en las superficies superiores" msgid "" "Use only one wall on flat top surface, to give more space to the top infill " "pattern" msgstr "" +"Sólo una pared en la superficies superiores, para dar más espacio a la placa " +"de relleno superior" msgid "Slow down for overhang" msgstr "Disminución de velocidad de voladizo" @@ -4816,6 +4879,18 @@ msgstr "" "No apoye todo el área del puente que hace el apoyo muy grande. El puente " "normalmente puede imprimirse directamente sin soporte si no es muy largo" +msgid "Thick bridges" +msgstr "" + +msgid "Layers and Perimeters" +msgstr "" + +msgid "" +"If enabled, bridges are more reliable, can bridge longer distances, but may " +"look worse. If disabled, bridges look better but are reliable just for " +"shorter bridged distances." +msgstr "" + msgid "Max bridge length" msgstr "Distancia máxima de puentes" @@ -4824,6 +4899,9 @@ msgid "" "bridges to be supported, and set it to a very large value if you don't want " "any bridges to be supported." msgstr "" +"Max length of bridges that don't need support. Set it to 0 if you want all " +"bridges to be supported, and set it to a very large value if you don't want " +"any bridges to be supported." msgid "End G-code" msgstr "Código G final" @@ -4849,7 +4927,6 @@ msgstr "Zig zag" msgid "Monotonic" msgstr "Monotónico" -# Monotonic line, I suppose you mean a continuous line, in which case in English it would be translated as "Linea continua", another translation would be to say that the line is monotonous, that is, repetitive, in which case, the translation would be "Linea repetitiva", but I think what you are referring to and what comes closest is "Linea continua". msgid "Monotonic line" msgstr "Linea continua" @@ -5048,6 +5125,7 @@ msgstr "Material de soporte" msgid "" "Support material is commonly used to print support and support interface" msgstr "" +"Support material is commonly used to print support and support interface" msgid "Temperature of vitrificaiton" msgstr "Temperatura de vitrificación" @@ -5082,7 +5160,7 @@ msgstr "" "dirección principal de la línea" msgid "Sparse infill density" -msgstr "Densidad de relleno escasa" +msgstr "Densidad de relleno" #, c-format msgid "Density of internal sparse infill, 100% means solid throughout" @@ -5541,10 +5619,9 @@ msgstr "Reducir la retracción del relleno" msgid "" "Don't retract when the travel is in infill area absolutely. That means the " -"oozing can't been seen" +"oozing can't been seen. This can reduce times of retraction for complex " +"model and save printing time, but make slicing and G-code generating slower" msgstr "" -"No se repliegue cuando el recorrido esté en zona de relleno absolutamente. " -"Eso significa que el rezago no puede ser visto" msgid "Enable" msgstr "Habilitar" @@ -5718,7 +5795,7 @@ msgid "Distance from skirt to brim or object" msgstr "Distancia de la falda al borde o al objeto" msgid "Skirt loops" -msgstr "Lazos de la falda" +msgstr "Contorno de la falda" msgid "Number of loops for the skirt. Zero means disabling skirt" msgstr "Número de bucles de la falda. Cero significa desactivar el faldón" @@ -6120,7 +6197,7 @@ msgid "Width of prime tower" msgstr "Anchura de la torre principal" msgid "Flush into objects' infill" -msgstr "" +msgstr "Purgar en el relleno de los objetos" msgid "" "Purging after filament change will be done inside objects' infills. This may " @@ -6128,23 +6205,32 @@ msgid "" "printed with transparent filament, the mixed color infill will be seen " "outside" msgstr "" +"La purga tras el cambio de filamento se realizará dentro del relleno de los " +"objetos. Esto puede reducir la cantidad de residuos y disminuir el tiempo de " +"impresión. Si las paredes se imprimen con filamento transparente, el " +"mezclado se podrá ver en el exterior." msgid "Flush into objects' support" -msgstr "" +msgstr "Flush into objects' support" msgid "" "Purging after filament change will be done inside objects' support. This may " "lower the amount of waste and decrease the print time" msgstr "" +"Purging after filament change will be done inside objects' support. This may " +"lower the amount of waste and decrease the print time." msgid "Flush into this object" -msgstr "" +msgstr "Flush into this object" msgid "" "This object will be used to purge the nozzle after a filament change to save " "filament and decrease the print time. Colours of the objects will be mixed " "as a result" msgstr "" +"This object will be used to purge the nozzle after a filament change to save " +"filament and decrease the print time. Colours of the objects will be mixed " +"as a result" msgid "X-Y hole compensation" msgstr "Compensación de huecos X-Y" @@ -6346,11305 +6432,179 @@ msgstr "Soporte: arreglar huecos en la capa %d" msgid "Support: propagate branches at layer %d" msgstr "Soporte: propagar ramas en la capa %d" -#~ msgid "Fix model through cloud" -#~ msgstr "Fijar el modelo a través de la nube" +#~ msgid "Creating" +#~ msgstr "Creando" -#~ msgid "Fix model locally" -#~ msgstr "Fijar el modelo localmente" +#~ msgid "Uploading" +#~ msgstr "Subiendo" -#~ msgid "Lightning" -#~ msgstr "Lightning" +#~ msgid "Waiting" +#~ msgstr "Esperando" -#~ msgid "Module" -#~ msgstr "Módulo" +#~ msgid "Sending" +#~ msgstr "Enviando" -#~ msgid "Mouse wheel" -#~ msgstr "Rueda del ratón" +#~ msgid "Finished" +#~ msgstr "Terminado" -#~ msgid "Any arrow" -#~ msgstr "Cualquier flecha" +#~ msgid "Please fill report first." +#~ msgstr "Por favor, rellene primero el informe." -#~ msgid "Shift + Any arrow" -#~ msgstr "Mayúsculas + Cualquier flecha" +#~ msgid "Unable to create zip file" +#~ msgstr "Unable to create zip file" -#~ msgid "Ctrl + Any arrow" -#~ msgstr "Ctrl + Cualquier tecla" +#~ msgid "Enter a search term" +#~ msgstr "Teclea un término de búsqueda" + +#~ msgid "Debug" +#~ msgstr "Depurar" + +#~ msgid "Monitoring" +#~ msgstr "Monitorizando" + +#~ msgid "Fragment filter" +#~ msgstr "Fragment filter" + +#~ msgid "Fragment Filter" +#~ msgstr "Fragment Filter" + +#~ msgid "Position:" +#~ msgstr "Posición:" #~ msgid "Alt + Mouse wheel" #~ msgstr "Alt + Rueda del ratón" -#~ msgid "Shift + Mouse wheel" -#~ msgstr "Mayúsculas + rueda del ratón" - -#~ msgid "Beginner's Tutorial" -#~ msgstr "Tutorial para principiantes" - -#~ msgid "Render statistics debugging box" -#~ msgstr "Cuadro de depuración de estadísticas de renderización" - -#~ msgid "The bed is auto leveling" -#~ msgstr "La cama es autonivelante" - -#~ msgid "The hot bed is preheating" -#~ msgstr "La cama caliente se está precalentando" - -#~ msgid "Frequncy sweeping" -#~ msgstr "Frecuencia de barrido" - -#~ msgid "Change the filament" -#~ msgstr "Cambiar el filamento" - -#~ msgid "Pause(M400)" -#~ msgstr "Pausa(M400)" - -#~ msgid "Pause(Lack of filament)" -#~ msgstr "Pausa(Falta de filamento)" - -#~ msgid "The nozzle is preheating" -#~ msgstr "La boquilla se está precalentando" - -#~ msgid "Extruder compensation scanning" -#~ msgstr "Escaneo de compensación del extrusor" - -#~ msgid "Bed surface scanning" -#~ msgstr "Exploración de la superficie de la cama" - -#~ msgid "First layer scanning" -#~ msgstr "Escaneo de la primera capa" - -#~ msgid "Bed surface is auto identifying" -#~ msgstr "La superficie de la cama es autoidentificable" - -#~ msgid "In the calibration of extrinsic parameters" -#~ msgstr "En la calibración de los parámetros extrínsecos" - -#~ msgid "The tool head is homing" -#~ msgstr "El cabezal de la herramienta se orienta" - -#~ msgid "Nozzle cleaning" -#~ msgstr "Limpieza de boquilla" - -#~ msgid "In the calibration of temperature protection" -#~ msgstr "En la calibración de la protección de la temperatura" - -#~ msgid "Silent Mode" -#~ msgstr "Modo Silencioso" - -#~ msgid "Show Edges(TODO)" -#~ msgstr "Mostrar bordes(TODO)" - -#~ msgid "Show Edges" -#~ msgstr "Mostrar bordes" - -#~ msgid "Associate .step files to BambuStudio" -#~ msgstr "Asociar archivos .step a BambuStudio" - -#~ msgid "Vibration Calibration" -#~ msgstr "Calibración de la vibración" - -#~ msgid "First Layer Inspection" -#~ msgstr "Inspección de la primera capa" - -#~ msgid "Please select a printer first." -#~ msgstr "Por favor, seleccione primero una impresora." - -#~ msgid "Enable spaghetti detector" -#~ msgstr "Activar el detector de espaguetis" - -#~ msgid "Enable the camera on printer to check spaghetti" -#~ msgstr "Habilitar la cámara en la impresora para comprobar los espaguetis" - -#~ msgid "Preparation before calibration" -#~ msgstr "Preparación antes de la calibración" - #~ msgid "" -#~ "Before calibration, please make sure a filament is loaded and its nozzle " -#~ "temperature and bed temperature is set in Feeding lab." +#~ "An object is layed over the boundary of plate.\n" +#~ "Please solve the problem by moving it totally inside or outside plate." #~ msgstr "" -#~ "Antes de la calibración, por favor asegúrese de que un filamento está " -#~ "cargado y su temperatura de la boquilla y la temperatura de la cama se " -#~ "ajusta en el campo de alimentación." +#~ "Un objeto está colocado sobre el límite de la placa.\n" +#~ "Por favor, resuelva el problema moviéndolo totalmente dentro o fuera de " +#~ "la placa." -#~ msgid "" -#~ "Calibration program detects the status of your device systematically to " -#~ "minimise deviation. It keeps the device at its the best performance" -#~ msgstr "" -#~ "El programa de calibración detecta el estado de su dispositivo " -#~ "sistemáticamente para minimizar las desviaciones. Mantiene el dispositivo " -#~ "en su mejor rendimiento" +#~ msgid "Arranging" +#~ msgstr "Organizando" -#~ msgid "Per Object Setting" -#~ msgstr "Por ajuste del objeto" +#~ msgid "Ctrl + Any arrow" +#~ msgstr "Ctrl + Cualquier tecla" -#~ msgid "Reset All" -#~ msgstr "Restablecer todo" +#~ msgid "Ctrl + Left mouse button" +#~ msgstr "Ctrl + Left mouse button" -#~ msgid "Internal error, no gcode file to upload." -#~ msgstr "Error interno, no hay archivo gcode para cargar." +#~ msgid "Display printable box" +#~ msgstr "Caja de visualización imprimible " -#~ msgid "Print job was cancelled." -#~ msgstr "La impresión fue cancelada" +#~ msgid "Display shadow of objects" +#~ msgstr "Mostrar la sombra de los objetos" -#~ msgid "Failed to create the print job. Please try agian." -#~ msgstr "" -#~ "No se ha podido crear el trabajo de impresión. Por favor, inténtelo de " -#~ "nuevo." - -#~ msgid "Failed to upload the print job. Please try agian." -#~ msgstr "" -#~ "No se ha podido cargar el trabajo de impresión. Por favor, inténtelo de " -#~ "nuevo." - -#~ msgid "Uploading print job timed out. Please try again." -#~ msgstr "" -#~ "Se ha agotado el tiempo de carga del trabajo de impresión. Por favor, " -#~ "inténtelo de nuevo." - -#~ msgid "Failed to send the print job. Please try again." -#~ msgstr "" -#~ "No se ha podido enviar el trabajo de impresión. Por favor, inténtelo de " -#~ "nuevo." - -#~ msgid "Sending print task timed out. Please try again." -#~ msgstr "" -#~ "El envío de la tarea de impresión se ha agotado. Por favor, inténtelo de " -#~ "nuevo." - -#~ msgid "The printer is being updated. Please try again after the update." -#~ msgstr "" -#~ "La impresora se está actualizando. Por favor, inténtelo de nuevo después " -#~ "de la actualización." - -#~ msgid "Exporting 3mf..." -#~ msgstr "Exportando 3mf..." - -#~ msgid "Internal error." -#~ msgstr "Error interno." - -#~ msgid "Exporting 3mf failed, please slice again." -#~ msgstr "La exportación de 3mf ha fallado, por favor, vuelva a cortar." - -#~ msgid "No printer available" -#~ msgstr "No hay impresora disponible" - -#~ msgid "YES" -#~ msgstr "SI" - -#~ msgid "NO" -#~ msgstr "NO" - -#~ msgid "The current file does not import any models." -#~ msgstr "El archivo actual no importó ningún modelo." +#~ msgid "Display triangles of models" +#~ msgstr "Mostrar los triángulos de los modelos" #~ msgid "" #~ "Do you want to synchronize your personal data from Bambu Cloud? \n" #~ "Contains the following information:\n" #~ "1. The Process presets\n" #~ "2. The Filament presets\n" -#~ "3. The Machine presets\n" +#~ "3. The Printer presets\n" #~ msgstr "" -#~ "¿Quieres sincronizar tus datos personales desde la Nube Bambu? \n" -#~ "Contiene la siguiente información:\n" -#~ "1. Los preajustes del proceso\n" -#~ "2. Los preajustes del filamento\n" -#~ "3. Los preajustes de la máquina\n" - -#~ msgid "Machine Control" -#~ msgstr "Control de Máquinas" - -#~ msgid "General settings" -#~ msgstr "Ajustes generales" - -#~ msgid "Bed temperature when cool plate is installed" -#~ msgstr "" -#~ "Temperatura de la cama cuando la placa de refrigeración está instalada" - -#~ msgid "Bed temperature when engineering plate is installed" -#~ msgstr "Temperatura de la cama cuando se instala la placa de ingeniería" - -#~ msgid "Bed temperature when high temperature plate is installed" -#~ msgstr "" -#~ "Temperatura de la cama cuando se instala la placa de alta temperatura" - -#~ msgid "Record Timelapse" -#~ msgstr "Grabar Timelapse" - -#~ msgid "bed temperature for layers except the initial one" -#~ msgstr "temperatura del lecho para las capas excepto la inicial" - -#~ msgid "Bed temperature of the initial layer" -#~ msgstr "Temperatura de la cama en la primera capa" - -#~ msgid "Filament Overrides" -#~ msgstr "Anulaciones de filamentos" - -#~ msgid "Tiny patch filter" -#~ msgstr "Filtro de parche pequeño" - -#~ msgid "Filter tiny patch" -#~ msgstr "Filtrar el pequeño parche" - -#~ msgid "Filament Retraction" -#~ msgstr "Retracción del filamento" - -#~ msgid "%1% is too close to others, there will be collisions when printing." -#~ msgstr "%1% está demasiado cerca de otros, habrá colisiones al imprimir." - -#~ msgid "" -#~ "\n" -#~ "%1% is too close to others, there will be collisions when printing." -#~ msgstr "" -#~ "\n" -#~ "%1% está demasiado cerca de otros, habrá colisiones al imprimir." - -#~ msgid "%1% is too tall, there will be collisions when printing." -#~ msgstr "%1% es demasiado alto, habrá colisiones al imprimir." - -#~ msgid "" -#~ "\n" -#~ "%1% is too tall, there will be collisions when printing." -#~ msgstr "" -#~ "\n" -#~ "%1% es demasiado alto, habrá colisiones al imprimir." - -#~ msgid "Login with your Account" -#~ msgstr "Acceda con su cuenta" - -#~ msgid "Logout" -#~ msgstr "Cierre de sesión" - -#~ msgid "Publish Model/Profile" -#~ msgstr "Publicar Modelo/Perfil" - -#~ msgid "Please slice all plates before upload" -#~ msgstr "Por favor, rebane todas las piezas antes de subirlas" - -#~ msgid "Chinese (Simplified)" -#~ msgstr "Chino (simplificado)" - -#~ msgid "GUI" -#~ msgstr "GUÍA" - -#~ msgid "Sync" -#~ msgstr "Sincronización" - -#~ msgid "Shortcuts" -#~ msgstr "Atajos" - -#~ msgid "Keep" -#~ msgstr "Mantener" - -# It is an abbreviation, in Spanish it can mean the same as in English, calculator, calculate, calculus etc, so it stays the same as it is. -#~ msgid "Calc" -#~ msgstr "Calc" - -#~ msgid "Smart" -#~ msgstr "Inteligente" - -#~ msgid "Extra flush volume" -#~ msgstr "Cantidad de flujo adicional" - -#~ msgid "mm3" -#~ msgstr "mm3" - -#~ msgid "Total Size:" -#~ msgstr "Tamaño total:" - -#~ msgid "Process %1% / 100" -#~ msgstr "Proceso %1% / 100" - -#~ msgid "Bambu Studio initialization failed" -#~ msgstr "Fallo en la inicialización de Bambu Studio" - -#~ msgid "Object %s has zero size and can't be arranged." -#~ msgstr "El objeto %s tiene tamaño cero y no puede ser organizado." - -#~ msgid "Show daily tips" -#~ msgstr "Mostrar consejos diarios" - -#~ msgid "Choose Filaments" -#~ msgstr "Elija Filamentos" - -#~ msgid "Bind Dialog" -#~ msgstr "Vincular el Diálogo" - -#~ msgid "Temperature and Axis Control" -#~ msgstr "Control de Temperatura y Ejes" - -#~ msgid "Model:" -#~ msgstr "Modelo:" - -#~ msgid "Serial:" -#~ msgstr "Serie:" - -#~ msgid "Version:" -#~ msgstr "Versión:" - -#~ msgid "Upgrade firmware" -#~ msgstr "Actualizar el firmware" - -#~ msgid "Relase Note" -#~ msgstr "Nota Relacionada" - -#~ msgid "Printing" -#~ msgstr "Imprimiendo" - -#~ msgid "Idle" -#~ msgstr "Idle" - -#~ msgid "Lastest version" -#~ msgstr "Última versión" - -#~ msgid "Upgrading" -#~ msgstr "Actualizando" - -#~ msgid "Upgrading success" -#~ msgstr "Actualizacion Exitosa" - -#~ msgid "Upgrading failed" -#~ msgstr "La actualización ha fallado" - -#~ msgid "Need to stop slicing first." -#~ msgstr "Hay que dejar de cortar primero." - -#~ msgid "Drop Files when slicing" -#~ msgstr "Soltar archivos al rebanar" - -#~ msgid "Importing Model" -#~ msgstr "Importando el modelo" - -#~ msgid "prepare 3mf file..." -#~ msgstr "preparar el archivo 3mf..." - -#~ msgid "Import project failed, Please try again!" -#~ msgstr "" -#~ "El proyecto de importación ha fallado, por favor, inténtelo de nuevo." - -#~ msgid "downloading project ..." -#~ msgstr "descargando el proyecto ..." - -#~ msgid "Project downloaded %d%%" -#~ msgstr "Proyecto descargado %d%%" - -#~ msgid "Failed to publish your project. Please try agian!" -#~ msgstr "" -#~ "No se ha podido publicar su proyecto. Por favor, inténtelo de nuevo." - -#~ msgid "preparing, export 3mf failed!" -#~ msgstr "Preparando, exportar 3mf no ha funcionado." - -#~ msgid "Preparing to upload your project..." -#~ msgstr "Preparando la carga de su proyecto..." - -#~ msgid "get_des,err:code=%u,msg=%s" -#~ msgstr "get_des,err:code=%u,msg=%s" - -#~ msgid "req_proj,err:code=%u,msg=%s" -#~ msgstr "req_proj,err:code=%u,msg=%s" - -#~ msgid "req_prof,err:code=%u,msg=%s" -#~ msgstr "req_proj,err:code=%u,msg=%s" - -#~ msgid "Uploading..." -#~ msgstr "Subiendo..." - -#~ msgid "Uploading %d%%, remaining time %s" -#~ msgstr "Cargando %d%%, tiempo restante %s" - -#~ msgid "Upload has been canceled." -#~ msgstr "La carga ha sido cancelada." - -#~ msgid "Publishing..." -#~ msgstr "Publicando..." - -#~ msgid "Failed to publish. Please try again!" -#~ msgstr "No se ha podido publicar. Por favor, inténtelo de nuevo." - -#~ msgid "Uploading is timed out. Please try again!" -#~ msgstr "El tiempo de carga se ha agotado. Por favor, inténtelo de nuevo." - -#~ msgid "Design id is empty." -#~ msgstr "El nombre del diseño está vacío." - -#~ msgid "Current printer is busy. Please select another one." -#~ msgstr "La impresora actual está ocupada. Por favor, seleccione otra." - -#~ msgid "Unable to get system certificate." -#~ msgstr "No se puede obtener el certificado del sistema." - -#~ msgid "use system SSL certificate: %1%" -#~ msgstr "utilizar el certificado SSL del sistema: %1%" - -#~ msgid "CURL initialization failed. See the log for additional details." -#~ msgstr "" -#~ "La inicialización de CURL ha fallado. Consulte el registro para obtener " -#~ "más detalles." - -#~ msgid "print project cancelled." -#~ msgstr "imprimir el proyecto cancelado." - -#~ msgid "Creating a print job..." -#~ msgstr "Creando un trabajo de impresión..." - -#~ msgid "Uploading the print job..." -#~ msgstr "Cargando el trabajo de impresión..." - -#~ msgid "The size of the uploaded file cannot exceed 1 GB." -#~ msgstr "El tamaño del archivo cargado no puede superar 1 GB." - -#~ msgid " Failed to upload the print job. Check Md5 failed, please try agian." -#~ msgstr "" -#~ " No se ha podido cargar el trabajo de impresión. La comprobación de Md5 " -#~ "ha fallado, inténtelo de nuevo." - -#~ msgid "" -#~ "\n" -#~ "upload,err:code=%u,msg=%s" -#~ msgstr "upload,err:code=%u,msg=%s" - -#~ msgid "Wait for the job to be sent." -#~ msgstr "Espere a que se envíe el trabajo." - -#~ msgid "The print job has been sent to your printer." -#~ msgstr "El trabajo de impresión se ha enviado a la impresora." - -#~ msgid "Invalid plate index %d" -#~ msgstr "Índice de placa inválido %d" - -#~ msgid "Plate %d" -#~ msgstr "Placa %d" - -#~ msgid "%s" -#~ msgstr "%s" - -#~ msgid "Start printing..." -#~ msgstr "Comenzar a imprimir..." - -#~ msgid "No brim" -#~ msgstr "Sin borde" - -#~ msgid "Outer brim only" -#~ msgstr "Sólo el borde exterior" - -#~ msgid "Inner brim only" -#~ msgstr "Sólo el borde interior" - -#~ msgid "Outer and inner brim" -#~ msgstr "Borde interior y exterior" - -#~ msgid "Load" -#~ msgstr "Cargar" - -#~ msgid "First layer" -#~ msgstr "Primera capa" - -#~ msgid "Import STL/OBJ/AMF/3MF without config, keep plater" -#~ msgstr "Importar STL/OBJ/AMF/3MF sin configuración, mantener la base" - -#~ msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" -#~ msgstr "" -#~ "Todos los movimientos: Rotar - botón izquierdo ratón; Girar- botón " -#~ "derecho ratón" - -#~ msgid "Gizmo move: Press to snap by 1mm" -#~ msgstr "Herramienta de mover: Pulsa para ajustar en pasos de 1 mm" - -#~ msgid "Gizmos" -#~ msgstr "Gizmos" - -#~ msgid "Eject drive" -#~ msgstr "Expulsar la unidad" - -#~ msgid "%1$d open edge" -#~ msgid_plural "%1$d open edges" -#~ msgstr[0] "%1$d esquina abierta" -#~ msgstr[1] "%1$d esquinas abiertas" - -#~ msgid "Save project" -#~ msgstr "Guardar proyecto" - -#~ msgid "Event" -#~ msgstr "Evento" - -#~ msgid "Remaining time" -#~ msgstr "Tiempo restante" - -#~ msgid "Duration" -#~ msgstr "Duración" - -#~ msgid "Fan settings" -#~ msgstr "Configuración del ventilador" - -#~ msgid "Cooling thresholds" -#~ msgstr "Umbrales de enfriamiento" - -#~ msgid "Enable auto cooling" -#~ msgstr "Habilitar el enfriamiento automático" - -#~ msgid "Disable fan for the first" -#~ msgstr "Desactivar ventilador para la primera" - -#~ msgid "Enable fan if layer print time is below" -#~ msgstr "" -#~ "Habilitar ventilador si el tiempo de impresión de la capa está por debajo" - -#~ msgid "Slow down if layer print time is below" -#~ msgstr "" -#~ "Disminuir la velocidad si el tiempo de impresión de la capa está por " -#~ "debajo" - -#~ msgid "mm or %" -#~ msgstr "mm o %" - -#~ msgid "Merge" -#~ msgstr "Combinar" - -#~ msgid "Merged" -#~ msgstr "Juntar" - -#~ msgid "Upgrade" -#~ msgstr "Actualización" - -#~ msgid "Gizmo-Move" -#~ msgstr "Gizmo-Mover" - -#~ msgid "Gizmo-Scale" -#~ msgstr "Gizmo-Escalar" - -#~ msgid "Gizmo-Rotate" -#~ msgstr "Gizmo-Rotar" - -#~ msgid "Export current plate as G-code" -#~ msgstr "Exportar plataforma actual como código G" - -#~ msgid "Box" -#~ msgstr "Caja" - -#~ msgid "Switching Presets: Unsaved Changes" -#~ msgstr "Cambio de ajustes preestablecidos: Cambios No guardados" - -#~ msgid "Save the selected options to preset \"%1%\"." -#~ msgstr "Guardar las opciones seleccionadas al ajuste \"%1%\"." - -#~ msgid "Transfer the selected options to the newly selected preset \"%1%\"." -#~ msgstr "" -#~ "Transferir las opciones seleccionadas al nuevo ajuste seleccionado \"%1%" -#~ "\"." - -#~ msgid "The following preset was modified" -#~ msgid_plural "The following presets were modified" -#~ msgstr[0] "El siguiente ajuste se modificó" -#~ msgstr[1] "Los siguientes ajustes se modificaron" - -#~ msgid "Local coordinates" -#~ msgstr "Coordenadas locales" - -#~ msgid "Object name" -#~ msgstr "Nombre del objeto" - -#~ msgid "Set Mirror" -#~ msgstr "Establecer Reflejo" - -#~ msgid "Drop to bed" -#~ msgstr "Colocar en la Cama" - -#~ msgid "Reset rotation" -#~ msgstr "Reiniciar rotación" - -#~ msgid "Reset scale" -#~ msgstr "Reiniciar escala" - -#~ msgid "Inches" -#~ msgstr "Pulgadas" - -#~ msgid "default value" -#~ msgstr "valor por defecto" - -#~ msgid "parameter name" -#~ msgstr "nombre del parámetro" - -#~ msgid "Add..." -#~ msgstr "Añadir..." - -#~ msgid "Max print speed" -#~ msgstr "Velocidad máxima de impresión" - -#~ msgid "mm/s or %" -#~ msgstr "mm/s o %" - -#~ msgid "Thick bridges" -#~ msgstr "Puentes gruesos" - -#~ msgid "Default color" -#~ msgstr "Color predeterminado" - -#~ msgid "Check for Configuration Updates" -#~ msgstr "Comprobación de las Actualizaciones de la Configuración" - -#~ msgid "Check for configuration updates" -#~ msgstr "Comprueba si hay actualizaciones de configuración" - -#~ msgid "Application preferences" -#~ msgstr "Preferencias de la aplicación" - -#~ msgid "Simple" -#~ msgstr "Sencillo" - -#~ msgid "Mode" -#~ msgstr "&Modo" - -#~ msgid "Restart application" -#~ msgstr "Reiniciar aplicación" - -#~ msgid "Run %s" -#~ msgstr "Ejecutar %s" - -#~ msgid "Add/Remove printers" -#~ msgstr "Añade/Quita impresoras" - -#~ msgid "Configuration update is available." -#~ msgstr "Disponible la actualización de la configuración." - -#~ msgid "See more." -#~ msgstr "Ver más." - -#~ msgid "" -#~ "You have just added a G-code for color change, but its value is empty.\n" -#~ "To export the G-code correctly, check the \"Color Change G-code\" in " -#~ "\"Printer Settings > Custom G-code\"" -#~ msgstr "" -#~ "Acabas de añadir un código G para el cambio de color, pero su valor está " -#~ "vacío.\n" -#~ "Para exportar el código G correctamente, marca \"Código G Cambio de Color" -#~ "\" in \"Configuración de la Impresora > Código G Personalizado\"" - -#~ msgid "" -#~ "No color change event was added to the print. The print does not look " -#~ "like a sign." -#~ msgstr "" -#~ "No se ha añadido ningún evento de cambio de color a la impresión. La " -#~ "impresión no parece un cartel." - -#~ msgid "Desktop integration was successful." -#~ msgstr "La integración en el escritorio ha sido un éxito." - -#~ msgid "Desktop integration failed." -#~ msgstr "La integración en el escritorio ha fallado." - -#~ msgid "Undo desktop integration was successful." -#~ msgstr "Deshacer la integración en el escritorio ha sido un éxito." - -#~ msgid "Undo desktop integration failed." -#~ msgstr "Deshacer la integración en el escritorio ha fallado." - -#~ msgid "See Releases page." -#~ msgstr "Consultar página de lanzamientos." - -#~ msgid "Slicing finished." -#~ msgstr "Laminado finalizado." - -#~ msgid "ERROR:" -#~ msgstr "ERROR:" - -#~ msgid "Exporting finished." -#~ msgstr "Exportación finalizada." - -#~ msgid "Add/Remove filaments" -#~ msgstr "Añadir/Retirar filamentos" - -#~ msgid "Add/Remove materials" -#~ msgstr "Añadir/Retirar materiales" - -#~ msgid "System Information" -#~ msgstr "Información del sistema" - -#~ msgid "Copy to Clipboard" -#~ msgstr "Copiar al portapapeles" - -#~ msgid "&Preferences" -#~ msgstr "&Preferencias" - -#~ msgid "&Language" -#~ msgstr "&Idioma" - -#~ msgid "&Configuration" -#~ msgstr "&Configuración" - -#~ msgid "&New Project" -#~ msgstr "&Nuevo proyecto" - -#~ msgid "&Open Project" -#~ msgstr "Abrir pr&oyecto" - -#~ msgid "&Save Project" -#~ msgstr "G&uardar proyecto" - -#~ msgid "Save Project &as" -#~ msgstr "Guardar Proyecto &como" - -#~ msgid "Export &G-code" -#~ msgstr "Exportar código &G" - -#~ msgid "&Export" -#~ msgstr "&Exportar" - -#~ msgid "&Undo" -#~ msgstr "Des&hacer" - -#~ msgid "&Redo" -#~ msgstr "&Rehacer" - -#~ msgid "&Copy" -#~ msgstr "&Copiar" - -#~ msgid "&Paste" -#~ msgstr "&Pegar" - -#~ msgid "&Delete selected" -#~ msgstr "Eli&minar selección" - -#~ msgid "&Select all" -#~ msgstr "&Seleccionar todo" - -#~ msgid "D&eselect all" -#~ msgstr "D&eseleccionar todo" - -#~ msgid "&Edit" -#~ msgstr "&Editar" - -#~ msgid "Select a gcode file:" -#~ msgstr "Seleccione un archivo gcode:" - -#~ msgid "Paint-on supports" -#~ msgstr "Soportes pintables" - -#~ msgid "Paint-on seam" -#~ msgstr "Pintado de costuras" - -#~ msgid "Multimaterial painting" -#~ msgstr "" -#~ "Espejo\n" -#~ "¿Sabías que puedes reflejar el modelo seleccionado para crear una versión " -#~ "invertida del mismo? Haz clic con el botón derecho del ratón en el " -#~ "modelo, selecciona Espejo y elije el eje de espejo." - -#~ msgid "Sinking" -#~ msgstr "Hundimiento" - -#~ msgid "Instances" -#~ msgstr "Instancias" - -#~ msgid "Instance %d" -#~ msgstr "Instancia %d" - -#~ msgid "Change extruder color" -#~ msgstr "Cambiar color del extrusor" - -#~ msgid "Stealth" -#~ msgstr "Silencio" - -#~ msgid "Material Settings" -#~ msgstr "Configuraciones del material" - -#~ msgid "" -#~ "Post-processing script %1% failed.\n" -#~ "\n" -#~ "The post-processing script is expected to change the G-code file %2% in " -#~ "place, but the G-code file was deleted and likely saved under a new " -#~ "name.\n" -#~ "Please adjust the post-processing script to change the G-code in place " -#~ "and consult the manual on how to optionally rename the post-processed G-" -#~ "code file.\n" -#~ msgstr "" -#~ "El script de post-procesamiento %1% falló.\n" -#~ "\n" -#~ "Se espera que el script de post-procesamiento cambie el archivo de código " -#~ "G %2% en su lugar, pero el archivo de código G fue borrado y " -#~ "probablemente guardado con un nuevo nombre.\n" -#~ "Por favor, ajusta el script de post-procesamiento para cambiar el código " -#~ "G en su lugar y consulta el manual sobre cómo renombrar opcionalmente el " -#~ "archivo de código G post-procesado.\n" - -#~ msgid "First layer bed temperature" -#~ msgstr "Temperatura de la base calefable para la primera capa" - -#~ msgid "First layer density" -#~ msgstr "Densidad de la primera capa" - -#~ msgid "First layer expansion" -#~ msgstr "Expansión de la primera capa" - -#~ msgid "Purging volumes - load/unload volumes" -#~ msgstr "Volumen de purga - volumen de carga/descarga" - -#~ msgid "Purging volumes - matrix" -#~ msgstr "Volúmenes de purga - matriz" - -#~ msgid "G-code viewer" -#~ msgstr "Visor código G" - -#~ msgid "Visualize an already sliced and saved G-code" -#~ msgstr "Visualizar un código G ya laminado y guardado" - -#~ msgid "Split triangles" -#~ msgstr "Dividir triángulos" - -#~ msgid "Clipping of view" -#~ msgstr "Recorte de la vista" - -#~ msgid "Reset direction" -#~ msgstr "Restablecer dirección" - -#~ msgid "Brush size" -#~ msgstr "Tamaño del pincel" - -#~ msgid "Brush shape" -#~ msgstr "Forma de pincel" - -#~ msgid "Enforce seam" -#~ msgstr "Imponer costura" - -#~ msgid "Block seam" -#~ msgstr "Bloquear costura" - -#~ msgid "Remove selection" -#~ msgstr "Eliminar selección" - -#~ msgid "Remove all selection" -#~ msgstr "Eliminar toda la selección" - -#~ msgid "Seam painting" -#~ msgstr "Pintado de costuras" - -#~ msgid "Paints all facets inside, regardless of their orientation." -#~ msgstr "" -#~ "Pinta todas las caras del interior, independientemente de su orientación." - -#~ msgid "Ignores facets facing away from the camera." -#~ msgstr "Ignora los lados que no están mirando hacia la cámara." - -#~ msgid "" -#~ "License agreements of all following programs (libraries) are part of " -#~ "application license agreement" -#~ msgstr "" -#~ "Los acuerdos de licencia de todos los programas (bibliotecas) siguientes " -#~ "forman parte del acuerdo de licencia de la aplicación" - -#~ msgid "is licensed under the" -#~ msgstr "está licenciado bajo el/los" - -#~ msgid "" -#~ "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " -#~ "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " -#~ "numerous others." -#~ msgstr "" -#~ "Contribuciones de Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " -#~ "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik y " -#~ "muchos otros." - -#~ msgid "Copy Version Info" -#~ msgstr "Copiar Información de Versión" - -#~ msgid "nozzle" -#~ msgstr "boquilla" - -#~ msgid "Alternate nozzles:" -#~ msgstr "Alternar nozzles:" - -#~ msgid "All standard" -#~ msgstr "Todo estandar" - -#~ msgid "Welcome to the %s Configuration Assistant" -#~ msgstr "Bienvenido al %s Asistente de Configuración" - -#~ msgid "Welcome to the %s Configuration Wizard" -#~ msgstr "Bienvenido al %s Ayudante de Configuración" - -#~ msgid "Welcome" -#~ msgstr "Bienvenido" - -#~ msgid "" -#~ "Hello, welcome to %s! This %s helps you with the initial configuration; " -#~ "just a few settings and you will be ready to print." -#~ msgstr "" -#~ "Hola, bienvenido a %s! Este %s te ayuda con la configuración inicial; " -#~ "sólo unos pocos ajustes y estarás preparado para imprimir." - -#~ msgid "Remove user profiles (a snapshot will be taken beforehand)" -#~ msgstr "" -#~ "Eliminar perfiles de usuario (se tomará una instantánea de antemano)" - -#~ msgid "" -#~ "Perform desktop integration (Sets this binary to be searchable by the " -#~ "system)." -#~ msgstr "" -#~ "Realiza la integración del escritorio (Establece este binario para que " -#~ "pueda ser buscado por el sistema)." - -#~ msgid "%s Family" -#~ msgstr "%s Familia" - -#~ msgid "Printer:" -#~ msgstr "Impresora:" - -#~ msgid "Vendor:" -#~ msgstr "Vendedor:" - -#~ msgid "Profile:" -#~ msgstr "Perfil:" - -#~ msgid "(All)" -#~ msgstr "(Todo)" - -#~ msgid "" -#~ "%1% marked with * are not compatible with some installed " -#~ "printers." -#~ msgstr "" -#~ "%1% marcados con un * no son compatible con algunas de las " -#~ "impresoras instaladas." - -#~ msgid "SLA materials" -#~ msgstr "Materiales SLA" - -#~ msgid "All installed printers are compatible with the selected %1%." -#~ msgstr "" -#~ "Todas las impresoras instaladas son compatibles con el %1% seleccionado." - -#~ msgid "filament" -#~ msgstr "filamento" - -#~ msgid "SLA material" -#~ msgstr "Material SLA" - -#~ msgid "" -#~ "Only the following installed printers are compatible with the selected " -#~ "filaments" -#~ msgstr "" -#~ "Sólo las siguientes impresoras instaladas son compatibles con los " -#~ "filamentos seleccionados" - -#~ msgid "" -#~ "Only the following installed printers are compatible with the selected " -#~ "SLA materials" -#~ msgstr "" -#~ "Sólo las siguientes impresoras instaladas son compatibles con los " -#~ "materiales SLA seleccionados" - -#~ msgid "Custom Printer Setup" -#~ msgstr "Configuración personalizada de impresora" - -#~ msgid "Custom Printer" -#~ msgstr "Impresora personalizada" - -#~ msgid "Define a custom printer profile" -#~ msgstr "Definir un perfil de impresora personalizado" - -#~ msgid "Custom profile name:" -#~ msgstr "Nombre impresora personalizada:" - -#~ msgid "Files association" -#~ msgstr "Asociación de archivos" - -#~ msgid "Other Vendors" -#~ msgstr "Otras Marcas" - -#~ msgid "Invalid numeric input." -#~ msgstr "Entrada numérica no válida." - -#~ msgid "Filament and Nozzle Diameters" -#~ msgstr "Filamento y diámetros de boquilla" - -#~ msgid "Print Diameters" -#~ msgstr "Diámetros de impresión" - -#~ msgid "Enter the diameter of your printer's hot end nozzle." -#~ msgstr "Introduce el diámetro de la boquilla del fusor de tu impresora." - -#~ msgid "Nozzle Diameter:" -#~ msgstr "Diámetro de la boquilla:" - -#~ msgid "Enter the diameter of your filament." -#~ msgstr "Introduce el diámetro de tu filamento." - -#~ msgid "" -#~ "Good precision is required, so use a caliper and do multiple measurements " -#~ "along the filament, then compute the average." -#~ msgstr "" -#~ "Se necesita buena precisión, así que usa un calibre y realiza varias " -#~ "medidas a lo largo del filamento, luego calcula la media." - -#~ msgid "Filament Diameter:" -#~ msgstr "Diámetro del filamento:" - -#~ msgid "Nozzle and Bed Temperatures" -#~ msgstr "Temperaturas de la Base y la Boquilla" - -#~ msgid "Temperatures" -#~ msgstr "Temperaturas" - -#~ msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." -#~ msgstr "" -#~ "Una buena aproximación es de 160 a 230 °C para PLA y de 215 a 250 °C para " -#~ "ABS." - -#~ msgid "Extrusion Temperature:" -#~ msgstr "Temperatura de Extrusión:" - -#~ msgid "" -#~ "Enter the bed temperature needed for getting your filament to stick to " -#~ "your heated bed." -#~ msgstr "" -#~ "Introduce la temperatura de la base necesaria para que adhiera el " -#~ "filamento a la base calefactable." - -#~ msgid "" -#~ "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you " -#~ "have no heated bed." -#~ msgstr "" -#~ "Una buena aproximación son unos 60°C para PLA y 110°C para ABS. Deja el " -#~ "valor a cero si no tienes base calefactable." - -#~ msgid "Bed Temperature:" -#~ msgstr "Temperatura de la base:" - -#~ msgid "SLA Materials" -#~ msgstr "Materiales SLA" - -#~ msgid "FFF Technology Printers" -#~ msgstr "Impresoras de Tecnología FFF" - -#~ msgid "SLA Technology Printers" -#~ msgstr "Impresoras de tecnología SLA" - -#~ msgid "" -#~ "Following printer profiles has no default filament: %1%Please select one " -#~ "manually." -#~ msgstr "" -#~ "Los siguientes perfiles de impresora no tienen filamento por defecto: " -#~ "%1%Por favor, selecciona uno manualmente." - -#~ msgid "" -#~ "Following printer profiles has no default material: %1%Please select one " -#~ "manually." -#~ msgstr "" -#~ "Los siguientes perfiles de impresora no tienen material por defecto: " -#~ "%1%Por favor, selecciona uno manualmente." - -#~ msgid "The following FFF printer models have no filament selected:" -#~ msgstr "" -#~ "Los siguientes modelos de impresoras FFF no tienen filamento seleccionado:" - -#~ msgid "" -#~ "Do you want to select default filaments for these FFF printer models?" -#~ msgstr "" -#~ "¿Desea seleccionar filamentos predeterminados para estos modelos de " -#~ "impresoras FFF?" - -#~ msgid "Configuration is edited in ConfigWizard" -#~ msgstr "La configuración se edita en ConfigWizard" - -#~ msgid "All user presets will be deleted." -#~ msgstr "Se borrarán todos los ajustes del usuario." - -#~ msgid "A new vendor was installed and one of its printers will be activated" -#~ msgid_plural "" -#~ "New vendors were installed and one of theirs printers will be activated" -#~ msgstr[0] "Un nuevo vendedor se instaló y se activará una de sus impresoras" -#~ msgstr[1] "" -#~ "Nuevos vendedores se instalaron y se activará una de sus impresoras" - -#~ msgid "A new Printer was installed and it will be activated." -#~ msgstr "Una nueva Impresora se instaló y se activará." - -#~ msgid "Some Printers were uninstalled." -#~ msgstr "Se han desinstalado algunas impresoras." - -#~ msgid "A new filament was installed and it will be activated." -#~ msgstr "Un nuevo filamento se instaló y se activará." - -#~ msgid "A new SLA material was installed and it will be activated." -#~ msgstr "Un nuevo material SLA se instaló y se activará." - -#~ msgid "Some filaments were uninstalled." -#~ msgstr "Se han desinstalado algunos filamentos." - -#~ msgid "Select all standard printers" -#~ msgstr "Selecciona todas las impresoras estándar" - -#~ msgid "< &Back" -#~ msgstr "< &Anterior" - -#~ msgid "&Next >" -#~ msgstr "&Siguiente >" - -#~ msgid "&Finish" -#~ msgstr "&Terminar" - -#~ msgid "Filament Profiles Selection" -#~ msgstr "Selección Perfiles de Filamento" - -#~ msgid "Configuration Assistant" -#~ msgstr "Asistente de Configuración" - -#~ msgid "Configuration &Assistant" -#~ msgstr "&Asistente de configuración" - -#~ msgid "Configuration Wizard" -#~ msgstr "Asistente de configuración" - -#~ msgid "Configuration &Wizard" -#~ msgstr "Ayudante de co&nfiguración" - -#~ msgid "" -#~ "Use this setting to rotate the support material pattern on the horizontal " -#~ "plane." -#~ msgstr "" -#~ "Use esta configuración para rotar el patrón de material de soporte en el " -#~ "plano horizontal." - -#~ msgid "Compare this preset with some another" -#~ msgstr "Comparar este ajuste con algún otro" - -#~ msgid "Wipe tower parameters" -#~ msgstr "Parámetros de la torre de limpieza" - -#~ msgid "Volumetric flow hints not available" -#~ msgstr "Sugerencias de flujo volumétrico no disponibles" - -#~ msgid "New printer preset selected" -#~ msgstr "Se ha seleccionado un nuevo ajuste de la impresora" - -#~ msgid "Bridges fan speed" -#~ msgstr "Velocidad del ventilador para puentes" - -#~ msgid "Bed Shape and Size" -#~ msgstr "Tamaño y forma de la base" - -#~ msgid "Set the shape of your printer's bed." -#~ msgstr "Define la forma de la base de impresión de tu impresora." - -#~ msgid "Place bearings in slots and resume printing" -#~ msgstr "Coloca los rodamientos en las ranuras y sigue imprimiendo" - -#~ msgid "One layer mode" -#~ msgstr "Modo de capa única" - -#~ msgid "Discard all custom changes" -#~ msgstr "Descartar todos los cambios personalizados" - -#~ msgid "Jump to move" -#~ msgstr "Saltar al movimiento" - -#~ msgid "" -#~ "Jump to height %s\n" -#~ "Set ruler mode\n" -#~ "or Set extruder sequence for the entire print" -#~ msgstr "" -#~ "Salta a la altura %s\n" -#~ "Fija el modo regla\n" -#~ "o Fija la secuencia del extrusor para toda la impresión" - -#~ msgid "" -#~ "Jump to height %s\n" -#~ "or Set ruler mode" -#~ msgstr "" -#~ "Salta a la altura %s\n" -#~ "o Fija el modo regla" - -#~ msgid "Edit current color - Right click the colored slider segment" -#~ msgstr "" -#~ "Editar color actual - Clic derecho en el segmento de color deslizante" - -#~ msgid "This is wipe tower layer" -#~ msgstr "Esta es la capa de la torre de limpieza" - -#~ msgid "" -#~ "The sequential print is on.\n" -#~ "It's impossible to apply any custom G-code for objects printing " -#~ "sequentually." -#~ msgstr "" -#~ "La impresión secuencial está activada.\n" -#~ "Es imposible aplicar cualquier código G personalizado para los objetos " -#~ "que se imprimen secuencialmente." - -#~ msgid "Print mode" -#~ msgstr "Modo de impresión" - -#~ msgid "Add extruder change - Left click" -#~ msgstr "Añadir cambio de extrusor - Clic izquierdo" - -#~ msgid "" -#~ "Add color change - Left click for predefined color or Shift + Left click " -#~ "for custom color selection" -#~ msgstr "" -#~ "Añadir cambio de color - Clic izquierdo para color preddefinido o Mayus + " -#~ "Clic izquierdo para selección de color personalizada" - -#~ msgid "Add color change - Left click" -#~ msgstr "Añadir cambio de color - Clic izquierdo" - -#~ msgid "or press \"+\" key" -#~ msgstr "o presiona la tecla \"+\"" - -#~ msgid "Add another code - Ctrl + Left click" -#~ msgstr "Añadir otro código - Ctrl + Clic izquierdo" - -#~ msgid "Add another code - Right click" -#~ msgstr "Añadir otro código - Clic derecho" - -#~ msgid "" -#~ "The sequential print is on.\n" -#~ "It's impossible to apply any custom G-code for objects printing " -#~ "sequentually.\n" -#~ "This code won't be processed during G-code generation." -#~ msgstr "" -#~ "La impresión secuencial está activada.\n" -#~ "Es imposible incluir G-code personalizado para piezas que se imprimen " -#~ "secuencialmente.\n" -#~ "Este código no se procesará durante la generación del G-code." - -#~ msgid "continue" -#~ msgstr "continuar" - -#~ msgid "Color change (\"%1%\")" -#~ msgstr "Cambio de color (\"%1%\")" - -#~ msgid "Color change (\"%1%\") for Extruder %2%" -#~ msgstr "Cambio de color (\"%1%\") para el Extrusor %2%" - -#~ msgid "Pause print (\"%1%\")" -#~ msgstr "Pausar impresión (\"%1%\")" - -#~ msgid "Custom template (\"%1%\")" -#~ msgstr "Plantilla personalizada (\"%1%\")" - -#~ msgid "Extruder (tool) is changed to Extruder \"%1%\"" -#~ msgstr "El Extrusor (herramienta) se cambia al Extrusor \"%1%\"" - -#~ msgid "Note" -#~ msgstr "Nota" - -#~ msgid "" -#~ "G-code associated to this tick mark is in a conflict with print mode.\n" -#~ "Editing it will cause changes of Slider data." -#~ msgstr "" -#~ "El código G asociado a esta marca de verificación está en conflicto con " -#~ "el modo de impresión.\n" -#~ "Su edición provocará cambios en los datos del Slider." - -#~ msgid "" -#~ "There is a color change for extruder that won't be used till the end of " -#~ "print job.\n" -#~ "This code won't be processed during G-code generation." -#~ msgstr "" -#~ "Hay un cambio de color para el extrusor que no será usado hasta el final " -#~ "del trabajo de impresión. Este código no será procesado durante la " -#~ "generación del G-code." - -#~ msgid "" -#~ "There is an extruder change set to the same extruder.\n" -#~ "This code won't be processed during G-code generation." -#~ msgstr "" -#~ "Hay un cambio de extrusor establecido en el mismo extrusor.\n" -#~ "Este código no se procesará durante la generación del código G." - -#~ msgid "" -#~ "There is a color change for extruder that has not been used before.\n" -#~ "Check your settings to avoid redundant color changes." -#~ msgstr "" -#~ "Hay un cambio de color para el extrusor que no se ha usado antes. \n" -#~ "Comprueba tus ajustes para evitar cambios de color innecesarios." - -#~ msgid "Delete tick mark - Left click or press \"-\" key" -#~ msgstr "" -#~ "Eliminar marca de verificación - Clic izquierdo o presionar tecla \"-\"" - -#~ msgid "Edit tick mark - Ctrl + Left click" -#~ msgstr "Editar la marca - Ctrl+ Clic izquierdo" - -#~ msgid "Edit tick mark - Right click" -#~ msgstr "Editar marca de verificación - Clic derecho" - -#~ msgid "Extruder %d" -#~ msgstr "Extrusor %d" - -#~ msgid "used" -#~ msgstr "usado" - -#~ msgid "Switch code to Color change (%1%) for:" -#~ msgstr "Código para cambiar de color (%1%) para:" - -#~ msgid "Add color change (%1%) for:" -#~ msgstr "Añadir cambio de color (%1%) para:" - -#~ msgid "Add color change" -#~ msgstr "Añadir cambio de color" - -#~ msgid "Add pause print" -#~ msgstr "Añadir pausa de impresión" - -#~ msgid "Add custom template" -#~ msgstr "Añadir plantilla personalizada" - -#~ msgid "Edit color" -#~ msgstr "Editar color" - -#~ msgid "Edit pause print message" -#~ msgstr "Editar mensaje de pausa de impresión" - -#~ msgid "Edit custom G-code" -#~ msgstr "Editar código G personalizado" - -#~ msgid "Delete color change" -#~ msgstr "Eliminar cambio de color" - -#~ msgid "Delete tool change" -#~ msgstr "Eliminar cambio de herramienta" - -#~ msgid "Delete pause print" -#~ msgstr "Eliminar pausa de impresión" - -#~ msgid "Delete custom G-code" -#~ msgstr "Eliminar código G personalizado" - -#~ msgid "Jump to height" -#~ msgstr "Salta a la altura" - -#~ msgid "Hide ruler" -#~ msgstr "Ocultar regla" - -#~ msgid "Show object height" -#~ msgstr "Mostrar altura del objeto" - -#~ msgid "Show object height on the ruler" -#~ msgstr "Mostrar altura del objeto en la regla" - -#~ msgid "Show estimated print time" -#~ msgstr "Mostrar tiempo estimado de impresión" - -#~ msgid "Show estimated print time on the ruler" -#~ msgstr "Mostrar tiempo estimado de impresión en la regla" - -#~ msgid "Ruler mode" -#~ msgstr "Modo regla" - -#~ msgid "Set ruler mode" -#~ msgstr "Establecer modo de regla" - -#~ msgid "Set auto color changes" -#~ msgstr "Establecer cambios de color automáticos" - -#~ msgid "This action will cause deletion of all ticks on vertical slider." -#~ msgstr "" -#~ "Esta acción hará que se borren todas las marcas del deslizador vertical." - -#~ msgid "" -#~ "This action is not revertible.\n" -#~ "Do you want to proceed?" -#~ msgstr "" -#~ "Esta acción no es reversible.\n" -#~ "¿Deseas continuar?" - -#~ msgid "Enter custom G-code used on current layer" -#~ msgstr "Ingresa el código G personalizado utilizado en la capa actual" - -#~ msgid "Custom G-code on current layer (%1% mm)." -#~ msgstr "Código G personalizado en la capa actual (%1% mm)." - -#~ msgid "Enter short message shown on Printer display when a print is paused" -#~ msgstr "" -#~ "Introduce un mensaje corto a mostrar en la pantalla de la impresora " -#~ "cuando la impresión se ponga en pausa" - -#~ msgid "Message for pause print on current layer (%1% mm)." -#~ msgstr "Mensaje para pausa de impresión en la capa actual (%1% mm)." - -#~ msgid "Enter the move you want to jump to" -#~ msgstr "Introduce el movimiento al que desea saltar" - -#~ msgid "Enter the height you want to jump to" -#~ msgstr "Introduce la altura a la que deseas saltar" - -#~ msgid "The last color change data was saved for a single extruder printing." -#~ msgstr "" -#~ "La información del último cambio de color se ha guardado para impresión " -#~ "con un solo extrusor." - -#~ msgid "The last color change data was saved for a multi extruder printing." -#~ msgstr "" -#~ "La información del último cambio de color se guardó para la impresión " -#~ "multi-extrusor." - -#~ msgid "Your current changes will delete all saved color changes." -#~ msgstr "Tus nuevos cambios borrarán todos los cambios de color." - -#~ msgid "Are you sure you want to continue?" -#~ msgstr "¿Estás seguro de que quieres continuar?" - -#~ msgid "" -#~ "Select YES if you want to delete all saved tool changes, \n" -#~ "NO if you want all tool changes switch to color changes, \n" -#~ "or CANCEL to leave it unchanged." -#~ msgstr "" -#~ "Escoge SI si deseas borrar todos los cambios de herramienta,\n" -#~ "NO si deseas que los cambios de herramienta sean cambios de color,\n" -#~ "o CANCELAR para no hacer cambios." - -#~ msgid "Do you want to delete all saved tool changes?" -#~ msgstr "¿Desea eliminar todos los cambios de herramienta guardados?" - -#~ msgid "" -#~ "The last color change data was saved for a multi extruder printing with " -#~ "tool changes for whole print." -#~ msgstr "" -#~ "La información del último cambio de color se guardó para impresión con " -#~ "múltiples extrusores mediante cambios de herramienta para toda la " -#~ "impresión." - -#~ msgid "Your current changes will delete all saved extruder (tool) changes." -#~ msgstr "" -#~ "Tus cambios actuales eliminarán todos los cambios guardados del extrusor " -#~ "(herramienta)." - -#~ msgid "An object outside the print area was detected." -#~ msgstr "Se detectó un objeto fuera del área de impresión." - -#~ msgid "A toolpath outside the print area was detected." -#~ msgstr "Ha sido detectada una trayectoria fuera del área de impresión." - -#~ msgid "SLA supports outside the print area were detected." -#~ msgstr "Se detectaron soportes SLA fuera del área de impresión." - -#~ msgid "Some objects are not visible during editing." -#~ msgstr "Algunos objetos no son visibles durante la edición." - -#~ msgid "" -#~ "An object outside the print area was detected.\n" -#~ "Resolve the current problem to continue slicing." -#~ msgstr "" -#~ "Se detectó un objeto fuera del área de impresión.\n" -#~ "Resuelve el problema actual para seguir laminando." - -#~ msgid "Rotate lower part upwards" -#~ msgstr "Dar la vuelta a las piezas" - -#~ msgid "Add supports" -#~ msgstr "Añadir soportes" - -#~ msgid "Scale factors" -#~ msgstr "Factores de escala" - -#~ msgid "Use for search" -#~ msgstr "Usar para buscar" - -#~ msgid "Category" -#~ msgstr "Categoría" - -#~ msgid "Search in English" -#~ msgstr "Buscar en Inglés" - -#~ msgid "Could not arrange model objects! Some geometries may be invalid." -#~ msgstr "" -#~ "¡No se pudieron organizar los objetos modelo! Algunas geometrías pueden " -#~ "ser inválidas." - -#~ msgid "New project, clear plater" -#~ msgstr "Nuevo proyecto, limpiar plataforma" - -#~ msgid "Save project (3mf)" -#~ msgstr "Guardar proyecto (3mf)" - -#~ msgid "Save project as (3mf)" -#~ msgstr "Guarda el proyecto como (3mf)" - -#~ msgid "(Re)slice" -#~ msgstr "(Re)laminar" - -#~ msgid "Import Config from ini/amf/3mf/gcode" -#~ msgstr "Importar Configuración desde ini/amf/3mf/gcode" - -#~ msgid "Load Config from ini/amf/3mf/gcode and merge" -#~ msgstr "Carga Configuración desde ini/amf/3mf/gcode y mezcla" - -#~ msgid "Export config" -#~ msgstr "Exportar configuración" - -#~ msgid "Export to SD card / Flash drive" -#~ msgstr "Exportar a tarjeta SD / tarjeta Flash" - -#~ msgid "Eject SD card / Flash drive" -#~ msgstr "Expulsa la tarjeta SD / disco USB" - -#~ msgid "Reload plater from disk" -#~ msgstr "Recargar la base desde el disco" - -#~ msgid "Search" -#~ msgstr "Buscar" - -#~ msgid "Select Plater Tab" -#~ msgstr "Seleccionar pestaña de la Base de impresión" - -#~ msgid "Select Print Settings Tab" -#~ msgstr "Seleccione la pestaña Configuración de impresión" - -#~ msgid "Select Filament Settings Tab" -#~ msgstr "Seleccionar pestaña de configuración de filamento" - -#~ msgid "Select Printer Settings Tab" -#~ msgstr "Selecciona pestaña de ajustes de impresora" - -#~ msgid "Switch to 3D" -#~ msgstr "Cambiar a 3D" - -#~ msgid "Switch to Preview" -#~ msgstr "Cambiar a Previsualización" - -#~ msgid "Print host upload queue" -#~ msgstr "Cola de subida al host de impresión" - -#~ msgid "Open new instance" -#~ msgstr "Abrir instancia nueva" - -#~ msgid "Camera view" -#~ msgstr "Vista de cámara" - -#~ msgid "Show/Hide object/instance labels" -#~ msgstr "Muestra/Oculta etiquetas de pieza/repetición" - -#~ msgid "Commands" -#~ msgstr "Comandos" - -#~ msgid "Arrange selection" -#~ msgstr "Ordenar selección" - -#~ msgid "Add Instance of the selected object" -#~ msgstr "Añadir instancia del objeto seleccionado" - -#~ msgid "Remove Instance of the selected object" -#~ msgstr "Retirar instancia del objeto seleccionado" - -#~ msgid "" -#~ "Press to select multiple objects\n" -#~ "or move multiple objects with mouse" -#~ msgstr "" -#~ "Presiona para seleccionar objetos múltiples\n" -#~ "o mover objetos múltiples con el ratón" - -#~ msgid "Press to activate selection rectangle" -#~ msgstr "Presionar para activar el rectángulo de selección" - -#~ msgid "Press to activate deselection rectangle" -#~ msgstr "Presionar para activar el rectángulo de deselección" - -#~ msgid "Page Up" -#~ msgstr "Page Up" - -#~ msgid "Rotate selection 45 degrees CCW" -#~ msgstr "Gira la selección 45 grados en sentido antihorario" - -#~ msgid "Page Down" -#~ msgstr "Page Down" - -#~ msgid "Rotate selection 45 degrees CW" -#~ msgstr "Gira la selección 45 grados en sentido horario" - -#~ msgid "Gizmo move" -#~ msgstr "Herramienta de Movimiento" - -#~ msgid "Gizmo scale" -#~ msgstr "Herramienta de Escalar" - -#~ msgid "Gizmo rotate" -#~ msgstr "Herramienta de Rotación" - -#~ msgid "Gizmo cut" -#~ msgstr "Herramienta de Corte" - -#~ msgid "Gizmo Place face on bed" -#~ msgstr "Gizmo Colocar cara en la base" - -#~ msgid "Gizmo SLA hollow" -#~ msgstr "Herramienta de vaciado SLA" - -#~ msgid "Gizmo SLA support points" -#~ msgstr "Herramienta de puntos de soporte SLA" - -#~ msgid "Gizmo FDM paint-on supports" -#~ msgstr "Gizmo Soportes pintables FDM" - -#~ msgid "Gizmo FDM paint-on seam" -#~ msgstr "Gizmo FDM pintado de costuras" - -#~ msgid "Gizmo Multi Material painting" -#~ msgstr "Gizmo Pintura multimaterial" - -#~ msgid "Unselect gizmo or clear selection" -#~ msgstr "Deseleccionar gizmo o borrar selección" - -#~ msgid "Change camera type (perspective, orthographic)" -#~ msgstr "Cambiar tipo de cámara (perspectiva, ortográfica)" - -#~ msgid "Zoom to Bed" -#~ msgstr "Zoom a la Cama" - -#~ msgid "" -#~ "Zoom to selected object\n" -#~ "or all objects in scene, if none selected" -#~ msgstr "" -#~ "Zoom a objetos seleccionados\n" -#~ "o a todos los objetos en escena, si no se seleccionó ninguno" - -#~ msgid "Zoom in" -#~ msgstr "Aumentar zoom" - -#~ msgid "Zoom out" -#~ msgstr "Reducir zoom" - -#~ msgid "Switch between Editor/Preview" -#~ msgstr "Cambiar entre Editor/Previsualización" - -#~ msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" -#~ msgstr "" -#~ "Mostrar/Ocultar el cuadro de diálogo de configuración de dispositivos " -#~ "3Dconnexion, si está habilitado" - -#~ msgid "Show/Hide 3Dconnexion devices settings dialog" -#~ msgstr "Mostrar/Ocultar cuadro de ajustes dispositivos 3Dconnexion" - -#~ msgid "Minimize application" -#~ msgstr "Minimizar aplicación" - -#~ msgid "Gizmo scale: Press to snap by 5%" -#~ msgstr "Herramienta de Escala: pulsa para ajustar un 5%" - -#~ msgid "Gizmo scale: Scale selection to fit print volume" -#~ msgstr "" -#~ "Herramienta de escala: Escala las piezas seleccionadas para ajustarse al " -#~ "volumen de impresión" - -#~ msgid "Gizmo scale: Press to activate one direction scaling" -#~ msgstr "Herramienta de escala: Pulsa para activar una dirección de escalado" - -#~ msgid "Gizmo scale: Press to scale selected objects around their own center" -#~ msgstr "" -#~ "Herramienta de escala: Pulsa para escalar la pieza seleccionada alrededor " -#~ "de su propio centro" - -#~ msgid "" -#~ "Gizmo rotate: Press to rotate selected objects around their own center" -#~ msgstr "" -#~ "Herramienta de rotación: Pulsa para girar la pieza sobre su propio centro" - -#~ msgid "" -#~ "The following shortcuts are applicable when the specified gizmo is active" -#~ msgstr "" -#~ "Los siguientes atajos son aplicables cuando el gizmo especificado está " -#~ "activo" - -#~ msgid "Set selected items as Printable/Unprintable" -#~ msgstr "" -#~ "Establecer los elementos seleccionados como Imprimibles/No imprimibles" - -#~ msgid "Set default extruder for the selected items" -#~ msgstr "Establecer el extrusor por defecto para los elementos seleccionados" - -#~ msgid "Set extruder number for the selected items" -#~ msgstr "Establecer el número de extrusor para los elementos seleccionados" - -#~ msgid "Show/Hide Legend and Estimated printing time" -#~ msgstr "Mostrar/Ocultar Leyenda y Tiempo de impresión estimado" - -#~ msgid "Show/Hide G-code window" -#~ msgstr "Mostrar/Ocultar ventana de código G" - -#~ msgid "Move active thumb Up" -#~ msgstr "Mover el pulgar activo hacia Arriba" - -#~ msgid "Move active thumb Down" -#~ msgstr "Mover el pulgar activo hacia Abajo" - -#~ msgid "Set upper thumb as active" -#~ msgstr "Establecer el pulgar superior como activo" - -#~ msgid "Set lower thumb as active" -#~ msgstr "Establecer el pulgar inferior como activo" - -#~ msgid "Add color change marker for current layer" -#~ msgstr "Añadir marcador de cambio de color para la capa actual" - -#~ msgid "Delete color change marker for current layer" -#~ msgstr "Eliminar marcador de cambio de color para la capa actual" - -#~ msgid "" -#~ "Press to speed up 5 times while moving thumb\n" -#~ "with arrow keys or mouse wheel" -#~ msgstr "" -#~ "Presiona para acelerar 5 veces mientras mueves el pulgar\n" -#~ "con teclas de flecha o rueda del ratón" - -#~ msgid "Vertical Slider" -#~ msgstr "Control Deslizante Vertical" - -#~ msgid "" -#~ "The following shortcuts are applicable in G-code preview when the " -#~ "vertical slider is active" -#~ msgstr "" -#~ "Los siguientes atajos son aplicables en la vista previa del código G " -#~ "cuando el control deslizante vertical está activo" - -#~ msgid "Move active thumb Left" -#~ msgstr "Mover el pulgar activo hacia la Izquierda" - -#~ msgid "Move active thumb Right" -#~ msgstr "Mover el pulgar activo hacia la Derecha" - -#~ msgid "Set left thumb as active" -#~ msgstr "Establecer el pulgar izquierdo como activo" - -#~ msgid "Set right thumb as active" -#~ msgstr "Establecer el pulgar derecho como activo" - -#~ msgid "Horizontal Slider" -#~ msgstr "Control Deslizante Horizontal" - -#~ msgid "" -#~ "The following shortcuts are applicable in G-code preview when the " -#~ "horizontal slider is active" -#~ msgstr "" -#~ "Los siguientes atajos son aplicables en la vista previa del código G " -#~ "cuando el control deslizante horizontal está activo" - -#~ msgid "Keyboard shortcuts" -#~ msgstr "Atajos de teclado" - -#~ msgid "Show &Configuration Folder" -#~ msgstr "Mostrar carpeta &Configuración" - -#~ msgid "Export AMF file:" -#~ msgstr "Exportar archivo AMF:" - -#~ msgid "Export OBJ file:" -#~ msgstr "Exportar archivo OBJ:" - -#~ msgid "Replace from:" -#~ msgstr "Reemplazar de:" - -#~ msgid "Unable to replace with more than one volume" -#~ msgstr "No se puede sustituir con más de un volumen" - -#~ msgid "Error during replace" -#~ msgstr "Error durante el reemplazo" - -#~ msgid "Do you want to replace it" -#~ msgstr "Quieres reemplazarlo" - -#~ msgid "Reload from:" -#~ msgstr "Recargar desde:" - -#~ msgid "Unable to reload:" -#~ msgstr "Incapaz de recargar:" - -#~ msgid "Error during reload" -#~ msgstr "Error al recargar" - -#~ msgid "The provided file name is not valid." -#~ msgstr "El nombre proporcionado no es válido." - -#~ msgid "The following characters are not allowed by a FAT file system:" -#~ msgstr "" -#~ "Los siguientes caracteres no están permitidos por un sistema de archivos " -#~ "FAT:" - -#~ msgid "All objects are outside of the print volume." -#~ msgstr "Todos los objetos están fuera del volumen de impresión." - -#~ msgid "The supplied settings will cause an empty print." -#~ msgstr "Los ajustes proporcionados causarán una impresión vacía." - -#~ msgid "" -#~ "The Spiral Vase option can only be used when printing single material " -#~ "objects." -#~ msgstr "" -#~ "La opción Vaso en espiral solo puede ser usada al imprimir objetos de un " -#~ "solo material." - -#~ msgid "" -#~ "The wipe tower is only supported if all extruders have the same nozzle " -#~ "diameter and use filaments of the same diameter." -#~ msgstr "" -#~ "La torre de limpieza solo es compatible si todos los extrusores tienen el " -#~ "mismo diámetro del nozzle y usan filamento del mismo diámetro." - -#~ msgid "" -#~ "The Wipe Tower is currently only supported for the Marlin, RepRap/" -#~ "Sprinter, RepRapFirmware and Repetier G-code flavors." -#~ msgstr "" -#~ "La Torre de Limpieza solo es compatible con las variantes de código G " -#~ "usadas por Marlin, RepRap/Sprinter, RepRapFirmware y Repetier." - -#~ msgid "" -#~ "Ooze prevention is currently not supported with the wipe tower enabled." -#~ msgstr "" -#~ "La prevención de goteo actualmente no es compatible con la torre de " -#~ "limpieza activa." - -#~ msgid "" -#~ "The Wipe Tower is only supported for multiple objects if they have equal " -#~ "layer heights" -#~ msgstr "" -#~ "La torre de limpieza sólo es compatible con varios objetos si tienen " -#~ "alturas de capas iguales" - -#~ msgid "" -#~ "The Wipe Tower is only supported for multiple objects if they are printed " -#~ "over an equal number of raft layers" -#~ msgstr "" -#~ "La torre de limpieza sólo se permite para varios objetos si se imprimen " -#~ "sobre un número igual de capas de balsa" - -#~ msgid "" -#~ "The Wipe Tower is only supported for multiple objects if they are sliced " -#~ "equally." -#~ msgstr "" -#~ "La torre de limpieza sólo es compatible con varios objetos si se cortan " -#~ "por igual." - -#~ msgid "" -#~ "The Wipe tower is only supported if all objects have the same variable " -#~ "layer height" -#~ msgstr "" -#~ "La Torre de Limpieza solo es compatible si todos los objetos tienen la " -#~ "misma altura de capa variable" - -#~ msgid "" -#~ "One or more object were assigned an extruder that the printer does not " -#~ "have." -#~ msgstr "Uno o más objetos fueron asignados a un extrusor no existente." - -#~ msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" -#~ msgstr "" -#~ "%1%=%2% mm es demasiado bajo para ser impreso a una altura de capa de %3% " -#~ "mm" - -#~ msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" -#~ msgstr "" -#~ "%1%=%2% mm excesivos para ser imprimible con un nozzle de diámetro de %3% " -#~ "mm" - -#~ msgid "" -#~ "Printing with multiple extruders of differing nozzle diameters. If " -#~ "support is to be printed with the current extruder " -#~ "(support_material_extruder == 0 or support_material_interface_extruder == " -#~ "0), all nozzles have to be of the same diameter." -#~ msgstr "" -#~ "Imprimir con múltiples extrusoras de diferentes diámetros de boquilla. Si " -#~ "el soporte debe imprimirse con la extrusora actual " -#~ "(support_material_extruder == 0 o support_material_interface_extruder == " -#~ "0), todas las boquillas deben ser del mismo diámetro." - -#~ msgid "First layer height can't be greater than nozzle diameter" -#~ msgstr "" -#~ "La altura de primera capa no puede ser mayor que el diametro de la " -#~ "boquilla" - -#~ msgid "Layer height can't be greater than nozzle diameter" -#~ msgstr "La altura de la capa no puede ser mayor que diámetro de la boquilla" - -#~ msgid "Infilling layers" -#~ msgstr "Rellenando capas" - -#~ msgid "Generating skirt and brim" -#~ msgstr "Generando falda y balsa" - -#~ msgid "Skirt" -#~ msgstr "Falda" - -#~ msgid "Skirt Loops" -#~ msgstr "Vueltas de la falda" - -#~ msgid "Same as top" -#~ msgstr "Igual que la superior" - -#~ msgid "Drag and drop G-code file" -#~ msgstr "Arrastra y suelta el archivo código G" - -#~ msgid "Skirt/Brim" -#~ msgstr "Falda/Balsa" - -#~ msgid "Mixed" -#~ msgstr "Mezclado" - -#~ msgid "Printer technology" -#~ msgstr "Tecnología de la impresora" - -#~ msgid "Between objects G-code" -#~ msgstr "Código G para entre objetos" - -#~ msgid "Bridges" -#~ msgstr "Puentes" - -#~ msgid "Label objects" -#~ msgstr "Etiquetar objetos" - -#~ msgid "0 (no open anchors)" -#~ msgstr "0 (sin anclajes abiertos)" - -#~ msgid "1 mm" -#~ msgstr "1 mm" - -#~ msgid "2 mm" -#~ msgstr "2 mm" - -#~ msgid "5 mm" -#~ msgstr "5 mm" - -#~ msgid "10 mm" -#~ msgstr "10 mm" - -#~ msgid "1000 (unlimited)" -#~ msgstr "1000 (ilimitado)" - -#~ msgid "Maximum length of the infill anchor" -#~ msgstr "Máxima longitud del relleno del anclaje" - -#~ msgid "0 (not anchored)" -#~ msgstr "0 (sin anclar)" - -#~ msgid "Inherits profile" -#~ msgstr "Hereda el perfil" - -#~ msgid "Interface shells" -#~ msgstr "Carcasas de interfaz" - -#~ msgid "After layer change G-code" -#~ msgstr "Código G tras un cambio de capa" - -#~ msgid "Perimeter" -#~ msgstr "Perímetro" - -#~ msgid "Printer type" -#~ msgstr "Tipo de impresora" - -#~ msgid "Printer variant" -#~ msgstr "Modelo de impresora" - -#~ msgid "Retract on layer change" -#~ msgstr "Retraer en el cambio de capa" - -#~ msgid "Retraction Length (Toolchange)" -#~ msgstr "Longitud de retracción (cambio de herramienta)" - -#~ msgid "Extra length on restart" -#~ msgstr "Longitud adicional en el reinicio" - -#~ msgid "Skirt height" -#~ msgstr "Altura de la falda" - -#~ msgid "Draft shield" -#~ msgstr "Escudo de protección" - -#~ msgid "Disabled" -#~ msgstr "Desactivado" - -#~ msgid "Limited" -#~ msgstr "Limitado" - -#~ msgid "Enabled" -#~ msgstr "Activado" - -#~ msgid "Solid infill" -#~ msgstr "Relleno sólido" - -#~ msgid "Solid layers" -#~ msgstr "Capas sólidas" - -#~ msgid "Number of solid layers to generate on top and bottom surfaces." -#~ msgstr "" -#~ "Número de capas sólidas para generar en las superficies superior e " -#~ "inferior." - -#~ msgid "Minimum thickness of a top / bottom shell" -#~ msgstr "Espesor mínimo de una carcasa superior / inferior" - -#~ msgid "Single Extruder Multi Material" -#~ msgstr "Extrusor único Multi Material" - -#~ msgid "Prime all printing extruders" -#~ msgstr "Cebar todos los extrusores de impresión" - -#~ msgid "No sparse layers (EXPERIMENTAL)" -#~ msgstr "Sin capas dispersas (EXPERIMENTAL)" - -#~ msgid "Slice gap closing radius" -#~ msgstr "Radio de cierre de los huecos al laminar" - -#~ msgid "Slicing Mode" -#~ msgstr "Modo de laminado" - -#~ msgid "Regular" -#~ msgstr "Habitual" - -#~ msgid "Even-odd" -#~ msgstr "Incluso-extraño" - -#~ msgid "Close holes" -#~ msgstr "Cerrar agujeros" - -#~ msgid "Bottom contact Z distance" -#~ msgstr "Distancia Z de contacto inferior " - -#~ msgid "Enforce support for the first" -#~ msgstr "Forzar soportes para la primera" - -#~ msgid "Enforce support for the first n layers" -#~ msgstr "Forzar soportes para las primeras n capas" - -#~ msgid "Closing radius" -#~ msgstr "Radio de cierre" - -#~ msgid "Z travel" -#~ msgstr "Recorrido en Z" - -#~ msgid "%1$d Object was loaded with custom supports." -#~ msgid_plural "%1$d Objects were loaded with custom supports." -#~ msgstr[0] "%1$d Se cargó el objeto con soportes personalizados." -#~ msgstr[1] "%1$d Se cargaron los objetos con soportes personalizados." - -#~ msgid "%1$d Object was loaded with custom seam." -#~ msgid_plural "%1$d Objects were loaded with custom seam." -#~ msgstr[0] "%1$d Se cargó el objeto con costura personalizada." -#~ msgstr[1] "%1$d Se cargaron los objetos con costura personalizada." - -#~ msgid "%1$d Object was loaded with multimaterial painting." -#~ msgid_plural "%1$d Objects were loaded with multimaterial painting." -#~ msgstr[0] "%1$d Se cargó el objeto con pintura multimaterial." -#~ msgstr[1] "%1$d Se cargaron los objetos con pintura multimaterial." - -#~ msgid "%1$d Object was loaded with partial sinking." -#~ msgid_plural "%1$d Objects were loaded with partial sinking." -#~ msgstr[0] "%1$d Se cargó el objeto con un hundimiento parcial." -#~ msgstr[1] "%1$d Se cargaron los objetos con un hundimiento parcial." - -#~ msgid "" -#~ "Some fields are too long to fit. Right mouse click reveals the full text." -#~ msgstr "" -#~ "Algunos campos son demasiado largos para caber. El clic derecho del mouse " -#~ "muestra el texto completo." - -#~ msgid "All settings changes will not be saved" -#~ msgstr "No se guardarán todos los cambios de configuración" - -#~ msgid "All settings changes will be discarded." -#~ msgstr "Todos los cambios de los ajustes serán descartados." - -#~ msgid "Keep the selected settings." -#~ msgstr "Mantener los ajustes seleccionados." - -#~ msgid "Transfer the selected settings to the newly selected preset." -#~ msgstr "" -#~ "Transfiera los ajustes seleccionados al preajuste recién seleccionado." - -#~ msgid "Preset \"%1%\" has the following unsaved changes:" -#~ msgstr "" -#~ "El ajuste preestablecido \"%1%\" tiene los siguientes cambios sin guardar:" - -#~ msgid "" -#~ "Preset \"%1%\" is not compatible with the new printer profile and it has " -#~ "the following unsaved changes:" -#~ msgstr "" -#~ "El ajuste preestablecido \"%1%\" no es compatible con el nuevo perfil de " -#~ "impresora y tiene los siguientes cambios sin guardar:" - -#~ msgid "" -#~ "Preset \"%1%\" is not compatible with the new print profile and it has " -#~ "the following unsaved changes:" -#~ msgstr "" -#~ "El ajuste preestablecido \"%1%\" no es compatible con el nuevo perfil de " -#~ "impresión y tiene los siguientes cambios sin guardar:" - -#~ msgid "Show all presets (including incompatible)" -#~ msgstr "Mostrar todos los ajustes (incluidos los incompatibles)" - -#~ msgid "Left Preset Value" -#~ msgstr "Valor del Ajuste Izquierdo" - -#~ msgid "Right Preset Value" -#~ msgstr "Valor del Ajuste Derecho" - -#~ msgid "Compare Presets" -#~ msgstr "Comparar Ajustes" - -#~ msgid "One of the presets doesn't found" -#~ msgstr "Uno de los ajustes no se encuentra" - -#~ msgid "Compared presets has different printer technology" -#~ msgstr "Los ajustes comparados tienen diferentes tecnologías de impresión" - -#~ msgid "Presets are the same" -#~ msgstr "Los ajustes son los mismos" - -#~ msgid "" -#~ "Presets are different.\n" -#~ "Click this button to select the same preset for the right and left preset." -#~ msgstr "" -#~ "Los ajustes son diferentes.\n" -#~ "Haz clic en este botón para seleccionar el mismo ajuste para el ajuste " -#~ "derecho e izquierdo." - -#~ msgid "Undef category" -#~ msgstr "Categoría sin definir" - -#~ msgid "Undef group" -#~ msgstr "Grupo sin definir" - -#~ msgid "Eigen vectorization supported:" -#~ msgstr "Se admite la vectorización propia:" - -#~ msgid "Data to send" -#~ msgstr "Datos a enviar" - -#~ msgid "Send system info" -#~ msgstr "Enviar info del sistema" - -#~ msgid "" -#~ "This is the first time you are running %1%. We would like to ask you to " -#~ "send some of your system information to us. This will only happen once " -#~ "and we will not ask you to do this again (only after you upgrade to the " -#~ "next version)." -#~ msgstr "" -#~ "Es la primera vez que se ejecuta %1%. Nos gustaría pedirte que nos envíe " -#~ "parte de la información de tu sistema. Esto sólo ocurrirá una vez y no te " -#~ "pediremos que lo hagas de nuevo (sólo después de actualizar a la " -#~ "siguiente versión)." - -#~ msgid "" -#~ "If we know your hardware, operating system, etc., it will greatly help us " -#~ "in development and prioritization, because we will be able to focus our " -#~ "effort more efficiently and spend time on features that are needed the " -#~ "most." -#~ msgstr "" -#~ "Si conocemos tu hardware, sistema operativo, etc., nos ayudará mucho en " -#~ "el desarrollo y la priorización, porque podremos centrar nuestro esfuerzo " -#~ "de forma más eficiente y dedicar tiempo a las características que más se " -#~ "necesitan." - -#~ msgid "Is it safe?" -#~ msgstr "¿Es seguro?" - -#~ msgid "Show verbatim data that will be sent" -#~ msgstr "Mostrar los datos literales que se enviarán" - -#~ msgid "Ask me next time" -#~ msgstr "Pregúntame la próxima vez" - -#~ msgid "Do not send anything" -#~ msgstr "No enviar nada" - -#~ msgid "System info sent successfully. Thank you." -#~ msgstr "Info del sistema enviada con éxito. Gracias." - -#~ msgid "Sending system info failed!" -#~ msgstr "¡El envío de info del sistema ha fallado!" - -#~ msgid "Sending system info was cancelled." -#~ msgstr "El envío de info del sistema se canceló." - -#~ msgid "Sending system info..." -#~ msgstr "Enviando info del sistema..." - -#~ msgid "Changing of an application language" -#~ msgstr "Cambio de idioma de una aplicación" - -#~ msgid "Bed filling canceled." -#~ msgstr "Relleno de base cancelado." - -#~ msgid "Bed filling done." -#~ msgstr "Relleno de la base realizado." - -#~ msgid "Orientation search canceled." -#~ msgstr "Búsqueda de orientación cancelada." - -#~ msgid "Orientation found." -#~ msgstr "Orientación encontrada." - -#~ msgid "Filling bed" -#~ msgstr "Rellenando base" - -#~ msgid "Searching for optimal orientation" -#~ msgstr "Buscando la orientación óptima" - -#~ msgid "Tool position" -#~ msgstr "Posición de herramienta" - -#~ msgid "Generating toolpaths" -#~ msgstr "Generando trayectorias" - -#~ msgid "Generating vertex buffer" -#~ msgstr "Generando buffer de vértice" - -#~ msgid "Generating index buffers" -#~ msgstr "Generando buffers de índice" - -#~ msgid "Click to hide" -#~ msgstr "Clic para ocultar" - -#~ msgid "Click to show" -#~ msgstr "Clic para mostrar" - -#~ msgid "Percentage" -#~ msgstr "Porcentaje" - -#~ msgid "Feature type" -#~ msgstr "Tipo de función" - -#~ msgid "Height (mm)" -#~ msgstr "Altura (mm)" - -#~ msgid "Width (mm)" -#~ msgstr "Ancho (mm)" - -#~ msgid "Stealth mode" -#~ msgstr "Modo silencioso" - -#~ msgid "Show stealth mode" -#~ msgstr "Mostrar modo silencioso" - -#~ msgid "Show normal mode" -#~ msgstr "Mostrar modo normal" - -#~ msgid "" -#~ "Copying of the temporary G-code to the output G-code failed. Maybe the SD " -#~ "card is write locked?\n" -#~ "Error message: %1%" -#~ msgstr "" -#~ "Error al copiar el código G temporal en el código G de salida. ¿Quizás la " -#~ "tarjeta SD está bloqueada contra escritura?\n" -#~ "Mensaje de error: %1%" - -#~ msgid "" -#~ "%s has encountered an error. It was likely caused by running out of " -#~ "memory. If you are sure you have enough RAM on your system, this may also " -#~ "be a bug and we would be glad if you reported it." -#~ msgstr "" -#~ "%s ha encontrado un error. Probablemente fue causado por quedarse sin " -#~ "memoria. Si estás seguro de tener suficiente RAM en su sistema, esto " -#~ "también puede ser un error y nos complacería que lo informaras." - -#~ msgid "Masked SLA file exported to %1%" -#~ msgstr "Archivo SLA enmascarado exportado a %1%" - -#~ msgid "Running post-processing scripts" -#~ msgstr "Ejecutando scripts de post-procesamiento" - -#~ msgid "Unknown error occured during exporting G-code." -#~ msgstr "" -#~ "Se produjo un error desconocido durante la exportación del código G." - -#~ msgid "" -#~ "Copying of the temporary G-code to the output G-code failed. There might " -#~ "be problem with target device, please try exporting again or using " -#~ "different device. The corrupted output G-code is at %1%.tmp." -#~ msgstr "" -#~ "La copia del código G temporal al código G de salida ha fallado. Puede " -#~ "haber un problema con el dispositivo de destino, intenta exportar " -#~ "nuevamente o usa un dispositivo diferente. El código G de salida dañado " -#~ "está en %1%.tmp." - -#~ msgid "" -#~ "Renaming of the G-code after copying to the selected destination folder " -#~ "has failed. Current path is %1%.tmp. Please try exporting again." -#~ msgstr "" -#~ "El cambio de nombre del código G después de copiar en la carpeta de " -#~ "destino seleccionada ha fallado. La ruta actual es %1%.tmp. Intenta " -#~ "exportar de nuevo." - -#~ msgid "" -#~ "Copying of the temporary G-code has finished but the original code at %1% " -#~ "couldn't be opened during copy check. The output G-code is at %2%.tmp." -#~ msgstr "" -#~ "La copia del código G temporal ha finalizado, pero el código original en " -#~ "%1% no se pudo abrir durante la verificación de copia. El código G de " -#~ "salida está en %2%.tmp." - -#~ msgid "" -#~ "Copying of the temporary G-code has finished but the exported code " -#~ "couldn't be opened during copy check. The output G-code is at %1%.tmp." -#~ msgstr "" -#~ "La copia del código G temporal ha finalizado, pero el código exportado no " -#~ "se pudo abrir durante la verificación de la copia. El código G de salida " -#~ "está en %1%.tmp." - -#~ msgid "G-code file exported to %1%" -#~ msgstr "Archivo de código G exportado a %1%" - -#~ msgid "" -#~ "If estimated layer time is below ~%1%s, fan will run at %2%%% and print " -#~ "speed will be reduced so that no less than %3%s are spent on that layer " -#~ "(however, speed will never be reduced below %4%mm/s)." -#~ msgstr "" -#~ "Si el tiempo de capa estimado está por debajo de ~%1%s, el ventilador " -#~ "funcionará en %2%%% y la velocidad de impresión se reducirá de modo que " -#~ "no se gaste menos de %3%s en esa capa (sin embargo, la velocidad nunca se " -#~ "reducirá por debajo de %4%mm/s) ." - -#~ msgid "" -#~ "If estimated layer time is greater, but still below ~%1%s, fan will run " -#~ "at a proportionally decreasing speed between %2%%% and %3%%%." -#~ msgstr "" -#~ "Si el tiempo estimado de la capa es mayor, pero todavía por debajo de ~" -#~ "%1%s, el ventilador funcionará a una velocidad proporcionalmente menor " -#~ "entre %2%%% y %3%%%." - -#~ msgid "" -#~ "If estimated layer time is greater, but still below ~%1%s, fan will run " -#~ "at %2%%%" -#~ msgstr "" -#~ "Si el tiempo de capa estimado es mayor, pero sigue siendo inferior a ~" -#~ "%1%s, el ventilador funcionará al %2%%%" - -#~ msgid "" -#~ "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%." -#~ msgstr "" -#~ "La velocidad del ventilador aumentará desde cero en la capa %1% a %2%%% " -#~ "en la capa %3%." - -#~ msgid "During the other layers, fan will always run at %1%%%" -#~ msgstr "" -#~ "Durante el resto de capas, el ventilador siempre funcionará al %1%%%" - -#~ msgid "Fan will always run at %1%%%" -#~ msgstr "El ventilador siempre funcionará al %1%%%" - -#~ msgid "except for the first %1% layers." -#~ msgstr "a excepción de las %1% primeras capas." - -#~ msgid "except for the first layer." -#~ msgstr "a excepción de la primera capa." - -#~ msgid "During the other layers, fan will be turned off." -#~ msgstr "Durante las otras capas, el ventilador se apagará." - -#~ msgid "Fan will be turned off." -#~ msgstr "El ventilador se apagará." - -#~ msgid "external perimeters" -#~ msgstr "perímetros externos" - -#~ msgid "perimeters" -#~ msgstr "perímetros" - -#~ msgid "infill" -#~ msgstr "relleno" - -#~ msgid "solid infill" -#~ msgstr "relleno sólido" - -#~ msgid "top solid infill" -#~ msgstr "relleno sólido superior" - -#~ msgid "support" -#~ msgstr "soporte" - -#~ msgid "support interface" -#~ msgstr "interfaz de soporte" - -#~ msgid "First layer volumetric" -#~ msgstr "Primera capa volumétrica" - -#~ msgid "Bridging volumetric" -#~ msgstr "Puente volumétrico" - -#~ msgid "Volumetric" -#~ msgstr "Volumétrico" - -#~ msgid "flow rate is maximized" -#~ msgstr "se maximiza el flujo de material" - -#~ msgid "by the print profile maximum" -#~ msgstr "por el máximo perfil de impresión" - -#~ msgid "when printing" -#~ msgstr "al imprimir" - -#~ msgid "with a volumetric rate" -#~ msgstr "con una tasa volumétrica" - -#~ msgid "%3.2f mm³/s at filament speed %3.2f mm/s." -#~ msgstr "%3.2f mm³/s a una velocidad de filamento de %3.2f mm/s." - -#~ msgid "" -#~ "Recommended object thin wall thickness: Not available due to invalid " -#~ "layer height." -#~ msgstr "" -#~ "Grosor recomendado de la pared del objeto recomendado: no disponible " -#~ "debido a la altura de capa no válida." - -#~ msgid "Recommended object thin wall thickness for layer height %.2f and" -#~ msgstr "" -#~ "Espesor de pared delgada del objeto recomendado para una altura de capa " -#~ "%.2f y" - -#~ msgid "%d lines: %.2f mm" -#~ msgstr "%d líneas: %.2f mm" - -#~ msgid "" -#~ "Recommended object thin wall thickness: Not available due to excessively " -#~ "small extrusion width." -#~ msgstr "" -#~ "Espesor de pared delgada del objeto recomendada: No disponible debido al " -#~ "ancho de extrusión excesivamente pequeño." - -#~ msgid "" -#~ "Top / bottom shell thickness hint: Not available due to invalid layer " -#~ "height." -#~ msgstr "" -#~ "Sugerencia de grosor de la carcasa superior / inferior: no disponible " -#~ "debido a una altura de capa inválida." - -#~ msgid "Top shell is %1% mm thick for layer height %2% mm." -#~ msgstr "" -#~ "La tapa superior es de %1% mm de espesor con una altura de capa de %2% mm." - -#~ msgid "Minimum top shell thickness is %1% mm." -#~ msgstr "El espesor mínimo de la carcasa superior es %1% mm." - -#~ msgid "Top is open." -#~ msgstr "La parte superior está abierta." - -#~ msgid "Bottom shell is %1% mm thick for layer height %2% mm." -#~ msgstr "" -#~ "La carcasa inferior es %1% mm más grueso para la altura de capa de %2% mm." - -#~ msgid "Minimum bottom shell thickness is %1% mm." -#~ msgstr "El espesor mínimo de la carcasa inferior es %1% mm." - -#~ msgid "Bottom is open." -#~ msgstr "La parte inferior está abierta." - -#~ msgid "Post processing scripts shall modify G-code file in place." -#~ msgstr "" -#~ "Los scripts de postprocesamiento modificarán el archivo de código G en su " -#~ "lugar." - -#~ msgid "There is an object with no extrusions in the first layer." -#~ msgstr "Hay un objeto sin extrusiones en la primera capa." - -#~ msgid "Empty layer between %1% and %2%." -#~ msgstr "Capa vacía entre %1% y %2%." - -#~ msgid "(Some lines not shown)" -#~ msgstr "(Algunas líneas no se muestran)" - -#~ msgid "Object name: %1%" -#~ msgstr "Nombre del objeto: %1%" - -#~ msgid "" -#~ "Make sure the object is printable. This is usually caused by negligibly " -#~ "small extrusions or by a faulty model. Try to repair the model or change " -#~ "its orientation on the bed." -#~ msgstr "" -#~ "Asegúrate de que el objeto es imprimible. Esto suele ser causado por " -#~ "extrusiones insignificantes o por un modelo defectuoso. Intenta reparar " -#~ "el modelo o cambiar su orientación en la cama." - -#~ msgid "Tool change G-code" -#~ msgstr "Código G de cambio de herramienta" - -#~ msgid "Between objects G-code (for sequential printing)" -#~ msgstr "Código G para entre objetos (para impresión secuencial)" - -#~ msgid "Filament Start G-code" -#~ msgstr "Código G Inicial del Filamento" - -#~ msgid "Filament End G-code" -#~ msgstr "Código G Final del Filamento" - -#~ msgid "In the custom G-code were found reserved keywords:" -#~ msgstr "" -#~ "En el código G personalizado se encontraron palabras clave reservadas:" - -#~ msgid "" -#~ "This may cause problems in g-code visualization and printing time " -#~ "estimation." -#~ msgstr "" -#~ "Esto puede causar problemas en la visualización del código g y en la " -#~ "estimación del tiempo de impresión." - -#~ msgid "" -#~ "Your print is very close to the priming regions. Make sure there is no " -#~ "collision." -#~ msgstr "" -#~ "Tu impresión está muy cerca de las regiones de purga. Asegúrate de que no " -#~ "hay colisiones." - -#~ msgid "Wipe tower" -#~ msgstr "Torre de limpieza" - -#~ msgid "" -#~ "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." -#~ msgstr "" -#~ "No se puede calcular el ancho de extrusión para %1%: Variable \"%2%\" no " -#~ "accesible." - -#~ msgid "Generating perimeters" -#~ msgstr "Generando perímetros" - -#~ msgid "Preparing infill" -#~ msgstr "Preparando relleno" - -#~ msgid "Generating support material" -#~ msgstr "Generando material de soporte" - -#~ msgid "" -#~ "Layer height is not valid.\n" -#~ "\n" -#~ "The layer height will be reset to 0.01." -#~ msgstr "" -#~ "La altura de capa no es válida.\n" -#~ "\n" -#~ "La altura de capa se restablecerá a 0.01." - -#~ msgid "" -#~ "First layer height is not valid.\n" -#~ "\n" -#~ "The first layer height will be reset to 0.01." -#~ msgstr "" -#~ "La altura de la primera capa no es válida.\n" -#~ "\n" -#~ "La altura de la primera capa se restablecerá a 0.01." - -#~ msgid "First layer height" -#~ msgstr "Altura de la primera capa" - -#~ msgid "Shall I adjust those settings in order to enable Spiral Vase?" -#~ msgstr "" -#~ "¿Debo ajustar esa configuración para habilitar el modo Vaso Espiral?" - -#~ msgid "Spiral Vase" -#~ msgstr "Modo Vaso Espiral" - -#~ msgid "" -#~ "Supports work better, if the following feature is enabled:\n" -#~ "- Detect bridging perimeters" -#~ msgstr "" -#~ "Los soportes funcionan mejor si la siguiente característica está " -#~ "habilitada:\n" -#~ "- Detectar perímetros con puentes" - -#~ msgid "Shall I adjust those settings for supports?" -#~ msgstr "¿Debo ajustar esa configuración para los soportes?" - -#~ msgid "Support Generator" -#~ msgstr "Generador de Soportes" - -#~ msgid "The %1% infill pattern is not supposed to work at 100%% density." -#~ msgstr "" -#~ "Se supone que el patrón de relleno %1% no funciona a una densidad del 100%" -#~ "%." - -#~ msgid "Shall I switch to rectilinear fill pattern?" -#~ msgstr "¿Debo cambiar al patrón de relleno rectilíneo?" - -#~ msgid "Head penetration should not be greater than the head width." -#~ msgstr "" -#~ "La penetración de la cabeza no debaría ser mayor que el ancho de la " -#~ "cabeza." - -#~ msgid "Invalid Head penetration" -#~ msgstr "Penetración inválida de la cabeza" - -#~ msgid "Pinhead diameter should be smaller than the pillar diameter." -#~ msgstr "" -#~ "El diámetro de la cabeza del pin debe ser menor que el diámetro del pilar." - -#~ msgid "Invalid pinhead diameter" -#~ msgstr "Diámetro de la cabeza del pin inválido" - -#~ msgid "" -#~ "Processing model '%1%' with more than 1M triangles could be slow. It is " -#~ "highly recommend to reduce amount of triangles." -#~ msgstr "" -#~ "El procesamiento del modelo '%1%' con más de 1M de triángulos podría ser " -#~ "lento. Es muy recomendable reducir la cantidad de triángulos." - -#~ msgid "Post-processing scripts" -#~ msgstr "Scripts de postprocesamiento" - -#~ msgid "Print speed override" -#~ msgstr "Anular la velocidad de impresión" - -#~ msgid "Print Host upload" -#~ msgstr "Subida al host de impresión" - -#~ msgid "" -#~ "The Wipe Tower is currently not supported for multimaterial sequential " -#~ "prints." -#~ msgstr "" -#~ "La Torre de Limpieza no se permite ahora para impresiones secuenciales " -#~ "multimaterial." - -#~ msgid "Names of presets related to the physical printer" -#~ msgstr "Nombres de ajustes relacionados con la impresora física" - -#~ msgid "Compatible printers" -#~ msgstr "Impresoras compatibles" - -#~ msgid "Compatible printers condition" -#~ msgstr "Condición de impresoras compatibles" - -#~ msgid "" -#~ "A boolean expression using the configuration values of an active printer " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active printer profile." -#~ msgstr "" -#~ "Una expresión booleana utilizando valores de configuración de un perfil " -#~ "existente. Si esta expresión es verdadera, el perfil será considerado " -#~ "compatible con el perfil de impresión activo." - -#~ msgid "Compatible print profiles" -#~ msgstr "Perfiles de impresión compatibles" - -#~ msgid "Compatible print profiles condition" -#~ msgstr "Condición de perfiles de impresión compatibles" - -#~ msgid "" -#~ "A boolean expression using the configuration values of an active print " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active print profile." -#~ msgstr "" -#~ "Una expresión booleana que utiliza los valores de configuración de un " -#~ "perfil de impresión activo. Si esta expresión se evalúa como verdadera, " -#~ "este perfil se considera compatible con el perfil de impresión activo." - -#~ msgid "Aligned Rectilinear" -#~ msgstr "Rectilíneo Alineado" - -#~ msgid "Hilbert Curve" -#~ msgstr "Curva de Hilbert" - -#~ msgid "Archimedean Chords" -#~ msgstr "Acordes de Arquímedes" - -#~ msgid "Octagram Spiral" -#~ msgstr "Octagram Spiral" - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for external " -#~ "perimeters. If left zero, default extrusion width will be used if set, " -#~ "otherwise 1.125 x nozzle diameter will be used. If expressed as " -#~ "percentage (for example 200%), it will be computed over layer height." -#~ msgstr "" -#~ "Ajuste este valor distinto de cero para establecer un ancho de extrusión " -#~ "manual para perímetros externos. Si se deja en cero, se usará el ancho de " -#~ "extrusión por defecto si se establece, de lo contrario se usará 1.125 x " -#~ "diámetro de la boquilla. Si se expresa como porcentaje (por ejemplo, " -#~ "200%), se computará sobre la altura de la capa." - -#~ msgid "" -#~ "This separate setting will affect the speed of external perimeters (the " -#~ "visible ones). If expressed as percentage (for example: 80%) it will be " -#~ "calculated on the perimeters speed setting above. Set to zero for auto." -#~ msgstr "" -#~ "Esta configuración independiente afectará la velocidad de los perímetros " -#~ "externos (los visibles). Si se expresa como porcentaje (por ejemplo: " -#~ "80%), se calculará en la configuración de velocidad de perímetros " -#~ "anterior. Establecer a cero para auto." - -#~ msgid "Extra perimeters if needed" -#~ msgstr "Perímetros adicionales si es necesario" - -#, fuzzy -#~ msgid "" -#~ "Add more perimeters when needed for avoiding gaps in sloping walls. " -#~ "Slic3r keeps adding perimeters, until more than 70% of the loop " -#~ "immediately above is supported." -#~ msgstr "" -#~ "Añadir más perímetros cuando se necesiten para evitar huecos en las " -#~ "paredes inclinadas. Slic3r sigue añadiendo perímetros hasta que más del " -#~ "70% del perímetro superior sea soportado." - -#~ msgid "" -#~ "The extruder to use (unless more specific extruder settings are " -#~ "specified). This value overrides perimeter and infill extruders, but not " -#~ "the support extruders." -#~ msgstr "" -#~ "La extrusora que se usa (a menos que se especifiquen configuraciones de " -#~ "extrusión más específicas). Este valor anula los extrusores de perímetro " -#~ "y relleno, pero no los extrusores de soporte." - -#~ msgid "" -#~ "Set this to the vertical distance between your nozzle tip and (usually) " -#~ "the X carriage rods. In other words, this is the height of the clearance " -#~ "cylinder around your extruder, and it represents the maximum depth the " -#~ "extruder can peek before colliding with other printed objects." -#~ msgstr "" -#~ "Ajuste este valor según la distancia vertical entre la punta de la " -#~ "boquilla y (generalmente) las barras X del carro. En otras palabras, esta " -#~ "es la altura del cilindro de holgura alrededor de su extrusor, y " -#~ "representa la profundidad máxima que el extrusor puede asomar antes de " -#~ "colisionar con otros objetos impresos." - -#~ msgid "" -#~ "Set this to the clearance radius around your extruder. If the extruder is " -#~ "not centered, choose the largest value for safety. This setting is used " -#~ "to check for collisions and to display the graphical preview in the " -#~ "plater." -#~ msgstr "" -#~ "Ajuste este parámetro según el radio de espacio libre alrededor de su " -#~ "extrusor. Si el extrusor no está centrado, elija el valor más grande para " -#~ "seguridad. Esta configuración se utiliza para verificar colisiones y " -#~ "mostrar la vista previa gráfica en la bandeja." - -#~ msgid "This is only used in the Slic3r interface as a visual help." -#~ msgstr "Esto solo se usa en la interfaz de Slic3r como ayuda visual." - -#~ msgid "" -#~ "If your firmware doesn't handle the extruder displacement you need the G-" -#~ "code to take it into account. This option lets you specify the " -#~ "displacement of each extruder with respect to the first one. It expects " -#~ "positive coordinates (they will be subtracted from the XY coordinate)." -#~ msgstr "" -#~ "Si su firmware no maneja el desplazamiento del extrusor, necesita el " -#~ "código G para tenerlo en cuenta. Esta opción le permite especificar el " -#~ "desplazamiento de cada extrusora con respecto a la primera. Se esperan " -#~ "coordenadas positivas (se restarán de la coordenada XY)." - -#~ msgid "Extrusion multiplier" -#~ msgstr "Multiplicador de extrusión" - -#~ msgid "" -#~ "This factor changes the amount of flow proportionally. You may need to " -#~ "tweak this setting to get nice surface finish and correct single wall " -#~ "widths. Usual values are between 0.9 and 1.1. If you think you need to " -#~ "change this more, check filament diameter and your firmware E steps." -#~ msgstr "" -#~ "Este factor cambia la cantidad de flujo proporcionalmente. Es posible que " -#~ "necesite ajustar esta configuración para obtener un buen acabado " -#~ "superficial y corregir el ancho de una sola pared. Los valores usuales " -#~ "están entre 0.9 y 1.1. Si cree que necesita cambiar esto más, verifique " -#~ "el diámetro del filamento y los pasos del E en el firmware." - -#~ msgid "" -#~ "Set this to a non-zero value to allow a manual extrusion width. If left " -#~ "to zero, Slic3r derives extrusion widths from the nozzle diameter (see " -#~ "the tooltips for perimeter extrusion width, infill extrusion width etc). " -#~ "If expressed as percentage (for example: 230%), it will be computed over " -#~ "layer height." -#~ msgstr "" -#~ "Ajuste este valor distinto de cero para permitir un ancho de extrusión " -#~ "manual. Si se deja a cero, Slic3r obtiene anchuras de extrusión del " -#~ "diámetro de la boquilla (consulte la información sobre herramientas para " -#~ "conocer el ancho de extrusión, el ancho de extrusión de relleno, etc.). " -#~ "Si se expresa como porcentaje (por ejemplo: 230%), se computará sobre la " -#~ "altura de la capa." - -#~ msgid "" -#~ "If this is enabled, fan will never be disabled and will be kept running " -#~ "at least at its minimum speed. Useful for PLA, harmful for ABS." -#~ msgstr "" -#~ "Si esto está habilitado, el ventilador nunca se desactivará y se " -#~ "mantendrá funcionando al menos a su velocidad mínima. Útil para PLA, no " -#~ "recomendado para ABS." - -#~ msgid "" -#~ "If layer print time is estimated below this number of seconds, fan will " -#~ "be enabled and its speed will be calculated by interpolating the minimum " -#~ "and maximum speeds." -#~ msgstr "" -#~ "Si el tiempo de impresión de capa se estima por debajo de este número de " -#~ "segundos, el ventilador se habilitará y su velocidad se calculará al " -#~ "interpolar las velocidades mínima y máxima." - -#~ msgid "" -#~ "Maximum volumetric speed allowed for this filament. Limits the maximum " -#~ "volumetric speed of a print to the minimum of print and filament " -#~ "volumetric speed. Set to zero for no limit." -#~ msgstr "" -#~ "Velocidad volumétrica máxima permitida para este filamento. Limita la " -#~ "velocidad volumétrica máxima de una impresión al mínimo de velocidad " -#~ "volumétrica de impresión y filamento. Establecer en cero para usar sin " -#~ "límite." - -#~ msgid "" -#~ "After a tool change, the exact position of the newly loaded filament " -#~ "inside the nozzle may not be known, and the filament pressure is likely " -#~ "not yet stable. Before purging the print head into an infill or a " -#~ "sacrificial object, Slic3r will always prime this amount of material into " -#~ "the wipe tower to produce successive infill or sacrificial object " -#~ "extrusions reliably." -#~ msgstr "" -#~ "Después de un cambio de herramienta, la posición exacta del filamento " -#~ "recién cargado dentro de la boquilla puede no ser conocida, y es probable " -#~ "que la presión del filamento aún no sea estable. Antes de purgar el " -#~ "cabezal de impresión en un relleno o en un objeto de sacrificio, Slic3r " -#~ "siempre purgará esta cantidad de material en la torre de limpieza para " -#~ "producir de forma fiable sucesivas rellenos u objetos de sacrificio." - -#~ msgid "" -#~ "Enter your filament diameter here. Good precision is required, so use a " -#~ "caliper and do multiple measurements along the filament, then compute the " -#~ "average." -#~ msgstr "" -#~ "Ingrese el diámetro de su fila aquí. Se requiere una buena precisión, por " -#~ "lo tanto, use un calibre y realice múltiples mediciones a lo largo del " -#~ "filamento, luego calcule el promedio." - -#~ msgid "" -#~ "Enter your filament density here. This is only for statistical " -#~ "information. A decent way is to weigh a known length of filament and " -#~ "compute the ratio of the length to volume. Better is to calculate the " -#~ "volume directly through displacement." -#~ msgstr "" -#~ "Ingrese su densidad de filamento aquí. Esto es solo para información " -#~ "estadística. Una forma decente es pesar una longitud conocida de " -#~ "filamento y calcular la relación entre la longitud y el volumen. Lo mejor " -#~ "es calcular el volumen directamente a través del desplazamiento." - -#~ msgid "The filament material type for use in custom G-codes." -#~ msgstr "" -#~ "El tipo de material de filamento para uso en códigos G personalizados." - -#~ msgid "Soluble material is most likely used for a soluble support." -#~ msgstr "" -#~ "El material soluble se usa muy probablemente para un soporte soluble." - -#~ msgid "" -#~ "Enter your filament cost per kg here. This is only for statistical " -#~ "information." -#~ msgstr "" -#~ "Ingrese su coste del filamento por kg aquí. Esto es solo para información " -#~ "estadística." - -#~ msgid "(Unknown)" -#~ msgstr "(Desconocido)" - -#~ msgid "" -#~ "Default base angle for infill orientation. Cross-hatching will be applied " -#~ "to this. Bridges will be infilled using the best direction Slic3r can " -#~ "detect, so this setting does not affect them." -#~ msgstr "" -#~ "Ángulo base predeterminado para orientación de relleno. Se aplicará " -#~ "sombreado cruzado a esto. Los puentes se rellenarán utilizando la mejor " -#~ "dirección que Slic3r pueda detectar, por lo que esta configuración no los " -#~ "afecta." - -#~ msgid "Density of internal infill, expressed in the range 0% - 100%." -#~ msgstr "Densidad de relleno interior, expresado en el rango 0% - 100%." - -#~ msgid "Fill pattern for general low-density infill." -#~ msgstr "Patrón de relleno para el relleno general de baja densidad." - -#~ msgid "Stars" -#~ msgstr "Estrellas" - -#~ msgid "3D Honeycomb" -#~ msgstr "Panal de abeja 3D" - -#~ msgid "Support Cubic" -#~ msgstr "Soporte Cúbico" - -#~ msgid "" -#~ "This is the acceleration your printer will use for first layer. Set zero " -#~ "to disable acceleration control for first layer." -#~ msgstr "" -#~ "Esta es la aceleración que su impresora usará para la primera capa. " -#~ "Establezca con el valor cero para deshabilitar el control de aceleración " -#~ "para la primera capa." - -#~ msgid "First object layer over raft interface" -#~ msgstr "Primera capa de objetos sobre la interfaz de la balsa" - -#~ msgid "" -#~ "This is the acceleration your printer will use for first layer of object " -#~ "above raft interface. Set zero to disable acceleration control for first " -#~ "layer of object above raft interface." -#~ msgstr "" -#~ "Esta es la aceleración que tu impresora utilizará para la primera capa " -#~ "del objeto por encima de la interfaz de la balsa. Establezca a cero para " -#~ "desactivar el control de la aceleración para la primera capa del objeto " -#~ "por encima de la interfaz de la balsa." - -#~ msgid "" -#~ "Heated build plate temperature for the first layer. Set this to zero to " -#~ "disable bed temperature control commands in the output." -#~ msgstr "" -#~ "Temperatura de base calefactable para la primera capa. Ajusta esto a cero " -#~ "para deshabilitar los comandos de control de temperatura de la cama en la " -#~ "salida." - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for first " -#~ "layer. You can use this to force fatter extrudates for better adhesion. " -#~ "If expressed as percentage (for example 120%) it will be computed over " -#~ "first layer height. If set to zero, it will use the default extrusion " -#~ "width." -#~ msgstr "" -#~ "Ajuste este valor distinto de cero para establecer un ancho de extrusión " -#~ "manual para la primera capa. Puede usar esto para forzar extrusiones más " -#~ "gordas para una mejor adhesión. Si se expresa como porcentaje (por " -#~ "ejemplo, 120%), se calculará sobre la altura de la primera capa. Si se " -#~ "establece en cero, usará el ancho de extrusión predeterminado." - -#~ msgid "Fuzzy skin type." -#~ msgstr "Tipo de Piel difusa." - -#~ msgid "Outside walls" -#~ msgstr "Paredes exteriores" - -#~ msgid "" -#~ "The maximum distance that each skin point can be offset (both ways), " -#~ "measured perpendicular to the perimeter wall." -#~ msgstr "" -#~ "La distancia máxima a la que puede desplazarse cada punto de piel (en " -#~ "ambos sentidos), medida perpendicularmente al muro perimetral." - -#~ msgid "" -#~ "Perimeters will be split into multiple segments by inserting Fuzzy skin " -#~ "points. Lowering the Fuzzy skin point distance will increase the number " -#~ "of randomly offset points on the perimeter wall." -#~ msgstr "" -#~ "Los perímetros se dividirán en múltiples segmentos mediante la inserción " -#~ "de puntos de piel difusos. Si se reduce la distancia de los puntos de " -#~ "piel difusa, aumentará el número de puntos desplazados aleatoriamente en " -#~ "el muro perimetral." - -#~ msgid "Fill gaps" -#~ msgstr "Rellenar huecos" - -#~ msgid "Layers and Perimeters" -#~ msgstr "Capas y Perímetros" - -#~ msgid "" -#~ "Enables filling of gaps between perimeters and between the inner most " -#~ "perimeters and infill." -#~ msgstr "" -#~ "Permite rellenar los huecos entre los perímetros y entre los perímetros " -#~ "más internos y el relleno." - -#~ msgid "" -#~ "Speed for filling small gaps using short zigzag moves. Keep this " -#~ "reasonably low to avoid too much shaking and resonance issues. Set zero " -#~ "to disable gaps filling." -#~ msgstr "" -#~ "Velocidad para llenar pequeños espacios usando movimientos cortos de " -#~ "zigzag. Mantenga esto razonablemente bajo para evitar demasiados " -#~ "problemas de vibración y sacudidas. Establezca cero para desactivar el " -#~ "llenado de huecos." - -#~ msgid "No extrusion" -#~ msgstr "Sin extrusión" - -#~ msgid "" -#~ "Enable this to add comments into the G-Code labeling print moves with " -#~ "what object they belong to, which is useful for the Octoprint " -#~ "CancelObject plugin. This settings is NOT compatible with Single Extruder " -#~ "Multi Material setup and Wipe into Object / Wipe into Infill." -#~ msgstr "" -#~ "Habilita esto para añadir los comentarios al código G, etiquetando " -#~ "movimientos de impresión con el objeto al que pertenecen, lo que es útil " -#~ "para el plugin Octoprint CancelObject. Esta configuración NO es " -#~ "compatible con la configuración de Single Extruder Multi Material y " -#~ "Limpiar en Objeto / Limpiar en Relleno." - -#~ msgid "Length of the infill anchor" -#~ msgstr "Longitud del relleno del anclaje" - -#~ msgid "The extruder to use when printing infill." -#~ msgstr "El extrusor que se usa cuando se imprime relleno." - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for infill. " -#~ "If left zero, default extrusion width will be used if set, otherwise " -#~ "1.125 x nozzle diameter will be used. You may want to use fatter " -#~ "extrudates to speed up the infill and make your parts stronger. If " -#~ "expressed as percentage (for example 90%) it will be computed over layer " -#~ "height." -#~ msgstr "" -#~ "Ajuste este valor distinto de cero para establecer un ancho de extrusión " -#~ "manual para relleno. Si se deja en cero, se usará el ancho de extrusión " -#~ "por defecto si se establece, de lo contrario se usará 1.125 x diámetro de " -#~ "la boquilla. Es posible que desee extrusiones más gordas para acelerar el " -#~ "relleno y fortalecer sus partes. Si se expresa como porcentaje (por " -#~ "ejemplo, 90%), se calculará sobre la altura de la capa." - -#~ msgid "" -#~ "This setting applies an additional overlap between infill and perimeters " -#~ "for better bonding. Theoretically this shouldn't be needed, but backlash " -#~ "might cause gaps. If expressed as percentage (example: 15%) it is " -#~ "calculated over perimeter extrusion width." -#~ msgstr "" -#~ "Esta configuración aplica una superposición adicional entre relleno y " -#~ "perímetros para una mejor unión. Teóricamente, esto no debería ser " -#~ "necesario, pero la reacción puede causar huecos. Si se expresa como " -#~ "porcentaje (ejemplo: 15%), se calcula sobre el ancho de extrusión del " -#~ "perímetro." - -#~ msgid "Speed for printing the internal fill. Set to zero for auto." -#~ msgstr "" -#~ "Velocidad para imprimir el relleno interno. Establecer a cero para auto." - -#~ msgid "Name of the profile, from which this profile inherits." -#~ msgstr "Nombre del perfil desde que éste hereda." - -#~ msgid "" -#~ "Force the generation of solid shells between adjacent materials/volumes. " -#~ "Useful for multi-extruder prints with translucent materials or manual " -#~ "soluble support material." -#~ msgstr "" -#~ "Forzar la generación de carcasas sólidas entre materiales / volúmenes " -#~ "adyacentes. Útil para impresiones de múltiples extrusoras con materiales " -#~ "translúcidos o material de soporte soluble manual." - -#~ msgid "Maximum width of a segmented region" -#~ msgstr "Anchura máxima de una región segmentada" - -#~ msgid "Maximum width of a segmented region. Zero disables this feature." -#~ msgstr "" -#~ "Ancho máximo de una región segmentada. El cero desactiva esta función." - -#~ msgid "All top surfaces" -#~ msgstr "Todas las superficies superiores" - -#~ msgid "Topmost surface only" -#~ msgstr "Solo en la superficie superior" - -#~ msgid "All solid surfaces" -#~ msgstr "Todas las superficies sólidas" - -#~ msgid "Percent of a flow rate relative to object's normal layer height." -#~ msgstr "" -#~ "Porcentaje de caudal relativo a la altura normal de la capa del objeto." - -#~ msgid "Distance between ironing lines" -#~ msgstr "Distancia entre las líneas alisadas" - -#~ msgid "" -#~ "This custom code is inserted at every layer change, right after the Z " -#~ "move and before the extruder moves to the first layer point. Note that " -#~ "you can use placeholder variables for all Slic3r settings as well as " -#~ "[layer_num] and [layer_z]." -#~ msgstr "" -#~ "Este código personalizado se inserta en cada cambio de capa, justo " -#~ "después del movimiento Z y antes de que el extrusor se mueva al primer " -#~ "punto de capa. Tenga en cuenta que puede usar variables de marcador de " -#~ "posición para todos los ajustes de Slic3r, así como [layer_num] y " -#~ "[layer_z]." - -#~ msgid "Supports stealth mode" -#~ msgstr "Soporta modo silencioso" - -#~ msgid "The firmware supports stealth mode" -#~ msgstr "El firmware soporta el modo silencioso" - -#~ msgid "Minimum feedrate when extruding" -#~ msgstr "Avance mínimo al extruir" - -#~ msgid "Minimum feedrate when extruding (M205 S)" -#~ msgstr "Avance mínimo al extruir (M205 S)" - -#~ msgid "Minimum travel feedrate" -#~ msgstr "Avance mínimo de movimiento" - -#~ msgid "Minimum travel feedrate (M205 T)" -#~ msgstr "Velocidad mínima sin extrusión (M205 T)" - -#~ msgid "Maximum acceleration when extruding" -#~ msgstr "Aceleración máxima al extruir" - -#~ msgid "" -#~ "Maximum acceleration when extruding (M204 P)\n" -#~ "\n" -#~ "Marlin (legacy) firmware flavor will use this also as travel acceleration " -#~ "(M204 T)." -#~ msgstr "" -#~ "Aceleración máxima al extruir (M204 P)\n" -#~ "\n" -#~ "El tipo de firmware de Marlin (heredado) lo utilizará también como " -#~ "aceleración de desplazamiento (M204 T)." - -#~ msgid "Maximum acceleration when retracting" -#~ msgstr "Aceleración máxima al retraer" - -#~ msgid "Maximum acceleration when retracting (M204 R)" -#~ msgstr "Aceleración máxima al retraer (M204 R)" - -#~ msgid "Maximum acceleration for travel moves" -#~ msgstr "Aceleración máxima para movimientos de desplazamiento" - -#~ msgid "Maximum acceleration for travel moves (M204 T)" -#~ msgstr "Aceleración máxima para movimientos de desplazamiento (M204 T)" - -#~ msgid "This setting represents the maximum speed of your fan." -#~ msgstr "Esta configuración representa la velocidad máxima de su ventilador." - -#, fuzzy -#~ msgid "" -#~ "This is the highest printable layer height for this extruder, used to cap " -#~ "the variable layer height and support layer height. Maximum recommended " -#~ "layer height is 75% of the extrusion width to achieve reasonable inter-" -#~ "layer adhesion. If set to 0, layer height is limited to 75% of the nozzle " -#~ "diameter." -#~ msgstr "" -#~ "Esta es la altura más alta imprimible de capa para este extrusor, que se " -#~ "utiliza para cubrir la altura de la capa variable y la altura de la capa " -#~ "de soporte. La altura máxima recomendada de la capa es del 75% del ancho " -#~ "de extrusión para lograr una adhesión razonable entre capas. Si se " -#~ "establece en 0, la altura de la capa se limita al 75% del diámetro de la " -#~ "boquilla." - -#~ msgid "" -#~ "When setting other speed settings to 0 Slic3r will autocalculate the " -#~ "optimal speed in order to keep constant extruder pressure. This " -#~ "experimental setting is used to set the highest print speed you want to " -#~ "allow." -#~ msgstr "" -#~ "Al establecer otras configuraciones de velocidad en 0, Slic3r calculará " -#~ "automáticamente la velocidad óptima para mantener constante la presión en " -#~ "el extrusor. Esta configuración experimental se utiliza para establecer " -#~ "la velocidad de impresión más alta que desea permitir." - -#~ msgid "" -#~ "This experimental setting is used to set the maximum volumetric speed " -#~ "your extruder supports." -#~ msgstr "" -#~ "Esta configuración experimental se usa para establecer la velocidad " -#~ "volumétrica máxima que admite el extrusor." - -#~ msgid "Max volumetric slope positive" -#~ msgstr "Máx. Pendiente volumétrica positiva" - -#~ msgid "" -#~ "This experimental setting is used to limit the speed of change in " -#~ "extrusion rate. A value of 1.8 mm³/s² ensures, that a change from the " -#~ "extrusion rate of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion " -#~ "height, feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at " -#~ "least 2 seconds." -#~ msgstr "" -#~ "Esta configuración experimental se usa para limitar la velocidad de " -#~ "cambio en la velocidad de extrusión. Un valor de 1,8 mm³ / s² asegura que " -#~ "se cambia la velocidad de extrusión de 1,8 mm³ / s (ancho de extrusión de " -#~ "0,45 mm, altura de extrusión de 0,2 mm, avance de 20 mm / s) a 5,4 mm³ / " -#~ "s (avance de 60 mm / s) durará al menos 2 segundos." - -#~ msgid "mm³/s²" -#~ msgstr "mm³/s²" - -#~ msgid "Max volumetric slope negative" -#~ msgstr "Máx. Pendiente volumétrica negativa" - -#~ msgid "This setting represents the minimum PWM your fan needs to work." -#~ msgstr "" -#~ "Este ajuste representa el PWM mínimo que el ventilador necesita para " -#~ "funcionar." - -#~ msgid "" -#~ "This is the lowest printable layer height for this extruder and limits " -#~ "the resolution for variable layer height. Typical values are between 0.05 " -#~ "mm and 0.1 mm." -#~ msgstr "" -#~ "Esta es la altura más baja de la capa imprimible para este extrusor y " -#~ "limita la resolución para la altura de la capa variable. Los valores " -#~ "típicos están entre 0.05 mm y 0.1 mm." - -#~ msgid "Slic3r will not scale speed down below this speed." -#~ msgstr "Slic3r no escalará la velocidad por debajo de esta velocidad." - -#~ msgid "" -#~ "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" -#~ msgstr "" -#~ "Este es el diámetro de la boquilla de su extrusor (por ejemplo: 0.5, " -#~ "0.35, etc.)" - -#~ msgid "" -#~ "Disables retraction when the travel path does not exceed the upper " -#~ "layer's perimeters (and thus any ooze will be probably invisible)." -#~ msgstr "" -#~ "Desactiva la retracción cuando la trayectoria de desplazamiento no supera " -#~ "los perímetros de la capa superior (y, por lo tanto, cualquier goteo " -#~ "probablemente será invisible)." - -#~ msgid "" -#~ "This option will drop the temperature of the inactive extruders to " -#~ "prevent oozing. It will enable a tall skirt automatically and move " -#~ "extruders outside such skirt when changing temperatures." -#~ msgstr "" -#~ "Esta opción reducirá la temperatura de las extrusoras inactivas para " -#~ "evitar el goteo. Permitirá una falda alta automáticamente y moverá los " -#~ "extrusores fuera de dicha falda cuando cambie la temperatura." - -#~ msgid "" -#~ "Experimental option to adjust flow for overhangs (bridge flow will be " -#~ "used), to apply bridge speed to them and enable fan." -#~ msgstr "" -#~ "Opción experimental para ajustar el flujo para salientes (se usará el " -#~ "flujo del puente), para aplicar la velocidad del puente a ellos y " -#~ "habilitar el ventilador." - -#~ msgid "" -#~ "The extruder to use when printing perimeters and brim. First extruder is " -#~ "1." -#~ msgstr "" -#~ "El extrusor que se usa al imprimir perímetros y borde. El primer extrusor " -#~ "es 1." - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for " -#~ "perimeters. You may want to use thinner extrudates to get more accurate " -#~ "surfaces. If left zero, default extrusion width will be used if set, " -#~ "otherwise 1.125 x nozzle diameter will be used. If expressed as " -#~ "percentage (for example 200%) it will be computed over layer height." -#~ msgstr "" -#~ "Ajuste este valor distinto de cero para establecer un ancho de extrusión " -#~ "manual para los perímetros. Es posible que desee utilizar extrusiones más " -#~ "delgadas para obtener superficies más precisas. Si se deja en cero, se " -#~ "usará el ancho de extrusión por defecto si se establece, de lo contrario " -#~ "se usará 1.125 x diámetro de la boquilla. Si se expresa como porcentaje " -#~ "(por ejemplo, 200%), se calculará sobre la altura de la capa." - -#~ msgid "" -#~ "Speed for perimeters (contours, aka vertical shells). Set to zero for " -#~ "auto." -#~ msgstr "" -#~ "Velocidad para perímetros (contornos, también conocidos como conchas " -#~ "verticales). Establecer a cero para auto." - -#~ msgid "" -#~ "If you want to process the output G-code through custom scripts, just " -#~ "list their absolute paths here. Separate multiple scripts with a " -#~ "semicolon. Scripts will be passed the absolute path to the G-code file as " -#~ "the first argument, and they can access the Slic3r config settings by " -#~ "reading environment variables." -#~ msgstr "" -#~ "Si desea procesar el código G de salida a través de scripts " -#~ "personalizados, simplemente haga una lista de sus rutas absolutas aquí. " -#~ "Separe los scripts múltiples con un punto y coma. Los scripts se pasarán " -#~ "por la ruta absoluta al archivo de código G como primer argumento, y " -#~ "pueden acceder a la configuración de configuración de Slic3r leyendo las " -#~ "variables de entorno." - -#~ msgid "Type of the printer." -#~ msgstr "Tipo de impresora." - -#~ msgid "" -#~ "Name of the printer variant. For example, the printer variants may be " -#~ "differentiated by a nozzle diameter." -#~ msgstr "" -#~ "Nombre de la variante de impresora. Por ejemplo, las variantes pueden " -#~ "distinguir diferentes diámetros de boquilla." - -#~ msgid "" -#~ "The vertical distance between object and raft. Ignored for soluble " -#~ "interface." -#~ msgstr "" -#~ "La distancia vertical entre el objeto y la balsa. Se ignora para la " -#~ "interfaz soluble." - -#~ msgid "Expansion of the raft in XY plane for better stability." -#~ msgstr "Expansión de la balsa en el plano XY para mejorar la estabilidad." - -#~ msgid "Density of the first raft or support layer." -#~ msgstr "Densidad de la primera balsa o capa de soporte." - -#~ msgid "" -#~ "Expansion of the first raft or support layer to improve adhesion to print " -#~ "bed." -#~ msgstr "" -#~ "Expansión de la primera balsa o capa de soporte para mejorar la adhesión " -#~ "a la cama de impresión." - -#~ msgid "" -#~ "The object will be raised by this number of layers, and support material " -#~ "will be generated under it." -#~ msgstr "" -#~ "El objeto será elevado por este número de capas y se generará material de " -#~ "soporte debajo de él." - -#~ msgid "" -#~ "Maximum deviation of exported G-code paths from their full resolution " -#~ "counterparts. Very high resolution G-code requires huge amount of RAM to " -#~ "slice and preview, also a 3D printer may stutter not being able to " -#~ "process a high resolution G-code in a timely manner. On the other hand, a " -#~ "low resolution G-code will produce a low poly effect and because the G-" -#~ "code reduction is performed at each layer independently, visible " -#~ "artifacts may be produced." -#~ msgstr "" -#~ "Desviación máxima de las rutas de código G exportadas respecto a sus " -#~ "homólogas de resolución completa. Un código G de muy alta resolución " -#~ "requiere una enorme cantidad de RAM para laminar y previsualizar, y " -#~ "además una impresora 3D puede fallar al no ser capaz de procesar un " -#~ "código G de alta resolución de manera oportuna. Por otro lado, un código " -#~ "G de baja resolución producirá un efecto de baja poligonización y, dado " -#~ "que la reducción del código G se realiza en cada capa de forma " -#~ "independiente, pueden producirse artefactos visibles." - -#~ msgid "Minimum travel after retraction" -#~ msgstr "Distancia mínima después de la retracción" - -#~ msgid "" -#~ "Retraction is not triggered when travel moves are shorter than this " -#~ "length." -#~ msgstr "" -#~ "La retracción no se activa cuando los movimientos de desplazamiento son " -#~ "más cortos que esta longitud." - -#~ msgid "" -#~ "With bowden extruders, it may be wise to do some amount of quick retract " -#~ "before doing the wipe movement." -#~ msgstr "" -#~ "Con extrusores bowden, puede ser recomendable realizar una retracción " -#~ "rápida antes de realizar el movimiento de limpiar." - -#~ msgid "This flag enforces a retraction whenever a Z move is done." -#~ msgstr "" -#~ "Esta bandera impone una retractación cada vez que se realiza un " -#~ "movimiento Z." - -#~ msgid "" -#~ "When retraction is triggered, filament is pulled back by the specified " -#~ "amount (the length is measured on raw filament, before it enters the " -#~ "extruder)." -#~ msgstr "" -#~ "Cuando se activa la retracción, el filamento se retira en la cantidad " -#~ "especificada (la longitud se mide en el filamento sin procesar, antes de " -#~ "que entre en el extrusor)." - -#~ msgid "mm (zero to disable)" -#~ msgstr "mm (cero para deshabilitar)" - -#~ msgid "" -#~ "When retraction is triggered before changing tool, filament is pulled " -#~ "back by the specified amount (the length is measured on raw filament, " -#~ "before it enters the extruder)." -#~ msgstr "" -#~ "Cuando se desencadena la retracción antes de cambiar la herramienta, el " -#~ "filamento se retira en la cantidad especificada (la longitud se mide en " -#~ "el filamento sin procesar, antes de que entre en el extrusor)." - -#~ msgid "Lift Z" -#~ msgstr "Levantar Z" - -#~ msgid "" -#~ "If you set this to a positive value, Z is quickly raised every time a " -#~ "retraction is triggered. When using multiple extruders, only the setting " -#~ "for the first extruder will be considered." -#~ msgstr "" -#~ "Si establece esto en un valor positivo, Z se levantará rápidamente cada " -#~ "vez que se active una retracción. Cuando se usan múltiples extrusores , " -#~ "solo se considerará la configuración del primer extrusor." - -#~ msgid "" -#~ "When the retraction is compensated after the travel move, the extruder " -#~ "will push this additional amount of filament. This setting is rarely " -#~ "needed." -#~ msgstr "" -#~ "Cuando la retracción se compensa después de un movimiento, el extrusor " -#~ "necesitará introducir más filamento. Este ajuste raramente se necesita." - -#~ msgid "" -#~ "When the retraction is compensated after changing tool, the extruder will " -#~ "push this additional amount of filament." -#~ msgstr "" -#~ "Cuando la retracción se compensa después de cambiar la herramienta, el " -#~ "extrusor empujará esta cantidad adicional de filamento." - -#~ msgid "The speed for retractions (it only applies to the extruder motor)." -#~ msgstr "" -#~ "La velocidad para las retracciones (solo se aplica al motor del extrusor)." - -#~ msgid "" -#~ "The speed for loading of a filament into extruder after retraction (it " -#~ "only applies to the extruder motor). If left to zero, the retraction " -#~ "speed is used." -#~ msgstr "" -#~ "La velocidad de carga de un filamento en la extrusora después de la " -#~ "retracción (solo se aplica al motor del extrusor). Si se deja a cero, se " -#~ "usa la velocidad de retracción." - -#~ msgid "Random" -#~ msgstr "Aleatorio" - -#~ msgid "Direction" -#~ msgstr "Dirección" - -#~ msgid "Preferred direction of the seam" -#~ msgstr "Dirección preferida de la costura" - -#~ msgid "Seam preferred direction" -#~ msgstr "Dirección de la costura" - -#~ msgid "Jitter" -#~ msgstr "Jitter" - -#~ msgid "Seam preferred direction jitter" -#~ msgstr "Dirección preferida de unión jitter" - -#~ msgid "Preferred direction of the seam - jitter" -#~ msgstr "Dirección preferida de la unión - jitter" - -#~ msgid "" -#~ "Distance between skirt and brim (when draft shield is not used) or " -#~ "objects." -#~ msgstr "" -#~ "Distancia entre el faldón y el borde (cuando no se utiliza el protector " -#~ "contra corrientes de aire) u objetos." - -#~ msgid "Height of skirt expressed in layers." -#~ msgstr "Altura de la falda expresada en capas." - -#~ msgid "" -#~ "With draft shield active, the skirt will be printed skirt_distance from " -#~ "the object, possibly intersecting brim.\n" -#~ "Enabled = skirt is as tall as the highest printed object.\n" -#~ "Limited = skirt is as tall as specified by skirt_height.\n" -#~ "This is useful to protect an ABS or ASA print from warping and detaching " -#~ "from print bed due to wind draft." -#~ msgstr "" -#~ "Con el protector contra corrientes de aire activado, la falda se " -#~ "imprimirá a la distancia de la falda del objeto, posiblemente cruzando el " -#~ "borde.\n" -#~ "Activado = la falda es tan alta como el objeto impreso más alto.\n" -#~ "Limitado = la falda es tan alto como se especifica en skirt_height.\n" -#~ "Esto es útil para proteger una impresión en ABS o ASA para que no se " -#~ "deforme y se desprenda de la cama de impresión debido a las corrientes de " -#~ "aire." - -#~ msgid "" -#~ "Number of loops for the skirt. If the Minimum Extrusion Length option is " -#~ "set, the number of loops might be greater than the one configured here. " -#~ "Set this to zero to disable skirt completely." -#~ msgstr "" -#~ "Número de vueltas para la falda Si se establece la opción Longitud Mínima " -#~ "de Extrusión, el número de bucles puede ser mayor que el configurado " -#~ "aquí. Ajuste esto a cero para deshabilitar la falda por completo." - -#~ msgid "" -#~ "If layer print time is estimated below this number of seconds, print " -#~ "moves speed will be scaled down to extend duration to this value." -#~ msgstr "" -#~ "Si el tiempo de impresión de la capa se estima por debajo de este número " -#~ "de segundos, la velocidad de los movimientos de impresión se reducirá " -#~ "para extender la duración a este valor." - -#~ msgid "Small perimeters" -#~ msgstr "Perímetros pequeños" - -#~ msgid "" -#~ "This separate setting will affect the speed of perimeters having radius " -#~ "<= 6.5mm (usually holes). If expressed as percentage (for example: 80%) " -#~ "it will be calculated on the perimeters speed setting above. Set to zero " -#~ "for auto." -#~ msgstr "" -#~ "Esta configuración por separado afectará la velocidad de los perímetros " -#~ "con un radio <= 6,5 mm (generalmente agujeros). Si se expresa como " -#~ "porcentaje (por ejemplo: 80%), se calculará en la configuración de " -#~ "velocidad de perímetros anterior. Establecer a cero para auto." - -#~ msgid "" -#~ "Force solid infill for regions having a smaller area than the specified " -#~ "threshold." -#~ msgstr "" -#~ "Forzar el relleno sólido para las regiones que tienen un área más pequeña " -#~ "que el umbral especificado." - -#~ msgid "The extruder to use when printing solid infill." -#~ msgstr "El extrusor que se usa al imprimir relleno sólido." - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for infill " -#~ "for solid surfaces. If left zero, default extrusion width will be used if " -#~ "set, otherwise 1.125 x nozzle diameter will be used. If expressed as " -#~ "percentage (for example 90%) it will be computed over layer height." -#~ msgstr "" -#~ "Ajuste este valor distinto de cero para establecer un ancho de extrusión " -#~ "manual para el relleno de superficies sólidas. Si se deja en cero, se " -#~ "usará el ancho de extrusión por defecto si se establece, de lo contrario " -#~ "se usará 1.125 x diámetro de la boquilla. Si se expresa como porcentaje " -#~ "(por ejemplo, 90%), se calculará sobre la altura de la capa." - -#~ msgid "" -#~ "Speed for printing solid regions (top/bottom/internal horizontal shells). " -#~ "This can be expressed as a percentage (for example: 80%) over the default " -#~ "infill speed above. Set to zero for auto." -#~ msgstr "" -#~ "Velocidad para imprimir regiones sólidas (superior / inferior / conchas " -#~ "horizontales internas). Esto se puede expresar como un porcentaje (por " -#~ "ejemplo: 80%) sobre la velocidad de relleno predeterminada anterior. " -#~ "Establecer a cero para auto." - -#~ msgid "" -#~ "This feature will raise Z gradually while printing a single-walled object " -#~ "in order to remove any visible seam. This option requires a single " -#~ "perimeter, no infill, no top solid layers and no support material. You " -#~ "can still set any number of bottom solid layers as well as skirt/brim " -#~ "loops. It won't work when printing more than one single object." -#~ msgstr "" -#~ "Esta función aumentará Z gradualmente mientras imprimes un objeto de " -#~ "pared simple para eliminar cualquier costura visible. Esta opción " -#~ "requiere un perímetro único, sin relleno, sin capas sólidas superiores y " -#~ "sin material de soporte. Puedes establecer cualquier cantidad de capas " -#~ "sólidas inferiores, así como los bucles de falda/balsa. No funcionará al " -#~ "imprimir más de un objeto." - -#~ msgid "" -#~ "Temperature difference to be applied when an extruder is not active. " -#~ "Enables a full-height \"sacrificial\" skirt on which the nozzles are " -#~ "periodically wiped." -#~ msgstr "" -#~ "Diferencia de temperatura que se aplicará cuando un extrusor no esté " -#~ "activo. ACtiva una falda \"de sacrificio\" de altura completa en la que " -#~ "las boquillas se limpian periódicamente." - -#~ msgid "The printer multiplexes filaments into a single hot end." -#~ msgstr "La impresora multiplexa los filamentos en un solo fusor." - -#~ msgid "" -#~ "If enabled, all printing extruders will be primed at the front edge of " -#~ "the print bed at the start of the print." -#~ msgstr "" -#~ "Si está habilitado, todos los extrusores de impresión estarán cebados en " -#~ "el borde frontal de la cama de impresión al comienzo de la impresión." - -#~ msgid "" -#~ "If enabled, the wipe tower will not be printed on layers with no " -#~ "toolchanges. On layers with a toolchange, extruder will travel downward " -#~ "to print the wipe tower. User is responsible for ensuring there is no " -#~ "collision with the print." -#~ msgstr "" -#~ "Si está habilitado, laTorre de Limpieza no se imprimirá en capas sin " -#~ "cambios de herramientas. En capas con cambio de herramienta, el extrusor " -#~ "viajará hacia abajo para imprimir la torre de limpieza. El usuario es " -#~ "responsable de garantizar que no haya colisión con la impresión." - -#~ msgid "" -#~ "Cracks smaller than 2x gap closing radius are being filled during the " -#~ "triangle mesh slicing. The gap closing operation may reduce the final " -#~ "print resolution, therefore it is advisable to keep the value reasonably " -#~ "low." -#~ msgstr "" -#~ "Las ranuras de menos de dos veces el radio de cierre de huecos se " -#~ "rellenan durante el laminado de la malla triangular. La operación de " -#~ "cierre de huecos puede reducir la resolución de la impresión, por lo " -#~ "tanto es aconsejable mantener ese valor razonablemente bajo." - -#~ msgid "" -#~ "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " -#~ "close all holes in the model." -#~ msgstr "" -#~ "Utiliza \"Incluso-extraño\" para los modelos de avión de 3DLabPrint. " -#~ "Utiliza \"Cerrar agujeros\" para cerrar todos los agujeros del modelo." - -#~ msgid "" -#~ "XY separation between an object and its support. If expressed as " -#~ "percentage (for example 50%), it will be calculated over external " -#~ "perimeter width." -#~ msgstr "" -#~ "Separación XY entre un objeto y su soporte. Si se expresa como porcentaje " -#~ "(por ejemplo 50%), se calculará sobre el ancho del perímetro externo." - -#~ msgid "" -#~ "Only create support if it lies on a build plate. Don't create support on " -#~ "a print." -#~ msgstr "" -#~ "Solo crear soportes si está en contacto con la plataforma. No crea " -#~ "soporte en la impresión." - -#~ msgid "0 (soluble)" -#~ msgstr "0 (soluble)" - -#~ msgid "0.2 (detachable)" -#~ msgstr "0.2 (despegable)" - -#~ msgid "" -#~ "Generate support material for the specified number of layers counting " -#~ "from bottom, regardless of whether normal support material is enabled or " -#~ "not and regardless of any angle threshold. This is useful for getting " -#~ "more adhesion of objects having a very thin or poor footprint on the " -#~ "build plate." -#~ msgstr "" -#~ "Generar material de soporte para la cantidad especificada de capas " -#~ "contando desde abajo, independientemente de si el material de soporte " -#~ "normal está habilitado o no e independientemente de cualquier umbral de " -#~ "ángulo. Es útil para obtener una mayor adhesión de los objetos que tienen " -#~ "una huella muy delgada o deficiente en la placa de construcción." - -#~ msgid "" -#~ "The extruder to use when printing support material, raft and skirt (1+, 0 " -#~ "to use the current extruder to minimize tool changes)." -#~ msgstr "" -#~ "El extrusor que se usa al imprimir material de soporte, balsa y falda " -#~ "(1+, 0 para usar la extrusora actual para minimizar los cambios de " -#~ "herramientas)." - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for support " -#~ "material. If left zero, default extrusion width will be used if set, " -#~ "otherwise nozzle diameter will be used. If expressed as percentage (for " -#~ "example 90%) it will be computed over layer height." -#~ msgstr "" -#~ "Ajuste este valor distinto de cero para establecer un ancho de extrusión " -#~ "manual para el material de soporte. Si se deja en cero, se usará el ancho " -#~ "de extrusión por defecto si se establece, de lo contrario se usará el " -#~ "diámetro de la boquilla. Si se expresa como porcentaje (por ejemplo, " -#~ "90%), se calculará sobre la altura de la capa." - -#~ msgid "Interface loops" -#~ msgstr "Bucles de interfaz" - -#~ msgid "" -#~ "The extruder to use when printing support material interface (1+, 0 to " -#~ "use the current extruder to minimize tool changes). This affects raft too." -#~ msgstr "" -#~ "La extrusora que se usa al imprimir la interfaz de material de soporte " -#~ "(1+, 0 para usar la extrusora actual para minimizar los cambios de " -#~ "herramientas). Esto también afecta a la balsa." - -#~ msgid "" -#~ "Number of interface layers to insert between the object(s) and support " -#~ "material." -#~ msgstr "" -#~ "Número de capas de interfaz para insertar entre el (los) objeto(s) y el " -#~ "material de soporte." - -#~ msgid "0 (off)" -#~ msgstr "0 (off)" - -#~ msgid "1 (light)" -#~ msgstr "1 (ligero)" - -#~ msgid "2 (default)" -#~ msgstr "2 (por defecto)" - -#~ msgid "3 (heavy)" -#~ msgstr "3 (pesado)" - -#~ msgid "" -#~ "For snug supports, the support regions will be merged using morphological " -#~ "closing operation. Gaps smaller than the closing radius will be filled in." -#~ msgstr "" -#~ "En el caso de los soportes ajustados, las regiones de soporte se " -#~ "fusionarán mediante la operación de cierre morfológico. Los huecos " -#~ "menores que el radio de cierre se rellenarán." - -#~ msgid "Spacing between interface lines. Set zero to get a solid interface." -#~ msgstr "" -#~ "Separación entre líneas de interfaz. Establezca cero para obtener una " -#~ "interfaz sólida." - -#~ msgid "" -#~ "Speed for printing support material interface layers. If expressed as " -#~ "percentage (for example 50%) it will be calculated over support material " -#~ "speed." -#~ msgstr "" -#~ "Velocidad para imprimir capas de interfaz de material de soporte. Si se " -#~ "expresa como porcentaje (por ejemplo, 50%), se calculará sobre la " -#~ "velocidad del material de soporte." - -#~ msgid "Pattern used to generate support material." -#~ msgstr "Patrón utilizado para generar material de soporte." - -#~ msgid "" -#~ "Pattern used to generate support material interface. Default pattern for " -#~ "non-soluble support interface is Rectilinear, while default pattern for " -#~ "soluble support interface is Concentric." -#~ msgstr "" -#~ "Patrón utilizado para generar la interfaz del material de soporte. El " -#~ "patrón por defecto para la interfaz de soporte no soluble es Rectilíneo, " -#~ "mientras que el patrón por defecto para la interfaz de soporte soluble es " -#~ "Concéntrico." - -#~ msgid "Spacing between support material lines." -#~ msgstr "Separación entre las líneas de material de soporte." - -#~ msgid "Speed for printing support material." -#~ msgstr "Velocidad para imprimir material de soporte." - -#~ msgid "" -#~ "Style and shape of the support towers. Projecting the supports into a " -#~ "regular grid will create more stable supports, while snug support towers " -#~ "will save material and reduce object scarring." -#~ msgstr "" -#~ "Estilo y forma de las torres de soporte. Proyectar los soportes en una " -#~ "cuadrícula regular creará soportes más estables, mientras que las torres " -#~ "de soporte ajustadas ahorrarán material y reducirán las cicatrices del " -#~ "objeto." - -#~ msgid "" -#~ "Support material will not be generated for overhangs whose slope angle " -#~ "(90° = vertical) is above the given threshold. In other words, this value " -#~ "represent the most horizontal slope (measured from the horizontal plane) " -#~ "that you can print without support material. Set to zero for automatic " -#~ "detection (recommended)." -#~ msgstr "" -#~ "El material de soporte no se generará para voladizos cuyo ángulo de " -#~ "inclinación (90 ° = vertical) esté por encima del umbral dado. En otras " -#~ "palabras, este valor representa la pendiente más horizontal (medida desde " -#~ "el plano horizontal) que puede imprimir sin material de soporte. Ajuste a " -#~ "cero para la detección automática (recomendado)." - -#~ msgid "With sheath around the support" -#~ msgstr "Con protección alrededor del soporte" - -#~ msgid "" -#~ "Add a sheath (a single perimeter line) around the base support. This " -#~ "makes the support more reliable, but also more difficult to remove." -#~ msgstr "" -#~ "Añadir una funda (una sola línea de perímetro) alrededor de la base del " -#~ "soporte. Esto hace el soporte más fiable pero también más difícil de " -#~ "retirar." - -#~ msgid "" -#~ "Nozzle temperature for layers after the first one. Set this to zero to " -#~ "disable temperature control commands in the output G-code." -#~ msgstr "" -#~ "Temperatura de la boquilla para las capas después de la primera. Ajusta " -#~ "esto a cero para deshabilitar los comandos de control de temperatura en " -#~ "el código G de salida." - -#~ msgid "" -#~ "If enabled, bridges are more reliable, can bridge longer distances, but " -#~ "may look worse. If disabled, bridges look better but are reliable just " -#~ "for shorter bridged distances." -#~ msgstr "" -#~ "Si están activados, los puentes serán más fiables, pueden salvar " -#~ "distancias más largas, pero pueden tener peor aspecto. Si se desactiva, " -#~ "los puentes se verán mejor pero son fiables sólo para distancias de " -#~ "puente más cortas." - -#~ msgid "" -#~ "Detect single-width walls (parts where two extrusions don't fit and we " -#~ "need to collapse them into a single trace)." -#~ msgstr "" -#~ "Detecta muros de ancho único (partes donde dos extrusiones no se ajustan " -#~ "y tenemos que colapsarlas en un solo rastro)." - -#~ msgid "" -#~ "Set this to a non-zero value to set a manual extrusion width for infill " -#~ "for top surfaces. You may want to use thinner extrudates to fill all " -#~ "narrow regions and get a smoother finish. If left zero, default extrusion " -#~ "width will be used if set, otherwise nozzle diameter will be used. If " -#~ "expressed as percentage (for example 90%) it will be computed over layer " -#~ "height." -#~ msgstr "" -#~ "Ajuste este valor distinto de cero para establecer un ancho de extrusión " -#~ "manual para el relleno de las superficies superiores. Es posible que " -#~ "desee utilizar extrusiones más delgadas para llenar todas las regiones " -#~ "estrechas y obtener un acabado más suave. Si se deja en cero, se usará el " -#~ "ancho de extrusión por defecto si se establece, de lo contrario se usará " -#~ "el diámetro de la boquilla. Si se expresa como porcentaje (por ejemplo, " -#~ "90%), se calculará sobre la altura de la capa." - -#~ msgid "" -#~ "Speed for printing top solid layers (it only applies to the uppermost " -#~ "external layers and not to their internal solid layers). You may want to " -#~ "slow down this to get a nicer surface finish. This can be expressed as a " -#~ "percentage (for example: 80%) over the solid infill speed above. Set to " -#~ "zero for auto." -#~ msgstr "" -#~ "Velocidad para imprimir capas sólidas superiores (solo se aplica a las " -#~ "capas externas superiores y no a sus capas sólidas internas). Es posible " -#~ "que desee reducir la velocidad para obtener un acabado de superficie más " -#~ "agradable. Esto se puede expresar como un porcentaje (por ejemplo: 80%) " -#~ "sobre la velocidad de relleno sólido anterior. Establecer a cero para " -#~ "auto." - -#~ msgid "Number of solid layers to generate on top surfaces." -#~ msgstr "Número de capas sólidas para generar en las superficies superiores." - -#~ msgid "Minimum top shell thickness" -#~ msgstr "Espesor mínimo de la carcasa superior" - -#~ msgid "Speed for travel moves (jumps between distant extrusion points)." -#~ msgstr "" -#~ "Velocidad para movimientos (saltos entre puntos de extrusión distantes)." - -#~ msgid "" -#~ "Speed for movements along the Z axis.\n" -#~ "When set to zero, the value is ignored and regular travel speed is used " -#~ "instead." -#~ msgstr "" -#~ "Velocidad para los movimientos a lo largo del eje Z.\n" -#~ "Cuando se ajusta a cero, el valor se ignora y se utiliza la velocidad de " -#~ "desplazamiento normal en su lugar." - -#~ msgid "" -#~ "This flag will move the nozzle while retracting to minimize the possible " -#~ "blob on leaky extruders." -#~ msgstr "" -#~ "Esta bandera moverá la boquilla mientras se retrae para minimizar la " -#~ "posible mancha en los extrusores con fugas." - -#~ msgid "" -#~ "Multi material printers may need to prime or purge extruders on tool " -#~ "changes. Extrude the excess material into the wipe tower." -#~ msgstr "" -#~ "Las impresoras de varios materiales pueden necesitar cebar o purgar " -#~ "extrusoras en los cambios de herramientas. Extruya el exceso de material " -#~ "en la torre de limpieza." - -#~ msgid "" -#~ "This vector saves required volumes to change from/to each tool used on " -#~ "the wipe tower. These values are used to simplify creation of the full " -#~ "purging volumes below." -#~ msgstr "" -#~ "Este vector guarda los volúmenes necesarios para cambiar desde/hasta " -#~ "cada herramienta usada en la torre de limpieza. Estos valores se emplean " -#~ "para simplificar la creación de los volúmenes totales de purga más abajo." - -#~ msgid "" -#~ "This matrix describes volumes (in cubic milimetres) required to purge the " -#~ "new filament on the wipe tower for any given pair of tools." -#~ msgstr "" -#~ "Esta matriz detalla los volúmenes (en milímetros cúbicos) necesarios para " -#~ "purgar el nuevo filamento en la torre de limpieza para cualquier par de " -#~ "filamentos." - -#~ msgid "Position X" -#~ msgstr "Posición X" - -#~ msgid "X coordinate of the left front corner of a wipe tower" -#~ msgstr "" -#~ "Coordenada X de la esquina frontal izquierda de la torre de limpieza" - -#~ msgid "Position Y" -#~ msgstr "Posición Y" - -#~ msgid "Y coordinate of the left front corner of a wipe tower" -#~ msgstr "" -#~ "Coordenada Y de la esquina delantera izquierda de la torre de limpieza" - -#~ msgid "Width of a wipe tower" -#~ msgstr "Ancho de la torre de limpieza" - -#~ msgid "Wipe tower rotation angle" -#~ msgstr "Ángulo de rotación de la torre de limpieza" - -#~ msgid "Wipe tower rotation angle with respect to x-axis." -#~ msgstr "Ángulo de rotación de la torre de limpieza con respecto al eje X." - -#~ msgid "Wipe tower brim width" -#~ msgstr "Ancho de la balsa de la torre de limpieza" - -#~ msgid "Wipe into this object's infill" -#~ msgstr "Limpiar en el relleno del objeto" - -#~ msgid "" -#~ "Purging after toolchange will be done inside this object's infills. This " -#~ "lowers the amount of waste but may result in longer print time due to " -#~ "additional travel moves." -#~ msgstr "" -#~ "La purga después del cambio de herramienta se hará dentro de los rellenos " -#~ "de este objeto. Esto reduce la cantidad de residuos, pero puede dar lugar " -#~ "a un mayor tiempo de impresión debido a los movimientos de desplazamiento " -#~ "adicionales." - -#~ msgid "Wipe into this object" -#~ msgstr "Limpiar en el objeto" - -#~ msgid "" -#~ "Object will be used to purge the nozzle after a toolchange to save " -#~ "material that would otherwise end up in the wipe tower and decrease print " -#~ "time. Colours of the objects will be mixed as a result." -#~ msgstr "" -#~ "El objeto se utilizará para purgar el nozzle después de un cambio de " -#~ "herramienta para guardar el material que de lo contrario terminaría en la " -#~ "torre de limpieza y disminuir el tiempo de impresión. Los colores de los " -#~ "objetos se mezclarán como resultado." - -#~ msgid "Maximal bridging distance" -#~ msgstr "Distancia máxima de puentes" - -#~ msgid "Maximal distance between supports on sparse infill sections." -#~ msgstr "" -#~ "Distancia máxima entre soportes en las secciones con relleno ligero." - -#~ msgid "Z offset" -#~ msgstr "Ajuste en altura Z" - -#~ msgid "" -#~ "This value will be added (or subtracted) from all the Z coordinates in " -#~ "the output G-code. It is used to compensate for bad Z endstop position: " -#~ "for example, if your endstop zero actually leaves the nozzle 0.3mm far " -#~ "from the print bed, set this to -0.3 (or fix your endstop)." -#~ msgstr "" -#~ "Este valor será añadido (o eliminado) de todas las coordenadas Z en el G-" -#~ "code de salida. Se usa para compensar una mala posición del final de " -#~ "carrera Z: por ejemplo, si tu interruptor deja la boquilla a 0.3mm de la " -#~ "base de impresión, ajustalo a -0.3 (o arregla tu interruptor)." - -#~ msgid "Print speed" -#~ msgstr "Velocidad de impresión" - -#~ msgid "Select the printers this profile is compatible with." -#~ msgstr "Seleccione las impresoras con las que este perfil es compatible." - -#~ msgid "Select the print profiles this profile is compatible with." -#~ msgstr "" -#~ "Seleccione los perfiles de impresión con las que este perfil es " -#~ "compatible." - -#~ msgid "Dependencies" -#~ msgstr "Dependencias" - -#~ msgid "Profile dependencies" -#~ msgstr "Dependencias de perfil" - -#~ msgid "Detach from system preset" -#~ msgstr "Separar del ajuste del sistema" - -#~ msgid "This is a default preset." -#~ msgstr "Este es un ajuste por defecto." - -#~ msgid "This is a system preset." -#~ msgstr "Este es un ajuste del sistema." - -#~ msgid "Current preset is inherited from the default preset." -#~ msgstr "El ajuste fue heredado del ajuste predeterminado." - -#~ msgid "Current preset is inherited from" -#~ msgstr "El ajuste fue heredado de" - -#~ msgid "It can't be deleted or modified." -#~ msgstr "No puede ser borrado o modificado." - -#~ msgid "" -#~ "Any modifications should be saved as a new preset inherited from this one." -#~ msgstr "" -#~ "Cualquier modificación debe guardarse como un nuevo preset heredado de " -#~ "este." - -#~ msgid "To do that please specify a new name for the preset." -#~ msgstr "" -#~ "Para hacerlo por favor especifique un nuevo nombre para esos ajustes." - -#~ msgid "Additional information:" -#~ msgstr "Información adicional:" - -#~ msgid "vendor" -#~ msgstr "fabricante" - -#~ msgid "printer model" -#~ msgstr "modelo de impresora" - -#~ msgid "default print profile" -#~ msgstr "perfil de impresión por defecto" - -#~ msgid "default filament profile" -#~ msgstr "perfil de filamento por defecto" - -#~ msgid "default SLA material profile" -#~ msgstr "perfil de material de SLA por defecto" - -#~ msgid "default SLA print profile" -#~ msgstr "perfil de impresión de SLA por defecto" - -#~ msgid "full profile name" -#~ msgstr "nombre completo perfil" - -#~ msgid "symbolic profile name" -#~ msgstr "nombre perfil simbólico" - -#~ msgid "" -#~ "The following line %s contains reserved keywords.\n" -#~ "Please remove it, as it may cause problems in G-code visualization and " -#~ "printing time estimation." -#~ msgid_plural "" -#~ "The following lines %s contain reserved keywords.\n" -#~ "Please remove them, as they may cause problems in G-code visualization " -#~ "and printing time estimation." -#~ msgstr[0] "" -#~ "La siguiente línea %s contiene palabras clave reservadas.\n" -#~ "Por favor, elimínala, ya que puede causar problemas en la visualización " -#~ "del código G y\n" -#~ "la estimación del tiempo de impresión." -#~ msgstr[1] "" -#~ "Las siguientes líneas %s contienen palabras clave reservadas.\n" -#~ "Por favor, elimínelas, ya que puede causar problemas en la visualización " -#~ "del código G y\n" -#~ "la estimación del tiempo de impresión." - -#~ msgid "Found reserved keywords in" -#~ msgstr "Encontradas palabras clave reservadas en" - -#~ msgid "" -#~ "A copy of the current system preset will be created, which will be " -#~ "detached from the system preset." -#~ msgstr "" -#~ "Se creará una copia del preajuste del sistema actual, que se separará del " -#~ "preajuste del sistema." - -#~ msgid "" -#~ "The current custom preset will be detached from the parent system preset." -#~ msgstr "" -#~ "El ajuste personalizado actual se separará del ajuste del sistema " -#~ "principal." - -#~ msgid "Modifications to the current profile will be saved." -#~ msgstr "Se guardarán las modificaciones al perfil actual." - -#~ msgid "Detach preset" -#~ msgstr "Separar ajuste" - -#~ msgid "Number of extruders of the printer." -#~ msgstr "Número de extrusores de la impresora." - -#~ msgid "" -#~ "Single Extruder Multi Material is selected, \n" -#~ "and all extruders must have the same diameter.\n" -#~ "Do you want to change the diameter for all extruders to first extruder " -#~ "nozzle diameter value?" -#~ msgstr "" -#~ "Multi Material en extrusor único seleccionado,\n" -#~ "y todos los extrusores deben tener el mismo diámetro.\n" -#~ "¿Deseas cambiar el diámetro de todos los extrusores al valor del diámetro " -#~ "del nozzle del primer extrusor?" - -#~ msgid "Firmware" -#~ msgstr "Firmware" - -#~ msgid "Size and coordinates" -#~ msgstr "Tamaño y coordenadas" - -#~ msgid "Tilt" -#~ msgstr "Inclinación" - -#~ msgid "Tilt time" -#~ msgstr "Tiempo de inclinación" - -#~ msgid "Corrections" -#~ msgstr "Correcciones" - -#~ msgid "Exposure" -#~ msgstr "Exposición" - -#~ msgid "Values in this column are for Normal mode" -#~ msgstr "Los valores en esta columna son para el modo Normal" - -#~ msgid "Values in this column are for Stealth mode" -#~ msgstr "Los valores en esta columna son para el modo Silencioso" - -#~ msgid "Single extruder MM setup" -#~ msgstr "Ajuste para MM con un solo extrusor" - -#~ msgid "Single extruder multimaterial parameters" -#~ msgstr "Parámetros multimaterial para un sólo extrusor" - -#~ msgid "" -#~ "This is a single extruder multimaterial printer, diameters of all " -#~ "extruders will be set to the new value. Do you want to proceed?" -#~ msgstr "" -#~ "Esta es una impresora multimaterial de extrusor único, los diámetros de " -#~ "todas los extrusores se establecerán según el nuevo valor. ¿Quieres " -#~ "proceder?" - -#~ msgid "Position (for multi-extruder printers)" -#~ msgstr "Posición (para impresoras con múltiples extrusores )" - -#~ msgid "Reset to Filament Color" -#~ msgstr "Reiniciar Filament Color" - -#~ msgid "" -#~ "The physical printer below is based on the preset, you are going to " -#~ "delete." -#~ msgid_plural "" -#~ "The physical printers below are based on the preset, you are going to " -#~ "delete." -#~ msgstr[0] "" -#~ "Las impresoras físicas que se muestran a continuación se basan en el " -#~ "ajuste, que se va a eliminar." -#~ msgstr[1] "" -#~ "Las impresoras físicas que se muestran a continuación se basan en el " -#~ "ajuste, que se va a eliminar." - -#~ msgid "" -#~ "Note, that the selected preset will be deleted from this printer too." -#~ msgid_plural "" -#~ "Note, that the selected preset will be deleted from these printers too." -#~ msgstr[0] "" -#~ "Ten en cuenta que el ajuste seleccionado se eliminará también de esta " -#~ "impresora." -#~ msgstr[1] "" -#~ "Ten en cuenta que el ajuste seleccionado se eliminará también de estas " -#~ "impresoras." - -#~ msgid "" -#~ "The physical printer below is based only on the preset, you are going to " -#~ "delete." -#~ msgid_plural "" -#~ "The physical printers below are based only on the preset, you are going " -#~ "to delete." -#~ msgstr[0] "" -#~ "La impresora física que se muestran a continuación se basan únicamente en " -#~ "el ajuste, que se va a eliminar." -#~ msgstr[1] "" -#~ "Las impresoras físicas que se muestran a continuación se basan únicamente " -#~ "en el ajuste, que se va a eliminar." - -#~ msgid "" -#~ "Note, that this printer will be deleted after deleting the selected " -#~ "preset." -#~ msgid_plural "" -#~ "Note, that these printers will be deleted after deleting the selected " -#~ "preset." -#~ msgstr[0] "" -#~ "Ten en cuenta que esta impresora se borrará después de borrar el ajuste " -#~ "seleccionado." -#~ msgstr[1] "" -#~ "Ten en cuenta que estas impresoras se eliminarán después de borrar el " -#~ "ajuste seleccionado." - -#~ msgid "Are you sure you want to %1% the selected preset?" -#~ msgstr "¿Estás seguro de que deseas %1% el preset seleccionado?" - -#~ msgid "" -#~ "LOCKED LOCK icon indicates that the settings are the same as the system " -#~ "(or default) values for the current option group" -#~ msgstr "" -#~ "El icono de CANDADO BLOQUEADO indica que los ajustes son los mismos que " -#~ "los valores del sistema (por defecto) para el grupo de opciones actual" - -#~ msgid "" -#~ "UNLOCKED LOCK icon indicates that some settings were changed and are not " -#~ "equal to the system (or default) values for the current option group.\n" -#~ "Click to reset all settings for current option group to the system (or " -#~ "default) values." -#~ msgstr "" -#~ "El icono de CANDADO DESBLOQUEADO indica que se cambiaron algunas " -#~ "configuraciones y no son iguales a los valores del sistema (o " -#~ "predeterminados) para el grupo de opciones actual.\n" -#~ "Haz clic para restablecer todas las configuraciones para el grupo de " -#~ "opciones actual a los valores del sistema (o predeterminados)." - -#~ msgid "WHITE BULLET icon indicates a non system (or non default) preset." -#~ msgstr "" -#~ "El icono de VIÑETA BLANCA un ajuste no del sistema (o no por defecto)" - -#~ msgid "" -#~ "WHITE BULLET icon indicates that the settings are the same as in the last " -#~ "saved preset for the current option group." -#~ msgstr "" -#~ "El símbolo de VIÑETA BLANCA indica que los ajustes son los mismos que los " -#~ "de la última vez que salvaste los ajustes para el grupo de opciones " -#~ "actual." - -#~ 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" -#~ "Click to reset all settings for the current option group to the last " -#~ "saved preset." -#~ msgstr "" -#~ "El símbolo de FLECHA ATRÁS indica que los ajustes cambiaron y que no son " -#~ "iguales a los que se guardaron para el grupo de opciones actual.\n" -#~ "Haz clic para devolver esos valores a los últimos guardados." - -#~ msgid "" -#~ "LOCKED LOCK icon indicates that the value is the same as the system (or " -#~ "default) value." -#~ msgstr "" -#~ "El icono de CANDADO BLOQUEADO indica que el valor es el mismo que el del " -#~ "sistema (por defecto)" - -#~ msgid "" -#~ "UNLOCKED LOCK icon indicates that the value was changed and is not equal " -#~ "to the system (or default) value.\n" -#~ "Click to reset current value to the system (or default) value." -#~ msgstr "" -#~ "El icono de CANDADO DESBLOQUEADO indica que se cambiaron algunas " -#~ "configuraciones y no son iguales a los valores del sistema (o " -#~ "predeterminados).\n" -#~ "Haz clic para reiniciar el valor actual a los del sistema (o " -#~ "predeterminados)" - -#~ msgid "" -#~ "WHITE BULLET icon indicates that the value is the same as in the last " -#~ "saved preset." -#~ msgstr "" -#~ "El símbolo de VIÑETA BLANCA indica que los valores son los mismos que los " -#~ "de los ajustes guardados la última vez." - -#~ msgid "" -#~ "BACK ARROW icon indicates that the value was changed and is not equal to " -#~ "the last saved preset.\n" -#~ "Click to reset current value to the last saved preset." -#~ msgstr "" -#~ "La FLECHA ATRÁS indica que el valor ha cambiado y ya no es el mismo que " -#~ "el guardado la última vez.\n" -#~ "Haz clic para restaurar el valor al último ajuste guardado." - -#~ msgid "Material" -#~ msgstr "Material" - -#~ msgid "Material printing profile" -#~ msgstr "Perfil de impresión del material" - -#~ msgid "Layers and perimeters" -#~ msgstr "Capas y perímetros" - -#~ msgid "Supports" -#~ msgstr "Soportes" - -#~ msgid "Support head" -#~ msgstr "Cabeza del soporte" - -#~ msgid "Support pillar" -#~ msgstr "Pilares de soporte" - -#~ msgid "Connection of the support sticks and junctions" -#~ msgstr "Conexión de las varillas de soporte y uniones" - -#~ msgid "Automatic generation" -#~ msgstr "Generación automática" - -#~ msgid "Pad" -#~ msgstr "Pad" - -#~ msgid "Hollowing" -#~ msgstr "Vaciando el interior" - -#~ msgid "Output options" -#~ msgstr "Opciones de salida" - -#~ msgid "" -#~ "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" -#~ "To enable \"%1%\", please switch off \"%2%\"" -#~ msgstr "" -#~ "\"%1%\" está desactivado porque \"%2%\" está en la categoría \"%3%\".\n" -#~ "Para activar \"%1%\", por favor desactiva \"%2%\"" - -#~ msgid "Object elevation" -#~ msgstr "Elevación del objeto" - -#~ msgid "Pad around object" -#~ msgstr "Pad alrededor del objeto" - -#~ msgid "Print Settings" -#~ msgstr "Configuración de Impresión" - -#~ msgid "" -#~ "Preselects faces by overhang angle. It is possible to restrict paintable " -#~ "facets to only preselected faces when the option \"%1%\" is enabled." -#~ msgstr "" -#~ "Preselecciona las caras según el ángulo del voladizo. Es posible " -#~ "restringir las facetas pintables sólo a las caras preseleccionadas cuando " -#~ "la opción \"%1%\" está activada." - -#~ msgid "Highlight overhang by angle" -#~ msgstr "Resaltar el voladizo según el ángulo" - -#~ msgid "Enforce" -#~ msgstr "Imponer" - -#~ msgid "On overhangs only" -#~ msgstr "Sólo en los voladizos" - -#~ msgid "Paints facets according to the chosen painting brush." -#~ msgstr "Pinta las facetas según el pincel elegido." - -#~ msgid "" -#~ "Paints neighboring facets whose relative angle is less or equal to set " -#~ "angle." -#~ msgstr "" -#~ "Pinta las facetas vecinas cuyo ángulo relativo es menor o igual al ángulo " -#~ "establecido." - -#~ msgid "Allows painting only on facets selected by: \"%1%\"" -#~ msgstr "Permite pintar sólo en las facetas seleccionadas por: \"%1%\"" - -#~ msgid "Paints only one facet." -#~ msgstr "Pinta sólo una faceta." - -#~ msgid "Splits bigger facets into smaller ones while the object is painted." -#~ msgstr "" -#~ "Divide las facetas más grandes en otras más pequeñas mientras se pinta el " -#~ "objeto." - -#~ msgid "Select what kind of support do you need" -#~ msgstr "Selecciona qué clase de soporte necesitas" - -#~ msgid "Support on build plate only" -#~ msgstr "Soporte en la base solamente" - -#~ msgid "For support enforcers only" -#~ msgstr "Sólo para forzado de soportes" - -#~ msgid "Everywhere" -#~ msgstr "En todos los sitios" - -#~ msgid "" -#~ "This flag enables the brim that will be printed around each object on the " -#~ "first layer." -#~ msgstr "" -#~ "Esta opción activa la balsa que se imprimirá alrededor del objeto en la " -#~ "primera capa." - -#~ msgid "Select what kind of pad do you need" -#~ msgstr "Selecciona que tipo de pad necesitas" - -#~ msgid "Below object" -#~ msgstr "Por debajo del objeto" - -#~ msgid "Around object" -#~ msgstr "Alrededor de objeto" - -#~ msgid "" -#~ "The first layer will be shrunk in the XY plane by the configured value to " -#~ "compensate for the 1st layer squish aka an Elephant Foot effect." -#~ msgstr "" -#~ "La primera capa se contraerá en el plano XY por el valor configurado para " -#~ "compensar el aplatamiento de la 1ª capa, también conocido como efecto Pie " -#~ "de Elefante." - -#~ msgid "G-code thumbnails" -#~ msgstr "Miniaturas de código G" - -#~ msgid "" -#~ "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " -#~ "following format: \"XxY, XxY, ...\"" -#~ msgstr "" -#~ "Tamaños de imagen que se almacenarán en archivos .gcode y .sl1 / .sl1s, " -#~ "en el siguiente formato: \"XxY, XxY, ...\"" - -#~ msgid "" -#~ "This setting controls the height (and thus the total number) of the " -#~ "slices/layers. Thinner layers give better accuracy but take more time to " -#~ "print." -#~ msgstr "" -#~ "Esta configuración controla la altura (y, por tanto, el número total) de " -#~ "las láminas / capas. Las capas más delgadas brindan una mayor precisión " -#~ "pero requieren más tiempo para imprimir." - -#~ msgid "" -#~ "Set this to the maximum height that can be reached by your extruder while " -#~ "printing." -#~ msgstr "" -#~ "Ajusta este valor a la altura máxima que puede alcanzar el extrusor " -#~ "mientras imprime." - -#~ msgid "" -#~ "Optimize travel moves in order to minimize the crossing of perimeters. " -#~ "This is mostly useful with Bowden extruders which suffer from oozing. " -#~ "This feature slows down both the print and the G-code generation." -#~ msgstr "" -#~ "Optimiza los movimientos de desplazamiento para minimizar el cruce de " -#~ "perímetros. Esto es principalmente útil con extrusores Bowden que sufren " -#~ "goteo. Esta característica ralentiza tanto la impresión como la " -#~ "generación de código G." - -#~ msgid "" -#~ "The maximum detour length for avoid crossing perimeters. If the detour is " -#~ "longer than this value, avoid crossing perimeters is not applied for this " -#~ "travel path. Detour length could be specified either as an absolute value " -#~ "or as percentage (for example 50%) of a direct travel path." -#~ msgstr "" -#~ "La longitud máxima del desvío para evitar cruzar perímetros. Si el desvío " -#~ "es más largo que este valor, el evitar cruzar perímetros no se aplica " -#~ "para esta ruta de viaje. La longitud del desvío se puede especificar como " -#~ "valor absoluto o como porcentaje (por ejemplo, 50%) de un desplazamiento " -#~ "directo." - -#~ msgid "" -#~ "Bed temperature for layers after the first one. Set this to zero to " -#~ "disable bed temperature control commands in the output." -#~ msgstr "" -#~ "Temperatura de la base calefactable para las capas después de la primera. " -#~ "Ajusta esto a cero para deshabilitar los comandos de control de " -#~ "temperatura de la base calefactable en la salida." - -#~ msgid "" -#~ "This custom code is inserted at every layer change, right before the Z " -#~ "move. Note that you can use placeholder variables for all Slic3r settings " -#~ "as well as [layer_num] and [layer_z]." -#~ msgstr "" -#~ "Este código personalizado se inserta en cada cambio de capa, justo antes " -#~ "del movimiento Z. Tenga en cuenta que puede usar variables de marcador de " -#~ "posición para todos los ajustes de Slic3r, así como [layer_num] y " -#~ "[layer_z]." - -#~ msgid "Number of solid layers to generate on bottom surfaces." -#~ msgstr "Número de capas sólidas para generar en las superficies inferiores." - -#~ msgid "Bottom solid layers" -#~ msgstr "Capas sólidas inferiores" - -#~ msgid "Minimum bottom shell thickness" -#~ msgstr "Espesor mínimo de la tapa inferior" - -#~ msgid "This fan speed is enforced during all bridges and overhangs." -#~ msgstr "" -#~ "La velocidad de este ventilador se aplica durante todos los puentes y " -#~ "voladizos." - -#~ msgid "" -#~ "This factor affects the amount of plastic for bridging. You can decrease " -#~ "it slightly to pull the extrudates and prevent sagging, although default " -#~ "settings are usually good and you should experiment with cooling (use a " -#~ "fan) before tweaking this." -#~ msgstr "" -#~ "Este factor afecta la cantidad de plástico para formar puentes. Puede " -#~ "disminuirlo ligeramente para extraer los extruidos y evitar el combado, " -#~ "aunque la configuración predeterminada suele ser buena y debe " -#~ "experimentar con la refrigeración (usar un ventilador) antes de ajustar " -#~ "esto." - -#~ msgid "Speed for printing bridges." -#~ msgstr "Velocidad para imprimir puentes." - -#~ msgid "Skirt and brim" -#~ msgstr "Falda y balsa" - -#~ msgid "" -#~ "The horizontal width of the brim that will be printed around each object " -#~ "on the first layer. When raft is used, no brim is generated (use " -#~ "raft_first_layer_expansion)." -#~ msgstr "" -#~ "La anchura horizontal del borde que se imprimirá alrededor de cada objeto " -#~ "en la primera capa. Cuando se utiliza la balsa, no se genera ningún borde " -#~ "(utiliza raft_first_layer_expansion)." - -#~ msgid "" -#~ "The places where the brim will be printed around each object on the first " -#~ "layer." -#~ msgstr "" -#~ "Los lugares donde se imprimirá el borde alrededor de cada objeto en la " -#~ "primera capa." - -#~ msgid "" -#~ "Offset of brim from the printed object. The offset is applied after the " -#~ "elephant foot compensation." -#~ msgstr "" -#~ "Desplazamiento del borde respecto al objeto impreso. El desplazamiento se " -#~ "aplica después de la compensación de la pie de elefante." - -#~ msgid "" -#~ "This flag enables the automatic cooling logic that adjusts print speed " -#~ "and fan speed according to layer printing time." -#~ msgstr "" -#~ "Este indicador habilita la lógica de enfriamiento automático que ajusta " -#~ "la velocidad de impresión y la velocidad del ventilador según el tiempo " -#~ "de impresión de la capa." - -#~ msgid "" -#~ "This is the acceleration your printer will be reset to after the role-" -#~ "specific acceleration values are used (perimeter/infill). Set zero to " -#~ "prevent resetting acceleration at all." -#~ msgstr "" -#~ "Esta es la aceleración después de que se usen los valores de aceleración " -#~ "específicos de cada función (perímetro / relleno). Establezca cero para " -#~ "evitar restablecer la aceleración." - -#~ msgid "" -#~ "Default filament profile associated with the current printer profile. On " -#~ "selection of the current printer profile, this filament profile will be " -#~ "activated." -#~ msgstr "" -#~ "Perfil de filamento por defecto asociado con el perfil de impresora " -#~ "actual. Al seleccionar el perfil de impresora actual se activará este " -#~ "perfil de filamento." - -#~ msgid "Default print profile" -#~ msgstr "Perfil de impresión por defecto" - -#~ msgid "" -#~ "Default print profile associated with the current printer profile. On " -#~ "selection of the current printer profile, this print profile will be " -#~ "activated." -#~ msgstr "" -#~ "Perfil de impresión por defecto asociado con el perfil de impresora " -#~ "actual. Al seleccionar el perfil de impresora actual se activará este " -#~ "perfil de impresión." - -#~ msgid "" -#~ "You can set this to a positive value to disable fan at all during the " -#~ "first layers, so that it does not make adhesion worse." -#~ msgstr "" -#~ "Puedes configurarlo como un valor positivo para desactivar el ventilador " -#~ "durante todas las capas iniciales, de manera que no empeora la adhesión." - -#~ msgid "" -#~ "Experimental option for preventing support material from being generated " -#~ "under bridged areas." -#~ msgstr "" -#~ "Opción experimental para evitar que se genere material de soporte debajo " -#~ "de las áreas con puente." - -#~ msgid "Distance between copies" -#~ msgstr "Distancia entre copias" - -#~ msgid "Distance used for the auto-arrange feature of the plater." -#~ msgstr "" -#~ "Distancia utilizada para la función de organización automática de la base." - -#~ msgid "" -#~ "Fill pattern for top infill. This only affects the top visible layer, and " -#~ "not its adjacent solid shells." -#~ msgstr "" -#~ "Patrón de relleno para el relleno superior. Esto solo afecta a la capa " -#~ "superior visible, y no a sus capas sólidas adyacentes." - -#~ msgid "" -#~ "Fill pattern for bottom infill. This only affects the bottom external " -#~ "visible layer, and not its adjacent solid shells." -#~ msgstr "" -#~ "Patrón de relleno para la tapa inferior. Esto sólo afecta a la capa " -#~ "inferior externa visible, y no a las paredes adyacentes." - -#~ msgid "" -#~ "When printing with very low layer heights, you might still want to print " -#~ "a thicker bottom layer to improve adhesion and tolerance for non perfect " -#~ "build plates." -#~ msgstr "" -#~ "Cuando se imprime con alturas de capa muy bajas, es posible que se quiera " -#~ "imprimir una capa inferior más gruesa para mejorar la adherencia y la " -#~ "tolerancia de las bases de impresión no perfectas." - -#~ msgid "" -#~ "If expressed as absolute value in mm/s, this speed will be applied to all " -#~ "the print moves of the first layer, regardless of their type. If " -#~ "expressed as a percentage (for example: 40%) it will scale the default " -#~ "speeds." -#~ msgstr "" -#~ "Si se expresa como valor absoluto en mm / s, esta velocidad se aplicará a " -#~ "todos los movimientos de impresión de la primera capa, independientemente " -#~ "de su tipo. Si se expresa como un porcentaje (por ejemplo: 40%), escalará " -#~ "las velocidades predeterminadas." - -#~ msgid "First layer nozzle temperature" -#~ msgstr "Temperatura de la boquilla para la primera capa" - -#~ msgid "" -#~ "Nozzle temperature for the first layer. If you want to control " -#~ "temperature manually during print, set this to zero to disable " -#~ "temperature control commands in the output G-code." -#~ msgstr "" -#~ "Temperatura de la boquilla para la primera capa. Si deseas controlar la " -#~ "temperatura manualmente durante la impresión, configúralo a cero para " -#~ "deshabilitar las órdenes de control de temperatura en el código G de " -#~ "salida." - -#~ msgid "" -#~ "This option sets the number of perimeters to generate for each layer. " -#~ "Note that Slic3r may increase this number automatically when it detects " -#~ "sloping surfaces which benefit from a higher number of perimeters if the " -#~ "Extra Perimeters option is enabled." -#~ msgstr "" -#~ "Esta opción establece la cantidad de perímetros que se generarán para " -#~ "cada capa. Tenga en cuenta que Slic3r puede aumentar este número " -#~ "automáticamente cuando detecta superficies inclinadas que se benefician " -#~ "de un mayor número de perímetros si la opción Perímetros adicionales está " -#~ "habilitada." - -#~ msgid "(minimum)" -#~ msgstr "(mínimo)" - -#~ msgid "Position of perimeters starting points." -#~ msgstr "Posición de los puntos de inicio del perímetro." - -#~ msgid "Display width" -#~ msgstr "Anchura de la pantalla" - -#~ msgid "Width of the display" -#~ msgstr "Ancho de la pantalla" - -#~ msgid "Display height" -#~ msgstr "Altura de la pantalla" - -#~ msgid "Height of the display" -#~ msgstr "Altura de la pantalla" - -#~ msgid "Number of pixels in" -#~ msgstr "Número de píxeles en" - -#~ msgid "Number of pixels in X" -#~ msgstr "Número de píxeles en X" - -#~ msgid "Number of pixels in Y" -#~ msgstr "Número de píxeles en Y" - -#~ msgid "Display horizontal mirroring" -#~ msgstr "Espejo horizontal de la pantalla" - -#~ msgid "Mirror horizontally" -#~ msgstr "Reflejar horizontalmente" - -#~ msgid "Enable horizontal mirroring of output images" -#~ msgstr "Activar espejo horizontal de salida de imágenes" - -#~ msgid "Display vertical mirroring" -#~ msgstr "Espejo vertical de la pantalla" - -#~ msgid "Mirror vertically" -#~ msgstr "Reflejar verticalmente" - -#~ msgid "Enable vertical mirroring of output images" -#~ msgstr "Activar espejo vertical de salida de imágenes" - -#~ msgid "Display orientation" -#~ msgstr "Orientación de la pantalla" - -#~ msgid "" -#~ "Set the actual LCD display orientation inside the SLA printer. Portrait " -#~ "mode will flip the meaning of display width and height parameters and the " -#~ "output images will be rotated by 90 degrees." -#~ msgstr "" -#~ "Establece la orientación real de la pantalla LCD dentro de la impresora " -#~ "SLA. El modo retrato cambiará el significado de los parámetros de ancho y " -#~ "alto de la pantalla y las imágenes de salida girarán 90 grados." - -#~ msgid "Landscape" -#~ msgstr "Paisaje" - -#~ msgid "Portrait" -#~ msgstr "Retrato" - -#~ msgid "Fast" -#~ msgstr "Rápida" - -#~ msgid "Fast tilt" -#~ msgstr "Inclinación rápida" - -#~ msgid "Time of the fast tilt" -#~ msgstr "Tiempo de la inclinación rápida" - -#~ msgid "Slow" -#~ msgstr "Lenta" - -#~ msgid "Slow tilt" -#~ msgstr "Inclinación lenta" - -#~ msgid "Time of the slow tilt" -#~ msgstr "Tiempo de la inclinación lenta" - -#~ msgid "Area fill" -#~ msgstr "Área de relleno" - -#~ msgid "" -#~ "The percentage of the bed area. \n" -#~ "If the print area exceeds the specified value, \n" -#~ "then a slow tilt will be used, otherwise - a fast tilt" -#~ msgstr "" -#~ "El porcentaje del área de la cama. \n" -#~ "Si el área de impresión excede el valor especificado, \n" -#~ "entonces se utilizará una inclinación lenta, de lo contrario - una " -#~ "inclinación rápida" - -#~ msgid "Printer scaling correction" -#~ msgstr "Corrección de escala de la impresora" - -#~ msgid "Printer scaling correction in X axis" -#~ msgstr "Corrección del escalado de la impresora en el eje X" - -#~ msgid "Printer scaling X axis correction" -#~ msgstr "Corrección del escalado de la impresora en el eje X" - -#~ msgid "Printer scaling correction in Y axis" -#~ msgstr "Corrección del escalado de la impresora en el eje Y" - -#~ msgid "Printer scaling Y axis correction" -#~ msgstr "Corrección del escalado de la impresora en el eje Y" - -#~ msgid "Printer scaling correction in Z axis" -#~ msgstr "Corrección del escalado de la impresora en el eje Z" - -#~ msgid "Printer scaling Z axis correction" -#~ msgstr "Corrección del escalado de la impresora en el eje Z" - -#~ msgid "Printer absolute correction" -#~ msgstr "Corrección absoluta de la impresora" - -#~ msgid "" -#~ "Will inflate or deflate the sliced 2D polygons according to the sign of " -#~ "the correction." -#~ msgstr "" -#~ "Aumentará o reducirá los polígonos 2D laminados de acuerdo con el signo " -#~ "de la corrección." - -#~ msgid "Elephant foot minimum width" -#~ msgstr "Ancho mínimo del pie de elefante" - -#~ msgid "" -#~ "Minimum width of features to maintain when doing elephant foot " -#~ "compensation." -#~ msgstr "" -#~ "Ancho mínimo característico para mantener al realizar la compensación de " -#~ "pie de elefante." - -#~ msgid "Printer gamma correction" -#~ msgstr "Corrección gamma de la impresora" - -#~ msgid "" -#~ "This will apply a gamma correction to the rasterized 2D polygons. A gamma " -#~ "value of zero means thresholding with the threshold in the middle. This " -#~ "behaviour eliminates antialiasing without losing holes in polygons." -#~ msgstr "" -#~ "Esto aplicará una corrección gamma a los polígonos 2D rasterizados. Un " -#~ "valor gamma de cero significa que el umbral se encuentra en el medio. " -#~ "Este comportamiento elimina el antialiasing sin perder agujeros en los " -#~ "polígonos." - -#~ msgid "SLA material type" -#~ msgstr "Tipo Material SLA" - -#~ msgid "Bottle volume" -#~ msgstr "Volumen de la botella" - -#~ msgid "ml" -#~ msgstr "ml" - -#~ msgid "Bottle weight" -#~ msgstr "Peso botella" - -#~ msgid "kg" -#~ msgstr "kg" - -#~ msgid "g/ml" -#~ msgstr "g/ml" - -#~ msgid "money/bottle" -#~ msgstr "dinero/botella" - -#~ msgid "Faded layers" -#~ msgstr "Capas descoloridas" - -#~ msgid "" -#~ "Number of the layers needed for the exposure time fade from initial " -#~ "exposure time to the exposure time" -#~ msgstr "" -#~ "El número de capas necesarias para el tiempo de exposición cambie desde " -#~ "el tiempo de exposición inicial hasta el tiempo de exposición" - -#~ msgid "Minimum exposure time" -#~ msgstr "Tiempo de exposición mínimo" - -#~ msgid "Maximum exposure time" -#~ msgstr "Tiempo de exposición máximo" - -#~ msgid "Exposure time" -#~ msgstr "Tiempo de exposición" - -#~ msgid "Minimum initial exposure time" -#~ msgstr "Tiempo de exposición inicial mínimo" - -#~ msgid "Maximum initial exposure time" -#~ msgstr "Tiempo de exposición inicial máximo" - -#~ msgid "Initial exposure time" -#~ msgstr "Tiempo de exposición inicial" - -#~ msgid "Correction for expansion" -#~ msgstr "Corrección para la expansión" - -#~ msgid "Correction for expansion in X axis" -#~ msgstr "Corrección de la expansión en el eje X" - -#~ msgid "Correction for expansion in Y axis" -#~ msgstr "Corrección de la expansión en el eje Y" - -#~ msgid "Correction for expansion in Z axis" -#~ msgstr "Corrección de la expansión en el eje Z" - -#~ msgid "Default SLA material profile" -#~ msgstr "Perfil de material de SLA predeterminado" - -#~ msgid "Generate supports" -#~ msgstr "Generar soportes" - -#~ msgid "Generate supports for the models" -#~ msgstr "Generar soportes para los modelos" - -#~ msgid "Pinhead front diameter" -#~ msgstr "Diámetro frontal de la cabeza" - -#~ msgid "Diameter of the pointing side of the head" -#~ msgstr "Diámetro de la parte en punta de la cabeza" - -#~ msgid "Head penetration" -#~ msgstr "Penetración de la cabeza" - -#~ msgid "How much the pinhead has to penetrate the model surface" -#~ msgstr "" -#~ "Cuánto tiene que penetrar la cabeza del pin en la superficie del modelo" - -#~ msgid "Pinhead width" -#~ msgstr "Ancho de la cabeza" - -#~ msgid "Width from the back sphere center to the front sphere center" -#~ msgstr "" -#~ "Ancho desde el centro de la esfera trasera al centro de la esfera " -#~ "delantera" - -#~ msgid "Pillar diameter" -#~ msgstr "Diámetro del pilar" - -#~ msgid "Diameter in mm of the support pillars" -#~ msgstr "Diámetro en mm de los pilares de soporte" - -#~ msgid "Small pillar diameter percent" -#~ msgstr "Porcentaje de diámetro de pilar pequeño" - -#~ msgid "" -#~ "The percentage of smaller pillars compared to the normal pillar diameter " -#~ "which are used in problematic areas where a normal pilla cannot fit." -#~ msgstr "" -#~ "El porcentaje de pilares más pequeños en comparación con el diámetro de " -#~ "pilar normal que se utilizan en áreas problemáticas donde no cabe un " -#~ "pilar normal." - -#~ msgid "Max bridges on a pillar" -#~ msgstr "Puentes maximos en un pilar" - -#~ msgid "" -#~ "Maximum number of bridges that can be placed on a pillar. Bridges hold " -#~ "support point pinheads and connect to pillars as small branches." -#~ msgstr "" -#~ "Número máximo de puentes que se pueden colocar en un pilar. Los puentes " -#~ "sostienen cabezas de alfiler de puntos de apoyo y se conectan a los " -#~ "pilares como pequeñas ramas." - -#~ msgid "Pillar connection mode" -#~ msgstr "Modo de conexión del pilar" - -#~ msgid "" -#~ "Controls the bridge type between two neighboring pillars. Can be zig-zag, " -#~ "cross (double zig-zag) or dynamic which will automatically switch between " -#~ "the first two depending on the distance of the two pillars." -#~ msgstr "" -#~ "Controla el tipo de puente entre dos pilares adyacentes. Puede ser zig-" -#~ "zag, cruzado (doble zig-zag) o dinámico que cambiará automáticamente " -#~ "entre los dos primeros dependiendo de la distancia de los dos pilares." - -#~ msgid "Zig-Zag" -#~ msgstr "Zig-Zag" - -#~ msgid "Cross" -#~ msgstr "Cruzado" - -#~ msgid "Dynamic" -#~ msgstr "Dinámico" - -#~ msgid "Pillar widening factor" -#~ msgstr "Factor de ensanchamiento del pilar" - -#~ msgid "" -#~ "Merging bridges or pillars into another pillars can increase the radius. " -#~ "Zero means no increase, one means full increase." -#~ msgstr "" -#~ "La fusión de puentes o pilares en otros pilares puede aumentar el radio. " -#~ "Cero significa que no hay aumento, uno significa aumento total." - -#~ msgid "Support base diameter" -#~ msgstr "Diámetro de la base del soporte" - -#~ msgid "Diameter in mm of the pillar base" -#~ msgstr "Diámetro en mm del pilar de la base" - -#~ msgid "Support base height" -#~ msgstr "Altura de la base del soporte" - -#~ msgid "The height of the pillar base cone" -#~ msgstr "La altura del cono de la base de un pilar" - -#~ msgid "Support base safety distance" -#~ msgstr "Distancia de seguridad de la base de soportes" - -#~ msgid "" -#~ "The minimum distance of the pillar base from the model in mm. Makes sense " -#~ "in zero elevation mode where a gap according to this parameter is " -#~ "inserted between the model and the pad." -#~ msgstr "" -#~ "La distancia mínima del modelo a la base de pilares en mm. Tiene sentido " -#~ "en el modo de cero elevación donde hay un hueco de acuerdo a cuando este " -#~ "parámetro se introduce entre el modelo y el pad." - -#~ msgid "Critical angle" -#~ msgstr "Ángulo crítico" - -#~ msgid "The default angle for connecting support sticks and junctions." -#~ msgstr "" -#~ "El ángulo por defecto para la conexión de sticks y uniones de soporte." - -#~ msgid "The max length of a bridge" -#~ msgstr "La longitud máxima de un puente" - -#~ msgid "Max pillar linking distance" -#~ msgstr "Distancia máxima de enlace del pilar" - -#~ msgid "" -#~ "The max distance of two pillars to get linked with each other. A zero " -#~ "value will prohibit pillar cascading." -#~ msgstr "" -#~ "La distancia máxima entre dos pilares par que se unan entre si. Un valor " -#~ "cero prohibirá el encadenamiento de pilares." - -#~ msgid "" -#~ "How much the supports should lift up the supported object. If \"Pad " -#~ "around object\" is enabled, this value is ignored." -#~ msgstr "" -#~ "Cuanto deberían los soportes deberían levantar el objeto soportado. Si " -#~ "\"Pad alrededor del objeto\" está activado, este valor será ignorado." - -#~ msgid "Support points density" -#~ msgstr "Densidad de los puntos de soporte" - -#~ msgid "This is a relative measure of support points density." -#~ msgstr "" -#~ "Esta es una medida relativa de la densidad de los puntos de soporte." - -#~ msgid "Minimal distance of the support points" -#~ msgstr "Distancia mínima de los puntos de apoyo" - -#~ msgid "No support points will be placed closer than this threshold." -#~ msgstr "Ningún punto de soporte se colocará más cerca de este umbral." - -#~ msgid "Use pad" -#~ msgstr "Usar pad" - -#~ msgid "Add a pad underneath the supported model" -#~ msgstr "Añade un pad debajo del modelo compatible" - -#~ msgid "Pad wall thickness" -#~ msgstr "Espesor de la pared del pad" - -#~ msgid "The thickness of the pad and its optional cavity walls." -#~ msgstr "El grosor de las pads y sus paredes de cavidad opcionales." - -#~ msgid "Pad wall height" -#~ msgstr "Altura de la pared del pad" - -#~ msgid "" -#~ "Defines the pad cavity depth. Set to zero to disable the cavity. Be " -#~ "careful when enabling this feature, as some resins may produce an extreme " -#~ "suction effect inside the cavity, which makes peeling the print off the " -#~ "vat foil difficult." -#~ msgstr "" -#~ "Define la profundidad de la cavidad del pad. Establecer a cero para " -#~ "deshabilitar la cavidad. Ten cuidado al habilitar esta función, ya que " -#~ "algunas resinas pueden producir un efecto de succión extremo dentro de la " -#~ "cavidad, lo que dificulta el despegado de la impresión de la lámina de la " -#~ "cuba." - -#~ msgid "Pad brim size" -#~ msgstr "Tamaño del borde del pad" - -#~ msgid "How far should the pad extend around the contained geometry" -#~ msgstr "" -#~ "¿Hasta dónde debe extenderse el pad alrededor de la geometría contenida" - -#~ msgid "Max merge distance" -#~ msgstr "Distancia máxima de combinación" - -#~ msgid "" -#~ "Some objects can get along with a few smaller pads instead of a single " -#~ "big one. This parameter defines how far the center of two smaller pads " -#~ "should be. If theyare closer, they will get merged into one pad." -#~ msgstr "" -#~ "Algunos objetos pueden llevarse bien con unas pocas pads más pequeñas en " -#~ "lugar de una sola grande. Este parámetro define a qué distancia debe " -#~ "estar el centro de dos pads más pequeñas. Si están más cerca, se " -#~ "fusionarán en una sola pad." - -#~ msgid "Pad wall slope" -#~ msgstr "Pendiente de la pared del pad" - -#~ msgid "" -#~ "The slope of the pad wall relative to the bed plane. 90 degrees means " -#~ "straight walls." -#~ msgstr "" -#~ "La pendiente de la pared del pad en relación con el plano de la cama. 90 " -#~ "grados significa paredes rectas." - -#~ msgid "Create pad around object and ignore the support elevation" -#~ msgstr "Crear pad alrededor del objeto e ignorar la elevación del soporte" - -#~ msgid "Pad around object everywhere" -#~ msgstr "Pad alrededor del objeto en todos lados" - -#~ msgid "Force pad around object everywhere" -#~ msgstr "Forzar el pad alrededor del objeto en todas partes" - -#~ msgid "Pad object gap" -#~ msgstr "Espacio del pad con el objeto" - -#~ msgid "" -#~ "The gap between the object bottom and the generated pad in zero elevation " -#~ "mode." -#~ msgstr "" -#~ "El espacio entre la parte de debajo del objeto y el pad generado en el " -#~ "modo de cero elevación." - -#~ msgid "Pad object connector stride" -#~ msgstr "Paso del conector del objeto al Pad" - -#~ msgid "" -#~ "Distance between two connector sticks which connect the object and the " -#~ "generated pad." -#~ msgstr "" -#~ "Distancia entre dos palitos de apoyo entre la pieza y la base generada." - -#~ msgid "Pad object connector width" -#~ msgstr "Anchura del conector del pad al objeto" - -#~ msgid "" -#~ "Width of the connector sticks which connect the object and the generated " -#~ "pad." -#~ msgstr "" -#~ "Ancho de los palitos de apoyo que conectan la pieza y la base generada." - -#~ msgid "Pad object connector penetration" -#~ msgstr "Penetración del conector del objeto al Pad" - -#~ msgid "How much should the tiny connectors penetrate into the model body." -#~ msgstr "" -#~ "Cuanto deberían penetrar los conectores pequeños en el modelo del cuerpo." - -#~ msgid "Enable hollowing" -#~ msgstr "Habilitar vaciado" - -#~ msgid "Hollow out a model to have an empty interior" -#~ msgstr "Vaciado de un modelo para tener un interior vacío" - -#~ msgid "Wall thickness" -#~ msgstr "Espesor de pared" - -#~ msgid "Minimum wall thickness of a hollowed model." -#~ msgstr "Mínimo de espesor de la pared de un modelo vaciado." - -#~ msgid "Accuracy" -#~ msgstr "Precisión" - -#~ msgid "" -#~ "Performance vs accuracy of calculation. Lower values may produce unwanted " -#~ "artifacts." -#~ msgstr "" -#~ "Rendimiento vs precisión de cálculo. Los valores más bajos pueden " -#~ "producir artefactos no deseados." - -#~ msgid "Closing distance" -#~ msgstr "Distancia de cierre" - -#~ msgid "" -#~ "Hollowing is done in two steps: first, an imaginary interior is " -#~ "calculated deeper (offset plus the closing distance) in the object and " -#~ "then it's inflated back to the specified offset. A greater closing " -#~ "distance makes the interior more rounded. At zero, the interior will " -#~ "resemble the exterior the most." -#~ msgstr "" -#~ "El vaciado del interior se hace en dos pasos: primero, se calcula un " -#~ "interior imaginario (un desplazamiento más la distancia de cierre) en la " -#~ "pieza y luego, se hincha hasta alcanzar el desplazamiento especificado. " -#~ "Una distancia de cierre mayor hace que interior sea más redondeado. Si es " -#~ "cero, el interior se parecerá mucho al exterior." - -#~ msgid "" -#~ "A slower printing profile might be necessary when using materials with " -#~ "higher viscosity or with some hollowed parts. It slows down the tilt " -#~ "movement and adds a delay before exposure." -#~ msgstr "" -#~ "Un perfil de impresión más lento puede ser necesario cuando se utilizan " -#~ "materiales con mayor viscosidad o con algunas piezas huecas. Ralentiza el " -#~ "movimiento de inclinación y añade un retraso antes de la exposición." - -#~ msgid "Copying of the temporary G-code to the output G-code failed" -#~ msgstr "Error al copiar el código G temporal al código G de salida" - -#~ msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" -#~ msgstr "" -#~ "Subida planificada a `%1%`. Mira Ventana -> Sube a la cola del gestor de " -#~ "impresión" - -#~ msgid "Simple mode" -#~ msgstr "Modo Simple" - -#~ msgid "Advanced mode" -#~ msgstr "Modo avanzado" - -#~ msgid "The size of the object can be specified in inches" -#~ msgstr "El tamaño del objeto puede ser especificado en pulgadas" - -#~ msgid "Use inches" -#~ msgstr "Usar pulgadas" - -#~ msgid "Pick another vendor supported by %s" -#~ msgstr "Elije otro proveedor compatible con% s" - -#~ msgid "Firmware Type" -#~ msgstr "Tipo de Firmware" - -#~ msgid "Choose the type of firmware used by your printer." -#~ msgstr "Selecciona el tipo de firmware que usa tu impresora." - -#~ msgid "Set extruder sequence for the entire print" -#~ msgstr "Fija la secuencia del extrusor para toda la impresión" - -#~ msgid "Set extruder sequence" -#~ msgstr "Establecer secuencia extrusor" - -#~ msgid "Set extruder change for every" -#~ msgstr "Establecer cambio de extrusor para cada" - -#~ msgid "Random sequence" -#~ msgstr "Secuencia aleatoria" - -#~ msgid "If enabled, random sequence of the selected extruders will be used." -#~ msgstr "" -#~ "Si se activa, se utilizará una secuencia aleatoria de los extrusores " -#~ "seleccionados." - -#~ msgid "Allow next color repetition" -#~ msgstr "Permitir la siguiente repetición del color" - -#~ msgid "If enabled, a repetition of the next random color will be allowed." -#~ msgstr "" -#~ "Si se activa, se permitirá la repetición del siguiente color aleatorio." - -#~ msgid "Set extruder(tool) sequence" -#~ msgstr "Establecer secuencia extrusor(herramienta)" - -#~ msgid "Remove extruder from sequence" -#~ msgstr "Retirar extrusor de la secuencia" - -#~ msgid "Add extruder to sequence" -#~ msgstr "Añadir extrusor a la secuencia" - -#~ msgid "Select by rectangle" -#~ msgstr "Seleccionar mediante rectángulo" - -#~ msgid "Reset selection" -#~ msgstr "Reiniciar selección" - -#~ msgid "Simplify %1%" -#~ msgstr "Simplificar %1%" - -#~ msgid "Rename Object" -#~ msgstr "Renombrar Objeto" - -#~ msgid "Load Part" -#~ msgstr "Cargar pieza" - -#~ msgid "Load Modifier" -#~ msgstr "Cargar Modificador" - -#~ msgid "Delete Settings" -#~ msgstr "Eliminar Ajustes" - -#~ msgid "Instances to Separated Objects" -#~ msgstr "Instancias para Separar Objetos" - -#~ msgid "Additional Settings" -#~ msgstr "Ajustes adicionales" - -#~ msgid "Delete Option %s" -#~ msgstr "Eliminar Opción %s" - -#~ msgid "Change Option %s" -#~ msgstr "Cambiar opción %s" - -#~ msgid "NOTE:" -#~ msgstr "NOTA:" - -#~ msgid "Sliced object \"%1%\" looks like a logo or a sign" -#~ msgstr "El objeto laminado \"%1%\" parece un logotipo o un cartel" - -#~ msgid "Apply color change automatically" -#~ msgstr "Aplicar el cambio de color automáticamente" - -#~ msgid "Retractions" -#~ msgstr "Retracciones" - -#~ msgid "Deretractions" -#~ msgstr "Deretracciones" - -#~ msgid "Tool changes" -#~ msgstr "Cambios de herramienta" - -#~ msgid "Color changes" -#~ msgstr "Cambios de color" - -#~ msgid "Print pauses" -#~ msgstr "Pausas de impresión" - -#~ msgid "Custom G-codes" -#~ msgstr "Códigos G personalizados" - -#~ msgid "Shells" -#~ msgstr "Carcasas" - -#~ msgid "Tool marker" -#~ msgstr "Marcador de herramienta" - -#~ msgid "Legend/Estimated printing time" -#~ msgstr "Leyenda/Tiempo de impresión estimado" - -#~ msgid "ERROR: not enough resources to execute a new job." -#~ msgstr "ERROR: no hay suficientes recursos para ejecutar el trabajo." - -#~ msgid "An unexpected error occured" -#~ msgstr "Se ha producido un error inesperado" - -#~ msgid "G-code preview" -#~ msgstr "Previsualización código G" - -#~ msgid "Open G-code viewer" -#~ msgstr "Abrir visor código G" - -#~ msgid "Open new G-code viewer" -#~ msgstr "Abrir visor código G nuevo" - -#~ msgid "Printer Settings" -#~ msgstr "Configuración de la Impresora" - -#~ msgid "based on Slic3r" -#~ msgstr "basado en Slic3r" - -#~ msgid "Show user configuration folder (datadir)" -#~ msgstr "Mostrar carpeta de configuración de usuario (datadir)" - -#~ msgid "Show system information" -#~ msgstr "Mostrar la información del sistema" - -#~ msgid "Show about dialog" -#~ msgstr "Mostrar Acerca de" - -#~ msgid "Iso View" -#~ msgstr "Vista Iso" - -#~ msgid "" -#~ "The selected project is no longer available.\n" -#~ "Do you want to remove it from the recent projects list?" -#~ msgstr "" -#~ "El proyecto seleccionado no está disponible.\n" -#~ "¿Desea eliminarlo de la lista de proyectos recientes?" - -#~ msgid "Save current project file" -#~ msgstr "Guardar el proyecto actual como" - -#~ msgid "Save current project file as" -#~ msgstr "Guardar archivo de proyecto actual como" - -#~ msgid "Export plate as &STL" -#~ msgstr "Exportar plataforma como &STL" - -#~ msgid "Export current plate as STL" -#~ msgstr "Exportar plataforma actual como STL" - -#~ msgid "Quick Slice" -#~ msgstr "Laminado rápido" - -#~ msgid "Slice a file into a G-code" -#~ msgstr "Laminar un archivo en un código G" - -#~ msgid "Quick Slice and Save As" -#~ msgstr "Laminado rápido y Guardar como" - -#~ msgid "Slice a file into a G-code, save as" -#~ msgstr "Laminar un archivo en un código G, guárdar como" - -#~ msgid "Repeat Last Quick Slice" -#~ msgstr "Repetir el último laminado rápido" - -#~ msgid "Repeat last quick slice" -#~ msgstr "Repetir el último laminado rápido" - -#~ msgid "Searc&h" -#~ msgstr "Busca&r" - -#~ msgid "Search in settings" -#~ msgstr "Buscar en los ajustes" - -#~ msgid "" -#~ "Switching the language will trigger application restart.\n" -#~ "You will lose content of the plater." -#~ msgstr "" -#~ "Cambiar el idioma necesita reiniciar la aplicación.\n" -#~ "Perderás todo el contenido situado en la base." - -#~ msgid "Do you want to proceed?" -#~ msgstr "¿Deseas continuar?" - -#~ msgid "&Window" -#~ msgstr "&Ventana" - -#~ msgid "No previously sliced file." -#~ msgstr "Ningún archivo previamente laminado." - -#~ msgid "Previously sliced file (" -#~ msgstr "Archivo anterior laminado (" - -#~ msgid ") not found." -#~ msgstr ") no encontrado." - -#~ msgid "File Not Found" -#~ msgstr "Archivo no encontrado" - -#~ msgid "Save %s file as:" -#~ msgstr "Guardar archivo %s como:" - -#~ msgid "SVG" -#~ msgstr "SVG" - -#~ msgid "G-code" -#~ msgstr "Código G" - -#~ msgid "Save zip file as:" -#~ msgstr "Guardar archivo zip como:" - -#~ msgid "Processing %s" -#~ msgstr "Procesando %s" - -#~ msgid "%1% was successfully sliced." -#~ msgstr "%1% fue laminado con éxito." - -#~ msgid "Slicing Done!" -#~ msgstr "¡Laminado realizado!" - -#~ msgid "Select the STL file to repair:" -#~ msgstr "Seleccione el archivo STL para reparar:" - -#~ msgid "Save OBJ file (less prone to coordinate errors than STL) as:" -#~ msgstr "" -#~ "Guardar archivo OBJ (menos propenso a errores de coordinación que STL) " -#~ "como:" - -#~ msgid "Your file was repaired." -#~ msgstr "Tu fichero fue reparado." - -#~ msgid "Loading of a configuration file" -#~ msgstr "Cargando un archivo de configuración" - -#~ msgid "Select configuration to load:" -#~ msgstr "Seleccione la configuración para cargar:" - -#~ msgid "" -#~ "Some presets are modified and the unsaved changes will not be exported " -#~ "into configuration bundle." -#~ msgstr "" -#~ "Algunos ajustes están modificados y los cambios no guardados no se " -#~ "exportarán al paquete de configuración." - -#~ msgid "Exporting configuration bundle" -#~ msgstr "Exportando el paquete de configuración" - -#~ msgid "Save presets bundle as:" -#~ msgstr "Guarde el conjunto de ajustes iniciales como:" - -#~ msgid "Loading of a configuration bundle" -#~ msgstr "Cargando un paquete de configuración" - -#~ msgid "%d presets successfully imported." -#~ msgstr "%d ajustes iniciales importados con éxito." - -#~ msgid "ERROR" -#~ msgstr "ERROR" - -#~ msgid "CANCELED" -#~ msgstr "CANCELADO" - -#~ msgid "COMPLETED" -#~ msgstr "COMPLETADO" - -#~ msgid "Cancel upload" -#~ msgstr "Cancelar subida" - -#~ msgid "You may need to update your graphics card driver." -#~ msgstr "Puede que necesites actualizar tu tarjeta de gráficos." - -#~ msgid "" -#~ "Unable to load the following shaders:\n" -#~ "%s" -#~ msgstr "" -#~ "No se pueden cargar las siguientes sombras:\n" -#~ "%s" - -#~ msgid "Delete this preset from this printer device" -#~ msgstr "" -#~ "Eliminar este ajuste preestablecido para este dispositivo de impresión" - -#~ msgid "This printer will be shown in the presets list as" -#~ msgstr "" -#~ "Esta impresora se mostrará en la lista de ajustes preestablecidos como" - -#~ msgid "Physical Printer" -#~ msgstr "Impresora Física" - -#~ msgid "Type here the name of your printer device" -#~ msgstr "Escribe aquí el nombre de tu dispositivo de impresión" - -#~ msgid "Descriptive name for the printer" -#~ msgstr "Un nombre descriptivo para la impresora" - -#~ msgid "Add preset for this printer device" -#~ msgstr "Añadir ajuste preestablecido para este dispositivo de impresión" - -#~ msgid "Connection to printers connected via the print host failed." -#~ msgstr "" -#~ "Falló la conexión a las impresoras conectadas a través del host de " -#~ "impresión." - -#~ msgid "Browse" -#~ msgstr "Buscar" - -#~ msgid "Test" -#~ msgstr "Test" - -#~ msgid "Could not get a valid Printer Host reference" -#~ msgstr "No pude conseguir una referencia válida de gestor de impresora" - -#~ msgid "Success!" -#~ msgstr "¡Éxito!" - -#~ msgid "Refresh Printers" -#~ msgstr "Actualizar lista de impresoras" - -#~ msgid "" -#~ "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -#~ "signed certificate." -#~ msgstr "" -#~ "El archivo HTTPS CA es opcional. Sólo se necesita si vas a usar HTTPS con " -#~ "un certificado auto-firmado." - -#~ msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -#~ msgstr "Archivos de certificados (*.crt, *.pem)|*.crt;*.pem|Todos|*.*" - -#~ msgid "Open CA certificate file" -#~ msgstr "Abrir archivo de certificado CA" - -#~ msgid "HTTPS CA File" -#~ msgstr "Archivo HTTPS CA" - -#~ msgid "" -#~ "On this system, %s uses HTTPS certificates from the system Certificate " -#~ "Store or Keychain." -#~ msgstr "" -#~ "En este sistema,%s usa certificados HTTPS del almacén de certificados o " -#~ "llavero." - -#~ msgid "" -#~ "To use a custom CA file, please import your CA file into Certificate " -#~ "Store / Keychain." -#~ msgstr "" -#~ "Para usar un archivo CA personalizado, importa tu archivo CA al Almacén " -#~ "de Certificados/Llavero." - -#~ msgid "The supplied name is empty. It can't be saved." -#~ msgstr "El nombre proporcionado está vacío. No se puede guardar." - -#~ msgid "You should change the name of your printer device." -#~ msgstr "Deberías cambiar el nombre de tu dispositivo de impresión." - -#~ msgid "Printer with name \"%1%\" already exists." -#~ msgstr "La impresora con nombre \"%1%\" ya existe." - -#~ msgid "Replace?" -#~ msgstr "¿Reemplazar?" - -#~ msgid "" -#~ "Following printer preset is duplicated:%1%The above preset for printer " -#~ "\"%2%\" will be used just once." -#~ msgid_plural "" -#~ "Following printer presets are duplicated:%1%The above presets for printer " -#~ "\"%2%\" will be used just once." -#~ msgstr[0] "" -#~ "Los siguientes ajustes de la impresora están duplicados:%1%El ajuste " -#~ "anterior para la impresora \"%2%\" se utilizará sólo una vez." -#~ msgstr[1] "" -#~ "Los siguientes ajustes de la impresora están duplicados:%1%Los ajustes " -#~ "anteriores para la impresora \"%2%\" se utilizarán sólo una vez." - -#~ msgid "It's not possible to delete the last related preset for the printer." -#~ msgstr "" -#~ "No es posible borrar el último ajuste preestablecido relacionado con la " -#~ "impresora." - -#~ msgid "Information" -#~ msgstr "Información" - -#~ msgid "The provided name is not valid;" -#~ msgstr "El nombre proporcionado no es válido;" - -#~ msgid "the following characters are not allowed:" -#~ msgstr "los siguientes caracteres no están permitidos:" - -#~ msgid "" -#~ "For a multipart object, this value isn't accurate.\n" -#~ "It doesn't take account of intersections and negative volumes." -#~ msgstr "" -#~ "Para un objeto de varias partes, este valor no es preciso.\n" -#~ "No tiene en cuenta las intersecciones y los volúmenes negativos." - -#~ msgid "Volume" -#~ msgstr "Volumen" - -#~ msgid "Facets" -#~ msgstr "Facetas" - -#~ msgid "Used Material (unit)" -#~ msgstr "Material usado (unidades)" - -#~ msgid "Cost (money)" -#~ msgstr "Coste (dinero)" - -#~ msgid "Estimated printing time" -#~ msgstr "Tiempo estimado de impresión" - -#~ msgid "Number of tool changes" -#~ msgstr "Número de cambios de herramienta" - -#~ msgid "Hold Shift to Slice & Export G-code" -#~ msgstr "" -#~ "Mantén presionada la tecla Shift para laminar y exportar el código G" - -#~ msgid "Fill bed" -#~ msgstr "Rellenar la base" - -#~ msgid "Optimize Rotation" -#~ msgstr "Optimizar Rotación" - -#~ msgid "Import SLA archive" -#~ msgstr "Importar archivo SLA" - -#~ msgid "Do you want to save the changes to \"%1%\"?" -#~ msgstr "¿Quieres guardar los cambios en \"%1%\"?" - -#~ msgid "" -#~ "Successfully unmounted. The device %s(%s) can now be safely removed from " -#~ "the computer." -#~ msgstr "" -#~ "Desmontado con éxito. El dispositivo %s (%s) ahora se puede retirar de " -#~ "forma segura del ordenador." - -#~ msgid "Ejecting of device %s(%s) has failed." -#~ msgstr "La expulsión del dispositivo %s(%s) ha fallado." - -#~ msgid "Expand sidebar" -#~ msgstr "Expandir barra lateral" - -#~ msgid "Collapse sidebar" -#~ msgstr "Ocultar barra lateral" - -#~ msgid "You cannot load SLA project with a multi-part object on the bed" -#~ msgstr "No puedes cargar un proyecto SLA con varias piezas en la base" - -#~ msgid "Please check your object list before preset changing." -#~ msgstr "" -#~ "Por favor comprueba tu lista de objetos antes de cambiar los ajustes " -#~ "iniciales." - -#~ msgid "Failed loading file \"%1%\" due to an invalid configuration." -#~ msgstr "" -#~ "Error al cargar el archivo \"%1%\" debido a una configuración no válida." - -#~ msgid "" -#~ "Object size from file %s appears to be zero.\n" -#~ "This object has been removed from the model" -#~ msgid_plural "" -#~ "Objects size from file %s appears to be zero.\n" -#~ "These objects have been removed from the model" -#~ msgstr[0] "" -#~ "El tamaño del objeto del archivo %s parece ser cero.\n" -#~ "Este objeto ha sido eliminado del modelo" -#~ msgstr[1] "" -#~ "El tamaño de los objetos del archivo %s parece ser cero.\n" -#~ "Estos objetos han sido eliminados del modelo" - -#~ msgid "The size of the object is zero" -#~ msgstr "El tamaño del objeto es cero" - -#~ msgid "The object is too small" -#~ msgstr "El objeto es demasiado pequeño" - -#~ msgid "Apply to all the remaining small objects being loaded." -#~ msgstr "Aplicar a todos los objetos pequeños restantes que se cargan." - -#~ msgid "" -#~ "This file contains several objects positioned at multiple heights.\n" -#~ "Instead of considering them as multiple objects, should \n" -#~ "the file be loaded as a single object having multiple parts?" -#~ msgstr "" -#~ "Este archivo contiene varios objetos colocados a varias alturas.\n" -#~ "En lugar de considerarlos como objetos múltiples, ¿debería cargarse\n" -#~ "el archivo como un solo objeto con múltiples partes?" - -#~ msgid "Multi-part object detected" -#~ msgstr "Objeto de piezas múltiples detectado" - -#~ msgid "" -#~ "This file cannot be loaded in a simple mode. Do you want to switch to an " -#~ "advanced mode?" -#~ msgstr "" -#~ "Este archivo no puede ser cargado en un modo sencillo. ¿Quieres cambiar " -#~ "al modo experto?" - -#~ msgid "Detected advanced data" -#~ msgstr "Datos avanzados detectados" - -#~ msgid "" -#~ "You can't to add the object(s) from %s because of one or some of them " -#~ "is(are) multi-part" -#~ msgstr "" -#~ "No puede agregar el(los) objeto(s) desde % s porque uno o algunos de " -#~ "ellos son de varias piezas" - -#~ msgid "Delete Object" -#~ msgstr "Eliminar Objeto" - -#~ msgid "Delete All Objects" -#~ msgstr "Borrar Todos Los Objetos" - -#~ msgid "Reset Project" -#~ msgstr "Reiniciar Proyecto" - -#~ msgid "" -#~ "The selected object couldn't be split because it contains only one solid " -#~ "part." -#~ msgstr "" -#~ "El objeto seleccionado no ha podido ser dividido porque sólo contiene una " -#~ "parte sólida." - -#~ msgid "All non-solid parts (modifiers) were deleted" -#~ msgstr "Se han eliminado todas las partes no sólidas (modificadores)" - -#~ msgid "Split to Objects" -#~ msgstr "Partir en Varias Piezas" - -#~ msgid "" -#~ "An object has custom support enforcers which will not be used because " -#~ "supports are disabled." -#~ msgstr "" -#~ "Un objeto tiene reforzadores de soporte personalizados que no se " -#~ "utilizarán porque los soportes están desactivados." - -#~ msgid "Enable supports for enforcers only" -#~ msgstr "Habilitar soportes sólo para los forzadores" - -#~ msgid "Slice now" -#~ msgstr "Laminar ahora" - -#~ msgid "Another export job is currently running." -#~ msgstr "Otro trabajo de exportación está aún en marcha." - -#~ msgid "Select the new file" -#~ msgstr "Selecciona el archivo nuevo" - -#~ msgid "File for the replace wasn't selected" -#~ msgstr "El archivo para el reemplazo no fue seleccionado" - -#~ msgid "Replace with STL" -#~ msgstr "Sustituir con STL" - -#~ msgid "Reload from disk" -#~ msgstr "Recargar desde el disco" - -#~ msgid "Please select the file to reload" -#~ msgstr "Por favor selecciona el archivo a volver a cargar" - -#~ msgid "differs from the original file" -#~ msgstr "difiere del archivo original" - -#~ msgid "Reload all from disk" -#~ msgstr "Recargar todo desde el disco" - -#~ msgid "There are active warnings concerning sliced models:" -#~ msgstr "Hay avisos activos respecto a los modelos laminados:" - -#~ msgid "generated warnings" -#~ msgstr "avisos generados" - -#~ msgid "Undo / Redo is processing" -#~ msgstr "Deshacer / Rehacer se está procesando" - -#~ msgid "" -#~ "Switching the printer technology from %1% to %2%.\n" -#~ "Some %1% presets were modified, which will be lost after switching the " -#~ "printer technology." -#~ msgstr "" -#~ "Cambiando la tecnología de la impresora de %1% a %2%.\n" -#~ "Se han modificado algunos ajustes de %1%, que se perderán después de " -#~ "cambiar la tecnología de la impresora." - -#~ msgid "Creating a new project while the current project is modified." -#~ msgstr "Creando un nuevo proyecto mientras se modifica el proyecto actual." - -#~ msgid "Creating a new project while some presets are modified." -#~ msgstr "Creando un nuevo proyecto mientras se modifican algunos ajustes." - -#~ msgid "" -#~ "You can keep presets modifications to the new project or discard them" -#~ msgstr "" -#~ "Puedes mantener las modificaciones de los preajustes en el nuevo proyecto " -#~ "o descartarlas" - -#~ msgid "" -#~ "You can keep presets modifications to the new project, discard them or " -#~ "save changes as new presets.\n" -#~ "Note, if changes will be saved then new project wouldn't keep them" -#~ msgstr "" -#~ "Puedes mantener las modificaciones de los ajustes en el nuevo proyecto, " -#~ "descartarlas o guardar los cambios como nuevos ajustes.\n" -#~ "Ten en cuenta que si se guardan los cambios, el nuevo proyecto no los " -#~ "conservará." - -#~ msgid "Load Project" -#~ msgstr "Cargar Proyecto" - -#~ msgid "Import Object" -#~ msgstr "Importar Objeto" - -#~ msgid "Import Objects" -#~ msgstr "Importar Objetos" - -#~ msgid "Error while loading .gcode file" -#~ msgstr "Error al cargar el archivo .gcode" - -#~ msgid "%s - Drop project file" -#~ msgstr "%s - Soltar archivo de proyecto" - -#~ msgid "Select an action to apply to the file" -#~ msgstr "Selecciona una acción para aplicar al archivo" - -#~ msgid "Import config only" -#~ msgstr "Importar configuración solo" - -#~ msgid "You can open only one .gcode file at a time." -#~ msgstr "Solo puedes abrir un archivo .gcode a la vez." - -#~ msgid "Load File" -#~ msgstr "Cargar Archivo" - -#~ msgid "Load Files" -#~ msgstr "Cargar Archivos" - -#~ msgid "Delete Selected Objects" -#~ msgstr "Eliminar Objetos Seleccionados" - -#~ msgid "Increase Instances" -#~ msgstr "Aumentar Instancias" - -#~ msgid "Decrease Instances" -#~ msgstr "Reducir Instancias" - -#~ msgid "Enter the number of copies:" -#~ msgstr "Introduce el número de copias:" - -#~ msgid "Set numbers of copies to %d" -#~ msgstr "Establecer el número de copias a %d" - -#~ msgid "Convert from imperial units" -#~ msgstr "Convertir de unidades imperiales" - -#~ msgid "Revert conversion from imperial units" -#~ msgstr "Revertir la conversión de unidades imperiales" - -#~ msgid "Convert from meters" -#~ msgstr "Convertir de metros" - -#~ msgid "Revert conversion from meters" -#~ msgstr "Revertir la conversión a metros" - -#~ msgid "Cut by Plane" -#~ msgstr "Cortar por el Plano" - -#~ msgid "Save SL1 / SL1S file as:" -#~ msgstr "Guardar archivo SL1 / SL1S como:" - -#~ msgid "" -#~ "The plater is empty.\n" -#~ "Do you want to save the project?" -#~ msgstr "" -#~ "La plataforma está vacía.\n" -#~ "¿Quieres guardar el proyecto?" - -#~ msgid "" -#~ "Custom supports, seams and multimaterial painting were removed after " -#~ "repairing the mesh." -#~ msgstr "" -#~ "Se eliminaron los soportes, las costuras y el pintado multimaterial tras " -#~ "la reparación de la malla." - -#~ msgid "Paste From Clipboard" -#~ msgstr "Pegar Desde Portapapeles" - -#~ msgid "Delete Physical Printer" -#~ msgstr "Eliminar Impresora Física" - -#~ msgid "Add physical printer" -#~ msgstr "Añadir impresora física" - -#~ msgid "Edit physical printer" -#~ msgstr "Editar impresora física" - -#~ msgid "Delete physical printer" -#~ msgstr "Eliminar impresora física" - -#~ msgid "Send G-Code to printer host" -#~ msgstr "Enviar el código G al host de impresión" - -#~ msgid "Upload to Printer Host with the following filename:" -#~ msgstr "Cargar el host de impresión con el siguiente nombre de archivo:" - -#~ msgid "Use forward slashes ( / ) as a directory separator if needed." -#~ msgstr "" -#~ "Use barras diagonales ( / ) como separadores de directorios si fuese " -#~ "necesario." - -#~ msgid "Group" -#~ msgstr "Agrupar" - -#~ msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" -#~ msgstr "" -#~ "El nombre del archivo enviado no termina con \"%s\". ¿Desea continuar?" - -#~ msgid "Upload and Print" -#~ msgstr "Enviar e imprimir" - -#~ msgid "Upload and Simulate" -#~ msgstr "Enviar y simular" - -#~ msgid "Upload" -#~ msgstr "Enviar" - -#~ msgid "ID" -#~ msgstr "ID" - -#~ msgid "Progress" -#~ msgstr "Progreso" - -#~ msgid "Host" -#~ msgstr "Equipo" - -#~ msgctxt "OfFile" -#~ msgid "Size" -#~ msgstr "OfFile||Tamaño" - -#~ msgid "Filename" -#~ msgstr "Nombre de archivo" - -#~ msgid "Error Message" -#~ msgstr "Mensaje de Error" - -#~ msgid "Cancel selected" -#~ msgstr "Cancelar selección" - -#~ msgid "Show error message" -#~ msgstr "Muestra mensaje de error" - -#~ msgid "Enqueued" -#~ msgstr "En cola" - -#~ msgid "Cancelling" -#~ msgstr "Cancelando" - -#~ msgid "Cancelled" -#~ msgstr "Cancelado" - -#~ msgid "Completed" -#~ msgstr "Completado" - -#~ msgid "Error uploading to print host:" -#~ msgstr "Error al cargar a la impresora:" - -#~ msgid "Selection-Add Object" -#~ msgstr "Selección-Añadir Objeto" - -#~ msgid "Selection-Remove Object" -#~ msgstr "Selección-Retirar Objeto" - -#~ msgid "Selection-Add Instance" -#~ msgstr "Selección-Añadir Instancia" - -#~ msgid "Selection-Remove Instance" -#~ msgstr "Selección-Retirar Instancia" - -#~ msgid "Scale To Fit" -#~ msgstr "Escalar para Adaptarse" - -#~ msgid "It's a last preset for this physical printer." -#~ msgstr "Es un último valor predeterminado para esta impresora." - -#~ msgid "" -#~ "Are you sure you want to delete \"%1%\" preset from the physical printer " -#~ "\"%2%\"?" -#~ msgstr "" -#~ "¿Está seguro de que desea eliminar el ajuste preestablecido \"%1%\" de la " -#~ "impresora física \"%2%\"?" - -#~ msgid "Update available" -#~ msgstr "Actualización disponible" - -#~ msgid "New version of %s is available" -#~ msgstr "Nueva versión de %s disponible" - -#~ msgid "Current version:" -#~ msgstr "Versión actual:" - -#~ msgid "New version:" -#~ msgstr "Nueva versión:" - -#~ msgid "Open changelog page" -#~ msgstr "Abrir la página del registro de cambios" - -#~ msgid "Open download page" -#~ msgstr "Abrir página de descarga" - -#~ msgid "Don't notify about new releases any more" -#~ msgstr "No quiero recibir avisos de nuevas versiones" - -#~ msgid "Opening Configuration Wizard" -#~ msgstr "Abriendo Asistente de Configuración" - -#~ msgid "Configuration update is available" -#~ msgstr "Hay disponible una actualización de la Configuración" - -#~ msgid "" -#~ "Would you like to install it?\n" -#~ "\n" -#~ "Note that a full configuration snapshot will be created first. It can " -#~ "then be restored at any time should there be a problem with the new " -#~ "version.\n" -#~ "\n" -#~ "Updated configuration bundles:" -#~ msgstr "" -#~ "¿Te gustaría instalarlo?\n" -#~ "\n" -#~ "Ten en cuenta que primero se creará una instantánea de la configuración. " -#~ "Así que se puede recuperar en cualquier momento en caso de que hubiera " -#~ "algún problema con la nueva versión.\n" -#~ "Updated configuration bundles:" - -#~ msgid "Install" -#~ msgstr "Instalar" - -#~ msgid "Don't install" -#~ msgstr "No instalar" - -#~ msgid "%s incompatibility" -#~ msgstr "%s incompatibilidad" - -#~ msgid "You must install a configuration update." -#~ msgstr "Es necesario instalar una actualización de la configuración." - -#~ msgid "" -#~ "%s will now start updates. Otherwise it won't be able to start.\n" -#~ "\n" -#~ "Note that a full configuration snapshot will be created first. It can " -#~ "then be restored at any time should there be a problem with the new " -#~ "version.\n" -#~ "\n" -#~ "Updated configuration bundles:" -#~ msgstr "" -#~ "%s comenzará las actualizaciones. De otro modo no podrá comenzar.\n" -#~ "\n" -#~ "Ten en cuenta que primero se creará una copia de seguridad. Puedes volver " -#~ "a ella si en algún momento hay problemas con la nueva versión.\n" -#~ "\n" -#~ "Configuraciones actualizadas:" - -#~ msgid "%s configuration is incompatible" -#~ msgstr "%s la configuración es incompatible" - -#~ msgid "" -#~ "This version of %s is not compatible with currently installed " -#~ "configuration bundles.\n" -#~ "This probably happened as a result of running an older %s after using a " -#~ "newer one.\n" -#~ "\n" -#~ "You may either exit %s and try again with a newer version, or you may re-" -#~ "run the initial configuration. Doing so will create a backup snapshot of " -#~ "the existing configuration before installing files compatible with this " -#~ "%s." -#~ msgstr "" -#~ "Esta versión de %s no es compatible con los grupos de configuraciones " -#~ "instaladas. Esto sucede probablemente por ejecutar una versión de %s " -#~ "después de haber usado una más reciente.\n" -#~ "\n" -#~ "Puedes salir de %s e intentarlo de nuevo con una versión más reciente, o " -#~ "puedes volver a ejecutar la configuración inicial. Al hacerlo se creará " -#~ "una copia de respaldo de la configuración existente antes de instalar la " -#~ "nueva compatible con esta versión de %s." - -#~ msgid "This %s version: %s" -#~ msgstr "Esta %s versión: %s" - -#~ msgid "Incompatible bundles:" -#~ msgstr "Grupos incompatibles:" - -#~ msgid "Re-configure" -#~ msgstr "Reconfigurar" - -#~ msgid "" -#~ "%s now uses an updated configuration structure.\n" -#~ "\n" -#~ "So called 'System presets' have been introduced, which hold the built-in " -#~ "default settings for various printers. These System presets cannot be " -#~ "modified, instead, users now may create their own presets inheriting " -#~ "settings from one of the System presets.\n" -#~ "An inheriting preset may either inherit a particular value from its " -#~ "parent or override it with a customized value.\n" -#~ "\n" -#~ "Please proceed with the %s that follows to set up the new presets and to " -#~ "choose whether to enable automatic preset updates." -#~ msgstr "" -#~ "Ahora %s usa una estructura actualizada para la configuración. \n" -#~ "\n" -#~ "Se han introducido los llamados 'Ajustes del sistema', que tienen valores " -#~ "por defecto para varias impresoras. Estos ajustes del sistema no pueden " -#~ "modificarse, por el contrario, los usuarios pueden crear nuevos ajustes " -#~ "que se basan en alguno de ellos.\n" -#~ "Un ajuste nuevo puede heredar un valor de un ajuste existente o bien " -#~ "tener un nuevo valor personalizado.\n" -#~ "\n" -#~ "Por favof, continúa con el %s que sigue para establecer los nuevos " -#~ "ajustes y seleccionar si quieres que estos se actualicen automáticamente." - -#~ msgid "For more information please visit our wiki page:" -#~ msgstr "Para más información visite por favor la página de nuestra wiki:" - -#~ msgid "No updates available" -#~ msgstr "No hay actualizaciones disponibles" - -#~ msgid "%s has no configuration updates available." -#~ msgstr "%s no tiene actualizaciones de configuración disponibles." - -#~ msgid "Exporting source model" -#~ msgstr "Exportando el modelo original" - -#~ msgid "Failed loading the input model." -#~ msgstr "No se pudo cargar el modelo de entrada." - -#~ msgid "Repairing model by the Netfabb service" -#~ msgstr "Reparar el modelo mediante el servicio de Netfabb" - -#~ msgid "Mesh repair failed." -#~ msgstr "Reparación de la malla fallida." - -#~ msgid "Loading repaired model" -#~ msgstr "Cargando modelo reparado" - -#~ msgid "Saving mesh into the 3MF container failed." -#~ msgstr "Error al guardar la malla en el contenedor 3MF." - -#~ msgid "Export of a temporary 3mf file failed" -#~ msgstr "La exportación de un archivo temporal de 3mf falló" - -#~ msgid "Import of the repaired 3mf file failed" -#~ msgstr "La importación del archivo 3mf reparado ha fallado" - -#~ msgid "Repaired 3MF file does not contain any object" -#~ msgstr "El archivo 3MF reparado no contiene ningún objeto" - -#~ msgid "Repaired 3MF file contains more than one object" -#~ msgstr "El archivo 3MF reparado contiene más de un objeto" - -#~ msgid "Repaired 3MF file does not contain any volume" -#~ msgstr "El archivo 3MF reparado no contiene ningún volumen" - -#~ msgid "Repaired 3MF file contains more than one volume" -#~ msgstr "El archivo 3MF reparado contiene más de un volumen" - -#~ msgid "Model repair finished" -#~ msgstr "Reparación del modelo terminada" - -#~ msgid "Model repair canceled" -#~ msgstr "Reparación del modelo cancelada" - -#~ msgid "" -#~ "Configuration Updates causes a lost of preset modification.\n" -#~ "So, check unsaved changes and save them if necessary." -#~ msgstr "" -#~ "La actualización de la configuración hace que se pierda la modificación " -#~ "de los ajustes.\n" -#~ "Por lo tanto, comprueba los cambios no guardados y guárdalos si es " -#~ "necesario." - -#~ msgid "Updating" -#~ msgstr "Actualizando" - -#~ msgid "requires min. %s and max. %s" -#~ msgstr "requiere un min. %s y un max. %s" - -#~ msgid "requires min. %s" -#~ msgstr "requiere min. %s" - -#~ msgid "requires max. %s" -#~ msgstr "requiere max. %s" - -#~ msgid "" -#~ "To specify the system certificate store manually, please set the %1% " -#~ "environment variable to the correct CA bundle and restart the application." -#~ msgstr "" -#~ "Para especificar el almacén de certificados del sistema manualmente, " -#~ "configure la variable de entorno %1% en el paquete CA correcto y reinicia " -#~ "la aplicación." - -#~ msgid "" -#~ "The selected amf file has been saved with a newer version of %1% and is " -#~ "not compatible." -#~ msgstr "" -#~ "El archivo amf seleccionado se ha guardado con una versión más reciente " -#~ "de %1% y no es compatible." - -#~ msgid "invalid header or archive is corrupted" -#~ msgstr "encabezado inválido o archivo está dañado" - -#~ msgid "unsupported multidisk archive" -#~ msgstr "archivo multidisk no compatible" - -#~ msgid "decompression failed or archive is corrupted" -#~ msgstr "descompresión fallida o archivo está dañado" - -#~ msgid "CRC-32 check failed" -#~ msgstr "Comprobación con CRC-32 fallida" - -#~ msgid "archive is too large" -#~ msgstr "el archivo es demasiado grande" - -#~ msgid "write calledback failed" -#~ msgstr "fallo write calledback" - -#~ msgid "SLA print" -#~ msgstr "Impresión SLA" - -#~ msgid "Hostname, IP or URL" -#~ msgstr "Nombre de equipo, IP o URL" - -#~ msgid "" -#~ "Slic3r can upload G-code files to a printer host. This field should " -#~ "contain the hostname, IP address or URL of the printer host instance. " -#~ "Print host behind HAProxy with basic auth enabled can be accessed by " -#~ "putting the user name and password into the URL in the following format: " -#~ "https://username:password@your-octopi-address/" -#~ msgstr "" -#~ "Slic3r puede cargar archivos de código G a un host de impresión. Este " -#~ "campo debe contener el nombre de host, la dirección IP o la URL de la " -#~ "instancia de host de la impresora. Se puede acceder al host de impresión " -#~ "mediante un HAProxy con la autenticación básica habilitada ingresando el " -#~ "nombre de usuario y la contraseña en la URL en el siguiente formato: " -#~ "https://nombredeusuario:contraseña@su-dirección-de-octopi /" - -#~ msgid "API Key / Password" -#~ msgstr "Clave API / Contraseña" - -#~ msgid "" -#~ "Slic3r can upload G-code files to a printer host. This field should " -#~ "contain the API Key or the password required for authentication." -#~ msgstr "" -#~ "Slic3r puede subir archivos de código G a un host de impresión. Este " -#~ "campo debe contener la clave API o la contraseña requerida para la " -#~ "autenticación." - -#~ msgid "Name of the printer" -#~ msgstr "Nombre de la impresora" - -#~ msgid "" -#~ "Custom CA certificate file can be specified for HTTPS OctoPrint " -#~ "connections, in crt/pem format. If left blank, the default OS CA " -#~ "certificate repository is used." -#~ msgstr "" -#~ "Un archivo de certificado CA personalizado puede ser especificado para " -#~ "conexiones HTTPS OctoPrint, en formato crt/pem. Si se deja en blanco, el " -#~ "repositorio de certificados OS CA será usado." - -#~ msgid "User" -#~ msgstr "Usuario" - -#~ msgid "Password" -#~ msgstr "Contraseña" - -#~ msgid "Ignore HTTPS certificate revocation checks" -#~ msgstr "Ignorar las comprobaciones de revocación de certificados HTTPS" - -#~ msgid "" -#~ "Ignore HTTPS certificate revocation checks in case of missing or offline " -#~ "distribution points. One may want to enable this option for self signed " -#~ "certificates if connection fails." -#~ msgstr "" -#~ "Ignorar las comprobaciones de revocación de certificados HTTPS en caso de " -#~ "que falten puntos de distribución o estén desconectados. Uno puede querer " -#~ "habilitar esta opción para los certificados autofirmados si la conexión " -#~ "falla." - -#~ msgid "Authorization Type" -#~ msgstr "Tipo de Autorización" - -#~ msgid "API key" -#~ msgstr "Clave API" - -#~ msgid "HTTP digest" -#~ msgstr "HTTP digest" - -#~ msgid "Error with zip archive" -#~ msgstr "Error con el archivo ZIP" - -#~ msgid "Volume to purge (mm³) when the filament is being" -#~ msgstr "Volumen a purgar (mm³) cuando el filamento está siendo" - -#~ msgid "" -#~ "Switching to simple settings will discard changes done in the advanced " -#~ "mode!\n" -#~ "\n" -#~ "Do you want to proceed?" -#~ msgstr "" -#~ "¡Cambiar a los ajustes sencillos descartará los cambios realizados en el " -#~ "modo avanzado!\n" -#~ "\n" -#~ "¿Quiere continuar?" - -#~ msgid "The supplied name is not valid;" -#~ msgstr "El nombre proporcionado no es válido;" - -#~ msgid "the following suffix is not allowed:" -#~ msgstr "el siguiente sufijo no está permitido:" - -#~ msgid "The supplied name is not available." -#~ msgstr "El nombre proporcionado no está disponible." - -#~ msgid "Cannot overwrite a system profile." -#~ msgstr "No se puede sobre-escribir un perfil del sistema." - -#~ msgid "Preset with name \"%1%\" already exists." -#~ msgstr "Ya existe un preset con el nombre \"%1%\"." - -#~ msgid "" -#~ "Preset with name \"%1%\" already exists and is incompatible with selected " -#~ "printer." -#~ msgstr "" -#~ "El ajuste predeterminado con el nombre \"%1%\" ya existe y es " -#~ "incompatible con la impresora seleccionada." - -#~ msgid "Note: This preset will be replaced after saving" -#~ msgstr "Nota: Este ajuste se reemplazará tras guardar" - -#~ msgid "The name cannot be empty." -#~ msgstr "El nombre no puede estar vacío." - -#~ msgid "The name cannot start with space character." -#~ msgstr "El nombre no puede empezar con un carácter de espacio." - -#~ msgid "The name cannot end with space character." -#~ msgstr "El nombre no puede terminar con un carácter de espacio." - -#~ msgid "" -#~ "You have selected physical printer \"%1%\" \n" -#~ "with related printer preset \"%2%\"" -#~ msgstr "" -#~ "Ha seleccionado una impresora física \"%1%\" \n" -#~ "con ajuste de impresora relacionado \"%2%\"" - -#~ msgid "What would you like to do with \"%1%\" preset after saving?" -#~ msgstr "" -#~ "¿Qué te gustaría hacer con el ajuste preestablecido \"%1%\" después de " -#~ "guardar?" - -#~ msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" -#~ msgstr "Cambia \"%1%\" a \"%2%\" para esta impresora física \"%3%\"" - -#~ msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" -#~ msgstr "" -#~ "Añade \"%1%\" como siguiente ajuste preestablecido para la impresora " -#~ "física \"%2%\"" - -#~ msgid "Just switch to \"%1%\" preset" -#~ msgstr "Simplemente cambiar al ajuste predeterminado \"%1%\"" - -#~ msgid "Choose one file (3MF/AMF):" -#~ msgstr "Selecciona un archivo (3MF/AMF):" - -#~ msgid "" -#~ "Select coordinate space, in which the transformation will be performed." -#~ msgstr "" -#~ "Escoge el espacio de coordenadas en el que se realizará la transformación." - -#~ msgid "Toggle %c axis mirroring" -#~ msgstr "Activar reflejo del eje %c" - -#~ msgid "" -#~ "You cannot use non-uniform scaling mode for multiple objects/parts " -#~ "selection" -#~ msgstr "" -#~ "No puedes usar el modo de escala no uniforme para la selección de " -#~ "múltiples objetos/partes" - -#~ msgid "" -#~ "The currently manipulated object is tilted (rotation angles are not " -#~ "multiples of 90°).\n" -#~ "Non-uniform scaling of tilted objects is only possible in the World " -#~ "coordinate system,\n" -#~ "once the rotation is embedded into the object coordinates." -#~ msgstr "" -#~ "El objeto que está manipulando está inclinado (los ángulos de rotación no " -#~ "son múltiplos de 90º). El escalado no uniforme de objetos inclinados sólo " -#~ "es posible en sistema de coordenadas Mundo, una vez que la rotación se ha " -#~ "aplicado a las coordenadas del objeto." - -#~ msgid "" -#~ "This operation is irreversible.\n" -#~ "Do you want to proceed?" -#~ msgstr "" -#~ "Esta operación es irreversible. \n" -#~ "¿Deseas continuar?" - -#~ msgid "Seq." -#~ msgstr "Sec." - -#~ msgid "Switch to Settings" -#~ msgstr "Cambiar a Ajustes" - -#~ msgid "Print Settings Tab" -#~ msgstr "Pestaña Ajustes Impresión" - -#~ msgid "Filament Settings Tab" -#~ msgstr "Pestaña Ajustes Filamento" - -#~ msgid "Material Settings Tab" -#~ msgstr "Pestaña Ajustes de Material" - -#~ msgid "Printer Settings Tab" -#~ msgstr "Pestaña Ajustes Impresora" - -#~ msgid "Undo History" -#~ msgstr "Deshacer Historia" - -#~ msgid "Redo History" -#~ msgstr "Rehacer Historia" - -#~ msgid "Undo %1$d Action" -#~ msgid_plural "Undo %1$d Actions" -#~ msgstr[0] "Deshacer %1$d Acción" -#~ msgstr[1] "Deshacer %1$d Acciones" - -#~ msgid "Redo %1$d Action" -#~ msgid_plural "Redo %1$d Actions" -#~ msgstr[0] "Rehacer %1$d Acción" -#~ msgstr[1] "Rehacer %1$d Acciones" - -#~ msgid "Press %1%left mouse button to enter the exact value" -#~ msgstr "" -#~ "Presiona %1% botón izquierdo del ratón para introducir el valor exacto" - -#~ msgid "Enable rotations (slow)" -#~ msgstr "Permitir rotaciones (lento)" - -#~ msgid "Click right mouse button to show arrangement options" -#~ msgstr "Clic derecho del ratón para mostrar opciones de colocación" - -#~ msgid "Click right mouse button to open/close History" -#~ msgstr "Clic con botón derecho del ratón para abrir/cerrar Historia" - -#~ msgid "Next Undo action: %1%" -#~ msgstr "Siguiente acción de Deshacer: %1%" - -#~ msgid "Next Redo action: %1%" -#~ msgstr "Siguiente acción de Rehacer: %1%" - -#~ msgid "Selection-Add from rectangle" -#~ msgstr "Selección-Añadir del rectángulo" - -#~ msgid "Selection-Remove from rectangle" -#~ msgstr "Selección-Retirar del rectángulo" - -#~ msgid "Place on face" -#~ msgstr "Colocar en la cara" - -#~ msgid "" -#~ "Your printer has more extruders than the multi-material painting gizmo " -#~ "supports. For this reason, only the first %1% extruders will be able to " -#~ "be used for painting." -#~ msgstr "" -#~ "Tu impresora tiene más extrusores de los que admite el gizmo de pintado " -#~ "de soportes multimaterial. Por esta razón, sólo los primeros %1% " -#~ "extrusores podrán ser utilizados para pintar." - -#~ msgid "First color" -#~ msgstr "Primer color" - -#~ msgid "Second color" -#~ msgstr "Segundo color" - -#~ msgid "Painted using: Extruder %1%" -#~ msgstr "Pintado usando: Extrusor %1%" - -#~ msgid "" -#~ "ERROR: Please close all manipulators available from the left toolbar first" -#~ msgstr "" -#~ "ERROR: Por favor, cierre primero todos los manipuladores disponibles en " -#~ "la barra de herramientas de la izquierda" - -#~ msgid "Gizmo-Place on Face" -#~ msgstr "Gizmo-Colocar en Cara" - -#~ msgid "" -#~ "You are currently editing SLA support points. Please, apply or discard " -#~ "your changes first." -#~ msgstr "" -#~ "Estás editando los puntos de apoyo del SLA. Por favor, aplica o descarta " -#~ "tus cambios primero." - -#~ msgid "%1% was substituted with %2%" -#~ msgstr "%1% fue sustituido con %2%" - -#~ msgid "The following values were substituted:" -#~ msgstr "Se sustituyeron los siguientes valores:" - -#~ msgid "Review the substitutions and adjust them if needed." -#~ msgstr "Revisalas sustituciones y ajústalas si es necesario." - -#~ msgid "SLA print settings" -#~ msgstr "Ajustes de impresión SLA" - -#~ msgid "" -#~ "Configuration bundle was loaded, however some configuration values were " -#~ "not recognized." -#~ msgstr "" -#~ "Se cargó el paquete de configuración, sin embargo, no se reconocieron " -#~ "algunos valores de configuración." - -#~ msgid "" -#~ "Configuration file \"%1%\" was loaded, however some configuration values " -#~ "were not recognized." -#~ msgstr "" -#~ "Se cargó el archivo de configuración \"%1%\", sin embargo, no se " -#~ "reconocieron algunos valores de configuración." - -#~ msgid "" -#~ "%s has encountered an error. It was likely caused by running out of " -#~ "memory. If you are sure you have enough RAM on your system, this may also " -#~ "be a bug and we would be glad if you reported it.\n" -#~ "\n" -#~ "The application will now terminate." -#~ msgstr "" -#~ "%s ha encontrado un error. Probablemente fue causado por quedarse sin " -#~ "memoria. Si estás seguro de tener suficiente RAM en su sistema, esto " -#~ "también puede ser un error y nos complacería que lo informaras.\n" -#~ "\n" -#~ "La aplicación se cerrará." - -#~ msgid "Internal error: %1%" -#~ msgstr "Error interno: %1%" - -#~ msgid "You are opening %1% version %2%." -#~ msgstr "Estás abriendo %1% versión %2%." - -#~ msgid "" -#~ "The active configuration was created by %1% %2%,\n" -#~ "while a newer configuration was found in %3%\n" -#~ "created by %1% %4%.\n" -#~ "\n" -#~ "Shall the newer configuration be imported?\n" -#~ "If so, your active configuration will be backed up before importing the " -#~ "new configuration." -#~ msgstr "" -#~ "La configuración activa fue creada por b>%1% %2%,\n" -#~ "mientras que una configuración más nueva fue encontrada en %3%\n" -#~ "creada por %1% %4%.\n" -#~ "\n" -#~ "¿Debe importarse la configuración más nueva?\n" -#~ "Si es así, se hará una copia de seguridad de la configuración activa " -#~ "antes de importar la nueva configuración." - -#~ msgid "" -#~ "An existing configuration was found in %3%\n" -#~ "created by %1% %2%.\n" -#~ "\n" -#~ "Shall this configuration be imported?" -#~ msgstr "" -#~ "Se ha encontrado una configuración existente en %3%\n" -#~ "creada por %1% %2%.\n" -#~ "\n" -#~ "¿Debe importarse esta configuración?" - -#~ msgid "Import" -#~ msgstr "Importar" - -#~ msgid "Don't import" -#~ msgstr "No importar" - -#~ msgid "Preparing settings tabs" -#~ msgstr "Preparando pestañas de configuración" - -#~ msgid "" -#~ "You have the following presets with saved options for \"Print Host upload" -#~ "\"" -#~ msgstr "" -#~ "Tiene los siguientes ajustes preestablecidos con opciones guardadas para " -#~ "\"Subida del host de impresión\"" - -#~ msgid "" -#~ "By default new Printer devices will be named as \"Printer N\" during its " -#~ "creation.\n" -#~ "Note: This name can be changed later from the physical printers settings" -#~ msgstr "" -#~ "Por defecto, los nuevos dispositivos de impresión se llamarán \"Impresora " -#~ "N\" durante su creación.\n" -#~ "Nota: Este nombre se puede cambiar posteriormente en los ajustes de " -#~ "impresora física" - -#~ msgid "Recreating" -#~ msgstr "Recreando" - -#~ msgid "Loading of current presets" -#~ msgstr "Cargando los ajustes actuales" - -#~ msgid "Loading of a mode view" -#~ msgstr "Carga de modo de vista" - -#~ msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" -#~ msgstr "Elige un archivo (GCODE/.GCO/.G/.ngc/NGC):" - -#~ msgid "modified" -#~ msgstr "modificado" - -#~ msgid "&Configuration Snapshots" -#~ msgstr "Instantáneas de la &Configuración" - -#~ msgid "Inspect / activate configuration snapshots" -#~ msgstr "Inspeccionar / activar instantáneas de configuración" - -#~ msgid "Take Configuration &Snapshot" -#~ msgstr "&Tomar una Captura de la configuración" - -#~ msgid "Capture a configuration snapshot" -#~ msgstr "Captura una instantánea de configuración" - -#~ msgid "Desktop Integration" -#~ msgstr "Integración en el escritorio" - -#~ msgid "Simple View Mode" -#~ msgstr "Modo de visualización sencillo" - -#~ msgid "Advanced View Mode" -#~ msgstr "Modo vista avanzada" - -#~ msgid "%s View Mode" -#~ msgstr "%s Tipo de vista" - -#~ msgid "Flash Printer &Firmware" -#~ msgstr "Flashear &Firmware en la Impresora" - -#~ msgid "Upload a firmware image into an Arduino based printer" -#~ msgstr "Cargar una imagen de firmware a una impresora basada en Arduino" - -#~ msgid "Taking a configuration snapshot" -#~ msgstr "Tomando una instantánea de la configuración" - -#~ msgid "" -#~ "Some presets are modified and the unsaved changes will not be captured by " -#~ "the configuration snapshot." -#~ msgstr "" -#~ "Algunos ajustes están modificados y los cambios no guardados no serán " -#~ "capturados por la instantánea de configuración." - -#~ msgid "Snapshot name" -#~ msgstr "Nombre de la instantánea" - -#~ msgid "The preset modifications are successfully saved" -#~ msgid_plural "The presets modifications are successfully saved" -#~ msgstr[0] "Las modificaciones del ajuste se ha guardado correctamente" -#~ msgstr[1] "Las modificaciones de los ajustes se han guardado correctamente" - -#~ msgid "For new project all modifications will be reseted" -#~ msgstr "" -#~ "En el caso de un nuevo proyecto, todas las modificaciones se restablecerán" - -#~ msgid "The uploads are still ongoing" -#~ msgstr "Las subidas aún están en curso" - -#~ msgid "Stop them and continue anyway?" -#~ msgstr "¿Detenerlos y continuar de todos modos?" - -#~ msgid "Ongoing uploads" -#~ msgstr "Cargas en curso" - -#~ msgid "It's impossible to print multi-part object(s) with SLA technology." -#~ msgstr "Es imposible imprimir objetos de varias piezas con tecnología SLA." - -#~ msgid "Configuration is editing from ConfigWizard" -#~ msgstr "La configuración se editada desde ConfigWizard" - -#~ msgid "Pad and Support" -#~ msgstr "Pad y soportes" - -#~ msgid "Add negative volume" -#~ msgstr "Añadir volumen negativo" - -#~ msgid "Select showing settings" -#~ msgstr "Seleccionar los ajustes mostrados" - -#~ msgid "Remove the selected object" -#~ msgstr "Eliminar el objeto seleccionado" - -#~ msgid "Slab" -#~ msgstr "Losa" - -#~ msgid "Height range Modifier" -#~ msgstr "Modificador Rango de Alturas" - -#~ msgid "Set as a Separated Object" -#~ msgstr "Establecer como Objeto Separado" - -#~ msgid "Set as a Separated Objects" -#~ msgstr "Establecer como Objetos Separados" - -#~ msgid "Fix through the Netfabb" -#~ msgstr "Reparar mediante Netfabb" - -#~ msgid "Reload the selected volumes from disk" -#~ msgstr "Vuelve a cargar los volúmenes seleccionados desde el disco" - -#~ msgid "Change extruder" -#~ msgstr "Cambiar extrusor" - -#~ msgid "Set extruder for selected items" -#~ msgstr "Establecer el extrusor para elementos seleccionados" - -#~ msgid "Scale to print volume" -#~ msgstr "Escalar al volumen de impresión" - -#~ msgid "Scale the selected object to fit the print volume" -#~ msgstr "" -#~ "Escala los objetos seleccionados para ajustarse al volumen de impresión" - -#~ msgid "Merge objects to the one multipart object" -#~ msgstr "Juntar objeto en un objeto multipieza" - -#~ msgid "Mirror the selected object along the X axis" -#~ msgstr "Duplicar el objeto seleccionado a lo largo del eje X" - -#~ msgid "Mirror the selected object along the Y axis" -#~ msgstr "Duplicar el objeto seleccionado a lo largo del eje Y" - -#~ msgid "Mirror the selected object along the Z axis" -#~ msgstr "Duplicar el objeto seleccionado a lo largo del eje Z" - -#~ msgid "Mirror the selected object" -#~ msgstr "Duplicar el objeto seleccionado" - -#~ msgid "Add Shape" -#~ msgstr "Añadir forma" - -#~ msgid "Split the selected object into individual objects" -#~ msgstr "Dividir el objeto seleccionado en objetos individuales" - -#~ msgid "Split the selected object into individual parts" -#~ msgstr "Divide el objeto seleccionado en partes individuales" - -#~ msgid "Start at height" -#~ msgstr "Comenzar en altura" - -#~ msgid "Stop at height" -#~ msgstr "Parar en altura" - -#~ msgid "Remove layer range" -#~ msgstr "Retirar rango de capas" - -#~ msgid "Add layer range" -#~ msgstr "Añadir rango de capas" - -#~ msgid "No errors detected" -#~ msgstr "No se han detectado errores" - -#~ msgid "Auto-repaired %1$d error" -#~ msgid_plural "Auto-repaired %1$d errors" -#~ msgstr[0] "%1$d error auto-reparado" -#~ msgstr[1] "%1$d errores auto-reparados" - -#~ msgid "%1$d edge fixed" -#~ msgid_plural "%1$d edges fixed" -#~ msgstr[0] "%1$d borde arreglado" -#~ msgstr[1] "%1$d bordes arreglados" - -#~ msgid "%1$d facet removed" -#~ msgid_plural "%1$d facets removed" -#~ msgstr[0] "%1$d faceta eliminada" -#~ msgstr[1] "%1$d facetas eliminadas" - -#~ msgid "%1$d facet reversed" -#~ msgid_plural "%1$d facets reversed" -#~ msgstr[0] "%1$d faceta invertida" -#~ msgstr[1] "%1$d facetas invertidas" - -#~ msgid "%1$d backward edge" -#~ msgid_plural "%1$d backward edges" -#~ msgstr[0] "%1$d borde de retroceso" -#~ msgstr[1] "%1$d bordes de retroceso" - -#~ msgid "Right button click the icon to fix STL through Netfabb" -#~ msgstr "" -#~ "Clic del botón derecho en el ícono para arreglar el STL a través de " -#~ "Netfabb" - -#~ msgid "Rename Sub-object" -#~ msgstr "Renombrar Sub-Objeto" - -#~ msgid "Volumes in Object reordered" -#~ msgstr "Volúmenes en Objetos reordenados" - -#~ msgid "Object reordered" -#~ msgstr "Objetos reordenados" - -#~ msgid "Add Settings for Layers" -#~ msgstr "Añadir Ajustes para Capas" - -#~ msgid "Add Settings for Sub-object" -#~ msgstr "Agregar Ajustes para Sub-objeto" - -#~ msgid "Add Settings for Object" -#~ msgstr "Agregar Ajustes para Objeto" - -#~ msgid "Add Settings Bundle for Height range" -#~ msgstr "Añadir Conjunto de Ajustes para Rango de Alturas" - -#~ msgid "Add Settings Bundle for Sub-object" -#~ msgstr "Añadir Conjunto de Ajustes para Sub-objeto" - -#~ msgid "Add Settings Bundle for Object" -#~ msgstr "Añadir Conjunto de Ajustes para Objeto" - -#~ msgid "Add Generic Subobject" -#~ msgstr "Añadir Subobjeto Genérico" - -#~ msgid "Add Shape from Gallery" -#~ msgstr "Añadir Forma desde la Galería" - -#~ msgid "Add Shapes from Gallery" -#~ msgstr "Añadir Formas desde la Galería" - -#~ msgid "Remove paint-on supports" -#~ msgstr "Eliminar soportes pintables" - -#~ msgid "Remove paint-on seam" -#~ msgstr "Eliminar pintado de costuras" - -#~ msgid "Remove Multi Material painting" -#~ msgstr "Eliminar el pintado Multi Material" - -#~ msgid "Shift objects to bed" -#~ msgstr "Desplazar los objetos a la cama" - -#~ msgid "Delete All Instances from Object" -#~ msgstr "Eliminar todas las instancias del Objeto" - -#~ msgid "Delete Height Range" -#~ msgstr "Eliminar Rango de Alturas" - -#~ msgid "From Object List You can't delete the last solid part from object." -#~ msgstr "" -#~ "Desde la Lista de Objetos no puedes eliminar la última parte sólida del " -#~ "objeto." - -#~ msgid "Delete Subobject" -#~ msgstr "Eliminar Subobjeto" - -#~ msgid "Last instance of an object cannot be deleted." -#~ msgstr "La última instancia de un objeto no puede ser eliminada." - -#~ msgid "Delete Instance" -#~ msgstr "Eliminar Instancia" - -#~ msgid "" -#~ "The selected object couldn't be split because it contains only one part." -#~ msgstr "" -#~ "El objeto seleccionado no se pudo dividir porque contiene solo una parte." - -#~ msgid "Split to Parts" -#~ msgstr "Separar en Piezas" - -#~ msgid "Merge all parts to the one single object" -#~ msgstr "Juntar todas las piezas en un único objeto" - -#~ msgid "Add Layers" -#~ msgstr "Añadir Capas" - -#~ msgid "Group manipulation" -#~ msgstr "Manipulación de grupos" - -#~ msgid "Object manipulation" -#~ msgstr "Manipulación de objetos" - -#~ msgid "Object Settings to modify" -#~ msgstr "Configuraciones de objetos para modificar" - -#~ msgid "Part Settings to modify" -#~ msgstr "Configuraciones de piezas para modificar" - -#~ msgid "Layer range Settings to modify" -#~ msgstr "Ajustes del Rango de capas a modificar" - -#~ msgid "Part manipulation" -#~ msgstr "Manipulación de piezas" - -#~ msgid "Instance manipulation" -#~ msgstr "Manipulación de instancias" - -#~ msgid "Height ranges" -#~ msgstr "Rango de alturas" - -#~ msgid "Settings for height range" -#~ msgstr "Ajustes para rango de alturas" - -#~ msgid "Delete Selected Item" -#~ msgstr "Eliminar Objeto Seleccionado" - -#~ msgid "Delete Selected" -#~ msgstr "Eliminar Selección" - -#~ msgid "Add Height Range" -#~ msgstr "Añadir Rango de Alturas" - -#~ msgid "" -#~ "Cannot insert a new layer range after the current layer range.\n" -#~ "The next layer range is too thin to be split to two\n" -#~ "without violating the minimum layer height." -#~ msgstr "" -#~ "No se puede insertar un nuevo rango de capas después del rango de capa " -#~ "actual.\n" -#~ "El siguiente rango de capa es demasiado delgado para dividirse en dos\n" -#~ "sin violar la altura mínima de la capa." - -#~ msgid "" -#~ "Cannot insert a new layer range between the current and the next layer " -#~ "range.\n" -#~ "The gap between the current layer range and the next layer range\n" -#~ "is thinner than the minimum layer height allowed." -#~ msgstr "" -#~ "No se puede insertar un nuevo rango de capas entre el rango de capa " -#~ "actual y el siguiente.\n" -#~ "La brecha entre el rango de capa actual y el siguiente rango de capa\n" -#~ "es más delgada que la altura mínima de capa permitida." - -#~ msgid "" -#~ "Cannot insert a new layer range after the current layer range.\n" -#~ "Current layer range overlaps with the next layer range." -#~ msgstr "" -#~ "No se puede insertar un nuevo rango de capas después del rango de capa " -#~ "actual.\n" -#~ "El rango de capa actual se superpone con el siguiente rango de capa." - -#~ msgid "Edit Height Range" -#~ msgstr "Editar Rango de Alturas" - -#~ msgid "Object or Instance" -#~ msgstr "Objeto o instancia" - -#~ msgid "Unsupported selection" -#~ msgstr "Selección no soportada" - -#~ msgid "You started your selection with %s Item." -#~ msgstr "Has empezado la selección con %s Items." - -#~ msgid "In this mode you can select only other %s Items%s" -#~ msgstr "En este modo, solo puede seleccionar otros %s Items %s" - -#~ msgid "of a current Object" -#~ msgstr "del Objeto actual" - -#~ msgid "You can't change a type of the last solid part of the object." -#~ msgstr "No puede cambiar un tipo de la última parte sólida del objeto." - -#~ msgid "Negative Volume" -#~ msgstr "Volumen negativo" - -#~ msgid "Select type of part" -#~ msgstr "Selecciona el tipo de pieza" - -#~ msgid "Change Part Type" -#~ msgstr "Cambiar Tipo de Pieza" - -#~ msgid "Repairing model" -#~ msgstr "Reparando modelo" - -#~ msgid "Fix through NetFabb" -#~ msgstr "Reparar mediante NetFabb" - -#~ msgid "Fixing through NetFabb" -#~ msgstr "Reparando a través de NetFabb" - -#~ msgid "The following model was repaired successfully" -#~ msgid_plural "The following models were repaired successfully" -#~ msgstr[0] "El siguiente modelo se reparó con éxito" -#~ msgstr[1] "Los siguientes modelos se reparon con éxito" - -#~ msgid "Folowing model repair failed" -#~ msgid_plural "Folowing models repair failed" -#~ msgstr[0] "La siguiente reparación del modelo falló" -#~ msgstr[1] "Los siguientes reparaciones de modelos fallaron" - -#~ msgid "Set Printable group" -#~ msgstr "Establecer Grupo imprimible" - -#~ msgid "Set Unprintable group" -#~ msgstr "Establecer Grupo No imprimible" - -#~ msgid "Set Printable Instance" -#~ msgstr "Establecer Instancia imprimible" - -#~ msgid "Set Unprintable Instance" -#~ msgstr "Establecer Instancia No Imprimible" - -#~ msgid "&Plater Tab" -#~ msgstr "&Pestaña Base de impresión" - -#~ msgid "Show the plater" -#~ msgstr "Mostrar la base" - -#~ msgid "P&rint Settings Tab" -#~ msgstr "Configu&ración de Impresión" - -#~ msgid "Show the print settings" -#~ msgstr "Mostrar los ajustes de impresión" - -#~ msgid "&Filament Settings Tab" -#~ msgstr "Pestaña de Ajustes de &filamento" - -#~ msgid "Show the filament settings" -#~ msgstr "Mostrar los ajustes de filamento" - -#~ msgid "Print&er Settings Tab" -#~ msgstr "Configuración de Impr&esión" - -#~ msgid "Show the printer settings" -#~ msgstr "Mostrar la configuración de la impresora" - -#~ msgid "3&D" -#~ msgstr "3&D" - -#~ msgid "Show the 3D editing view" -#~ msgstr "Muestra la vista de edición 3D" - -#~ msgid "Pre&view" -#~ msgstr "Pre&visualizar" - -#~ msgid "Show the 3D slices preview" -#~ msgstr "Muestra la vista 3D preliminar del laminado" - -#~ msgid "Shape Gallery" -#~ msgstr "Galería de Formas" - -#~ msgid "Open the dialog to modify shape gallery" -#~ msgstr "Abre el diálogo para modificar la galería de formas" - -#~ msgid "Print &Host Upload Queue" -#~ msgstr "Cola de subida al &host de impresión" - -#~ msgid "Display the Print Host Upload Queue window" -#~ msgstr "Mostrar la ventana de la cola de carga del host de impresión" - -#~ msgid "Open New Instance" -#~ msgstr "Abrir Nueva Instancia" - -#~ msgid "External perimeter" -#~ msgstr "Perímetro externo" - -#~ msgid "Overhang perimeter" -#~ msgstr "Perímetro de voladizos" - -#~ msgid "Internal infill" -#~ msgstr "Relleno interno" - -#~ msgid "Top solid infill" -#~ msgstr "Relleno sólido superior" - -#~ msgid "Bridge infill" -#~ msgstr "Relleno de puente" - -#~ msgid "Gap fill" -#~ msgstr "Relleno del hueco" - -#~ msgid "Support material interface" -#~ msgstr "Interfaz del material de soporte" - -#~ msgid "Variable layer height" -#~ msgstr "Altura de capa variable" - -#~ msgid "Left mouse button:" -#~ msgstr "Botón izquierdo del ratón:" - -#~ msgid "Add detail" -#~ msgstr "Añadir detalle" - -#~ msgid "Right mouse button:" -#~ msgstr "Botón derecho del ratón:" - -#~ msgid "Remove detail" -#~ msgstr "Retirar detalle" - -#~ msgid "Shift + Left mouse button:" -#~ msgstr "Mayús + botón izquierdo del ratón:" - -#~ msgid "Reset to base" -#~ msgstr "Reiniciar a la base" - -#~ msgid "Shift + Right mouse button:" -#~ msgstr "Mayús + botón derecho del ratón:" - -#~ msgid "Smoothing" -#~ msgstr "Suavizado" - -#~ msgid "Mouse wheel:" -#~ msgstr "Rueda del ratón:" - -#~ msgid "Increase/decrease edit area" -#~ msgstr "Incrementar/reducir area edición" - -#~ msgid "Adaptive" -#~ msgstr "Adaptativa" - -#~ msgid "Quality / Speed" -#~ msgstr "Calidad / Velocidad" - -#~ msgid "Higher print quality versus higher print speed." -#~ msgstr "Mayor calidad de impresión contra mayor velocidad de impresión." - -#~ msgid "Smooth" -#~ msgstr "Suave" - -#~ msgid "Keep min" -#~ msgstr "Mantener mínimo" - -#~ msgid "Variable layer height - Manual edit" -#~ msgstr "Altura de capa variable - Edicción manual" - -#~ msgid "Variable layer height - Reset" -#~ msgstr "Altura de capa variable - Reiniciar" - -#~ msgid "Variable layer height - Adaptive" -#~ msgstr "Altura de capa variable - Adaptativa" - -#~ msgid "Variable layer height - Smooth all" -#~ msgstr "Altura de capa variable - Suavizar todo" - -#~ msgid "Remove variable layer height" -#~ msgstr "Eliminar altura de capa variable" - -#~ msgid "%1$d Object was loaded with variable layer height." -#~ msgid_plural "%1$d Objects were loaded with variable layer height." -#~ msgstr[0] "%1$d Se cargó el objeto con altura de capa variable." -#~ msgstr[1] "%1$d Se cargaron los objetos con altura de capa variable." - -#~ msgid "Are you sure you want to delete \"%1%\" printer?" -#~ msgstr "¿Estás seguro de que quieres borrar la impresora \"%1%\"?" - -#~ msgid "%s doesn't support percentage" -#~ msgstr "%s no permite porcentajes" - -#~ msgid "" -#~ "Input value is out of range\n" -#~ "Are you sure that %s is a correct value and that you want to continue?" -#~ msgstr "" -#~ "El valor introducido está fuera de rango\n" -#~ "¿Está seguro de que %s es un valor correcto y que deseas continuar?" - -#~ msgid "Input value is out of range" -#~ msgstr "El valor introducido está fuera de rango" - -#~ msgid "" -#~ "Do you mean %s%% instead of %s %s?\n" -#~ "Select YES if you want to change this value to %s%%, \n" -#~ "or NO if you are sure that %s %s is a correct value." -#~ msgstr "" -#~ "¿Quieres decir %s%% en vez de %s %s?\n" -#~ "Escoge SI si deseas cambiar este valor a %s%%,\n" -#~ "o NO si estás seguro que %s %s es el valor correcto." - -#~ msgid "" -#~ "Invalid input format. Expected vector of dimensions in the following " -#~ "format: \"%1%\"" -#~ msgstr "" -#~ "Formato de entrada inválido. Vector esperado de dimensiones en el " -#~ "siguiente formato: \"%1%\"" - -#~ msgid "Switch to the %s mode" -#~ msgstr "Cambiar al modo %s" - -#~ msgid "Current mode is %s" -#~ msgstr "El modo actual es %s" - -#~ msgctxt "Mode" -#~ msgid "Advanced" -#~ msgstr "Avanzado" - -#~ msgid "" -#~ "Here you can adjust required purging volume (mm³) for any given pair of " -#~ "tools." -#~ msgstr "" -#~ "Aquí puedes ajustar el volumende purga requerida (mm³) para cualquier par " -#~ "de herramientas." - -#~ msgid "Extruder changed to" -#~ msgstr "El extrusor cambia a" - -#~ msgid "Tool #" -#~ msgstr "Herramienta nº" - -#~ msgid "" -#~ "Total purging volume is calculated by summing two values below, depending " -#~ "on which tools are loaded/unloaded." -#~ msgstr "" -#~ "El volumen total de purga se calcula sumando dos valors más abajo, " -#~ "dependiendo de qué filamentos se carguen/descarguen." - -#~ msgid "Change Extruder" -#~ msgstr "Cambiar Extrusor" - -#~ msgid "Change Extruders" -#~ msgstr "Cambiar Extrusores" - -#~ msgid "Quick Add Settings (%s)" -#~ msgstr "Añadir ajustes rápidos (%s)" - -#~ msgid "Add instance" -#~ msgstr "Añadir instancia" - -#~ msgid "Add one more instance of the selected object" -#~ msgstr "Añadir una instancia más del objeto seleccionado" - -#~ msgid "Remove instance" -#~ msgstr "Retirar una copia" - -#~ msgid "Remove one instance of the selected object" -#~ msgstr "Eliminar una instancia del objeto seleccionado" - -#~ msgid "Set number of instances" -#~ msgstr "Establecer número de instancias" - -#~ msgid "Change the number of instances of the selected object" -#~ msgstr "Cambiar número de instancias al objeto seleccionado" - -#~ msgid "Fill bed with instances" -#~ msgstr "Rellenar la base con copias" - -#~ msgid "Fill the remaining area of bed with instances of the selected object" -#~ msgstr "" -#~ "Rellenar el área restante de la base con copias del objeto seleccionado" - -#~ msgid "" -#~ "is based on Slic3r by Alessandro Ranellucci and the RepRap community." -#~ msgstr "" -#~ "está basado en Slic3r de Alessandro Ranellucci y la comunidad RepRap." - -#~ msgid "" -#~ "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, " -#~ "Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous " -#~ "others." -#~ msgstr "" -#~ "Contribuciones de Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, " -#~ "Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik y muchos otros." - -#~ msgid "Artwork model by M Boyer" -#~ msgstr "Modelo artístico de M Boyer" - -#~ msgid "" -#~ "Starting with %1% 2.3, configuration directory on Linux has changed " -#~ "(according to XDG Base Directory Specification) to \n" -#~ "%2%.\n" -#~ "\n" -#~ "This directory did not exist yet (maybe you run the new version for the " -#~ "first time).\n" -#~ "However, an old %1% configuration directory was detected in \n" -#~ "%3%.\n" -#~ "\n" -#~ "Consider moving the contents of the old directory to the new location in " -#~ "order to access your profiles, etc.\n" -#~ "Note that if you decide to downgrade %1% in future, it will use the old " -#~ "location again.\n" -#~ "\n" -#~ "What do you want to do now?" -#~ msgstr "" -#~ "Comenzando con %1% 2.3, el directorio de configuración en Linux ha " -#~ "cambiado (de acuerdo con la Especificación de directorio base de XDG) a\n" -#~ "%2%.\n" -#~ "\n" -#~ "Este directorio aún no existía (tal vez ejecutes la nueva versión por " -#~ "primera vez).\n" -#~ "Sin embargo, se detectó un directorio de configuración antiguo %1% en\n" -#~ "%3%.\n" -#~ "\n" -#~ "Puedes mover el contenido del directorio antiguo a la nueva ubicación " -#~ "para acceder a tus perfiles, etc.\n" -#~ "Ten en cuenta que si decides retroceder de versión %1% en el futuro, " -#~ "volverás a utilizar la ubicación anterior.\n" -#~ "\n" -#~ "¿Qué quieres hacer ahora?" - -#~ msgid "%s - BREAKING CHANGE" -#~ msgstr "%s - CAMBIO IMPORTANTE" - -#~ msgid "Quit, I will move my data now" -#~ msgstr "Termino, moveré mis datos ahora" - -#~ msgid "Start the application" -#~ msgstr "Inicia el programa" - -#~ msgid "NO RAMMING AT ALL" -#~ msgstr "NO EMPUJAR EN ABSOLUTO" - -#~ msgid "Volumetric speed" -#~ msgstr "Velocidad volumétrica" - -#~ msgid "Ramming customization" -#~ msgstr "Configuración de empuje" - -#~ msgid "" -#~ "Ramming denotes the rapid extrusion just before a tool change in a single-" -#~ "extruder MM printer. Its purpose is to properly shape the end of the " -#~ "unloaded filament so it does not prevent insertion of the new filament " -#~ "and can itself be reinserted later. This phase is important and different " -#~ "materials can require different extrusion speeds to get the good shape. " -#~ "For this reason, the extrusion rates during ramming are adjustable.\n" -#~ "\n" -#~ "This is an expert-level setting, incorrect adjustment will likely lead to " -#~ "jams, extruder wheel grinding into filament etc." -#~ msgstr "" -#~ "El empuje señala la extrusión rápida justo antes de un cambio de " -#~ "filamento en una impresora MM de un sólo extrusor. Su propósito es " -#~ "asegurar una forma adecuada para el extremo de filamento que se va a " -#~ "descargar, para que no haya problemas al insertar uno nuevo y para que se " -#~ "pueda volver a insertar este más tarde. Esta fase es importante y " -#~ "diferentes materiales puede precisar diferentes velocidades para obtener " -#~ "la forma correcta. Por este motivo, las velocidades extrusión durante el " -#~ "empuje son ajustables.\n" -#~ "\n" -#~ "Este es un ajuste para expertos, ajustarlo incorrectamente podrá producir " -#~ "atascos, que la rueda del extrusor arañe el filamento, etc." - -#~ msgid "Total ramming time" -#~ msgstr "Tiempo de empuje total" - -#~ msgid "Total rammed volume" -#~ msgstr "Volumen total empujado" - -#~ msgid "Ramming line width" -#~ msgstr "Ancho de la linea de empuje" - -#~ msgid "Ramming line spacing" -#~ msgstr "Separación de la linea de empuje" - -#~ msgid "Network lookup" -#~ msgstr "Búsqueda en la red" - -#~ msgid "Address" -#~ msgstr "Dirección" - -#~ msgid "Hostname" -#~ msgstr "Nombre del equipo" - -#~ msgid "Service name" -#~ msgstr "Nombre del servicio" - -#~ msgid "OctoPrint version" -#~ msgstr "Versión de OctoPrint" - -#~ msgid "Searching for devices" -#~ msgstr "Buscando dispositivos" - -#~ msgid "Revert color to default" -#~ msgstr "Revertir el color por defecto" - -#~ msgid "Value is the same as the system value" -#~ msgstr "El valor es el mismo que el del sistema" - -#~ msgid "" -#~ "Value was changed and is not equal to the system value or the last saved " -#~ "preset" -#~ msgstr "" -#~ "El valor ha cambiado y ya no es igual al valor del sistema o al último " -#~ "valor guardado" - -#~ msgid "Buttons And Text Colors Description" -#~ msgstr "Descripción de los botones y de los colores del texto" - -#, fuzzy -#~ msgid "" -#~ "The Spiral Vase mode requires:\n" -#~ "- one perimeter\n" -#~ "- no top solid layers\n" -#~ "- 0% fill density\n" -#~ "- no support material\n" -#~ "- Ensure vertical shell thickness enabled\n" -#~ "- Detect thin walls disabled" -#~ msgstr "" -#~ "El modo Vaso Espiral necesita:\n" -#~ "-un perímetro\n" -#~ "-cero capas de tapa superior\n" -#~ "-0% densidad de relleno\n" -#~ "-sin soportes\n" -#~ "-Comprueba que está activado el espesor de pared vertical\n" -#~ "-Desactiva la detección de paredes finas" - -#~ msgid "" -#~ "The Wipe Tower currently supports the non-soluble supports only\n" -#~ "if they are printed with the current extruder without triggering a tool " -#~ "change.\n" -#~ "(both support_material_extruder and support_material_interface_extruder " -#~ "need to be set to 0)." -#~ msgstr "" -#~ "La Torre de Limpieza actualmente admite los soportes no solubles solo si " -#~ "están impresos con el extrusor actual sin activar un cambio de " -#~ "herramienta. \n" -#~ "(tanto support_material_extruder como support_material_interface_extruder " -#~ "deben configurarse en 0)." - -#~ msgid "Shall I adjust those settings in order to enable the Wipe Tower?" -#~ msgstr "" -#~ "¿Debo ajustar esa configuración para habilitar la Torre de Limpieza?" - -#~ msgid "Wipe Tower" -#~ msgstr "Torre de limpieza" - -#~ msgid "" -#~ "For the Wipe Tower to work with the soluble supports, the support layers\n" -#~ "need to be synchronized with the object layers." -#~ msgstr "" -#~ "Para que la Torre de Limpieza funcione con los soportes solubles, las " -#~ "capas de soporte\n" -#~ "deben sincronizarse con las capas de objetos." - -#~ msgid "" -#~ "Shall I synchronize support layers in order to enable the Wipe Tower?" -#~ msgstr "" -#~ "¿Debo sincronizar las capas de soporte para habilitar la Torre de " -#~ "Limpieza?" - -#~ msgid "Downgrade" -#~ msgstr "Volver a una versión anterior" - -#~ msgid "Before roll back" -#~ msgstr "Antes de volver atrás" - -#~ msgid "Active" -#~ msgstr "Activo" - -#~ msgid "print" -#~ msgstr "imprimir" - -#~ msgid "filaments" -#~ msgstr "filamentos" - -#~ msgid "printer" -#~ msgstr "impresora" - -#~ msgid "version" -#~ msgstr "versión" - -#~ msgid "model" -#~ msgstr "modelo" - -#~ msgid "variants" -#~ msgstr "variantes" - -#~ msgid "Incompatible with this %s" -#~ msgstr "Incompatible con este %s" - -#~ msgid "Activate" -#~ msgstr "Activar" - -#~ msgid "Configuration Snapshots" -#~ msgstr "Instantáneas de la Configuración" - -#~ msgid "Automatic updates" -#~ msgstr "Actualizaciones automáticas" - -#~ msgid "Updates" -#~ msgstr "Actualizaciones" - -#~ msgid "Check for application updates" -#~ msgstr "Comprueba si hay actualizaciones de la aplicación" - -#~ msgid "" -#~ "If enabled, %s checks for new application versions 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 "" -#~ "Si está activado, %s comprueba si hay nuevas versiones de Slic3r PE en la " -#~ "red. Cuando hay disponible una nueva versión se muestra una notificación " -#~ "al iniciar la aplicación (nunca durante el uso del programa). Esto es " -#~ "sólo un mecanismo de notificación, sin que se realice una instalación " -#~ "automática." - -#~ msgid "Update built-in Presets automatically" -#~ msgstr "Actualiza los ajustes de fábrica automáticamente" - -#~ msgid "" -#~ "If enabled, %s downloads updates of built-in system presets in the " -#~ "background.These updates are downloaded into a separate temporary " -#~ "location.When a new preset version becomes available it is offered at " -#~ "application startup." -#~ msgstr "" -#~ "Si está activado, %s descargará actualizaciones de los ajustes del " -#~ "sistema mientras lo usamos. Estas actualizaciones se descargan a una " -#~ "ubicación temporal. Cuando hay un nuevo ajuste disponible, este se podrá " -#~ "incorporar y usar cuando la aplicación se vuelva a iniciar." - -#~ msgid "" -#~ "Updates are never applied without user's consent and never overwrite " -#~ "user's customized settings." -#~ msgstr "" -#~ "Las actualizaciones nunca se realizan sin el consentimiento del usuario y " -#~ "nunca sobre-escriben ajustes personalizados del usuario." - -#~ msgid "" -#~ "Additionally a backup snapshot of the whole configuration is created " -#~ "before an update is applied." -#~ msgstr "" -#~ "Además se realizará una instantánea de toda la configuración antes de " -#~ "aplicar una actualización." - -#~ msgid "" -#~ "Export full pathnames of models and parts sources into 3mf and amf files" -#~ msgstr "" -#~ "Exportar nombres de ruta completos de las fuentes de los modelos y de " -#~ "piezas a archivos 3mf y amf" - -#~ msgid "" -#~ "If enabled, allows the Reload from disk command to automatically find and " -#~ "load the files when invoked.\n" -#~ "If not enabled, the Reload from disk command will ask to select each file " -#~ "using an open file dialog." -#~ msgstr "" -#~ "Si está activado, permite que la orden de Recarga desde el disco " -#~ "encuentre y cargue los archivos al invocarla. \n" -#~ "Si no está activado, la orden de Recarga desde el disco te pedirá que " -#~ "selecciones cada archivo en un cuadro de abrir archivo." - -#~ msgid "View mode" -#~ msgstr "Modo de vista" - -#~ msgid "Expert mode" -#~ msgstr "Modo experto" - -#~ msgid "Enter the temperature needed for extruding your filament." -#~ msgstr "Introduce la temperatura necesaria para extruir tu filamento." - -#~ msgid "Do you want to continue changing the configuration?" -#~ msgstr "¿Quieres seguir cambiando la configuración?" - -#~ msgid "Custom printer was installed and it will be activated." -#~ msgstr "Una nueva impresora personalizada se instaló y se activará." - -#~ msgid "SLA Material Profiles Selection" -#~ msgstr "Selección Perfiles de Material SLA" - -#~ msgid "" -#~ "Performing desktop integration failed - boost::filesystem::canonical did " -#~ "not return appimage path." -#~ msgstr "" -#~ "Falló la integración del escritorio - boost::filesystem::canonical no " -#~ "devolvió la ruta de la imagen de la aplicación." - -#~ msgid "Performing desktop integration failed - Could not find executable." -#~ msgstr "" -#~ "Falló la integración del escritorio - No se pudo encontrar el ejecutable." - -#~ msgid "" -#~ "Performing desktop integration failed because the application directory " -#~ "was not found." -#~ msgstr "" -#~ "La integración del escritorio ha fallado porque no se ha encontrado el " -#~ "directorio de la aplicación." - -#~ msgid "" -#~ "Desktop Integration sets this binary to be searchable by the system.\n" -#~ "\n" -#~ "Press \"Perform\" to proceed." -#~ msgstr "" -#~ "La integración del escritorio establece este binario para que pueda ser " -#~ "buscado por el sistema.\n" -#~ "\n" -#~ "Pulse \"Realizar\" para continuar." - -#~ msgid "Switch code to Change extruder" -#~ msgstr "Cambiar código para cambiar extrusor" - -#~ msgid "Change extruder (N/A)" -#~ msgstr "Cambiar extrusor (N/A)" - -#~ msgid "Use another extruder" -#~ msgstr "Usar otro extrusor" - -#~ msgid "Add custom G-code" -#~ msgstr "Añadir código G personalizado" - -#~ msgid "default color" -#~ msgstr "color predeterminado" - -#~ msgid "Movement" -#~ msgstr "Movimiento" - -#~ msgid "Extrusion" -#~ msgstr "Extrusión" - -#~ msgid "Estimated printing times" -#~ msgstr "Tiempos estimados de impresión" - -#~ msgid "Hollow this object" -#~ msgstr "Vaciar este objeto" - -#~ msgid "Preview hollowed and drilled model" -#~ msgstr "Vista preliminar del modelo con su interior vaciado y taladrado" - -#~ msgid "Offset" -#~ msgstr "Desplazamiento" - -#~ msgid "Hole diameter" -#~ msgstr "Diámetro del orificio" - -#~ msgid "Hole depth" -#~ msgstr "Profundidad del orificio" - -#~ msgid "Remove selected holes" -#~ msgstr "Elimina huecos seleccionados" - -#~ msgid "Remove all holes" -#~ msgstr "Elimina todos los huecos" - -#~ msgid "Show supports" -#~ msgstr "Muestra soportes" - -#~ msgid "Add drainage hole" -#~ msgstr "Añadir orificio de drenaje" - -#~ msgid "Delete drainage hole" -#~ msgstr "Eliminar orificio de drenaje" - -#~ msgid "Hollowing parameter change" -#~ msgstr "Cambio del parámetro de vaciar el interior" - -#~ msgid "Change drainage hole diameter" -#~ msgstr "Cambiar diámetro orificio de drenaje" - -#~ msgid "Hollow and drill" -#~ msgstr "Vaciado y taladrado" - -#~ msgid "Move drainage hole" -#~ msgstr "Mover orificio de drenaje" - -#~ msgid "Paints neighboring facets that have the same color." -#~ msgstr "Pinta las facetas vecinas que tienen el mismo color." - -#~ msgid "Split bigger facets into smaller ones while the object is painted." -#~ msgstr "" -#~ "Divide las facetas más grandes en otras más pequeñas mientras se pinta el " -#~ "objeto." - -#~ msgid "Loading a configuration snapshot" -#~ msgstr "Cargando una instantánea de configuración" - -#~ msgid "Continue to activate a configuration snapshot %1%?" -#~ msgstr "¿Continuar activando una instantánea de configuración %1%?" - -#~ msgid "Failed to activate configuration snapshot." -#~ msgstr "No se pudo activar la instantánea de configuración." - -#~ msgid "Open hyperlink in default browser?" -#~ msgstr "¿Abrir el hipervínculo en el navegador por defecto?" - -#~ msgid "Editing" -#~ msgstr "Edición" - -#~ msgid "Right button click the icon to change the object settings" -#~ msgstr "" -#~ "Clic del botón derecho en el ícono para cambiar los ajustes del objeto" - -#~ msgid "Click the icon to change the object settings" -#~ msgstr "Clic en el icono para cambiar los ajustes del objeto" - -#~ msgid "Right button click the icon to change the object printable property" -#~ msgstr "" -#~ "Clic con el botón derecho en el icono para cambiar la propiedad " -#~ "imprimible del objeto" - -#~ msgid "Click the icon to change the object printable property" -#~ msgstr "Clic en el icono para cambiar las propiedades del objeto imprimible" - -#~ msgid "Height" -#~ msgstr "Altura" - -#~ msgid "Volumetric flow rate" -#~ msgstr "Tasa de caudal volumétrico" - -#~ msgid "Show" -#~ msgstr "Mostrar" - -#~ msgid "Feature types" -#~ msgstr "Tipos de funciones" - -#~ msgid "Open Preferences." -#~ msgstr "Abrir Preferencias." - -#~ msgid "Open Documentation in web browser." -#~ msgstr "Abrir la documentación en el navegador web." - -#~ msgid "Suppress to open hyperlink in browser" -#~ msgstr "Suprimir para abrir hipervínculo en el navegador" - -#~ msgid "You will not be asked about it again on label hovering." -#~ msgstr "No se te preguntará de nuevo sobre la etiqueta flotante." - -#~ msgid "" -#~ "Visit \"Preferences\" and check \"%1%\"\n" -#~ "to changes your choice." -#~ msgstr "" -#~ "Visita \"Preferencias\" y marca\"%1%\"\n" -#~ "para cambiar tu elección." - -#~ msgid "" -#~ "Multiple objects were loaded for a multi-material printer.\n" -#~ "Instead of considering them as multiple objects, should I consider\n" -#~ "these files to represent a single object having multiple parts?" -#~ msgstr "" -#~ "Se cargaron varios objetos para una impresora de varios materiales.\n" -#~ "En lugar de considerarlos como objetos múltiples, ¿debería considerar\n" -#~ "estos archivos para formar un solo objeto que tiene varias partes?" - -#~ msgid "3D editor view" -#~ msgstr "Vista editor 3D" - -#~ msgid "Action" -#~ msgstr "Acción" - -#~ msgid "Remember output directory" -#~ msgstr "Recordar el directorio de salida" - -#~ msgid "" -#~ "If this is enabled, Slic3r will prompt the last output directory instead " -#~ "of the one containing the input files." -#~ msgstr "" -#~ "Si esto está habilitado, Slic3r solicitará el último directorio de salida " -#~ "en lugar del que contiene los archivos de entrada." - -#~ msgid "Auto-center parts" -#~ msgstr "Piezas auto-centradas" - -#~ msgid "" -#~ "If this is enabled, Slic3r will auto-center objects around the print bed " -#~ "center." -#~ msgstr "" -#~ "Si esto está habilitado, Slic3r centrará automáticamente los objetos " -#~ "alrededor del centro de la base de impresión." - -#~ msgid "Background processing" -#~ msgstr "Procesamiento en segundo plano" - -#~ msgid "" -#~ "If this is enabled, Slic3r will pre-process objects as soon as they're " -#~ "loaded in order to save time when exporting G-code." -#~ msgstr "" -#~ "Si esto está habilitado, Slic3r preprocesará objetos tan pronto como se " -#~ "carguen para ahorrar tiempo al exportar el código G." - -#~ msgid "Export sources full pathnames to 3mf and amf" -#~ msgstr "Exportar nombres de ruta completos de las fuentes a 3mf y amf" - -#~ msgid "" -#~ "If enabled, allows the Reload from disk command to automatically find and " -#~ "load the files when invoked." -#~ msgstr "" -#~ "Si está activado, permite que la orden de Recarga desde el disco busque y " -#~ "cargue los ficheros cuando se invoque." - -#~ msgid "" -#~ "If enabled, Slic3r downloads updates of built-in system presets in the " -#~ "background. These updates are downloaded into a separate temporary " -#~ "location. When a new preset version becomes available it is offered at " -#~ "application startup." -#~ msgstr "" -#~ "Si está activado, Slic3r descargará actualizaciones de los ajustes del " -#~ "sistema mientras lo usamos. Estas actualizaciones se descargan a una " -#~ "ubicación temporal. Cuando hay un nuevo ajuste disponible, este se podrá " -#~ "incorporar y usar cuando la aplicación se vuelva a iniciar." - -#~ msgid "Suppress \" - default - \" presets" -#~ msgstr "Suprima los ajustes iniciales \"- predeterminado -\"" - -#~ msgid "" -#~ "Suppress \" - default - \" presets in the Print / Filament / Printer " -#~ "selections once there are any other valid presets available." -#~ msgstr "" -#~ "Suprima los ajustes iniciales \"- predeterminado -\" en las selecciones " -#~ "Imprimir / Filamento / Impresora una vez que haya otros ajustes " -#~ "preestablecidos disponibles." - -#~ msgid "Show incompatible print and filament presets" -#~ msgstr "Mostrar impresiones incompatibles y ajustes iniciales de filamentos" - -#~ msgid "" -#~ "When checked, the print and filament presets are shown in the preset " -#~ "editor even if they are marked as incompatible with the active printer" -#~ msgstr "" -#~ "Cuando está marcada, los ajustes preestablecidos de impresión y filamento " -#~ "se muestran en el editor de ajustes preestablecidos, incluso si están " -#~ "marcados como incompatibles con la impresora activa" - -#~ msgid "Show drop project dialog" -#~ msgstr "Mostrar cuadro de diálogo al soltar proyecto" - -#~ msgid "" -#~ "When checked, whenever dragging and dropping a project file on the " -#~ "application, shows a dialog asking to select the action to take on the " -#~ "file to load." -#~ msgstr "" -#~ "Cuando está marcada, cada vez que se arrastra y suelta un archivo de " -#~ "proyecto en la aplicación, muestra un cuadro de diálogo que solicita " -#~ "seleccionar la acción a realizar en el archivo a cargar." - -#~ msgid "" -#~ "On OSX there is always only one instance of app running by default. " -#~ "However it is allowed to run multiple instances of same app from the " -#~ "command line. In such case this settings will allow only one instance." -#~ msgstr "" -#~ "En OSX, siempre hay una sola instancia de aplicación que se ejecuta de " -#~ "forma predeterminada. Sin embargo, está permitido ejecutar varias " -#~ "instancias de la misma aplicación desde la línea de comandos. En tal " -#~ "caso, esta configuración permitirá solo una instancia." - -#~ msgid "" -#~ "Ask to save unsaved changes when closing the application or when loading " -#~ "a new project" -#~ msgstr "" -#~ "Pedir que se guarden los cambios no guardados al cerrar la aplicación o " -#~ "al cargar un nuevo proyecto" - -#~ msgid "Ask for unsaved changes when selecting new preset" -#~ msgstr "" -#~ "Preguntar por los cambios no guardados al seleccionar un nuevo ajuste " -#~ "preestablecido" - -#~ msgid "" -#~ "Always ask for unsaved changes when selecting new preset or resetting a " -#~ "preset" -#~ msgstr "" -#~ "Preguntar siempre por los cambios no guardados al seleccionar un nuevo " -#~ "ajuste o al restablecer un ajuste" - -#~ msgid "Ask for unsaved changes when creating new project" -#~ msgstr "Preguntar por los cambios no guardados al crear un nuevo proyecto" - -#~ msgid "Always ask for unsaved changes when creating new project" -#~ msgstr "" -#~ "Preguntar siempre por los cambios no guardados al crear un nuevo proyecto" - -#~ msgid "Use Retina resolution for the 3D scene" -#~ msgstr "Usa la resolución de Retina para la escena 3D" - -#~ msgid "" -#~ "If enabled, the 3D scene will be rendered in Retina resolution. If you " -#~ "are experiencing 3D performance problems, disabling this option may help." -#~ msgstr "" -#~ "Si está activado, la escena 3D se mostrará en resolución Retina. Si " -#~ "tienes problemas de prestaciones 3D, desactivar esta opción te puede " -#~ "ayudar." - -#~ msgid "Show splash screen" -#~ msgstr "Mostrar pantalla splash" - -#~ msgid "Clear Undo / Redo stack on new project" -#~ msgstr "Borrar la pila de Deshacer / Rehacer en el nuevo proyecto" - -#~ msgid "" -#~ "Clear Undo / Redo stack on new project or when an existing project is " -#~ "loaded." -#~ msgstr "" -#~ "Borrar la pila de Deshacer / Rehacer en un nuevo proyecto o cuando se " -#~ "carga un proyecto existente." - -#~ msgid "Enable support for legacy 3DConnexion devices" -#~ msgstr "Habilitar la compatibilidad con dispositivos 3DConnexion antiguos" - -#~ msgid "" -#~ "If enabled, the legacy 3DConnexion devices settings dialog is available " -#~ "by pressing CTRL+M" -#~ msgstr "" -#~ "Si está habilitado, el cuadro de diálogo de configuración de dispositivos " -#~ "3DConnexion antiguos está disponible presionando CTRL + M" - -#~ msgid "Camera" -#~ msgstr "Cámara" - -#~ msgid "Use perspective camera" -#~ msgstr "Usar cámara en perspectiva" - -#~ msgid "" -#~ "If enabled, use perspective camera. If not enabled, use orthographic " -#~ "camera." -#~ msgstr "" -#~ "Si está activado, se usará una cámara en perspectiva. Si no está activo, " -#~ "se usará una cámara ortográfica." - -#~ msgid "Use free camera" -#~ msgstr "Usar la cámara libre" - -#~ msgid "If enabled, use free camera. If not enabled, use constrained camera." -#~ msgstr "" -#~ "Si está activado, usa la cámara libre. Si no está activado, usa la cámara " -#~ "restringida." - -#~ msgid "Reverse direction of zoom with mouse wheel" -#~ msgstr "Revertir zoom con la rueda del ratón" - -#~ msgid "If enabled, reverses the direction of zoom with mouse wheel" -#~ msgstr "" -#~ "Si está habilitado, invierte la dirección del zoom con la rueda del mouse" - -#~ msgid "Sequential slider applied only to top layer" -#~ msgstr "Deslizador secuencial aplicado solo a la capa superior" - -#~ msgid "" -#~ "If enabled, changes made using the sequential slider, in preview, apply " -#~ "only to gcode top layer. If disabled, changes made using the sequential " -#~ "slider, in preview, apply to the whole gcode." -#~ msgstr "" -#~ "Si se activa, los cambios realizados con el deslizador secuencial, en la " -#~ "vista previa, se aplican sólo a la capa superior del código G. Si se " -#~ "desactiva, los cambios realizados con el deslizador secuencial, en la " -#~ "vista previa, se aplican a todo el código G." - -#~ msgid "Show sidebar collapse/expand button" -#~ msgstr "Mostrar botón ocultar/expandir barra lateral" - -#~ msgid "" -#~ "If enabled, the button for the collapse sidebar will be appeared in top " -#~ "right corner of the 3D Scene" -#~ msgstr "" -#~ "Si está habilitado, el botón de la barra lateral ocultable aparecerá en " -#~ "la esquina superior derecha de la escena 3D" - -#~ msgid "" -#~ "If enabled, the descriptions of configuration parameters in settings tabs " -#~ "wouldn't work as hyperlinks. If disabled, the descriptions of " -#~ "configuration parameters in settings tabs will work as hyperlinks." -#~ msgstr "" -#~ "Si está habilitado, las descripciones de los parámetros de configuración " -#~ "en las pestañas de configuración no funcionarán como hipervínculos. Si " -#~ "está deshabilitado, las descripciones de los parámetros de configuración " -#~ "en las pestañas de configuración funcionarán como hipervínculos." - -#~ msgid "Use colors for axes values in Manipulation panel" -#~ msgstr "" -#~ "Usar colores para los valores de los ejes en el panel de Manipulación" - -#~ msgid "" -#~ "If enabled, the axes names and axes values will be colorized according to " -#~ "the axes colors. If disabled, old UI will be used." -#~ msgstr "" -#~ "Si se activa, los nombres de los ejes y los valores de los ejes se " -#~ "colorearán de acuerdo con los colores de los ejes. Si se desactiva, se " -#~ "utilizará la antigua interfaz de usuario." - -#~ msgid "Order object volumes by types" -#~ msgstr "Ordenar los volúmenes de objetos por tipos" - -#~ msgid "" -#~ "If enabled, volumes will be always ordered inside the object. Correct " -#~ "order is Model Part, Negative Volume, Modifier, Support Blocker and " -#~ "Support Enforcer. If disabled, you can reorder Model Parts, Negative " -#~ "Volumes and Modifiers. But one of the model parts have to be on the first " -#~ "place." -#~ msgstr "" -#~ "Si se activa, los volúmenes se ordenarán siempre dentro del objeto. El " -#~ "orden correcto es Parte del Modelo, Volumen Negativo, Modificador, " -#~ "Bloqueador de Soporte y Reforzador de Soporte. Si se desactiva, se pueden " -#~ "reordenar las Partes del Modelo, los Volúmenes Negativos y los " -#~ "Modificadores. Pero una de las partes del modelo tiene que estar en el " -#~ "primer lugar." - -#~ msgid "Set settings tabs as menu items (experimental)" -#~ msgstr "" -#~ "Establecer pestañas de configuración como elementos de menú (experimental)" - -#~ msgid "" -#~ "If enabled, Settings Tabs will be placed as menu items. If disabled, old " -#~ "UI will be used." -#~ msgstr "" -#~ "Si se activa, las Pestañas de Configuración se colocarán como elementos " -#~ "de menú. Si se desactiva, se utilizará la antigua interfaz de usuario." - -#~ msgid "Show \"Tip of the day\" notification after start" -#~ msgstr "Mostrar la notificación de \"Consejo del día\" tras el inicio" - -#~ msgid "If enabled, useful hints are displayed at startup." -#~ msgstr "Si se activa, se muestran consejos útiles al inicio." - -#~ msgid "Notify about new releases" -#~ msgstr "Notificar sobre nuevos lanzamientos" - -#~ msgid "" -#~ "You will be notified about new release after startup acordingly: All = " -#~ "Regular release and alpha / beta releases. Release only = regular release." -#~ msgstr "" -#~ "Se te notificará sobre la nueva versión después de la puesta en marcha en " -#~ "consecuencia: Todos = Lanzamiento regular y lanzamientos alfa / beta. " -#~ "Sólo versión = versión regular." - -#~ msgid "Release only" -#~ msgstr "Solo lanzamiento" - -#~ msgid "Use custom size for toolbar icons" -#~ msgstr "" -#~ "Usar tamaño personalizado para los iconos de la barra de herramientas" - -#~ msgid "If enabled, you can change size of toolbar icons manually." -#~ msgstr "" -#~ "Si está activado, puedes cambiar el tamaño de la barra de herramientas " -#~ "manualmente." - -#~ msgid "Render" -#~ msgstr "Renderizar" - -#~ msgid "Use environment map" -#~ msgstr "Usar mapa ambiental" - -#~ msgid "If enabled, renders object using the environment map." -#~ msgstr "Si está activado, visualiza el objeto usando el mapa del entorno." - -#~ msgid "Dark mode (experimental)" -#~ msgstr "Modo oscuro (experimental)" - -#~ msgid "Enable dark mode" -#~ msgstr "Activar el modo oscuro" - -#~ msgid "" -#~ "If enabled, UI will use Dark mode colors. If disabled, old UI will be " -#~ "used." -#~ msgstr "" -#~ "Si se activa, la interfaz de usuario utilizará los colores del modo " -#~ "oscuro. Si se desactiva, se utilizará la antigua interfaz de usuario." - -#~ msgid "Use system menu for application" -#~ msgstr "Utilizar el menú del sistema para la aplicación" - -#~ msgid "" -#~ "If enabled, application will use the standard Windows system menu,\n" -#~ "but on some combination of display scales it can looks ugly. If disabled, " -#~ "old UI will be used." -#~ msgstr "" -#~ "Si se activa, la aplicación utilizará el menú de sistema estándar de " -#~ "Windows,\n" -#~ "pero en algunas combinaciones de escalas de pantalla puede parecer feo. " -#~ "Si se desactiva, se utilizará la antigua interfaz de usuario." - -#~ msgid "Changes for the critical options" -#~ msgstr "Cambios para las opciones críticas" - -#~ msgid "" -#~ "Changing some options will trigger application restart.\n" -#~ "You will lose the content of the plater." -#~ msgstr "" -#~ "El cambio de algunas opciones hará que se reinicie la aplicación.\n" -#~ "Se perderá el contenido de la plataforma." - -#~ msgid "Icon size in a respect to the default size" -#~ msgstr "Tamaño del icono respecto al tamaño original" - -#~ msgid "Select toolbar icon size in respect to the default one." -#~ msgstr "" -#~ "Selecciona el tamaño del icono de la barra de herramientas con respecto " -#~ "al predeterminado." - -#~ msgid "Old regular layout with the tab bar" -#~ msgstr "Diseño regular antiguo con la barra de pestañas" - -#~ msgid "New layout, access via settings button in the top menu" -#~ msgstr "" -#~ "Nuevo diseño, acceso a través del botón de configuración en el menú " -#~ "superior" - -#~ msgid "Settings in non-modal window" -#~ msgstr "Configuración en ventana no modal" - -#~ msgid "Layout Options" -#~ msgstr "Opciones de diseño" - -#~ msgid "Text colors" -#~ msgstr "Colores del texto" - -#~ msgid "Save %s as:" -#~ msgstr "Guardar %s como:" - -#~ msgid "Extrusion width" -#~ msgstr "Ancho de extrusión" - -#~ msgid "Vertical shells" -#~ msgstr "Carcasas verticales" - -#~ msgid "Horizontal shells" -#~ msgstr "Carcasas horizontales" - -#~ msgid "Minimum shell thickness" -#~ msgstr "Espesor mínimo de pared" - -#~ msgid "Raft" -#~ msgstr "Balsa" - -#~ msgid "Options for support material and raft" -#~ msgstr "Opciones de material de soporte y balsa" - -#~ msgid "Speed for print moves" -#~ msgstr "Velocidad para movimientos de impresión" - -#~ msgid "Speed for non-print moves" -#~ msgstr "Velocidad para movimientos sin impresión" - -#~ msgid "Acceleration control (advanced)" -#~ msgstr "Control de aceleración (avanzado)" - -#~ msgid "Autospeed (advanced)" -#~ msgstr "Velocidad automática (avanzado)" - -#~ msgid "Ooze prevention" -#~ msgstr "Prevención de goteo" - -#~ msgid "Spiral vase" -#~ msgstr "Modo vaso" - -#~ msgid "Sequential printing" -#~ msgstr "Impresión secuencial" - -#~ msgid "Extruder clearance" -#~ msgstr "Separación del extrusor" - -#~ msgid "Fuzzy skin (experimental)" -#~ msgstr "Piel difusa (experimental)" - -#~ msgid "Notes" -#~ msgstr "Notas" - -#~ msgid "Toolchange parameters with single extruder MM printers" -#~ msgstr "" -#~ "Parámetros del cambio de herramienta para impresoras de un único extrusor " -#~ "MM" - -#~ msgid "Ramming settings" -#~ msgstr "Ajustes de empuje" - -#~ msgid "Color Change G-code" -#~ msgstr "Código G Cambio Color" - -#~ msgid "Pause Print G-code" -#~ msgstr "Pausar Código G de Impresión" - -#~ msgid "Template Custom G-code" -#~ msgstr "Plantilla Código G Personalizado" - -#~ msgid "Maximum feedrates" -#~ msgstr "Avance máximo" - -#~ msgid "Maximum accelerations" -#~ msgstr "Aceleraciones máximas" - -#~ msgid "Jerk limits" -#~ msgstr "Límites del jerk" - -#~ msgid "Minimum feedrates" -#~ msgstr "Avances míninos" - -#~ msgid "Only lift Z" -#~ msgstr "Solo levantar Z" - -#~ msgid "" -#~ "Retraction when tool is disabled (advanced settings for multi-extruder " -#~ "setups)" -#~ msgstr "" -#~ "Retracción cuando la herramienta está desactivada (configuraciones " -#~ "avanzadas para configuraciones de extrusores múltiples )" - -#~ 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 "" -#~ "La opción Limpiar no está disponible cuando se usa el modo Retracción de " -#~ "firmware. ¿Lo inhabilito para habilitar la Retracción de firmware?" - -#~ msgid "Firmware Retraction" -#~ msgstr "Retracción del firmware" - -#~ msgid "" -#~ "Machine limits will be emitted to G-code and used to estimate print time." -#~ msgstr "" -#~ "Los límites de la máquina se emitirán al código G y se utilizarán para " -#~ "calcular el tiempo de impresión." - -#~ msgid "" -#~ "Machine limits will NOT be emitted to G-code, however they will be used " -#~ "to estimate print time, which may therefore not be accurate as the " -#~ "printer may apply a different set of machine limits." -#~ msgstr "" -#~ "Los límites máquina NO se emitirán al código G, sin embargo, se " -#~ "utilizarán para estimar el tiempo de impresión, que por lo tanto puede no " -#~ "ser exacto ya que la impresora puede aplicar un conjunto diferente de " -#~ "límites de la máquina." - -#~ msgid "" -#~ "Machine limits are not set, therefore the print time estimate may not be " -#~ "accurate." -#~ msgstr "" -#~ "Los límites de la máquina no están establecidos, por lo tanto, el tiempo " -#~ "estimado de impresión puede no ser exacto." - -#~ msgid "LOCKED LOCK" -#~ msgstr "CANDADO CERRADO" - -#~ msgid "" -#~ "indicates that the settings are the same as the system (or default) " -#~ "values for the current option group" -#~ msgstr "" -#~ "indica que los ajustes son los mismos que los valores del sistema (o por " -#~ "defecto) para el grupo de opciones actual" - -#~ msgid "UNLOCKED LOCK" -#~ msgstr "CANDADO ABIERTO" - -#~ msgid "" -#~ "indicates that some settings were changed and are not equal to the system " -#~ "(or default) values for the current option group.\n" -#~ "Click the UNLOCKED LOCK icon to reset all settings for current option " -#~ "group to the system (or default) values." -#~ msgstr "" -#~ "indica que se modificaron algunas configuraciones y no son iguales a los " -#~ "valores del sistema (o predeterminados) para el grupo de opciones " -#~ "actual.\n" -#~ "Haz clic en el icono CANDADO DESBLOQUEADO para restablecer todos los " -#~ "ajustes del grupo de opciones actual a los valores del sistema (o " -#~ "predeterminados)." - -#~ msgid "WHITE BULLET" -#~ msgstr "VIÑETA BLANCA" - -#~ msgid "" -#~ "for the left button: indicates a non-system (or non-default) preset,\n" -#~ "for the right button: indicates that the settings hasn't been modified." -#~ msgstr "" -#~ "para el botón izquierdo: indica un ajuste que no es del sistema (o no " -#~ "predeterminado),\n" -#~ "para el botón derecho: indica que la configuración no se ha modificado." - -#~ msgid "BACK ARROW" -#~ msgstr "FLECHA HACIA ATRÁS" - -#~ msgid "" -#~ "indicates that the settings were changed and are not equal to the last " -#~ "saved preset for the current option group.\n" -#~ "Click the BACK ARROW icon to reset all settings for the current option " -#~ "group to the last saved preset." -#~ msgstr "" -#~ "indica que los ajustes cambiaron y no son iguales que los ajustes " -#~ "grabados la última vez para el grupo de opciones actual.\n" -#~ "Haz clic en el símbolo de FLECHA ATRÁS para resetear todos los ajustes " -#~ "del grupo de opciones actual a los grabados la vez anterior." - -#~ msgid "" -#~ "You will not be asked about the unsaved changes the next time you create " -#~ "new project" -#~ msgstr "" -#~ "No se te preguntará por los cambios no guardados la próxima vez que crees " -#~ "un nuevo proyecto" - -#~ msgid "" -#~ "You will not be asked about the unsaved changes the next time you switch " -#~ "a preset" -#~ msgstr "" -#~ "No se te preguntará por los cambios no guardados la próxima vez que " -#~ "cambies de ajuste" - -#~ msgid "" -#~ "Visit \"Preferences\" and check \"%1%\"\n" -#~ "to be asked about unsaved changes again." -#~ msgstr "" -#~ "Visita \"Preferencias\" y marca\"%1%\"\n" -#~ "para que se le pregunte sobre los cambios no guardados nuevamente." - -#~ msgid "Comment:" -#~ msgstr "Comentario:" - -#~ msgid "Wipe tower - Purging volume adjustment" -#~ msgstr "Torre de limpieza - Ajuste del volumen de purga" - -#~ msgid "Expert" -#~ msgstr "Experto" - -#~ msgid "Continue and install configuration updates?" -#~ msgstr "¿Continuar e instalar las actualizaciones de configuración?" - -#~ msgid "" -#~ "Only a single object may be printed at a time in Spiral Vase mode. Either " -#~ "remove all but the last object, or enable sequential mode by " -#~ "\"complete_objects\"." -#~ msgstr "" -#~ "Solo se puede imprimir un objeto a la vez en el modo Vaso en espiral. " -#~ "Elimina todos menos el último objeto o habilita el modo secuencial en " -#~ "\"complete_objects\"." - -#~ msgid "" -#~ "The Wipe Tower is currently only supported with the relative extruder " -#~ "addressing (use_relative_e_distances=1)." -#~ msgstr "" -#~ "En la actualidad, Wipe Tower solo es compatible con el direccionamiento " -#~ "relativo del extrusor (use_relative_e_distances=1)." - -#~ msgid "" -#~ "The Wipe Tower currently does not support volumetric E " -#~ "(use_volumetric_e=0)." -#~ msgstr "" -#~ "La Torre de Limpieza actualmente no es compatible con E volumétrico " -#~ "(use_volumetric_e=0)." - -#~ msgid "" -#~ "The Wipe Tower is only supported for multiple objects if they are printed " -#~ "with the same support_material_contact_distance" -#~ msgstr "" -#~ "La torre de limpieza sólo es compatible con varios objetos si se imprimen " -#~ "con la misma support_material_contact_distance" - -#~ msgid "" -#~ "For the Wipe Tower to work with the soluble supports, the support layers " -#~ "need to be synchronized with the object layers." -#~ msgstr "" -#~ "Para que la Torre de limpieza funcione con soportes solubles, las capas " -#~ "de soportes necesitan estar sincronizadas con las capas del objeto." - -#~ msgid "" -#~ "The Wipe Tower currently supports the non-soluble supports only if they " -#~ "are printed with the current extruder without triggering a tool change. " -#~ "(both support_material_extruder and support_material_interface_extruder " -#~ "need to be set to 0)." -#~ msgstr "" -#~ "La Torre de Limpieza actualmente admite los soportes no solubles solo si " -#~ "están impresos con el extrusor actual sin activar un cambio de " -#~ "herramienta. (Tanto support_material_extruder como " -#~ "support_material_interface_extruder deben configurarse en 0)." - -#~ msgid "Failed processing of the output_filename_format template." -#~ msgstr "Error al procesar la plantilla output_filename_format." - -#~ msgid "Bed shape" -#~ msgstr "Forma de la base de impresión" - -#~ msgid "Bed custom texture" -#~ msgstr "Textura personalizada de la base" - -#~ msgid "Bed custom model" -#~ msgstr "Modelo de base personalizado" - -#~ msgid "Max print height" -#~ msgstr "Máxima altura de impresión" - -#~ msgid "Avoid crossing perimeters" -#~ msgstr "Evita cruzar perímetros" - -#~ msgid "Avoid crossing perimeters - Max detour length" -#~ msgstr "Evitar cruzar perímetros - Longitud máxima del desvío" - -#~ msgid "mm or % (zero to disable)" -#~ msgstr "mm or % (cero para deshabilitar)" - -#~ msgid "" -#~ "This code is inserted between objects when using sequential printing. By " -#~ "default extruder and bed temperature are reset using non-wait command; " -#~ "however if M104, M109, M140 or M190 are detected in this custom code, " -#~ "Slic3r will not add temperature commands. Note that you can use " -#~ "placeholder variables for all Slic3r settings, so you can put a \"M109 " -#~ "S[first_layer_temperature]\" command wherever you want." -#~ msgstr "" -#~ "Este código se inserta entre los objetos cuando se utiliza la impresión " -#~ "secuencial. Por defecto, el extrusor y la temperatura de la cama se " -#~ "reinician utilizando un comando de no espera; sin embargo, si se detectan " -#~ "M104, M109, M140 o M190 en este código personalizado, Slic3r no agregará " -#~ "comandos de temperatura. Tenga en cuenta que puede usar variables de " -#~ "marcador de posición para todas las configuraciones de Slic3r, por lo que " -#~ "puede poner un comando \"M109 S [first_layer_temperature]\" donde lo " -#~ "desee." - -#~ msgid "" -#~ "The number of bottom solid layers is increased above bottom_solid_layers " -#~ "if necessary to satisfy minimum thickness of bottom shell." -#~ msgstr "" -#~ "El número de capas sólidas en la base se incrementa por encima de " -#~ "bottom_solid_layers si es necesario para asegurar un espesor mínimo en la " -#~ "pared de inferior." - -#~ msgid "" -#~ "This is the acceleration your printer will use for bridges. Set zero to " -#~ "disable acceleration control for bridges." -#~ msgstr "" -#~ "Esta es la aceleración que su impresora usará para los puentes. " -#~ "Establezca con el valor cero para deshabilitar el control de aceleración " -#~ "para puentes." - -#~ msgid "Bridging angle" -#~ msgstr "Ángulo de puente" - -#~ msgid "" -#~ "Bridging angle override. If left to zero, the bridging angle will be " -#~ "calculated automatically. Otherwise the provided angle will be used for " -#~ "all bridges. Use 180° for zero angle." -#~ msgstr "" -#~ "Anulación de ángulo de puente. Si se deja en cero, el ángulo de puente se " -#~ "calculará automáticamente. De lo contrario, el ángulo proporcionado se " -#~ "usará para todos los puentes. Usa 180° para ángulo con cero grados." - -#~ msgid "Bridge flow ratio" -#~ msgstr "Relación de flujo del puente" - -#~ msgid "Brim separation gap" -#~ msgstr "Hueco de separación del borde" - -#~ msgid "Clip multi-part objects" -#~ msgstr "Enlazar objetos de varias partes" - -#~ msgid "" -#~ "When printing multi-material objects, this settings will make Slic3r to " -#~ "clip the overlapping object parts one by the other (2nd part will be " -#~ "clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -#~ msgstr "" -#~ "Al imprimir objetos multi-material, esta configuración hará que slic3r " -#~ "recorte las partes del objeto superpuestas una por la otra (la 2da parte " -#~ "será recortada por la 1ra, la 3ra parte será recortada por la 1ra y 2da, " -#~ "etc.)." - -#~ msgid "Colorprint height" -#~ msgstr "Altura de Colorprint" - -#~ msgid "Heights at which a filament change is to occur." -#~ msgstr "Alturas en las que se producirá un cambio de filamento." - -#~ msgid "Complete individual objects" -#~ msgstr "Completar objetos individuales" - -#~ msgid "" -#~ "When printing multiple objects or copies, this feature will complete each " -#~ "object before moving onto next one (and starting it from its bottom " -#~ "layer). This feature is useful to avoid the risk of ruined prints. Slic3r " -#~ "should warn and prevent you from extruder collisions, but beware." -#~ msgstr "" -#~ "Al imprimir múltiples objetos o copias, esta característica completará " -#~ "cada objeto antes de pasar al siguiente (y comenzará desde la capa " -#~ "inferior). Esta función es útil para evitar el riesgo de impresiones " -#~ "arruinadas. Slic3r debería advertirte y evitar las colisiones del " -#~ "extrusor, pero ten cuidado." - -#~ msgid "Cooling tube position" -#~ msgstr "Posición del tubo de refrigeración" - -#~ msgid "" -#~ "Distance of the center-point of the cooling tube from the extruder tip." -#~ msgstr "" -#~ "Distancia desde el centro del tubo de enfriado a la punta del extrusor." - -#~ msgid "Cooling tube length" -#~ msgstr "Longitud del tubo de enfriamiento" - -#~ msgid "" -#~ "Length of the cooling tube to limit space for cooling moves inside it." -#~ msgstr "" -#~ "Longitud del tubo de enfriado para limitar el espacio para movimientos de " -#~ "enfriamiento dentro del mismo." - -#~ msgid "Ensure vertical shell thickness" -#~ msgstr "Asegurar el espesor de la carcasa vertical" - -#~ msgid "" -#~ "Add solid infill near sloping surfaces to guarantee the vertical shell " -#~ "thickness (top+bottom solid layers)." -#~ msgstr "" -#~ "Añade un relleno completo cerca de las superficies inclinadas para " -#~ "garantizar el ancho vertical solicitado (capas sólidas arriba+abajo)." - -#~ msgid "Top fill pattern" -#~ msgstr "Patrón de relleno superior" - -#~ msgid "Bottom fill pattern" -#~ msgstr "Patrón de relleno inferior" - -#~ msgid "External perimeters" -#~ msgstr "Perímetros externos" - -#~ msgid "External perimeters first" -#~ msgstr "Perímetros externos primero" - -#~ msgid "" -#~ "Print contour perimeters from the outermost one to the innermost one " -#~ "instead of the default inverse order." -#~ msgstr "" -#~ "Imprimir perímetros de contorno desde el más externo hasta el más interno " -#~ "en lugar del orden inverso predeterminado." - -#~ msgid "Extrusion axis" -#~ msgstr "Eje de extrusión" - -#~ msgid "" -#~ "Use this option to set the axis letter associated to your printer's " -#~ "extruder (usually E but some printers use A)." -#~ msgstr "" -#~ "Utiliza esta opción para ajustar la letra asociada al extrusor de tu " -#~ "impresora (normalmente se usa E pero otras usan A)." - -#~ msgid "Default extrusion width" -#~ msgstr "Ancho de extrusión por defecto" - -#~ msgid "approximate seconds" -#~ msgstr "segundos aproximadamente" - -#~ msgid "Filament notes" -#~ msgstr "Notas del filamento" - -#~ msgid "You can put your notes regarding the filament here." -#~ msgstr "Puede poner sus notas con respecto al filamento aquí." - -#~ msgid "Loading speed" -#~ msgstr "Velocidad de carga" - -#~ msgid "Speed used for loading the filament on the wipe tower." -#~ msgstr "" -#~ "Velocidad empleada para cargar el filamento en la torre de limpieza." - -#~ msgid "Loading speed at the start" -#~ msgstr "Velocidad de carga al inicio" - -#~ msgid "Speed used at the very beginning of loading phase." -#~ msgstr "Velocidad utilizada al inicio de la fase de carga." - -#~ msgid "Unloading speed" -#~ msgstr "Velocidad de descarga" - -#~ msgid "" -#~ "Speed used for unloading the filament on the wipe tower (does not affect " -#~ "initial part of unloading just after ramming)." -#~ msgstr "" -#~ "Velocidad empleada para descargar el filamento en la torre de limpieza " -#~ "(no afecta a la fase inicial de la descarga, sólo después de empujar)." - -#~ msgid "Unloading speed at the start" -#~ msgstr "Velocidad de descarga al inicio" - -#~ msgid "" -#~ "Speed used for unloading the tip of the filament immediately after " -#~ "ramming." -#~ msgstr "" -#~ "Velocidad utilizada para descargar la punta del filamento inmediatamente " -#~ "después del ramming." - -#~ msgid "Delay after unloading" -#~ msgstr "Retardo tras la descarga" - -#~ msgid "" -#~ "Time to wait after the filament is unloaded. May help to get reliable " -#~ "toolchanges with flexible materials that may need more time to shrink to " -#~ "original dimensions." -#~ msgstr "" -#~ "Tiempo de espera después de que se ha descargado el filamento. Puede " -#~ "ayudar para conseguir cambios de herramienta fiables con materiales " -#~ "flexibles que pueden necesitar más tiempo para encogerse a su tamaño " -#~ "original." - -#~ msgid "Number of cooling moves" -#~ msgstr "Número de movimientos de enfriamiento" - -#~ msgid "" -#~ "Filament is cooled by being moved back and forth in the cooling tubes. " -#~ "Specify desired number of these moves." -#~ msgstr "" -#~ "El filamento se enfría al ser movido hacia adelante y hacia atrás en los " -#~ "tubos de enfriamiento. Especifica el número deseado de estos movimientos." - -#~ msgid "Speed of the first cooling move" -#~ msgstr "Velocidad del primer movimiento de enfriamiento" - -#~ msgid "Cooling moves are gradually accelerating beginning at this speed." -#~ msgstr "" -#~ "Los movimientos de enfriamiento se están acelerando gradualmente " -#~ "comenzando a esta velocidad." - -#~ msgid "Speed of the last cooling move" -#~ msgstr "Velocidad del último movimiento de enfriamiento" - -#~ msgid "Cooling moves are gradually accelerating towards this speed." -#~ msgstr "" -#~ "Los movimientos de enfriamiento se están acelerando gradualmente hacia " -#~ "esta velocidad." - -#~ msgid "" -#~ "Time for the printer firmware (or the Multi Material Unit 2.0) to load a " -#~ "new filament during a tool change (when executing the T code). This time " -#~ "is added to the total print time by the G-code time estimator." -#~ msgstr "" -#~ "Tiempo para que el firmware de la impresora (o la Unidad Multi Material " -#~ "2.0) cargue un filamento durante un cambio de herramienta (al ejecutar el " -#~ "código T). Este tiempo se añade al tiempo total de impresión mediante el " -#~ "estimador de tiempo del código G." - -#~ msgid "Ramming parameters" -#~ msgstr "Parámetros de empuje" - -#~ msgid "" -#~ "This string is edited by RammingDialog and contains ramming specific " -#~ "parameters." -#~ msgstr "" -#~ "Esta cadena se modifica con el Diálogo de Empuje y contiene parámetros " -#~ "específicos de empuje." - -#~ msgid "" -#~ "Time for the printer firmware (or the Multi Material Unit 2.0) to unload " -#~ "a filament during a tool change (when executing the T code). This time is " -#~ "added to the total print time by the G-code time estimator." -#~ msgstr "" -#~ "Tiempo para que el firmware de la impresora (o la Unidad Multi Material " -#~ "2.0) descargue un filamento durante un cambio de herramienta (al ejecutar " -#~ "el código T). Este tiempo se añade al tiempo total de impresión mediante " -#~ "el estimador de tiempo del código G." - -#~ msgid "Filament type" -#~ msgstr "Tipo de filamento" - -#~ msgid "Spool weight" -#~ msgstr "Peso de la bobina" - -#~ msgid "" -#~ "Enter weight of the empty filament spool. One may weigh a partially " -#~ "consumed filament spool before printing and one may compare the measured " -#~ "weight with the calculated weight of the filament with the spool to find " -#~ "out whether the amount of filament on the spool is sufficient to finish " -#~ "the print." -#~ msgstr "" -#~ "Introduce el peso de la bobina de filamento vacía. Se puede pesar una " -#~ "bobina de filamento parcialmente vacía antes de imprimir y se puede " -#~ "comparar el peso medido con el peso calculado del filamento con la bobina " -#~ "para averiguar si la cantidad de filamento en la bobina es suficiente " -#~ "para terminar la impresión." - -#~ msgid "g" -#~ msgstr "g" - -#~ msgid "Fill angle" -#~ msgstr "Ángulo de relleno" - -#~ msgid "Fill density" -#~ msgstr "Densidad de relleno" - -#~ msgid "Fill pattern" -#~ msgstr "Patrón de relleno" - -#~ msgid "First layer speed" -#~ msgstr "Velocidad de la primera capa" - -#~ msgid "Speed of object first layer over raft interface" -#~ msgstr "" -#~ "Velocidad de la primera capa del objeto sobre la interfaz de la balsa" - -#~ msgid "" -#~ "If expressed as absolute value in mm/s, this speed will be applied to all " -#~ "the print moves of the first object layer above raft interface, " -#~ "regardless of their type. If expressed as a percentage (for example: 40%) " -#~ "it will scale the default speeds." -#~ msgstr "" -#~ "Si se expresa como valor absoluto en mm/s, esta velocidad se aplicará a " -#~ "todos los movimientos de impresión de la primera capa del objeto por " -#~ "encima de la interfaz de la balsa, independientemente de su tipo. Si se " -#~ "expresa como porcentaje (por ejemplo: 40%) escalará las velocidades por " -#~ "defecto." - -#~ msgid "" -#~ "Fan speed will be ramped up linearly from zero at layer " -#~ "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer" -#~ "\". \"full_fan_speed_layer\" will be ignored if lower than " -#~ "\"disable_fan_first_layers\", in which case the fan will be running at " -#~ "maximum allowed speed at layer \"disable_fan_first_layers\" + 1." -#~ msgstr "" -#~ "La velocidad del ventilador aumentará linealmente desde cero en la capa " -#~ "\"disable_fan_first_layers\" al máximo en la capa \"full_fan_speed_layer" -#~ "\". \"full_fan_speed_layer\" será ignorada si es menor que " -#~ "\"disable_fan_first_layers\",en cuyo caso el ventilador funcionará a la " -#~ "velocidad máxima permitida en la capa \"disable_fan_first_layers\" + 1." - -#~ msgid "Verbose G-code" -#~ msgstr "Código G detallado" - -#~ msgid "" -#~ "Enable this to get a commented G-code file, with each line explained by a " -#~ "descriptive text. If you print from SD card, the additional weight of the " -#~ "file could make your firmware slow down." -#~ msgstr "" -#~ "Habilítelo para obtener un archivo de código G comentado, con cada línea " -#~ "explicada por un texto descriptivo. Si imprime desde una tarjeta SD, el " -#~ "peso adicional del archivo podría ralentizar su firmware." - -#~ msgid "High extruder current on filament swap" -#~ msgstr "Alta intensidad en el extrusor durante el cambio de filamento" - -#~ msgid "" -#~ "It may be beneficial to increase the extruder motor current during the " -#~ "filament exchange sequence to allow for rapid ramming feed rates and to " -#~ "overcome resistance when loading a filament with an ugly shaped tip." -#~ msgstr "" -#~ "Puede ser beneficioso aumentar la corriente del motor del extrusor " -#~ "durante la secuencia de intercambio de filamentos para permitir " -#~ "velocidades de alimentación de rampa rápidas y superar la resistencia " -#~ "cuando se carga un filamento con una punta de forma fea." - -#~ msgid "" -#~ "This is the acceleration your printer will use for infill. Set zero to " -#~ "disable acceleration control for infill." -#~ msgstr "" -#~ "Esta es la aceleración que su impresora usará para el relleno. Establezca " -#~ "con el valor cero para deshabilitar el control de aceleración para el " -#~ "relleno." - -#~ msgid "Infill before perimeters" -#~ msgstr "Rellenar antes que los perímetros" - -#~ msgid "" -#~ "This option will switch the print order of perimeters and infill, making " -#~ "the latter first." -#~ msgstr "" -#~ "Esta opción cambiará el orden de impresión de los perímetros y el " -#~ "relleno, haciendo que el último sea el primero." - -#~ msgid "" -#~ "This option will limit infill to the areas actually needed for supporting " -#~ "ceilings (it will act as internal support material). If enabled, slows " -#~ "down the G-code generation due to the multiple checks involved." -#~ msgstr "" -#~ "Esta opción limitará el relleno a las áreas realmente necesarias para " -#~ "soportar techos (actuará como material de soporte interno). Si está " -#~ "habilitado, ralentiza la generación del código G debido a las múltiples " -#~ "comprobaciones involucradas." - -#~ msgid "Infill/perimeters overlap" -#~ msgstr "Superposición de relleno/perímetros" - -#~ msgid "Enable ironing" -#~ msgstr "Activar alisado" - -#~ msgid "" -#~ "Enable ironing of the top layers with the hot print head for smooth " -#~ "surface" -#~ msgstr "" -#~ "Habilitar el alisado de las capas superiores con el cabezal de impresión " -#~ "caliente para obtener una superficie lisa" - -#~ msgid "Flow rate" -#~ msgstr "Tasa de flujo" - -#~ msgid "Spacing between ironing passes" -#~ msgstr "Separación entre pasadas de alisado" - -#~ msgid "Supports remaining times" -#~ msgstr "Compatible con tiempos restantes" - -#~ msgid "How to apply limits" -#~ msgstr "Cómo aplicar límites" - -#~ msgid "Purpose of Machine Limits" -#~ msgstr "Propósito de los Límites Máquina" - -#~ msgid "How to apply the Machine Limits" -#~ msgstr "Cómo aplicar los Límites Máquina" - -#~ msgid "Emit to G-code" -#~ msgstr "Emitir a código G" - -#~ msgid "Use for time estimate" -#~ msgstr "Usar para la estimación de tiempo" - -#~ msgid "Ignore" -#~ msgstr "Ignorar" - -#~ msgid "Maximum feedrate X" -#~ msgstr "Máxima velocidad en X" - -#~ msgid "Maximum feedrate Y" -#~ msgstr "Máxima velocidad en Y" - -#~ msgid "Maximum feedrate Z" -#~ msgstr "Máximo avance en Z" - -#~ msgid "Maximum feedrate E" -#~ msgstr "Máximo avance E" - -#~ msgid "Maximum feedrate of the X axis" -#~ msgstr "Máximo avance en el eje X" - -#~ msgid "Maximum feedrate of the Y axis" -#~ msgstr "Máximo avance del eje Y" - -#~ msgid "Maximum feedrate of the Z axis" -#~ msgstr "Máximo avance del eje Z" - -#~ msgid "Maximum feedrate of the E axis" -#~ msgstr "Máximo avance del eje E" - -#~ msgid "Minimal filament extrusion length" -#~ msgstr "Longitud mínima de filamento extruido" - -#~ msgid "" -#~ "Generate no less than the number of skirt loops required to consume the " -#~ "specified amount of filament on the bottom layer. For multi-extruder " -#~ "machines, this minimum applies to each extruder." -#~ msgstr "" -#~ "Generar no menos que el número de bucles de falda requeridos para " -#~ "consumir la cantidad especificada de filamento en la capa inferior. Para " -#~ "máquinas multi-extrusoras, este mínimo se aplica a cada extrusora." - -#~ msgid "Configuration notes" -#~ msgstr "Notas de configuración" - -#~ msgid "" -#~ "You can put here your personal notes. This text will be added to the G-" -#~ "code header comments." -#~ msgstr "" -#~ "Puede poner sus notas personales aquí. Este texto se añadirá al código G " -#~ "como comentarios." - -#~ msgid "Host Type" -#~ msgstr "Tipo de host" - -#~ msgid "" -#~ "Slic3r can upload G-code files to a printer host. This field must contain " -#~ "the kind of the host." -#~ msgstr "" -#~ "Slic3r puede subir archivos de código G a un host de impresión. Este " -#~ "campo debe contener el tipo de host." - -#~ msgid "Only retract when crossing perimeters" -#~ msgstr "Solo retraer al cruzar perímetros" - -#~ msgid "Output filename format" -#~ msgstr "Formato de nombre de salida" - -#~ msgid "" -#~ "You can use all configuration options as variables inside this template. " -#~ "For example: [layer_height], [fill_density] etc. You can also use " -#~ "[timestamp], [year], [month], [day], [hour], [minute], [second], " -#~ "[version], [input_filename], [input_filename_base]." -#~ msgstr "" -#~ "Puedes usar todas las opciones de configuración como las variables dentro " -#~ "de esta muestra. Por ejemplo [layer_height], [fill_density] etc.También " -#~ "puedes usar [timestamp], [year], [month], [day], [hour], [minute], " -#~ "[second], [version], [input_filename], [input_filename_base]." - -#~ msgid "Detect bridging perimeters" -#~ msgstr "Detectar perímetros con puentes" - -#~ msgid "Filament parking position" -#~ msgstr "Posición de aparcar el filamento" - -#~ msgid "" -#~ "Distance of the extruder tip from the position where the filament is " -#~ "parked when unloaded. This should match the value in printer firmware." -#~ msgstr "" -#~ "Distancia de la punta del extrusor desde la posición donde el filamento " -#~ "es colocado cuando se descarga. Esto debería coincidir con el valor en el " -#~ "firmware de la impresora." - -#~ msgid "Extra loading distance" -#~ msgstr "Distancia de carga adicional" - -#~ msgid "" -#~ "When set to zero, the distance the filament is moved from parking " -#~ "position during load is exactly the same as it was moved back during " -#~ "unload. When positive, it is loaded further, if negative, the loading " -#~ "move is shorter than unloading." -#~ msgstr "" -#~ "Cuando se establece en cero, la distancia que el filamento se mueve desde " -#~ "la posición de estacionamiento durante la carga es exactamente la misma " -#~ "que se usó durante la descarga. Cuando es positivo, se carga más lejos, " -#~ "si es negativo, el movimiento de carga es más corto que el de descarga." - -#~ msgid "Perimeters" -#~ msgstr "Perímetros" - -#~ msgid "" -#~ "This is the acceleration your printer will use for perimeters. Set zero " -#~ "to disable acceleration control for perimeters." -#~ msgstr "" -#~ "Esta es la aceleración que usará su impresora para los perímetros. " -#~ "Establezca con el valor cero para deshabilitar el control de aceleración " -#~ "de los perímetros." - -#~ msgid "Printer notes" -#~ msgstr "Notas de la impresora" - -#~ msgid "You can put your notes regarding the printer here." -#~ msgstr "Puede poner sus notas con respecto a la impresora aquí." - -#~ msgid "Printer vendor" -#~ msgstr "Fabricante de la impresora" - -#~ msgid "Name of the printer vendor." -#~ msgstr "Nombre del fabricante de la impresora." - -#~ msgid "Slice resolution" -#~ msgstr "Resolución del laminado" - -#~ msgid "" -#~ "Minimum detail resolution, used to simplify the input file for speeding " -#~ "up the slicing job and reducing memory usage. High-resolution models " -#~ "often carry more detail than printers can render. Set to zero to disable " -#~ "any simplification and use full resolution from input." -#~ msgstr "" -#~ "Resolución mínima de detalles, utilizada para simplificar el archivo de " -#~ "entrada para acelerar el trabajo de laminado y reducir el uso de memoria. " -#~ "Los modelos de alta resolución suelen llevar más detalles de los que las " -#~ "impresoras pueden ofrecer. Establézcalo en cero para desactivar cualquier " -#~ "simplificación y usar la resolución completa de la entrada." - -#~ msgid "G-code resolution" -#~ msgstr "Resolución del código G" - -#~ msgid "Above Z" -#~ msgstr "Encima de Z" - -#~ msgid "Only lift Z above" -#~ msgstr "Solo levantar Z mayor que" - -#~ msgid "" -#~ "If you set this to a positive value, Z lift will only take place above " -#~ "the specified absolute Z. You can tune this setting for skipping lift on " -#~ "the first layers." -#~ msgstr "" -#~ "Si establece esto en un valor positivo, la elevación de Z solo tendrá " -#~ "lugar por encima de la Z absoluta especificada. Puede ajustar esta " -#~ "configuración para omitir el levantamiento en las primeras capas." - -#~ msgid "Below Z" -#~ msgstr "Por debajo de Z" - -#~ msgid "Only lift Z below" -#~ msgstr "Solo levantar Z menor que" - -#~ msgid "" -#~ "If you set this to a positive value, Z lift will only take place below " -#~ "the specified absolute Z. You can tune this setting for limiting lift to " -#~ "the first layers." -#~ msgstr "" -#~ "Si configura esto en un valor positivo, la elevación Z solo tendrá lugar " -#~ "por debajo de la Z absoluta especificada. Puede ajustar esta " -#~ "configuración para limitar la elevación a las primeras capas." - -#~ msgid "Distance from brim/object" -#~ msgstr "Distancia del borde/objeto" - -#~ msgid "Loops (minimum)" -#~ msgstr "Bucles (mínimo)" - -#~ msgid "Solid infill threshold area" -#~ msgstr "Área del umbral de relleno sólido" - -#~ msgid "Solid infill every" -#~ msgstr "Relleno sólido cada" - -#~ msgid "" -#~ "This feature allows to force a solid layer every given number of layers. " -#~ "Zero to disable. You can set this to any value (for example 9999); Slic3r " -#~ "will automatically choose the maximum possible number of layers to " -#~ "combine according to nozzle diameter and layer height." -#~ msgstr "" -#~ "Esta característica permite forzar una capa sólida en cada número de " -#~ "capas. Cero para deshabilitar. Puede establecer esto en cualquier valor " -#~ "(por ejemplo, 9999); Slic3r seleccionará automáticamente la cantidad " -#~ "máxima posible de capas para combinar según el diámetro de la boquilla y " -#~ "la altura de la capa." - -#~ msgid "Color change G-code" -#~ msgstr "Código G Cambio color" - -#~ msgid "This G-code will be used as a code for the color change" -#~ msgstr "Este código G se utilizará como código para el cambio de color" - -#~ msgid "This G-code will be used as a code for the pause print" -#~ msgstr "Este código G se utilizará como código para la pausa de impresión" - -#~ msgid "This G-code will be used as a custom code" -#~ msgstr "Este código G se utilizará como código personalizado" - -#~ msgid "Top contact Z distance" -#~ msgstr "Distancia Z de contacto superior" - -#~ msgid "" -#~ "The vertical distance between object and support material interface. " -#~ "Setting this to 0 will also prevent Slic3r from using bridge flow and " -#~ "speed for the first object layer." -#~ msgstr "" -#~ "La distancia vertical entre el objeto y la interfaz del material de " -#~ "soporte. Establecer esto en 0 también evitará que Slic3r use el flujo y " -#~ "la velocidad del puente para la primera capa de los objetos." - -#~ msgid "" -#~ "The vertical distance between the object top surface and the support " -#~ "material interface. If set to zero, support_material_contact_distance " -#~ "will be used for both top and bottom contact Z distances." -#~ msgstr "" -#~ "La distancia vertical entre la superficie superior del objeto y la " -#~ "interfaz del material de soporte. Si se establece en cero, " -#~ "support_material_contact_distance se utilizará para las distancias Z de " -#~ "contacto superior e inferior." - -#~ msgid "" -#~ "Number of interface layers to insert between the object(s) and support " -#~ "material. Set to -1 to use support_material_interface_layers" -#~ msgstr "" -#~ "Número de capas de interfaz a insertar entre el objeto(s) y el material " -#~ "de soporte. Establezcer a -1 para utilizar " -#~ "support_material_interface_layers" - -#~ msgid "Pattern" -#~ msgstr "Patrón" - -#~ msgid "Pattern spacing" -#~ msgstr "Separación entre patrones" - -#~ msgid "Synchronize with object layers" -#~ msgstr "Sincronizar con las capas del objeto" - -#~ msgid "" -#~ "Synchronize support layers with the object print layers. This is useful " -#~ "with multi-material printers, where the extruder switch is expensive." -#~ msgstr "" -#~ "Sincronizar las capas de soporte con las capas de impresión del objeto. " -#~ "Esto es útil con impresoras de múltiples materiales, donde el cambio de " -#~ "el extrusor es costoso." - -#~ msgid "Overhang threshold" -#~ msgstr "Umbral de voladizos" - -#~ msgid "Detect thin walls" -#~ msgstr "Detecta paredes delgadas" - -#~ msgid "Threads" -#~ msgstr "Núcleos" - -#~ msgid "" -#~ "Threads are used to parallelize long-running tasks. Optimal threads " -#~ "number is slightly above the number of available cores/processors." -#~ msgstr "" -#~ "Núcleos usados para tareas multi-recurso. Número óptimo de núcleos es " -#~ "ligeramente sobre el numero de núcleos/procesadores disponibles." - -#~ msgid "" -#~ "The number of top solid layers is increased above top_solid_layers if " -#~ "necessary to satisfy minimum thickness of top shell. This is useful to " -#~ "prevent pillowing effect when printing with variable layer height." -#~ msgstr "" -#~ "El número de capas sólidas en la parte superior se incrementa sobre " -#~ "top_solid_layers si es necesario para satisfacer la altura mínima de la " -#~ "tapa superior. Esto es útil para prevenir el efecto de achatado cuando se " -#~ "imprime con altura de capa variable." - -#~ msgid "Use firmware retraction" -#~ msgstr "Usar la retracción del firmware" - -#~ msgid "" -#~ "This experimental setting uses G10 and G11 commands to have the firmware " -#~ "handle the retraction. This is only supported in recent Marlin." -#~ msgstr "" -#~ "Esta configuración experimental utiliza comandos G10 y G11 para que el " -#~ "firmware maneje la retracción. Esto solo se admite en Marlin reciente." - -#~ msgid "Use relative E distances" -#~ msgstr "Usar las distancias relativas en E" - -#~ msgid "" -#~ "If your firmware requires relative E values, check this, otherwise leave " -#~ "it unchecked. Most firmwares use absolute values." -#~ msgstr "" -#~ "Si su firmware requiere valores E relativos, verifique esto, de lo " -#~ "contrario, deje sin marcar. La mayoría de los firmwares usan valores " -#~ "absolutos." - -#~ msgid "Use volumetric E" -#~ msgstr "Usar E volumétrico" - -#~ msgid "" -#~ "This experimental setting uses outputs the E values in cubic millimeters " -#~ "instead of linear millimeters. If your firmware doesn't already know " -#~ "filament diameter(s), you can put commands like 'M200 " -#~ "D[filament_diameter_0] T0' in your start G-code in order to turn " -#~ "volumetric mode on and use the filament diameter associated to the " -#~ "filament selected in Slic3r. This is only supported in recent Marlin." -#~ msgstr "" -#~ "Este ajuste experimental utiliza como salida del E valores en milímetros " -#~ "cúbicos en lugar de milímetros lineales. Si su firmware aún no conoce el " -#~ "(los) diámetro (s) del filamento, puede poner comandos como 'M200 D " -#~ "[filament_diameter_0] T0' en su código G inicial para activar el modo " -#~ "volumétrico y usar el diámetro del filamento asociado al filamento " -#~ "seleccionado. en Slic3r. Esto solo se admite en Marlin reciente." - -#~ msgid "Enable variable layer height feature" -#~ msgstr "Habilitar la función de altura de capa variable" - -#~ msgid "" -#~ "Some printers or printer setups may have difficulties printing with a " -#~ "variable layer height. Enabled by default." -#~ msgstr "" -#~ "Algunas impresoras o configuraciones de impresora pueden tener " -#~ "dificultades para imprimir con una altura de capa variable. Habilitado " -#~ "por defecto." - -#~ msgid "XY Size Compensation" -#~ msgstr "Compensación de tamaño XY" - -#~ msgid "" -#~ "The object will be grown/shrunk in the XY plane by the configured value " -#~ "(negative = inwards, positive = outwards). This might be useful for fine-" -#~ "tuning hole sizes." -#~ msgstr "" -#~ "El objeto se crecerá / reducirá en el plano XY por el valor configurado " -#~ "(negativo = hacia adentro, positivo = hacia afuera). Esto podría ser útil " -#~ "para ajustar el tamaño de los orificios." - -#~ msgid "SLA print material notes" -#~ msgstr "Notas del material de impresión de SLA" - -#~ msgid "You can put your notes regarding the SLA print material here." -#~ msgstr "Puede poner tus notas sobre el material de impresión de SLA aquí." - -#~ msgid "Export OBJ" -#~ msgstr "Exportar OBJ" - -#~ msgid "Export the model(s) as OBJ." -#~ msgstr "Exportar el(los) objeto(s) como OBJ." - -#~ msgid "Export SLA" -#~ msgstr "Exportar SLA" - -#~ msgid "Slice the model and export SLA printing layers as PNG." -#~ msgstr "" -#~ "Laminar el modelo y exportar las capas de impresión de SLA como PNG." - -#~ msgid "Export the model(s) as 3MF." -#~ msgstr "Exportar el(los) objeto(s) como 3MF." - -#~ msgid "Export AMF" -#~ msgstr "Exportar AMF" - -#~ msgid "Export the model(s) as AMF." -#~ msgstr "Exportar el(los) objeto(s) como AMF." - -#~ msgid "Export STL" -#~ msgstr "Exportar STL" - -#~ msgid "Export the model(s) as STL." -#~ msgstr "Exportar el(los) objeto(s) como STL." - -#~ msgid "Slice the model and export toolpaths as G-code." -#~ msgstr "Laminar el modelo y exportar las trayectorias como código G." - -#~ msgid "" -#~ "Slice the model as FFF or SLA based on the printer_technology " -#~ "configuration value." -#~ msgstr "" -#~ "Laminar el modelo como FFF o SLA basado en el valor de configuración de " -#~ "printer_technology." - -#~ msgid "Show this help." -#~ msgstr "Mostrar esta ayuda." - -#~ msgid "Help (FFF options)" -#~ msgstr "Ayuda (opciones FFF)" - -#~ msgid "Show the full list of print/G-code configuration options." -#~ msgstr "" -#~ "Muestra la lista completa de opciones de configuración de impresión/G-" -#~ "code." - -#~ msgid "Help (SLA options)" -#~ msgstr "Ayuda (opciones SLA)" - -#~ msgid "Show the full list of SLA print configuration options." -#~ msgstr "" -#~ "Muestra la lista completa de opciones de configuración de impresión SLA." - -#~ msgid "Write information about the model to the console." -#~ msgstr "Escribir información sobre el modelo en la consola." - -#~ msgid "Save config file" -#~ msgstr "Guardar archivo de configuración" - -#~ msgid "Save configuration to the specified file." -#~ msgstr "Guarda la configuración al archivo especificado." - -#~ msgid "Align XY" -#~ msgstr "Alinear XY" - -#~ msgid "Align the model to the given point." -#~ msgstr "Alinear el modelo a un punto dado." - -#~ msgid "Cut model at the given Z." -#~ msgstr "Cortar modelo a una Z dada." - -#~ msgid "Center" -#~ msgstr "Centro" - -#~ msgid "Center the print around the given center." -#~ msgstr "Centrar la impresión alrededor del centro dado." - -#~ msgid "Ensure on bed" -#~ msgstr "Asegurar en la base" - -#~ msgid "" -#~ "Lift the object above the bed when it is partially below. Enabled by " -#~ "default, use --no-ensure-on-bed to disable." -#~ msgstr "" -#~ "Eleva el objeto por encima de la cama cuando está parcialmente debajo. " -#~ "Activado por defecto, usa --no-ensure-on-bed para desactivarlo." - -#~ msgid "Duplicate" -#~ msgstr "Duplicar" - -#~ msgid "Multiply copies by this factor." -#~ msgstr "Multiplicar las copias por este factor." - -#~ msgid "Duplicate by grid" -#~ msgstr "Duplicar por cuadrícula" - -#~ msgid "Multiply copies by creating a grid." -#~ msgstr "Multiplicar copias creando una rejilla." - -#~ msgid "" -#~ "Arrange the supplied models in a plate and merge them in a single model " -#~ "in order to perform actions once." -#~ msgstr "" -#~ "Organizar los modelos suministrados en una base y combinarlos en un solo " -#~ "modelo para realizar acciones una vez." - -#~ msgid "" -#~ "Try to repair any non-manifold meshes (this option is implicitly added " -#~ "whenever we need to slice the model to perform the requested action)." -#~ msgstr "" -#~ "Intenta reparar cualquier malla no múltiple (esta opción se agrega " -#~ "implícitamente cada vez que necesitamos laminar el modelo para realizar " -#~ "la acción solicitada)." - -#~ msgid "Rotation angle around the Z axis in degrees." -#~ msgstr "Ángulo de rotación alrededor del eje Z en grados." - -#~ msgid "Rotate around X" -#~ msgstr "Rotar alrededor del eje X" - -#~ msgid "Rotation angle around the X axis in degrees." -#~ msgstr "Ángulo de rotación alrededor del eje X en grados." - -#~ msgid "Rotate around Y" -#~ msgstr "Rotar alrededor del eje Y" - -#~ msgid "Rotation angle around the Y axis in degrees." -#~ msgstr "Ángulo de rotación alrededor del eje Y en grados." - -#~ msgid "Scaling factor or percentage." -#~ msgstr "Factor de escalado o porcentaje." +#~ "Do you want to synchronize your personal data from Bambu Cloud? \n" +#~ "Contains the following information:\n" +#~ "1. Process presets\n" +#~ "2. Filament presets\n" +#~ "3. Printer presets\n" #~ msgid "" -#~ "Detect unconnected parts in the given model(s) and split them into " -#~ "separate objects." +#~ "Don't retract when the travel is in infill area absolutely. That means " +#~ "the oozing can't been seen" #~ msgstr "" -#~ "Detectadas piezas desconectadas en el(los) modelo(s) dado(s) y " -#~ "divídido(s) en objetos separados." - -#~ msgid "Scale to Fit" -#~ msgstr "Escalar para Adaptarse" +#~ "No se repliegue cuando el recorrido esté en zona de relleno " +#~ "absolutamente. Eso significa que el rezago no puede ser visto" -#~ msgid "Scale to fit the given volume." -#~ msgstr "Escalar para ajustarse al volumen dado." +#~ msgid "Fix model locally" +#~ msgstr "Fijar el modelo localmente" -#~ msgid "Ignore non-existent config files" -#~ msgstr "Ignorar archivos de configuración inexistentes" - -#~ msgid "Do not fail if a file supplied to --load does not exist." -#~ msgstr "No fallar si el archivo suministrado para --load no existe." +#~ msgid "Fix model through cloud" +#~ msgstr "Fijar el modelo a través de la nube" #~ msgid "" -#~ "Forward-compatibility rule when loading configurations from config files " -#~ "and project files (3MF, AMF)." +#~ "Heat the nozzle to target \n" +#~ "temperature" #~ msgstr "" -#~ "Regla de compatibilidad al cargar configuraciones desde archivos de " -#~ "configuración y archivos de proyecto (3MF, AMF)." - -#~ msgid "Bail out on unknown configuration values" -#~ msgstr "Salir en caso de valores de configuración desconocidos" +#~ "Calentar la boquilla a la temperatura deseada \n" +#~ "temperatura" -#~ msgid "" -#~ "Enable reading unknown configuration values by verbosely substituting " -#~ "them with defaults." -#~ msgstr "" -#~ "Permite la lectura de valores de configuración desconocidos " -#~ "sustituyéndolos verbosamente por los predeterminados." +#~ msgid "In the calibration of extrusion flow" +#~ msgstr "In the calibration of extrusion flow" -#~ msgid "" -#~ "Enable reading unknown configuration values by silently substituting them " -#~ "with defaults." -#~ msgstr "" -#~ "Permite leer valores de configuración desconocidos sustituyéndolos " -#~ "silenciosamente por los predeterminados." +#~ msgid "In the calibration of laser scanner" +#~ msgstr "In the calibration of laser scanner" -#~ msgid "Load config file" -#~ msgstr "Cargar archivo de configuración" +#~ msgid "Module" +#~ msgstr "Módulo" -#~ msgid "" -#~ "Load configuration from the specified file. It can be used more than once " -#~ "to load options from multiple files." -#~ msgstr "" -#~ "Cargar la configuración desde el archivo especificado. Se puede usar más " -#~ "de una vez para cargar opciones de varios archivos." +#~ msgid "New version of Bambu Studio" +#~ msgstr "Nueva versión de Bambu Studio" -#~ msgid "Output File" +#~ msgid "Output file" #~ msgstr "Archivo de salida" -#~ msgid "" -#~ "The file where the output will be written (if not specified, it will be " -#~ "based on the input file)." -#~ msgstr "" -#~ "El archivo donde se escribirá el resultado (si no se especifica, se " -#~ "basará en en archivo de entrada)." - -#~ msgid "Single instance mode" -#~ msgstr "Modo de instancia única" - -#~ msgid "Data directory" -#~ msgstr "Directorio de datos" - -#~ msgid "" -#~ "Load and store settings at the given directory. This is useful for " -#~ "maintaining different profiles or including configurations from a network " -#~ "storage." -#~ msgstr "" -#~ "Cargar y almacenar configuraciones en el directorio dado. Esto es útil " -#~ "para mantener diferentes perfiles o incluir configuraciones desde un " -#~ "almacenamiento de red." - -#~ msgid "Logging level" -#~ msgstr "Nivel de registro" - -#~ msgid "" -#~ "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" -#~ "trace\n" -#~ "For example. loglevel=2 logs fatal, error and warning level messages." -#~ msgstr "" -#~ "Ajusta el nivel de avisos: 0:fallo, 1:error, 2:peligro, 3:info, 4:" -#~ "depuración, 5:traza\n" -#~ "Por ejemplo. loglevel=2 registrará mensajes de fallo, error y peligro." - -#~ msgid "Render with a software renderer" -#~ msgstr "Renderizar con un software renderizador" - -#~ msgid "" -#~ "Render with a software renderer. The bundled MESA software renderer is " -#~ "loaded instead of the default OpenGL driver." -#~ msgstr "" -#~ "Render con un software de renderizado. El procesador de software MESA " -#~ "incluido se carga en lugar del controlador OpenGL predeterminado." - -#~ msgid "" -#~ "Fuzzy skin\n" -#~ "Did you know that you can create rough fibre-like texture on the sides of " -#~ "your models using theFuzzy skinfeature? You can also use modifiers " -#~ "to apply fuzzy-skin only to a portion of your model." -#~ msgstr "" -#~ "Piel difusa\n" -#~ "¿Sabías que puedes crear una textura rugosa similar a la de la fibra en " -#~ "los laterales de tus modelos utilizando la funciónPiel difusa? " -#~ "También puedes utilizar modificadores para aplicar la piel difusa sólo a " -#~ "una parte de tu modelo." - -#~ msgid "" -#~ "Arrange settings\n" -#~ "Did you know that you can right-click theArrange iconto adjust the " -#~ "size of the gap between objects and to allow automatic rotations?" -#~ msgstr "" -#~ "Ajustes de organización\n" -#~ "¿Sabías que puedes hacer clic con el botón derecho del ratón en el " -#~ "iconoOrdenar para ajustar el tamaño del espacio entre los objetos " -#~ "y permitir las rotaciones automáticas?" - -#~ msgid "" -#~ "Simplify mesh\n" -#~ "Did you know that you can reduce the number of triangles in a mesh using " -#~ "the Simplify mesh feature? Right-click the model and select Simplify " -#~ "model. Read more in the documentation." -#~ msgstr "" -#~ "Simplificar malla\n" -#~ "¿Sabías que puedes reducir el número de triángulos de una malla mediante " -#~ "la función Simplificar malla? Haz clic con el botón derecho del ratón en " -#~ "el modelo y selecciona Simplificar modelo. Más información en la " -#~ "documentación." - -#~ msgid "" -#~ "Hiding sidebar\n" -#~ "Did you know that you can hide the right sidebar using the shortcut " -#~ "Shift+Tab? You can also enable the icon for this from " -#~ "thePreferences." -#~ msgstr "" -#~ "Ocultar la barra lateral\n" -#~ "¿Sabías que puedes ocultar la barra lateral derecha con el atajo Mayús" -#~ "+Tab? También puedes habilitar el icono para ello desde las " -#~ "Preferencias." - -#~ msgid "" -#~ "Perspective camera\n" -#~ "Did you know that you can use the K key to quickly switch between " -#~ "an orthographic and perspective camera?" -#~ msgstr "" -#~ "Cámara en perspectiva\n" -#~ "¿Sabías que puedes utilizar la tecla K para cambiar rápidamente " -#~ "entre una cámara ortográfica y otra en perspectiva?" - -#~ msgid "" -#~ "Camera Views\n" -#~ "Did you know that you can use the number keys 0-6 to quickly " -#~ "switch between predefined camera angles?" -#~ msgstr "" -#~ "Vistas de la cámara\n" -#~ "¿Sabías que puedes utilizar las teclas numéricas 0-6 para cambiar " -#~ "rápidamente entre los ángulos de cámara predefinidos?" - -#~ msgid "" -#~ "Place on face\n" -#~ "Did you know that you can quickly orient a model so that one of its faces " -#~ "sits on the print bed? Select thePlace on facefunction or press " -#~ "the F key." -#~ msgstr "" -#~ "Colocar en la cara\n" -#~ "¿Sabías que puede orientar rápidamente un modelo para que una de sus " -#~ "caras se sitúe en la cama de impresión? Selecciona la función Colocar " -#~ "en la cara o pulse la tecla F." - -#~ msgid "" -#~ "Set number of instances\n" -#~ "Did you know that you can right-click a model and set an exact number of " -#~ "instances instead of copy-pasting it several times?" -#~ msgstr "" -#~ "Establecer el número de instancias\n" -#~ "¿Sabías que puedes hacer clic con el botón derecho en un modelo y " -#~ "establecer un número exacto de instancias en lugar de copiar y pegar " -#~ "varias veces?" - -#~ msgid "" -#~ "Combine infill\n" -#~ "Did you know that you can print the infill with a higher layer height " -#~ "compared to perimeters to save print time using the settingCombine " -#~ "infill every." -#~ msgstr "" -#~ "Combinar relleno\n" -#~ "Sabías que puede imprimir el relleno con una altura de capa mayor que la " -#~ "de los perímetros para ahorrar tiempo de impresión utilizando el ajuste " -#~ "Combinar relleno cada." - -#~ msgid "" -#~ "Variable layer height\n" -#~ "Did you know that you can print different regions of your model with a " -#~ "different layer height and smooth the transitions between them? Try " -#~ "theVariable layer height tool.(Not available for SLA printers.)" -#~ msgstr "" -#~ "Altura de capa variable\n" -#~ "¿Sabías que puede imprimir diferentes regiones de tu modelo con una " -#~ "altura de capa diferente y suavizar las transiciones entre ellas? Prueba " -#~ "la herramientaAltura de capa variable.(No disponible para " -#~ "impresoras SLA.)" - -#~ msgid "" -#~ "Undo/redo history\n" -#~ "Did you know that you can right-click theundo/redo arrowsto see " -#~ "the history of changes and to undo or redo several actions at once?" -#~ msgstr "" -#~ "Historial de deshacer/rehacer\n" -#~ "¿Sabías que puedes hacer clic con el botón derecho del ratón en las " -#~ "flechas dedeshacer/rehacer para ver el historial de cambios y " -#~ "deshacer o rehacer varias acciones a la vez?" - -#~ msgid "" -#~ "Different layer height for each model\n" -#~ "Did you know that you can print each model on the plater with a different " -#~ "layer height? Right-click the model in the 3D view, choose Layers and " -#~ "Perimeters and adjust the values in the right panel. Read more in the " -#~ "documentation." -#~ msgstr "" -#~ "Altura de capa diferente para cada modelo\n" -#~ "¿Sabías que puedes imprimir cada modelo en el plater con una altura de " -#~ "capa diferente? Haz clic con el botón derecho del ratón en el modelo en " -#~ "la vista 3D, elige Capas y Perímetros y ajusta los valores en el panel " -#~ "derecho. Lee más en la documentación." - -#~ msgid "" -#~ "Solid infill threshold area\n" -#~ "Did you know that you can make parts of your model with a small cross-" -#~ "section be filled with solid infill automatically? Set theSolid infill " -#~ "threshold area.(Expert mode only.)" -#~ msgstr "" -#~ "Área umbral de relleno sólido\n" -#~ "¿Sabías que puede hacer que las partes de su modelo con una sección " -#~ "transversal pequeña se rellenen con relleno sólido automáticamente? " -#~ "Ajusta elÁrea umbral de relleno sólido. (Sólo en modo Experto.)" - -#~ msgid "" -#~ "Box selection\n" -#~ "Did you know that you can do a box selection with Shift+Mouse drag? You " -#~ "can also box-deselect objects with Alt+Mouse drag." -#~ msgstr "" -#~ "Selección de caja\n" -#~ "¿Sabías que puedes hacer una selección de caja con Mayús+Arrastre del " -#~ "ratón? También puedes hacer una selección de caja con Alt+Arrastre " -#~ "del ratón." - -#~ msgid "" -#~ "Zoom on selected objects or on all objects if none selected\n" -#~ "Did you know that you can zoom in on selected objects by pressing the " -#~ "Z key? If none are selected, the camera will zoom on all objects " -#~ "in the scene." -#~ msgstr "" -#~ "Zoom sobre los objetos seleccionados o sobre todos los objetos si no hay " -#~ "ninguno seleccionado\n" -#~ "¿Sabías que puedes hacer zoom sobre los objetos seleccionados pulsando la " -#~ "tecla Z? Si no hay ninguno seleccionado, la cámara hará zoom sobre " -#~ "todos los objetos de la escena." - -#~ msgid "" -#~ "Printable toggle\n" -#~ "Did you know that you can disable the G-code generation for the selected " -#~ "model without having to move or delete it? Toggle the Printable property " -#~ "of a model from the Right-click context menu." -#~ msgstr "" -#~ "Activación de la impresión\n" -#~ "¿Sabías que puedes desactivar la generación de código G para el modelo " -#~ "seleccionado sin tener que moverlo o eliminarlo? Alterna la propiedad " -#~ "Imprimible de un modelo desde el menú contextual del botón derecho del " -#~ "ratón." - -#~ msgid "" -#~ "Mirror\n" -#~ "Did you know that you can mirror the selected model to create a reversed " -#~ "version of it? Right-click the model, select Mirror and pick the mirror " -#~ "axis." -#~ msgstr "" -#~ "Mirror\n" -#~ "Did you know that you can mirror the selected model to create a reversed " -#~ "version of it? Right-click the model, select Mirror and pick the mirror " -#~ "axis." - -#~ msgid "" -#~ "PageUp / PageDown quick rotation by 45 degrees\n" -#~ "Did you know that you can quickly rotate selected models by 45 degrees " -#~ "around the Z-axis clockwise or counter-clockwise by pressing Page Up or Page Down respectively?" -#~ msgstr "" -#~ "Rotación rápida de 45 grados con Re Pag / Av Pag\n" -#~ "¿Sabías que puedes girar rápidamente los modelos seleccionados 45 grados " -#~ "alrededor del eje Z en el sentido de las agujas del reloj o en sentido " -#~ "contrario pulsando Re Pag o Av Pag respectivamente?" - -#~ msgid "" -#~ "Load config from G-code\n" -#~ "Did you know that you can use File-Import-Import Config to load print, " -#~ "filament and printer profiles from an existing G-code file? Similarly, " -#~ "you can use File-Import-Import SL1 / SL1S archive, which also lets you " -#~ "reconstruct 3D models from the voxel data." -#~ msgstr "" -#~ "Cargar configuración desde G-code\n" -#~ "¿Sabías que puedes usar Archivo-Importar-Configuración para cargar " -#~ "perfiles de impresión, filamento e impresora desde un archivo G-code " -#~ "existente? Del mismo modo, puedes utilizar Archivo-Importar-Importar " -#~ "archivo SL1 / SL1S, que también te permite reconstruir modelos 3D a " -#~ "partir de los datos de voxel." - -#~ msgid "" -#~ "Ironing\n" -#~ "Did you know that you can smooth top surfaces of prints using Ironing? " -#~ "The nozzle will run a special second infill phase at the same layer to " -#~ "fill in holes and flatten any lifted plastic. Read more in the " -#~ "documentation. (Requires Advanced or Expert mode.)" -#~ msgstr "" -#~ "Planchado\n" -#~ "¿Sabías que puedes suavizar las superficies superiores de las impresiones " -#~ "con el planchado? La boquilla realizará una segunda fase de relleno " -#~ "especial en la misma capa para rellenar cualquier ranura y aplanar " -#~ "cualquier plástico levantado. Lee más en la documentación. (Requiere el " -#~ "modo avanzado o experto). " - -#~ msgid "" -#~ "Paint-on supports\n" -#~ "Did you know that you can paint directly on the object and select areas, " -#~ "where supports should be enforced or blocked? Try thePaint-on " -#~ "supportsfeature. (Requires Advanced or Expert mode.)" -#~ msgstr "" -#~ "Soportes pintables\n" -#~ "¿Sabía que puede pintar directamente sobre el objeto y seleccionar las " -#~ "zonas en las que deben reforzarse o bloquearse los soportes? Prueba la " -#~ "función Soportes pintables. (Requiere el modo Avanzado o Experto)." - -#~ msgid "" -#~ "Paint-on seam\n" -#~ "Did you know that you can paint directly on the object and select where " -#~ "to place the start/endpoint of each perimeter loop? Try theSeam " -#~ "paintingfeature. (Requires Advanced or Expert mode.)" -#~ msgstr "" -#~ "Pintado de costuras\n" -#~ "¿Sabías que puedes pintar directamente sobre el objeto y seleccionar " -#~ "dónde colocar el punto de inicio/fin de cada bucle perimetral? Prueba la " -#~ "funciónPintado de costuras. (Requiere el modo Avanzado o Experto)." - -#~ msgid "" -#~ "Insert Pause\n" -#~ "Did you know that you can schedule the print to pause at a specific " -#~ "layer? Right-click the layer slider in the Preview and select Add pause " -#~ "print (M601). This can be used to insert magnets, weights or nuts into " -#~ "your prints. Read more in the documentation." -#~ msgstr "" -#~ "Insertar Pausa\n" -#~ "¿Sabías que puedes programar la impresión para que se detenga en una capa " -#~ "específica? Haz clic con el botón derecho del ratón en el control " -#~ "deslizante de la capa en la vista previa y selecciona Añadir pausa de " -#~ "impresión (M601). Esto se puede utilizar para insertar imanes, pesos o " -#~ "tuercas en sus impresiones. Lee más en la documentación." - -#~ msgid "" -#~ "Insert Custom G-code\n" -#~ "Did you know that you can insert a custom G-code at a specific layer? " -#~ "Left-click the layer in the Preview, Right-click the plus icon and select " -#~ "Add custom G-code. With this function you can, for example, create a " -#~ "temperature tower. Read more in the documentation." -#~ msgstr "" -#~ "Insertar código G personalizado\n" -#~ "¿Sabías que puede insertar un código G personalizado en una capa " -#~ "específica? Haz clic con el botón izquierdo del ratón sobre la capa en la " -#~ "vista previa, haz clic con el botón derecho del ratón sobre el icono del " -#~ "signo más y selecciona Añadir código G personalizado. Con esta función " -#~ "puedes, por ejemplo, crear una torre de temperatura. Lee más en la " -#~ "documentación." - -#~ msgid "" -#~ "Configuration snapshots\n" -#~ "Did you know that roll back to a complete backup of all system and user " -#~ "profiles? You can view and move back and forth between snapshots using " -#~ "the Configuration - Configuration snapshots menu." -#~ msgstr "" -#~ "Instantáneas de la configuración\n" -#~ "¿Sabías que se puede retroceder a una copia de seguridad completa de " -#~ "todos los perfiles del sistema y de los usuarios? Puede ver y avanzar " -#~ "entre las instantáneas utilizando el menú Configuración - Instantáneas " -#~ "de la configuración." - -#~ msgid "" -#~ "Minimum shell thickness\n" -#~ "Did you know that instead of the number of top and bottom layers, you can " -#~ "define theMinimum shell thicknessin millimeters? This feature is " -#~ "especially useful when using the variable layer height function." -#~ msgstr "" -#~ "Espesor mínimo de la carcasa\n" -#~ "¿Sabías que en lugar del número de capas superiores e inferiores, puede " -#~ "definir elEspesor mínimo de la carcasa en milímetros? Esta " -#~ "característica es especialmente útil cuando se utiliza la función de " -#~ "altura de capa variable." - -#~ msgid "" -#~ "Settings in non-modal window\n" -#~ "Did you know that you can open the Settings in a new non-modal window? " -#~ "This means you can have settings open on one screen and the G-code " -#~ "Preview on the other. Go to thePreferencesand select Settings in " -#~ "non-modal window." -#~ msgstr "" -#~ "Configuración en ventana no modal\n" -#~ "¿Sabías que puedes abrir la Configuración en una nueva ventana no modal? " -#~ "Esto significa que puedes tener la configuración abierta en una pantalla " -#~ "y la Vista previa del código G en la otra. Ves a Preferencias y " -#~ "selecciona Configuración en la ventana no modal." - -#~ msgid "" -#~ "Adaptive infills\n" -#~ "Did you know that you can use the Adaptive cubic and Support cubic " -#~ "infills to decrease the print time and lower the filament consumption? " -#~ "Read more in the documentation." -#~ msgstr "" -#~ "Rellenos adaptables\n" -#~ "¿Sabías que puede utilizar los rellenos Cúbico adaptable y Cúbicos de " -#~ "soporte para reducir el tiempo de impresión y el consumo de filamento? " -#~ "Lee más en la documentación." - -#~ msgid "Interface pattern spacing" -#~ msgstr "Separación de patrón de interfaz" - -#~ msgid "" -#~ "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " -#~ "community." -#~ msgstr "" -#~ "PrusaSlicer está basado en Slic3r de Alessandro Ranellucci y la comunidad " -#~ "RepRap." - -#~ msgid "" -#~ "Please save your project and restart PrusaSlicer. We would be glad if you " -#~ "reported the issue." -#~ msgstr "" -#~ "Por favor, guarda tu proyecto y reinicia PrusaSlicer. Estaremos " -#~ "encantados de que nos informes del problema." - -#~ msgid "PrusaSlicer version" -#~ msgstr "Versión PrusaSlicer" - -#~ msgid "min PrusaSlicer version" -#~ msgstr "mínima versión PrusaSlicer" - -#~ msgid "max PrusaSlicer version" -#~ msgstr "máxima versión PrusaSlicer" - -#~ msgid "Associate .3mf files to PrusaSlicer" -#~ msgstr "Asociar archivos .3mf a PrusaSlicer" - -#~ msgid "Associate .stl files to PrusaSlicer" -#~ msgstr "Asociar archivos .stl a PrusaSlicer" - -#~ msgid "" -#~ "PrusaSlicer's user interfaces comes in three variants:\n" -#~ "Simple, Advanced, and Expert.\n" -#~ "The Simple mode shows only the most frequently used settings relevant for " -#~ "regular 3D printing. The other two offer progressively more sophisticated " -#~ "fine-tuning, they are suitable for advanced and expert users, " -#~ "respectively." -#~ msgstr "" -#~ "Las interfaces de usuario de PrusaSlicer tiene tres variantes:\n" -#~ "Simple, avanzado y experto.\n" -#~ "El modo Simple muestra solo las configuraciones usadas con más frecuencia " -#~ "relevantes para la impresión 3D normal. Los otros dos ofrecen ajustes " -#~ "progresivamente más sofisticados, son adecuados para usuarios avanzados y " -#~ "expertos, respectivamente." - -#~ msgid "The following SLA printer models have no materials selected:" -#~ msgstr "" -#~ "Los siguientes modelos de impresoras SLA no tienen filamento seleccionado:" - -#~ msgid "" -#~ "Do you want to select default SLA materials for these printer models?" -#~ msgstr "" -#~ "¿Desea seleccionar materiales SLA predeterminados para estos modelos de " -#~ "impresora?" - -#~ msgid "Some SLA materials were uninstalled." -#~ msgstr "Se han desinstalado algunos materiales SLA." - -#~ msgid "" -#~ "Performing desktop integration failed - could not create Gcodeviewer " -#~ "desktop file. PrusaSlicer desktop file was probably created successfully." -#~ msgstr "" -#~ "Falló la integración del escritorio - no se ha podido crear el archivo de " -#~ "escritorio de Gcodeviewer. El archivo de escritorio de PrusaSlicer se " -#~ "creó probablemente con éxito." - -#~ msgid "Flash!" -#~ msgstr "Flash!" - -#~ msgid "Flashing in progress. Please do not disconnect the printer!" -#~ msgstr "Flasheo en curso. ¡Por favor no desconecte la impresora!" - -#~ msgid "Flashing failed" -#~ msgstr "Falló el flasheo" - -#~ msgid "Flashing succeeded!" -#~ msgstr "¡Exito al flashear!" - -#~ msgid "Flashing failed. Please see the avrdude log below." -#~ msgstr "Flasheo fallido. Por favor comprueba el log de avrdude." - -#~ msgid "Flashing cancelled." -#~ msgstr "Flasheo cancelado." - -#~ msgid "" -#~ "This firmware hex file does not match the printer model.\n" -#~ "The hex file is intended for: %s\n" -#~ "Printer reported: %s\n" -#~ "\n" -#~ "Do you want to continue and flash this hex file anyway?\n" -#~ "Please only continue if you are sure this is the right thing to do." -#~ msgstr "" -#~ "Este archivo hex del firmware no se corresponde con el modelo de " -#~ "impresora. El archivo hex está preparado para: %s\n" -#~ "Esta Impresora: %s\n" -#~ "\n" -#~ "¿Quieres continuar y grabar este archivo hex de todos modos?\n" -#~ "Por favor continúa solo si estás seguro de que es lo correcto." - -#~ msgid "" -#~ "Multiple %s devices found. Please only connect one at a time for flashing." -#~ msgstr "" -#~ "Se encontraron múltiples dispositivos %s. Por favor, conecta solo uno a " -#~ "la vez para flashear." - -#~ msgid "" -#~ "The %s device was not found.\n" -#~ "If the device is connected, please press the Reset button next to the USB " -#~ "connector ..." -#~ msgstr "" -#~ "No se encontró el dispositivo %s. \n" -#~ "Si el dispositivo está conectado, presione el botón Reset al lado del " -#~ "conector USB ..." - -#~ msgid "The %s device could not have been found" -#~ msgstr "El dispositivo %s no se pudo encontrar" - -#~ msgid "Error accessing port at %s: %s" -#~ msgstr "Error al acceder al puerto en %s: %s" - -#~ msgid "Error: %s" -#~ msgstr "Error: %s" - -#~ msgid "Firmware flasher" -#~ msgstr "Flasheador de firmware" - -#~ msgid "Firmware image:" -#~ msgstr "Imagen del firmware:" - -#~ msgid "Serial port:" -#~ msgstr "Puerto serie:" - -#~ msgid "Autodetected" -#~ msgstr "Detectado automáticamente" - -#~ msgid "Rescan" -#~ msgstr "Rescanear" - -#~ msgid "Progress:" -#~ msgstr "Progreso:" - -#~ msgid "Status:" -#~ msgstr "Estado:" - -#~ msgid "Ready" -#~ msgstr "Listo" - -#~ msgid "Advanced: Output log" -#~ msgstr "Avanzado: Registro de salida" - -#~ msgid "" -#~ "Are you sure you want to cancel firmware flashing?\n" -#~ "This could leave your printer in an unusable state!" -#~ msgstr "" -#~ "¿Estás seguro de cancelar el flasheo del firmware?\n" -#~ "¡Esto podría dejar tu impresora en un estado inusable!" - -#~ msgid "Confirmation" -#~ msgstr "Confirmación" - -#~ msgid "Cancelling..." -#~ msgstr "Cancelando..." - -#~ msgid "Select shape from the gallery" -#~ msgstr "Seleccionar la forma en la galería" - -#~ msgid "Add to bed" -#~ msgstr "Añadir a la cama" - -#~ msgid "Add selected shape(s) to the bed" -#~ msgstr "Añadir la(s) forma(s) seleccionada(s) a la base" - -#~ msgid "Add one or more custom shapes" -#~ msgstr "Añadir una o más formas personalizadas" - -#~ msgid "Delete one or more custom shape. You can't delete system shapes" -#~ msgstr "" -#~ "Eliminar una o varias formas personalizadas. No se pueden eliminar las " -#~ "formas del sistema" - -#~ msgid "Choose one or more files (STL, OBJ):" -#~ msgstr "Elije uno o varios archivos (STL, OBJ):" - -#~ msgid "" -#~ "It looks like selected %1%-file has an error or is destructed.\n" -#~ "We can't load this file" -#~ msgstr "" -#~ "Parece que el archivo %1% seleccionado tiene un error o está destruido.\n" -#~ "No podemos cargar este archivo" - -#~ msgid "Choose one PNG file:" -#~ msgstr "Elije un archivo PNG:" - -#~ msgid "Replacing of the PNG" -#~ msgstr "Sustitución del PNG" - -#~ msgid "Change thumbnail" -#~ msgstr "Cambiar la miniatura" - -#~ msgid "Loading of the \"%1%\"" -#~ msgstr "Cargando de la \"%1%\"" - -#~ msgid "Head diameter" -#~ msgstr "Diámetro de la cabeza" - -#~ msgid "Lock supports under new islands" -#~ msgstr "Bloquear soportes bajo nuevas islas" - -#~ msgid "Remove selected points" -#~ msgstr "Eliminar puntos seleccionados" - -#~ msgid "Remove all points" -#~ msgstr "Eliminar todos los puntos" - -#~ msgid "Apply changes" -#~ msgstr "Aplicar cambios" - -#~ msgid "Discard changes" -#~ msgstr "Descartar los cambios" - -#~ msgid "Minimal points distance" -#~ msgstr "Distancia mínima de puntos" - -#~ msgid "Auto-generate points" -#~ msgstr "Auto-generar puntos" - -#~ msgid "Manual editing" -#~ msgstr "Edición manual" - -#~ msgid "Add support point" -#~ msgstr "Añadir punto de soporte" - -#~ msgid "Delete support point" -#~ msgstr "Borra punto de apoyo" - -#~ msgid "Change point head diameter" -#~ msgstr "Cambiar diámetro de la cabeza de punta" - -#~ msgid "Support parameter change" -#~ msgstr "Cambio de parámetros de soporte" - -#~ msgid "SLA Support Points" -#~ msgstr "Puntos de soporte SLA" - -#~ msgid "Do you want to save your manually edited support points?" -#~ msgstr "¿Deseas guardar tus puntos de soporte editados manualmente?" - -#~ msgid "Save support points?" -#~ msgstr "¿Guardar puntos de apoyo?" - -#~ msgid "Move support point" -#~ msgstr "Mover punto de soporte" - -#~ msgid "Support points edit" -#~ msgstr "Edición de puntos de soporte" - -#~ msgid "Autogeneration will erase all manually edited points." -#~ msgstr "La autogeneración borrará todos los puntos editados manualmente." - -#~ msgid "Are you sure you want to do it?" -#~ msgstr "¿Estás seguro de que quieres hacerlo?" - -#~ msgid "Autogenerate support points" -#~ msgstr "Genera los puntos de apoyo automáticamente" - -#~ msgid "SLA gizmo keyboard shortcuts" -#~ msgstr "Herramienta de atajos de teclado SLA" - -#~ msgid "Note: some shortcuts work in (non)editing mode only." -#~ msgstr "" -#~ "Nota: algunos accesos directos funcionan solo en modo de (no)edición." - -#~ msgid "Left click" -#~ msgstr "Clic izquierdo" - -#~ msgid "Add point" -#~ msgstr "Añadir punto" - -#~ msgid "Right click" -#~ msgstr "Clic derecho" - -#~ msgid "Remove point" -#~ msgstr "Retirar punto" - -#~ msgid "Drag" -#~ msgstr "Arrastra" - -#~ msgid "Move point" -#~ msgstr "Mover punto" - -#~ msgid "Add point to selection" -#~ msgstr "Añadir punto a selección" - -#~ msgid "Remove point from selection" -#~ msgstr "Retirar punto de selección" - -#~ msgid "Deselect by rectangle" -#~ msgstr "Deseleccionar mediante rectángulo" - -#~ msgid "Select all points" -#~ msgstr "Seleccionar todos los puntos" - -#~ msgid "Move clipping plane" -#~ msgstr "Mover plano de recorte" - -#~ msgid "Reset clipping plane" -#~ msgstr "Restablecer plano de recorte" - -#~ msgid "Switch to editing mode" -#~ msgstr "Cambiar al modo edición" - -#~ msgid "" -#~ "Most likely the configuration was produced by a newer version of " -#~ "PrusaSlicer or by some PrusaSlicer fork." -#~ msgstr "" -#~ "Lo más probable es que la configuración haya sido producida por una " -#~ "versión más reciente de PrusaSlicer o por algún fork de PrusaSlicer." - -#~ msgid "Developed by Prusa Research." -#~ msgstr "Desarrollado por Prusa Research." - -#~ msgid "" -#~ "PrusaSlicer has encountered a localization error. Please report to " -#~ "PrusaSlicer team, what language was active and in which scenario this " -#~ "issue happened. Thank you.\n" -#~ "\n" -#~ "The application will now terminate." -#~ msgstr "" -#~ "PrusaSlicer ha encontrado un error de localización. Por favor, informa al " -#~ "equipo de PrusaSlicer qué idioma estaba activo y en qué escenario ocurrió " -#~ "este problema. Gracias.\n" -#~ "\n" -#~ "La aplicación terminará ahora." - -#~ msgid "" -#~ "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " -#~ "manually delete the file to recover from the error. Your user profiles " -#~ "will not be affected." -#~ msgstr "" -#~ "Error al analizar el archivo de configuración de PrusaSlicer, " -#~ "probablemente está dañado. Intenta eliminar manualmente el archivo para " -#~ "recuperarse del error. Tus perfiles de usuario no se verán afectados." - -#~ msgid "" -#~ "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try " -#~ "to manually delete the file to recover from the error." -#~ msgstr "" -#~ "Error al analizar el archivo de configuración de PrusaGCodeViewer, " -#~ "probablemente esté dañado. Intenta eliminar manualmente el archivo para " -#~ "recuperarse del error." - -#~ msgid "" -#~ "You are running a 32 bit build of PrusaSlicer on 64-bit Windows.\n" -#~ "32 bit build of PrusaSlicer will likely not be able to utilize all the " -#~ "RAM available in the system.\n" -#~ "Please download and install a 64 bit build of PrusaSlicer from https://" -#~ "www.prusa3d.cz/prusaslicer/.\n" -#~ "Do you wish to continue?" -#~ msgstr "" -#~ "Está ejecutando una versión de 32 bits de PrusaSlicer en Windows de 64 " -#~ "bits.\n" -#~ "La versión de 32 bits de PrusaSlicer probablemente no podrá utilizar toda " -#~ "la RAM disponible en el sistema.\n" -#~ "Por favor, descarga e instala una versión de 64 bits de PrusaSlice desde " -#~ "https://www.prusa3d.cz/prusaslicer/.\n" -#~ "¿Desea continuar?" - -#~ msgid "" -#~ "But since this version of PrusaSlicer we don't show this information in " -#~ "Printer Settings anymore.\n" -#~ "Settings will be available in physical printers settings." -#~ msgstr "" -#~ "Pero dado que a partir de esta versión de PrusaSlicer ya no mostramos " -#~ "esta información en los ajustes de impresora.\n" -#~ "Los ajustes se mostrarán en la configuración de impresora física." - -#~ msgid "PrusaSlicer: Open hyperlink" -#~ msgstr "PrusaSlicer: Abrir hipervínculo" - -#~ msgid "Choose SLA archive:" -#~ msgstr "Elegir archivo SLA:" - -#~ msgid "Import file" -#~ msgstr "Importar archivo" - -#~ msgid "Import model and profile" -#~ msgstr "Importar modelo y perfil" - -#~ msgid "Import profile only" -#~ msgstr "Importar perfil únicamente" - -#~ msgid "Import model only" -#~ msgstr "Importar modelo únicamente" - -#~ msgid "Accurate" -#~ msgstr "Preciso" - -#~ msgid "Balanced" -#~ msgstr "Balanceado" - -#~ msgid "Quick" -#~ msgstr "Rápido" - -#~ msgid "Importing SLA archive" -#~ msgstr "Importando archivo SLA" - -#~ msgid "" -#~ "The SLA archive doesn't contain any presets. Please activate some SLA " -#~ "printer preset first before importing that SLA archive." -#~ msgstr "" -#~ "El archivo SLA no contiene ningún ajuste. Por favor, activa primero algún " -#~ "preajuste de la impresora SLA antes de importar ese archivo SLA." - -#~ msgid "Importing canceled." -#~ msgstr "Importación cancelada." - -#~ msgid "Importing done." -#~ msgstr "Importación finalizada." - -#~ msgid "" -#~ "The imported SLA archive did not contain any presets. The current SLA " -#~ "presets were used as fallback." -#~ msgstr "" -#~ "El archivo SLA importado no contenía ningún preajuste. Los preajustes " -#~ "actuales de SLA se utilizaron como reserva." - -#~ msgid "Open a new PrusaSlicer instance" -#~ msgstr "Abrir instancia nueva de PrusaSlicer" - -#~ msgid "PrusaSlicer is closing" -#~ msgstr "PrusaSlicer se está cerrando" - -#~ msgid "Closing PrusaSlicer while some presets are modified." -#~ msgstr "Cerrando PrusaSlicer mientras se modifican algunos ajustes." - -#~ msgid "Closing PrusaSlicer. Current project is modified." -#~ msgstr "Cerrando PrusaSlicer. Se modifica el proyecto actual." - -#~ msgid "" -#~ "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run " -#~ "correctly, \n" -#~ "while OpenGL version %s, render %s, vendor %s was detected." -#~ msgstr "" -#~ "PrusaSlicer requiere el controlador de gráficos OpenGL 2.0 para que " -#~ "funcione correctamente, \n" -#~ "mientras que la versión %s OpenGL, renderizado %s, vendedor %s fue " -#~ "detectada." - -#~ msgid "" -#~ "As a workaround, you may run PrusaSlicer with a software rendered 3D " -#~ "graphics by running prusa-slicer.exe with the --sw-renderer parameter." -#~ msgstr "" -#~ "Como solución, puedes ejecutar PrusaSlicer con gráficos 3D renderizados " -#~ "por software ejecutando prusa-slicer.exe con el parámetro --sw-renderer." - -#~ msgid "PrusaSlicer will remember your choice." -#~ msgstr "PrusaSlicer recordará tu elección." - -#~ msgid "PrusaSlicer: Don't ask me again" -#~ msgstr "PrusaSlicer: No me vuelvas a preguntar" - -#~ msgid "" -#~ "The dimensions of the object from file %s seem to be defined in meters.\n" -#~ "The internal unit of PrusaSlicer is a millimeter. Do you want to " -#~ "recalculate the dimensions of the object?" -#~ msgid_plural "" -#~ "The dimensions of some objects from file %s seem to be defined in " -#~ "meters.\n" -#~ "The internal unit of PrusaSlicer is a millimeter. Do you want to " -#~ "recalculate the dimensions of these objects?" -#~ msgstr[0] "" -#~ "Las dimensiones del objeto del archivo %s parecen estar definidas en " -#~ "metros. La unidad interna de PrusaSlicer es el milímetro. ¿Quieres " -#~ "recalcular las dimensiones del objeto?" -#~ msgstr[1] "" -#~ "Las dimensiones de algunos objetos del archivo %s parecen estar definidas " -#~ "en metros. La unidad interna de PrusaSlicer es el milímetro. ¿Quiere " -#~ "recalcular las dimensiones de estos objetos?" - -#~ msgid "" -#~ "The dimensions of the object from file %s seem to be defined in inches.\n" -#~ "The internal unit of PrusaSlicer is a millimeter. Do you want to " -#~ "recalculate the dimensions of the object?" -#~ msgid_plural "" -#~ "The dimensions of some objects from file %s seem to be defined in " -#~ "inches.\n" -#~ "The internal unit of PrusaSlicer is a millimeter. Do you want to " -#~ "recalculate the dimensions of these objects?" -#~ msgstr[0] "" -#~ "Las dimensiones del objeto del archivo %s parecen estar definidas en " -#~ "pulgadas. La unidad interna de PrusaSlicer es el milímetro. ¿Quiere " -#~ "recalcular las dimensiones del objeto?" -#~ msgstr[1] "" -#~ "Las dimensiones de algunos objetos del archivo %s parecen estar definidas " -#~ "en pulgadas. La unidad interna de PrusaSlicer es el milímetro. ¿Quiere " -#~ "recalcular las dimensiones de estos objetos?" - -#~ msgid "" -#~ "If enabled, sets PrusaSlicer as default application to open .3mf files." -#~ msgstr "" -#~ "Si está habilitado, establece a PrusaSlicer como aplicación " -#~ "predeterminada para abrir archivos .3mf." - -#~ msgid "" -#~ "If enabled, sets PrusaSlicer as default application to open .stl files." -#~ msgstr "" -#~ "Si está habilitado, establece a PrusaSlicer como aplicación " -#~ "predeterminada para abrir archivos .stl." - -#~ msgid "Allow just a single PrusaSlicer instance" -#~ msgstr "Permitir una sola instancia de PrusaSlicer" - -#~ msgid "" -#~ "If this is enabled, when starting PrusaSlicer and another instance of the " -#~ "same PrusaSlicer is already running, that instance will be reactivated " -#~ "instead." -#~ msgstr "" -#~ "Si está habilitado, al iniciar PrusaSlicer y ya se está ejecutando otra " -#~ "instancia del mismo PrusaSlicer, esa instancia se reactivará en su lugar." - -#~ msgid "" -#~ "Always ask for unsaved changes, when: \n" -#~ "- Closing PrusaSlicer while some presets are modified,\n" -#~ "- Loading a new project while some presets are modified" -#~ msgstr "" -#~ "Preguntar siempre por los cambios no guardados, cuando: \n" -#~ "- Al cerrar PrusaSlicer mientras se modifican algunos ajustes,\n" -#~ "- Cargar un nuevo proyecto mientras se modifican algunos ajustes" - -#~ msgid "Associate .gcode files to PrusaSlicer G-code Viewer" -#~ msgstr "Asociar archivos .gcode al Visor de CódigoG de PrusaSlicer" - -#~ msgid "" -#~ "If enabled, sets PrusaSlicer G-code Viewer as default application to " -#~ "open .gcode files." -#~ msgstr "" -#~ "Si está habilitado, establece el Visor de CódigoG de PrusaSlicer como " -#~ "aplicación predeterminada para abrir archivos .gcode." - -#~ msgid "" -#~ "We do not send any personal information nor anything that would allow us " -#~ "to identify you later. To detect duplicate entries, a unique number " -#~ "derived from your system is sent, but the source information cannot be " -#~ "reconstructed. Apart from that, only general data about your OS, hardware " -#~ "and OpenGL installation are sent. PrusaSlicer is open source, if you want " -#~ "to inspect the code actually performing the communication, see %1%." -#~ msgstr "" -#~ "No enviamos ninguna información personal ni nada que nos permita " -#~ "identificarle posteriormente. Para detectar entradas duplicadas, se envía " -#~ "un número único derivado de su sistema, pero la información de origen no " -#~ "puede reconstruirse. Aparte de eso, sólo se envían datos generales sobre " -#~ "tu sistema operativo, hardware e instalación de OpenGL. PrusaSlicer es de " -#~ "código abierto, si quiere inspeccionar el código que realmente realiza la " -#~ "comunicación, vea %1%." - -#~ msgid "Blacklisted libraries loaded into PrusaSlicer process:" -#~ msgstr "Bibliotecas de la lista negra cargadas en el proceso PrusaSlicer:" - -#~ msgid "" -#~ "You will not be asked about the unsaved changes the next time you: \n" -#~ "- Closing PrusaSlicer while some presets are modified,\n" -#~ "- Loading a new project while some presets are modified" -#~ msgstr "" -#~ "No se te preguntará por los cambios no guardados la próxima vez que lo " -#~ "hagas: \n" -#~ "- Cerrar PrusaSlicer mientras se modifican algunos ajustes,\n" -#~ "- Cargar un nuevo proyecto mientras se modifican algunos ajustes" - -#~ msgid "PrusaSlicer will remember your action." -#~ msgstr "PrusaSlicer recordará tu acción." - -#~ msgid "" -#~ "PrusaSlicer is not using the newest configuration available.\n" -#~ "Configuration Wizard may not offer the latest printers, filaments and SLA " -#~ "materials to be installed." -#~ msgstr "" -#~ "PrusaSlicer no utiliza la configuración más reciente disponible.\n" -#~ "Es posible que el Asistente de Configuración no muestre las últimas " -#~ "impresoras, filamentos y materiales SLA para instalar." - -#~ msgid "Mismatched type of print host: %s" -#~ msgstr "Tipo de host de impresión no coincidente: %s" - -#~ msgid "Connection to AstroBox works correctly." -#~ msgstr "La conexión a Astrobox funciona correctamente." - -#~ msgid "Could not connect to AstroBox" -#~ msgstr "No se pudo conectar con Astrobox" - -#~ msgid "Note: AstroBox version at least 1.1.0 is required." -#~ msgstr "Aviso: Se necesita la versión 1.1.0 o superior de AstroBox." - -#~ msgid "Connection to Duet works correctly." -#~ msgstr "La conexión con la Duet funciona correctamente." - -#~ msgid "Could not connect to Duet" -#~ msgstr "No se pudo conectar con la Duet" - -#~ msgid "Unknown error occured" -#~ msgstr "Ha ocurrido un error desconocido" - -#~ msgid "Wrong password" -#~ msgstr "Contraseña incorrecta" - -#~ msgid "Could not get resources to create a new connection" -#~ msgstr "No se pudieron obtener recursos para crear una nueva conexión" - -#~ msgid "Upload not enabled on FlashAir card." -#~ msgstr "Subida no activada a tarjeta FlashAir." - -#~ msgid "Connection to FlashAir works correctly and upload is enabled." -#~ msgstr "" -#~ "La conexión a FlashAir funciona correctamente y la carga está habilitada." - -#~ msgid "Could not connect to FlashAir" -#~ msgstr "No puedo conectar con FlashAir" - -#~ msgid "" -#~ "Note: FlashAir with firmware 2.00.02 or newer and activated upload " -#~ "function is required." -#~ msgstr "" -#~ "Nota: Requiere FlashAir con firmware 2.00.02 o posterior y la función de " -#~ "carga activada." - -#~ msgid "Connection to OctoPrint works correctly." -#~ msgstr "La conexión a OctoPrint funciona correctamente." - -#~ msgid "Could not connect to OctoPrint" -#~ msgstr "No puedo conectar con OctoPrint" - -#~ msgid "Note: OctoPrint version at least 1.1.0 is required." -#~ msgstr "Nota: Se necesita al menos la versión 1.1.0 de OctoPrint." - -#~ msgid "Connection to Prusa SL1 / SL1S works correctly." -#~ msgstr "La conexión con la Prusa SL1 / SL1S funciona correctamente." - -#~ msgid "Could not connect to Prusa SLA" -#~ msgstr "No se pudo conectar con la Prusa SLA" - -#~ msgid "Connection to PrusaLink works correctly." -#~ msgstr "La conexión con PrusaLink funciona correctamente." - -#~ msgid "Could not connect to PrusaLink" -#~ msgstr "No se pudo conectar con PrusaLink" - -#~ msgid "" -#~ "Could not detect system SSL certificate store. PrusaSlicer will be unable " -#~ "to establish secure network connections." -#~ msgstr "" -#~ "No se pudo detectar el almacén de certificados SSL del sistema. " -#~ "PrusaSlicer no podrá establecer conexiones de red seguras." - -#~ msgid "PrusaSlicer detected system SSL certificate store in: %1%" -#~ msgstr "" -#~ "PrusaSlicer detectó el almacenamiento de certificados SSL del sistema en: " -#~ "%1%" - -#~ msgid "" -#~ "CURL init has failed. PrusaSlicer will be unable to establish network " -#~ "connections. See logs for additional details." -#~ msgstr "" -#~ "CURL init ha fallado. PrusaSlicer no podrá establecer conexiones de red. " -#~ "Consulta los registros para obtener detalles adicionales." - -#~ msgid "Connection to Repetier works correctly." -#~ msgstr "La conexión con Repetier funciona correctamente." - -#~ msgid "Could not connect to Repetier" -#~ msgstr "No se ha podido conectar con Repetier" - -#~ msgid "Note: Repetier version at least 0.90.0 is required." -#~ msgstr "Nota: Se requiere la versión 0.90.0 de Repetier como mínimo." - -#~ msgid "" -#~ "HTTP status: %1%\n" -#~ "Message body: \"%2%\"" -#~ msgstr "" -#~ "Estado HTTP: %1%\n" -#~ "Cuerpo del mensaje: \"%2%\"" - -#~ msgid "" -#~ "Parsing of host response failed.\n" -#~ "Message body: \"%1%\"\n" -#~ "Error: \"%2%\"" -#~ msgstr "" -#~ "Ha fallado el análisis de la respuesta del host.\n" -#~ "Cuerpo del mensaje: \"%1%\"\n" -#~ "Error: \"%2%\"" - -#~ msgid "" -#~ "Enumeration of host printers failed.\n" -#~ "Message body: \"%1%\"\n" -#~ "Error: \"%2%\"" -#~ msgstr "" -#~ "Ha fallado la enumeración de las impresoras del host.\n" -#~ "Cuerpo del mensaje: \"%1%\"\n" -#~ "Error: \"%2%\"" - -#~ msgid "" -#~ "The selected 3mf file has been saved with a newer version of %1% and is " -#~ "not compatible." -#~ msgstr "" -#~ "El archivo 3mf seleccionado se ha guardado con una versión más reciente " -#~ "de %1% y no es compatible." - -#~ msgid "" -#~ "The selected 3MF contains FDM supports painted object using a newer " -#~ "version of PrusaSlicer and is not compatible." -#~ msgstr "" -#~ "El 3MF seleccionado contiene un objeto pintado compatible con FDM que " -#~ "utiliza una versión más reciente de PrusaSlicer y no es compatible." - -#~ msgid "" -#~ "The selected 3MF contains seam painted object using a newer version of " -#~ "PrusaSlicer and is not compatible." -#~ msgstr "" -#~ "El 3MF seleccionado contiene un objeto pintado con una versión más " -#~ "reciente de PrusaSlicer y no es compatible." - -#~ msgid "" -#~ "The selected 3MF contains multi-material painted object using a newer " -#~ "version of PrusaSlicer and is not compatible." -#~ msgstr "" -#~ "El 3MF seleccionado contiene un objeto pintado multimaterial que utiliza " -#~ "una versión más reciente de PrusaSlicer y no es compatible." - -#~ msgid "Pad brim size is too small for the current configuration." -#~ msgstr "" -#~ "El tamaño del borde del pad es demasiado pequeño para la configuración " -#~ "actual." - -#~ msgid "" -#~ "Cannot proceed without support points! Add support points or disable " -#~ "support generation." -#~ msgstr "" -#~ "No se puede proceder sin puntos de soporte! Añade puntos de soporte o " -#~ "desactiva la generación de soportes." +#~ msgid "Pause(heated bed temperature error)" +#~ msgstr "Pause(heated bed temperature error)" -#~ msgid "" -#~ "Elevation is too low for object. Use the \"Pad around object\" feature to " -#~ "print the object without elevation." -#~ msgstr "" -#~ "Elevación demasiado baja para el objeto. Utiliza la característica \"Pad " -#~ "alrededor del objeto\" para imprimir el objeto sin elevación." - -#~ msgid "" -#~ "The endings of the support pillars will be deployed on the gap between " -#~ "the object and the pad. 'Support base safety distance' has to be greater " -#~ "than the 'Pad object gap' parameter to avoid this." -#~ msgstr "" -#~ "Las terminaciones de los pilares de soporte se desplegarán en el espacio " -#~ "entre el objeto y el pad. La 'distancia de seguridad de la base de " -#~ "soporte' debe ser mayor que el parámetro 'Distancia entre objetos de " -#~ "relleno' para evitar esto." - -#~ msgid "Exposition time is out of printer profile bounds." -#~ msgstr "" -#~ "Tiempo de exposición inicial fuera de los límites del perfil de impresión." - -#~ msgid "Initial exposition time is out of printer profile bounds." -#~ msgstr "" -#~ "El tiempo de exposición inicial está fuera de los límites del perfil de " -#~ "impresión." - -#~ msgid "Slicing done" -#~ msgstr "Laminado terminado" - -#~ msgid "Hollowing model" -#~ msgstr "Vaciando modelo" - -#~ msgid "Drilling holes into model." -#~ msgstr "Taladrando agujeros en el modelo." - -#~ msgid "Slicing model" -#~ msgstr "Laminando modelo" - -#~ msgid "Generating support points" -#~ msgstr "Generando puntos de soporte" - -#~ msgid "Generating support tree" -#~ msgstr "Generando soporte tipo árbol" - -#~ msgid "Generating pad" -#~ msgstr "Generando pad" - -#~ msgid "Slicing supports" -#~ msgstr "Soportes para el laminado" - -#~ msgid "Merging slices and calculating statistics" -#~ msgstr "Mezclando laminados y calculando estadísticas" - -#~ msgid "Rasterizing layers" -#~ msgstr "Rastrerizando capas" - -#~ msgid "Too many overlapping holes." -#~ msgstr "Demasiados agujeros superpuestos." - -#~ msgid "" -#~ "Mesh to be hollowed is not suitable for hollowing (does not bound a " -#~ "volume)." -#~ msgstr "" -#~ "La malla que se va a vaciar no es apta para el vaciado (no delimita un " -#~ "volumen)." - -#~ msgid "Unable to drill the current configuration of holes into the model." -#~ msgstr "" -#~ "No se puede perforar la configuración actual de agujeros en el modelo." - -#~ msgid "" -#~ "Drilling holes into the mesh failed. This is usually caused by broken " -#~ "model. Try to fix it first." -#~ msgstr "" -#~ "Perforación de agujeros en la malla fallida. Esto generalmente es causado " -#~ "por un modelo roto. Intenta arreglarlo primero." - -#~ msgid "Failed to drill some holes into the model" -#~ msgstr "Fallo en la perforación de algunos agujeros en el modelo" - -#~ msgid "" -#~ "Slicing had to be stopped due to an internal error: Inconsistent slice " -#~ "index." -#~ msgstr "" -#~ "El laminado se ha tenido que parar debido a un error interno: Índice de " -#~ "laminado inconsistente." - -#~ msgid "Visualizing supports" -#~ msgstr "Visualizar soportes" - -#~ msgid "" -#~ "No pad can be generated for this model with the current configuration" -#~ msgstr "" -#~ "No se puede generar el pad para este modelo con la configuración actual" - -#~ msgid "" -#~ "There are unprintable objects. Try to adjust support settings to make the " -#~ "objects printable." -#~ msgstr "" -#~ "Hay objetos no imprimibles. Intenta ajustar la configuración de soportes " -#~ "para que los objetos se puedan imprimir." - -#~ msgid "" -#~ "This end procedure is inserted at the end of the output file. Note that " -#~ "you can use placeholder variables for all PrusaSlicer settings." -#~ msgstr "" -#~ "Este procedimiento final se inserta al final del archivo de salida. Ten " -#~ "en cuenta que puedes usar variables de marcador de posición para todas " -#~ "las configuraciones de PrusaSlicer." - -#~ msgid "" -#~ "This end procedure is inserted at the end of the output file, before the " -#~ "printer end gcode (and before any toolchange from this filament in case " -#~ "of multimaterial printers). Note that you can use placeholder variables " -#~ "for all PrusaSlicer settings. If you have multiple extruders, the gcode " -#~ "is processed in extruder order." -#~ msgstr "" -#~ "Este procedimiento final se inserta al final del archivo de salida, antes " -#~ "del código G final de la impresora (y antes de cualquier cambio de " -#~ "herramienta desde este filamento en el caso de impresoras " -#~ "multimateriales). Ten en cuenta que puede usar variables de marcador de " -#~ "posición para todas las configuraciones de PrusaSlicer. Si tienes varios " -#~ "extrusores, el código G se procesa en orden de extrusor." - -#~ msgid "" -#~ "Some G/M-code commands, including temperature control and others, are not " -#~ "universal. Set this option to your printer's firmware to get a compatible " -#~ "output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting " -#~ "any extrusion value at all." -#~ msgstr "" -#~ "Algunos comandos de códigos G/M, incluidos el control de temperatura y " -#~ "otros, no son universales. Configura esta opción en el firmware de tu " -#~ "impresora para obtener una salida compatible. El tipo \"Sin extrusión\" " -#~ "evita que PrusaSlicer exporte ningún valor de extrusión." - -#~ msgid "" -#~ "Connect an infill line to an internal perimeter with a short segment of " -#~ "an additional perimeter. If expressed as percentage (example: 15%) it is " -#~ "calculated over infill extrusion width. PrusaSlicer tries to connect two " -#~ "close infill lines to a short perimeter segment. If no such perimeter " -#~ "segment shorter than infill_anchor_max is found, the infill line is " -#~ "connected to a perimeter segment at just one side and the length of the " -#~ "perimeter segment taken is limited to this parameter, but no longer than " -#~ "anchor_length_max. Set this parameter to zero to disable anchoring " -#~ "perimeters connected to a single infill line." -#~ msgstr "" -#~ "Conecta una línea de relleno a un perímetro interno con un segmento corto " -#~ "de un perímetro adicional. Si se expresa como porcentaje (por ejemplo: " -#~ "15%), se calcula sobre el ancho de extrusión del relleno. PrusaSlicer " -#~ "intenta conectar dos líneas de relleno cercanas a un segmento de " -#~ "perímetro corto. Si no se encuentra tal segmento de perímetro más corto " -#~ "que infill_anchor_max, la línea de relleno se conecta a un segmento de " -#~ "perímetro en un solo lado y la longitud del segmento de perímetro tomado " -#~ "se limita a este parámetro, pero no más largo que anchor_length_max. " -#~ "Establezca este parámetro a cero para deshabilitar los perímetros de " -#~ "anclaje conectados a una sola línea de relleno." - -#~ msgid "" -#~ "Connect an infill line to an internal perimeter with a short segment of " -#~ "an additional perimeter. If expressed as percentage (example: 15%) it is " -#~ "calculated over infill extrusion width. PrusaSlicer tries to connect two " -#~ "close infill lines to a short perimeter segment. If no such perimeter " -#~ "segment shorter than this parameter is found, the infill line is " -#~ "connected to a perimeter segment at just one side and the length of the " -#~ "perimeter segment taken is limited to infill_anchor, but no longer than " -#~ "this parameter. Set this parameter to zero to disable anchoring." -#~ msgstr "" -#~ "Conecta una línea de relleno a un perímetro interno con un segmento corto " -#~ "de un perímetro adicional. Si se expresa como porcentaje (por ejemplo: " -#~ "15%), se calcula sobre el ancho de extrusión del relleno. PrusaSlicer " -#~ "intenta conectar dos líneas de relleno cercanas a un segmento de " -#~ "perímetro corto. Si no se encuentra un segmento de perímetro más corto " -#~ "que este parámetro, la línea de relleno se conecta a un segmento de " -#~ "perímetro en un solo lado y la longitud del segmento de perímetro tomado " -#~ "se limita a infill_anchor, pero no más largo que este parámetro. " -#~ "Establezca este parámetro a cero para deshabilitar el anclaje." - -#~ msgid "" -#~ "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " -#~ "intervals into the G-code to let the firmware show accurate remaining " -#~ "time. As of now only the Prusa i3 MK3 firmware recognizes M73. Also the " -#~ "i3 MK3 firmware supports M73 Qxx Sxx for the silent mode." -#~ msgstr "" -#~ "Emitir M73 P[porcentaje impreso] R[tiempo restante en minutos] en " -#~ "intervalos de 1 minuto en el código G para permitir que el firmware " -#~ "muestre el tiempo restante preciso. A partir de ahora solo el firmware " -#~ "Prusa i3 MK3 reconoce M73. También el firmware i3 MK3 es compatible con " -#~ "M73 Qxx Sxx para el modo silencioso." - -#~ msgid "" -#~ "This start procedure is inserted at the beginning, after bed has reached " -#~ "the target temperature and extruder just started heating, and before " -#~ "extruder has finished heating. If PrusaSlicer detects M104 or M190 in " -#~ "your custom codes, such commands will not be prepended automatically so " -#~ "you're free to customize the order of heating commands and other custom " -#~ "actions. Note that you can use placeholder variables for all PrusaSlicer " -#~ "settings, so you can put a \"M109 S[first_layer_temperature]\" command " -#~ "wherever you want." -#~ msgstr "" -#~ "Este procedimiento de inicio se inserta al principio, después de que la " -#~ "base ha alcanzado la temperatura objetivo y el extrusor acaba de comenzar " -#~ "a calentar, y antes de que el extrusor haya terminado de calentar. Si " -#~ "PrusaSlicer detecta un M104 o M190 en tus códigos personalizados, dichos " -#~ "comandos no se agregarán automáticamente, por lo que se puede " -#~ "personalizar el orden de los comandos de calentamiento y otras acciones " -#~ "personalizadas. Ten en cuenta que puedes usar variables de marcador de " -#~ "posición para todas las configuraciones de PrusaSlicer, por lo que puedes " -#~ "colocar un comando \"M109 S [first_layer_temperature]\" donde lo desees." - -#~ msgid "" -#~ "This start procedure is inserted at the beginning, after any printer " -#~ "start gcode (and after any toolchange to this filament in case of multi-" -#~ "material printers). This is used to override settings for a specific " -#~ "filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom " -#~ "codes, such commands will not be prepended automatically so you're free " -#~ "to customize the order of heating commands and other custom actions. Note " -#~ "that you can use placeholder variables for all PrusaSlicer settings, so " -#~ "you can put a \"M109 S[first_layer_temperature]\" command wherever you " -#~ "want. If you have multiple extruders, the gcode is processed in extruder " -#~ "order." -#~ msgstr "" -#~ "Este procedimiento de inicio se inserta al principio, después de que " -#~ "cualquier impresora inicie un código G(y después de cualquier cambio de " -#~ "herramienta a este filamento en el caso de impresoras de materiales " -#~ "múltiples). Esto se utiliza para anular la configuración de un filamento " -#~ "específico. Si PrusaSlicer detecta un M104, M109, M140 o M190 en tus " -#~ "códigos personalizados, dichos comandos no se agregarán automáticamente, " -#~ "por lo que puede personalizar el orden de los comandos de calentamiento y " -#~ "otras acciones personalizadas. Ten en cuenta que puedes usar variables de " -#~ "marcador de posición para todas las configuraciones de PrusaSlicer, por " -#~ "lo que puedes colocar un comando \"M109 S [first_layer_temperature]\" " -#~ "donde lo desees. Si tienes varias extrusorrs, el código G se procesa en " -#~ "el orden del extrusor." - -#~ msgid "" -#~ "This custom code is inserted before every toolchange. Placeholder " -#~ "variables for all PrusaSlicer settings as well as {toolchange_z}, " -#~ "{previous_extruder} and {next_extruder} can be used. When a tool-changing " -#~ "command which changes to the correct extruder is included (such as " -#~ "T{next_extruder}), PrusaSlicer will emit no other such command. It is " -#~ "therefore possible to script custom behaviour both before and after the " -#~ "toolchange." -#~ msgstr "" -#~ "Este código personalizado se inserta antes de cada cambio de herramienta. " -#~ "Se pueden utilizar variables de marcador de posición para todos los " -#~ "ajustes de PrusaSlicer, así como {toolchange_z}, {previous_extruder} y " -#~ "{next_extruder}. Cuando se incluye un comando de cambio de herramienta " -#~ "que cambia al extrusor correcto (como T{next_extruder}), PrusaSlicer no " -#~ "emitirá ningún otro comando de este tipo. Por lo tanto, es posible " -#~ "programar un comportamiento personalizado tanto antes como después del " -#~ "cambio de herramienta." - -#~ msgid "" -#~ "This version of PrusaSlicer may not understand configurations produced by " -#~ "the newest PrusaSlicer versions. For example, newer PrusaSlicer may " -#~ "extend the list of supported firmware flavors. One may decide to bail out " -#~ "or to substitute an unknown value with a default silently or verbosely." -#~ msgstr "" -#~ "Esta versión de PrusaSlicer puede no entender las configuraciones " -#~ "producidas por las versiones más nuevas de PrusaSlicer. Por ejemplo, el " -#~ "PrusaSlicer más reciente puede ampliar la lista de tipos de firmware " -#~ "soportados. Uno puede decidir abandonar o sustituir un valor desconocido " -#~ "con un valor por defecto silenciosamente o verbosamente." - -#~ msgid "" -#~ "If enabled, the command line arguments are sent to an existing instance " -#~ "of GUI PrusaSlicer, or an existing PrusaSlicer window is activated. " -#~ "Overrides the \"single_instance\" configuration value from application " -#~ "preferences." -#~ msgstr "" -#~ "Si está habilitado, los argumentos de la línea de comando se envían a una " -#~ "instancia existente de GUI PrusaSlicer, o se activa una ventana de " -#~ "PrusaSlicer existente. Anula el valor de configuración \"single_instance" -#~ "\" de las preferencias de la aplicación." - -#~ msgid "Prusa FFF Technology Printers" -#~ msgstr "Impresoras Prusa de tecnología FFF" - -#~ msgid "Prusa MSLA Technology Printers" -#~ msgstr "Impresoras Prusa de tecnología MSLA" - -#~ msgid "Block supports by angle" -#~ msgstr "Bloquear soportes según ángulo" - -#~ msgid "Add supports by angle" -#~ msgstr "Añadir soportes según ángulo" - -#~ msgid "New release version %1% is available." -#~ msgstr "La nueva versión %1% está disponible." - -#~ msgid "See Download page." -#~ msgstr "Ver página de Descargas." - -#~ msgid "New prerelease version %1% is available." -#~ msgstr "La nueva versión prelanzamiento %1% está disponible." - -#~ msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" -#~ msgstr "Escoje uno o más archivos (STL/OBJ/AMF/3MF/PRUSA):" - -#~ msgid "Expert View Mode" -#~ msgstr "Modo de visualización experto" - -#~ msgid "Loading a new project while the current project is modified." -#~ msgstr "Cargando un proyecto nuevo mientras el actual es modificado." - -#~ msgid "Project is loading" -#~ msgstr "El proyecto se está cargando" - -#~ msgid "Opening new project while some presets are unsaved." -#~ msgstr "Abre un nuevo proyecto mientras algunos ajustes están sin guardar." - -#~ msgid "PrusaSlicer GUI initialization failed" -#~ msgstr "Hubo un error al abrir el GUI de PrusaSlicer" - -#~ msgid "Gallery" -#~ msgstr "Tipo de piel difusa." - -#~ msgid "Replace the selected volume with new STL" -#~ msgstr "Sustituir el volumen seleccionado por un nuevo STL" - -#~ msgid "Selection-Remove from list" -#~ msgstr "Selección-Retirar de la lista" - -#~ msgid "Selection-Add from list" -#~ msgstr "Selección-Añadir de la lista" - -#~ msgid "Open project STL/OBJ/AMF/3MF with config, clear plater" -#~ msgstr "" -#~ "Abrir proyecto STL/OBJ/AMF/3MF con configuración, limpiar plataforma" - -#~ msgid "Prusa 3D &Drivers" -#~ msgstr "Controladores de Prusa 3&D" - -#~ msgid "Open the Prusa3D drivers download page in your browser" -#~ msgstr "" -#~ "Abrir la página de descarga de los controladores Prusa3D en su navegador" - -#~ msgid "Software &Releases" -#~ msgstr "Lanzamientos de Softwa&re" - -#~ msgid "Open the software releases page in your browser" -#~ msgstr "Abre la página de lanzamientos de software en tu navegador" - -#~ msgid "%s &Website" -#~ msgstr "%s Sitio &Web" - -#~ msgid "Open the %s website in your browser" -#~ msgstr "Abrir el sitio web de %s en su navegador" - -#~ msgid "System &Info" -#~ msgstr "&Información del Sistema" - -#~ msgid "Report an I&ssue" -#~ msgstr "Informar de un &problema" - -#~ msgid "Report an issue on %s" -#~ msgstr "Reportar un problema a %s" - -#~ msgid "Show Tip of the Day" -#~ msgstr "Mostrar Consejo del día" - -#~ msgid "" -#~ "Opens Tip of the day notification in bottom right corner or shows another " -#~ "tip if already opened." -#~ msgstr "" -#~ "Abre la notificación del Consejo del día en la esquina inferior derecha o " -#~ "muestra otro consejo si ya está abierto." - -#~ msgid "Iso" -#~ msgstr "Iso" - -#~ msgid "Import STL/OBJ/AM&F/3MF" -#~ msgstr "Importar STL/OBJ/AM&F/3MF" - -#~ msgid "Import STL (Imperial Units)" -#~ msgstr "Importar STL (Unidades Imperiales)" - -#~ msgid "Load an model saved with imperial units" -#~ msgstr "Cargar un modelo guardado con unidades imperiales" - -#~ msgid "Import SL1 / SL1S Archive" -#~ msgstr "Importar Archivo SL1 / SL1S" - -#~ msgid "Load an SL1 / Sl1S archive" -#~ msgstr "Cargar un archivo SL1 / SL1S" - -#~ msgid "Import &Config" -#~ msgstr "Importar &Configuración" - -#~ msgid "Load exported configuration file" -#~ msgstr "Cargar archivo de configuración exportado" - -#~ msgid "Import Config from &Project" -#~ msgstr "Importar configuración desde un &Proyecto" - -#~ msgid "Load configuration from project file" -#~ msgstr "Cargar configuración desde archivo de proyecto" - -#~ msgid "Import Config &Bundle" -#~ msgstr "Importar &Conjunto de Ajustes" - -#~ msgid "Load presets from a bundle" -#~ msgstr "Cargar ajustes de un paquete" - -#~ msgid "&Import" -#~ msgstr "&Importar" - -#~ msgid "S&end G-code" -#~ msgstr "&Enviar código G" - -#~ msgid "Send to print current plate as G-code" -#~ msgstr "Enviar para imprimir la plataforma actual como código G" - -#~ msgid "Export G-code to SD Card / Flash Drive" -#~ msgstr "Exportar código G a la Tarjeta SD / Unidad Flash" - -#~ msgid "Export current plate as G-code to SD card / Flash drive" -#~ msgstr "Exporta a G-code en la tarjeta SD / disco USB" - -#~ msgid "Export Plate as &STL" -#~ msgstr "Exportar Plataforma como &STL" - -#~ msgid "Export Plate as STL &Including Supports" -#~ msgstr "Exportar plataforma como STL &Incluyendo Soportes" - -#~ msgid "Export current plate as STL including supports" -#~ msgstr "Exportar la plataforma actual como STL incluyendo soportes" - -#~ msgid "Export &Config" -#~ msgstr "Exportar &Configuración" - -#~ msgid "Export current configuration to file" -#~ msgstr "Exportar la configuración actual al archivo" - -#~ msgid "Export Config &Bundle" -#~ msgstr "Exportar Conjunto de A&justes" +#~ msgid "Pause(hotend temperature error)" +#~ msgstr "Pause(hotend temperature error)" -#~ msgid "Export all presets to file" -#~ msgstr "Exportar todos los ajustes al archivo" +#~ msgid "Pause(toolhead shell off)" +#~ msgstr "Pause(toolhead shell off)" -#~ msgid "Export Config Bundle With Physical Printers" -#~ msgstr "Exportar Paquete de Configuración Con Impresoras Físicas" - -#~ msgid "Export all presets including physical printers to file" -#~ msgstr "" -#~ "Exportar todos los ajustes preestablecidos, incluidas las impresoras " -#~ "físicas, al archivo" - -#~ msgid "Ejec&t SD Card / Flash Drive" -#~ msgstr "Expul&sar Tarjeta SD / Unidad Flash" - -#~ msgid "Eject SD card / Flash drive after the G-code was exported to it." -#~ msgstr "" -#~ "Expulsa la tarjeta SD / disco USB después de que se haya exportado a él." - -#~ msgid "(Re)Slice No&w" -#~ msgstr "(Re)Laminar A&hora" - -#~ msgid "Start new slicing process" -#~ msgstr "Comenzar un nuevo proceso de laminado" - -#~ msgid "&Repair STL file" -#~ msgstr "&Reparar archivo STL" - -#~ msgid "Automatically repair an STL file" -#~ msgstr "Archivo STL reparado automáticamente" - -#~ msgid "&G-code Preview" -#~ msgstr "Previsualización Código &G" - -#~ msgid "&Select All" -#~ msgstr "&Seleccionar Todo" - -#~ msgid "D&eselect All" -#~ msgstr "D&eseleccionar todo" - -#~ msgid "&Delete Selected" -#~ msgstr "&Eliminar selección" - -#~ msgid "Delete &All" -#~ msgstr "Borrar &Todo" - -#~ msgid "Show &Labels" -#~ msgstr "Mostrar &Etiquetas" - -#~ msgid "Show object/instance labels in 3D scene" -#~ msgstr "Muestra etiquetas de pieza/repetición en vista 3D" - -#~ msgid "&Collapse Sidebar" -#~ msgstr "&Contraer la barra lateral" - -#~ msgid "&Fullscreen" -#~ msgstr "&Pantalla completa" - -#~ msgid "Fullscreen" -#~ msgstr "Pantalla completa" - -#~ msgid "E&xport" -#~ msgstr "E&xportar" - -#~ msgid "S&end to print" -#~ msgstr "E&nviar para imprimir" - -#~ msgid "Mate&rial Settings Tab" -#~ msgstr "Pestaña Ajustes de Mate&rial" - -#~ msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" -#~ msgstr "Elije un archivo para laminar (STL/OBJ/AMF/3MF/PRUSA):" - -#~ msgid "%1% (%2$d shell)" -#~ msgid_plural "%1% (%2$d shells)" -#~ msgstr[0] "%1% (%2$d carcasa)" -#~ msgstr[1] "%1% (%2$d carcasas)" - -#~ msgid "Used Material (ml)" -#~ msgstr "Material usado (ml)" - -#~ msgid "object" -#~ msgid_plural "objects" -#~ msgstr[0] "objeto" -#~ msgstr[1] "objetos" - -#~ msgid "supports and pad" -#~ msgstr "soportes y pad" - -#~ msgid "Used Filament (in)" -#~ msgstr "Filamento Usado (in)" - -#~ msgid "objects" -#~ msgstr "objetos" - -#~ msgid "wipe tower" -#~ msgstr "torre de limpieza" - -#~ msgid "Used Filament (in³)" -#~ msgstr "Filamento Usado (in³)" - -#~ msgid "Filament at extruder %1%" -#~ msgstr "Filamento en extrusor %1%" - -#~ msgid "(including spool)" -#~ msgstr "(incluyendo la bobina)" - -#~ msgid "normal mode" -#~ msgstr "modo normal" - -#~ msgid "stealth mode" -#~ msgstr "modo silencioso" - -#~ msgid "" -#~ "The preset below was temporarily installed on the active instance of " -#~ "PrusaSlicer" -#~ msgid_plural "" -#~ "The presets below were temporarily installed on the active instance of " -#~ "PrusaSlicer" -#~ msgstr[0] "" -#~ "El ajuste de abajo fue instalado temporalmente en la instancia activa de " -#~ "PrusaSlicer" -#~ msgstr[1] "" -#~ "Los ajustes de abajo fueron instalados temporalmente en la instancia " -#~ "activa de PrusaSlicer" - -#~ msgid "" -#~ "Your object appears to be too large, so it was automatically scaled down " -#~ "to fit your print bed." -#~ msgstr "" -#~ "Tu pieza parece demasiado grande, así que se ha escalado automáticamente " -#~ "para que pueda caber en la base de impresión." - -#~ msgid "Object too large?" -#~ msgstr "Objeto demasiado grande?" - -#~ msgid "Physical printers" -#~ msgstr "Impresoras físicas" - -#~ msgid "Cannot overwrite an external profile." -#~ msgstr "No puedo sobre-escribir un valor externo." - -#~ msgid "Selection-Add" -#~ msgstr "Selección-Añadir" - -#~ msgid "Selection-Remove" -#~ msgstr "Selección-Retirar" - -#~ msgid "Selection-Add All" -#~ msgstr "Selección-Añadir todos" - -#~ msgid "Selection-Remove All" -#~ msgstr "Selección-Retirar todo" - -#~ msgid "" -#~ "Hover the cursor over buttons to find more information \n" -#~ "or click this button." -#~ msgstr "" -#~ "Sitúa el cursos sobre los botones para más información o haz clic en este " -#~ "botón." - -#~ msgid "Search in settings [%1%]" -#~ msgstr "Buscar en ajustes [%1%]" - -#~ msgid "Quality (slower slicing)" -#~ msgstr "Calidad (laminado más lento)" - -#~ msgid "Reducing printing time" -#~ msgstr "Reduciendo el tiempo de impresión" - -#~ msgid "Modifiers" -#~ msgstr "Modificadores" - -#~ msgid "Multiple Extruders" -#~ msgstr "Múltiples Extrusores" - -#~ msgid "Overlap" -#~ msgstr "Superposición" - -#~ msgid "Filament properties" -#~ msgstr "Propiedades del filamento" - -#~ msgid "" -#~ "Note: All parameters from this group are moved to the Physical Printer " -#~ "settings (see changelog).\n" -#~ "\n" -#~ "A new Physical Printer profile is created by clicking on the \"cog\" icon " -#~ "right of the Printer profiles combo box, by selecting the \"Add physical " -#~ "printer\" item in the Printer combo box. The Physical Printer profile " -#~ "editor opens also when clicking on the \"cog\" icon in the Printer " -#~ "settings tab. The Physical Printer profiles are being stored into " -#~ "PrusaSlicer/physical_printer directory." -#~ msgstr "" -#~ "Nota: Todos los parámetros de este grupo se han desplazado a la " -#~ "configuración de Impresora física (consulte el registro de cambios).\n" -#~ "\n" -#~ "Se crea un nuevo perfil de impresora física haciendo clic en el icono de " -#~ "\"engranaje\" a la derecha del cuadro combinado de perfiles de impresora, " -#~ "seleccionando el elemento \"Agregar impresora física\" en el cuadro " -#~ "combinado de impresora. El editor de perfil de Impresora física también " -#~ "se abre al hacer clic en el icono \"engranaje\" en la pestaña " -#~ "Configuración de impresora. Los perfiles de la impresora física se " -#~ "almacenan en el directorio PrusaSlicer/physical_printer." - -#~ msgid "remove" -#~ msgstr "eliminar" - -#~ msgid "delete" -#~ msgstr "borra" - -#~ msgid "Show simplified settings" -#~ msgstr "Muestra los ajustes simplificados" - -#~ msgid "Show advanced settings" -#~ msgstr "Mostrar ajustes avanzados" - -#~ msgid "Some objects are too close; your extruder will collide with them." -#~ msgstr "" -#~ "Algunos objetos están demasiado cerca; el extrusor colisionará con ellos." - -#~ msgid "" -#~ "Some objects are too tall and cannot be printed without extruder " -#~ "collisions." -#~ msgstr "" -#~ "Algunos objetos son demasiado altos y no se pueden imprimir sin que " -#~ "colisione el extrusor." - -#~ msgid "Combine infill every" -#~ msgstr "Combinar el relleno cada" - -#~ msgid "" -#~ "This feature allows to combine infill and speed up your print by " -#~ "extruding thicker infill layers while preserving thin perimeters, thus " -#~ "accuracy." -#~ msgstr "" -#~ "Esta característica permite combinar el relleno y acelerar la impresión " -#~ "mediante la extrusión de capas de relleno más gruesas a la vez que se " -#~ "preservan los finos perímetros y, por lo tanto, la precisión." - -#~ msgid "Combine infill every n layers" -#~ msgstr "Combinar el relleno cada n capas" - -#~ msgid "Infill extruder" -#~ msgstr "Extrusor para el relleno" - -#~ msgid "Only infill where needed" -#~ msgstr "Solo rellenar cuando sea necesario" - -#~ msgid "Perimeter extruder" -#~ msgstr "Extrusor para perímetros" - -#~ msgid "Solid infill extruder" -#~ msgstr "Extrusor para el relleno sólido" - -#~ msgid "Generate support material" -#~ msgstr "Generar material de soporte" - -#~ msgid "Enable support material generation." -#~ msgstr "Habilite la generación de material de soporte." - -#~ msgid "Auto generated supports" -#~ msgstr "Soportes generados automáticamente" - -#~ msgid "" -#~ "If checked, supports will be generated automatically based on the " -#~ "overhang threshold value. If unchecked, supports will be generated inside " -#~ "the \"Support Enforcer\" volumes only." -#~ msgstr "" -#~ "Si se marca, los soportes se generarán automáticamente según el valor del " -#~ "umbral de voladizo. Si no se selecciona, los apoyos se generarán solo " -#~ "dentro de los volúmenes \"Forzado de Soportes\"." - -#~ msgid "0.1 (detachable)" -#~ msgstr "0.1 (desmontable)" - -#~ msgid "Support material/raft/skirt extruder" -#~ msgstr "Extrusor para el material de soporte/falda/balsa" - -#~ msgid "Support material/raft interface extruder" -#~ msgstr "Extrusor para el material de soporte o balsa" - -#~ msgid "Don't arrange" -#~ msgstr "No organizar" - -#~ msgid "" -#~ "Do not rearrange the given models before merging and keep their original " -#~ "XY coordinates." -#~ msgstr "" -#~ "No reorganizar los modelos dados antes de fusionar y mantener sus " -#~ "coordenadas XY originales." - -#~ msgid "" -#~ "Shapes gallery\n" -#~ "Did you know that PrusaSlicer has a Shapes Gallery? You can use the " -#~ "included models as modifiers, negative volumes or as printable objects. " -#~ "Right-click the platter and selectAdd Shape - Gallery." -#~ msgstr "" -#~ "Galería de Formas\n" -#~ "¿Sabías que PrusaSlicer tiene una galería de Formas? Puedes utilizar los " -#~ "modelos incluidos como modificadores, volúmenes negativos o como objetos " -#~ "imprimibles. Haz clic con el botón derecho del ratón en el plato y " -#~ "seleccionaAñadir Forma - Galería." - -#~ msgid "" -#~ "Negative volume\n" -#~ "Did you know that you can subtract one mesh from another using the " -#~ "Negative volume modifier? That way you can, for example, create easily " -#~ "resizable holes directly in PrusaSlicer. Read more in the documentation. " -#~ "(Requires Advanced or Expert mode.)" -#~ msgstr "" -#~ "Volumen negativo\n" -#~ "¿Sabías que puedes restar una malla de otra utilizando el modificador de " -#~ "volumen negativo? De esta manera puedes, por ejemplo, crear agujeros " -#~ "fácilmente redimensionables directamente en PrusaSlicer. Lee más en la " -#~ "documentación. (Requiere el modo Avanzado o Experto)." +#~ msgid "Please upgrade your printer first" +#~ msgstr "Please upgrade your printer first" #~ msgid "" -#~ "Reload from disk\n" -#~ "Did you know that if you created a newer version of your model, you can " -#~ "simply reload it in PrusaSlicer? Right-click the model in the 3D view and " -#~ "choose Reload from disk. Read more in the documentation." +#~ "Preview only mode:\n" +#~ "The loaded file contains gcode only." #~ msgstr "" -#~ "Recargar desde el disco\n" -#~ "¿Sabías que si has creado una versión más reciente de tu modelo, puedes " -#~ "simplemente recargarlo en PrusaSlicer? Haz clic con el botón derecho del " -#~ "ratón en el modelo en la vista 3D y elige Recargar desde el disco. Lee " -#~ "más en la documentación." +#~ "Preview only mode:\n" +#~ "The loaded file contains gcode only." -#~ msgid "" -#~ "Search functionality\n" -#~ "Did you know that you use theSearchtool to quickly find a specific " -#~ "PrusaSlicer setting? Or use the familiar shortcut Ctrl+F." -#~ msgstr "" -#~ "Funcionalidad de búsqueda\n" -#~ "¿Sabías que puedes utilizar la herramienta Búsqueda para encontrar " -#~ "rápidamente un ajuste específico de PrusaSlicer? O utilizar el conocido " -#~ "atajo Ctrl+F." +#~ msgid "Preview only mode for gcode file." +#~ msgstr "Preview only mode for gcode file." #~ msgid "" -#~ "Fullscreen mode\n" -#~ "Did you know that you can switch PrusaSlicer to fullscreen mode? Use the " -#~ "F11 hotkey." +#~ "Push new filament \n" +#~ "into extruder" #~ msgstr "" -#~ "Modo Pantalla completa\n" -#~ "¿Sabías que puedes poner el PrusaSlicer en modo de pantalla completa? " -#~ "Utiliza la tecla de acceso rápido F11." - -#~ msgid "&Collapse sidebar" -#~ msgstr "Barra lateral ocultable (&C)" - -#~ msgid "&Full screen" -#~ msgstr "&Pantalla completa" - -#~ msgid "&G-code preview" -#~ msgstr "Previsualización código G (&G)" - -#~ msgid "0.1" -#~ msgstr "0.1" - -#~ msgid "0.2" -#~ msgstr "0.2" +#~ "Empujar el nuevo filamento \n" +#~ "en el extrusor" -#~ msgid "Ask for unsaved changes when ??closing application??" -#~ msgstr "Preguntar por los cambios no guardados al ??cerrar la aplicación??." +#~ msgid "Shift + Any arrow" +#~ msgstr "Mayúsculas + Cualquier flecha" -#~ msgid "Changelog && Download" -#~ msgstr "Registro de cambios && Descargar" +#~ msgid "Shift + Mouse wheel" +#~ msgstr "Mayúsculas + rueda del ratón" -#~ msgid "Compare %1% Presets" -#~ msgstr "Comparar %1% Ajustes" +#~ msgid "Show Model Mesh(TODO)" +#~ msgstr "Mostrar modelo de malla(TODO)" -#~ msgid "Delete &all" -#~ msgstr "Borr&ar todo" +#~ msgid "Show Model Shadow(TODO)" +#~ msgstr "Mostrar sombra del modelo(TODO)" -#~ msgid "Ejec&t SD card / Flash drive" -#~ msgstr "Expul&sa tarjeta SD / disco USB" - -#~ msgid "Export &toolpaths as OBJ" -#~ msgstr "Exportar &trayectorias de herramientas como OBJ" - -#~ msgid "Export G-code to SD card / Flash drive" -#~ msgstr "Exporta G-code a la tarjeta SD / disco USB" - -#~ msgid "Export plate as STL &including supports" -#~ msgstr "Exportar plataforma como STL &incluyendo soportes" - -#~ msgid "Flash printer &firmware" -#~ msgstr "Grabar &firmware en la impresora" - -#~ msgid "Full screen" -#~ msgstr "Pantalla completa" - -#~ msgid "" -#~ "If enabled, application will use the standart Windows system menu,\n" -#~ "but on some combination of display scales it can looks ugly. If disabled, " -#~ "old UI will be used." -#~ msgstr "" -#~ "Si se activa, la aplicación utilizará el menú de sistema estándar de " -#~ "Windows,\n" -#~ "pero en algunas combinaciones de escalas de pantalla puede parecer feo. " -#~ "Si se desactiva, se utilizará la antigua interfaz de usuario." +#~ msgid "Show Printable Box(TODO)" +#~ msgstr "Mostrar caja imprimible(TODO)" -#~ msgid "" -#~ "If enabled, changes made using the sequential slider, in preview, apply " -#~ "only to gcode top layer.If disabled, changes made using the sequential " -#~ "slider, in preview, apply to the whole gcode." +#~ msgid "Successfully sent.Will automatically jump to the device page in %s s" #~ msgstr "" -#~ "Si se activa, los cambios realizados con el deslizador secuencial, en la " -#~ "vista previa, se aplican sólo a la capa superior del código G. Si se " -#~ "desactiva, los cambios realizados con el deslizador secuencial, en la " -#~ "vista previa, se aplican a todo el código G." - -#~ msgid "Import Config from &project" -#~ msgstr "Importar configuración desde un &proyecto" - -#~ msgid "Import SL1 / SL1S archive" -#~ msgstr "Importar archivo SL1 / SL1S" - -#~ msgid "Import STL (imperial units)" -#~ msgstr "Importar STL (unidades imperiales)" +#~ "Successfully sent.Will automatically jump to the device page in %s s" -#~ msgid "PrusaSlicer" -#~ msgstr "PrusaSlicer" +#~ msgid "Swith cloud environment, Please login again!" +#~ msgstr "Cambiar el entorno de la nube, ¡Por favor, inicie sesión de nuevo!" #~ msgid "" -#~ "PrusaSlicer detected another configuration folder at %s.\n" -#~ "Its version is %s.\n" -#~ "Last version you used in current configuration folder is %s.\n" -#~ "Please note that PrusaSlicer uses different folders to save configuration " -#~ "of alpha, beta and full release versions.\n" -#~ "Would you like to copy found configuration to your current configuration " -#~ "folder?\n" -#~ "\n" -#~ "If you select yes, PrusaSlicer will copy all profiles and other files " -#~ "from found folder to the current one. Overwriting any existing file with " -#~ "matching name.\n" -#~ "If you select no, you will continue with current configuration." +#~ "The firmware versions of printer and AMS are too low.Please update to the " +#~ "latest version before sending the print job" #~ msgstr "" -#~ "PrusaSlicer detectó otra carpeta de configuración en %s.\n" -#~ "Tu versión es %s.\n" -#~ "La última versión que utilizó en la carpeta de configuración actual es " -#~ "%s.\n" -#~ "Por favor, ten en cuenta que PrusaSlicer utiliza diferentes carpetas para " -#~ "guardar la configuración de las versiones alfa, beta y final.\n" -#~ "¿Deseas copiar la configuración encontrada a tu carpeta de configuración " -#~ "actual?\n" -#~ "\n" -#~ "Si seleccionas sí, PrusaSlicer copiará todos los perfiles y otros " -#~ "archivos de la carpeta encontrada a la actual. Sobrescribiendo cualquier " -#~ "archivo existente con el mismo nombre.\n" -#~ "Si seleccionas no, continuará con la configuración actual." - -#~ msgid "" -#~ "PrusaSlicer detected another configuration folder at %s.\n" -#~ "Its version is %s.\n" -#~ "There is no configuration file in current configuration folder.\n" -#~ "Please note that PrusaSlicer uses different folders to save configuration " -#~ "of alpha, beta and full release versions.\n" -#~ "Would you like to copy found configuration to your current configuration " -#~ "folder?\n" -#~ "\n" -#~ "If you select yes, PrusaSlicer will copy all profiles and other files " -#~ "from found folder to the current one.\n" -#~ "If you select no, you will start with clean installation with " -#~ "configuration wizard." -#~ msgstr "" -#~ "PrusaSlicer detectó otra carpeta de configuración en %s.\n" -#~ "Tu versión es %s.\n" -#~ "No hay ningún archivo de configuración en la carpeta de configuración " -#~ "actual.\n" -#~ "Por favor, ten en cuenta que PrusaSlicer utiliza diferentes carpetas para " -#~ "guardar la configuración de las versiones alfa, beta y final.\n" -#~ "¿Desea copiar la configuración encontrada a tu carpeta de configuración " -#~ "actual?\n" -#~ "\n" -#~ "Si selecciona sí, PrusaSlicer copiará todos los perfiles y otros archivos " -#~ "de la carpeta encontrada a la actual.\n" -#~ "Si selecciona no, comenzará con una instalación limpia con el asistente " -#~ "de configuración." - -#~ msgid "Re&load from disk" -#~ msgstr "Recargar desde e&l disco" +#~ "The firmware versions of printer and AMS are too low.Please update to the " +#~ "latest version before sending the print job" -#~ msgid "Remaning errors" -#~ msgstr "Errores restantes" - -#~ msgid "same as top" -#~ msgstr "igual que la parte superior" - -#~ msgid "Save project &as" -#~ msgstr "Guardar proyecto &como" - -#~ msgid "Show &labels" -#~ msgstr "Muestra &etiquetas" - -#~ msgid "Show all preset (including incompatible)" -#~ msgstr "Mostrar todos los ajustes (incluidos los incompatibles)" - -#~ msgid "Show Tip of the day" -#~ msgstr "Mostrar Consejo del día" - -#~ msgid "" -#~ "You will not be asked about the unsaved changes the next time you: \n" -#~ "- close the application,\n" -#~ "- load project,\n" -#~ "- process Undo / Redo with a change of print technology,\n" -#~ "- take/load snapshot,\n" -#~ "- load config file/bundle,\n" -#~ "- export config_bundle" -#~ msgstr "" -#~ "No se le preguntará por los cambios no guardados la próxima vez que \n" -#~ "- cierre la aplicación,\n" -#~ "- cargue el proyecto,\n" -#~ "- proceso de Deshacer / Rehacer con un cambio de tecnología de " -#~ "impresión,\n" -#~ "- tome/cargue una instantánea,\n" -#~ "- cargar archivo de configuración/paquete,\n" -#~ "- exportar config_bundle" +#~ msgid "User pause" +#~ msgstr "User pause" diff --git a/bbl/i18n/fr/BambuStudio_fr.po b/bbl/i18n/fr/BambuStudio_fr.po index bf2f233d6c..1662ebfd31 100644 --- a/bbl/i18n/fr/BambuStudio_fr.po +++ b/bbl/i18n/fr/BambuStudio_fr.po @@ -1,19 +1,17 @@ msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-15 10:25+0800\n" +"POT-Creation-Date: 2022-07-22 18:39+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" -"Language: en\n" +"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Plural-Forms: nplurals=2; plural=(n==0 || n==1) ? 0 : 1;\n" "X-Generator: Poedit 3.1\n" -"X-Language: fr\n" -"X-Source-Language: C\n" msgid "Supports Painting" msgstr "Prend en charge la peinture" @@ -28,13 +26,13 @@ msgid "Left mouse button" msgstr "Bouton gauche de la souris" msgid "Enforce supports" -msgstr "Appliquer les supports" +msgstr "Forcer les supports" msgid "Right mouse button" msgstr "Bouton droit de la souris" msgid "Block supports" -msgstr "Bloc prend en charge" +msgstr "Bloquer les supports" msgid "Shift + Left mouse button" msgstr "Maj + bouton gauche de la souris" @@ -48,14 +46,14 @@ msgstr "Effacer toute la peinture" msgid "Highlight overhang areas" msgstr "Mettez en surbrillance les zones en surplomb" -msgid "Fragment filter" +msgid "Gap fill" msgstr "" msgid "Perform" -msgstr "" +msgstr "Exécuter" msgid "Fragment area" -msgstr "" +msgstr "Fragment area" msgid "Set pen size" msgstr "Définir la taille du stylo" @@ -79,9 +77,9 @@ msgid "Sphere" msgstr "Sphère" msgid "Fill" -msgstr "" +msgstr "Fill" -msgid "Fragment Filter" +msgid "Gap Fill" msgstr "" msgid "Highlight faces according to overhang angle." @@ -136,13 +134,13 @@ msgid "Filaments" msgstr "Filaments" msgid "Brush" -msgstr "Brosser" +msgstr "Pinceau" msgid "Smart fill" msgstr "Remplissage intelligent" msgid "Bucket fill" -msgstr "Remplissage du seau" +msgstr "Pot de peinture" msgid "Height range" msgstr "Plage de hauteur" @@ -151,10 +149,10 @@ msgid "Shortcut Key " msgstr "Touche de raccourci" msgid "Triangle" -msgstr "" +msgstr "Triangle" msgid "Height Range" -msgstr "" +msgstr "Height Range" msgid "Remove painted color" msgstr "Supprimer la couleur peinte" @@ -167,7 +165,7 @@ msgid "Move" msgstr "Déplacer" msgid "Rotate" -msgstr "Tourner" +msgstr "Pivoter" msgid "Optimize orientation" msgstr "Optimiser l'orientation" @@ -176,7 +174,7 @@ msgid "Apply" msgstr "Appliquer" msgid "Scale" -msgstr "Échelle" +msgstr "Redimensionner" msgid "Error: Please close all toolbar menus first" msgstr "Erreur : Veuillez d'abord fermer tous les menus de la barre d'outils" @@ -212,35 +210,32 @@ msgid "Group Operations" msgstr "Group operations" msgid "Set Position" -msgstr "Définir la position" +msgstr "Définir la Position" msgid "Set Orientation" -msgstr "Définir l'orientation" +msgstr "Définir l'Orientation" msgid "Set Scale" -msgstr "Définir l'échelle" +msgstr "Définir l'Échelle" msgid "Reset Position" msgstr "Position de réinitialisation" msgid "Reset Rotation" -msgstr "Réinitialiser la rotation" +msgstr "Réinitialiser la Rotation" msgid "World coordinates" -msgstr "Coordonnées mondiales" +msgstr "Les coordonnées mondiales" msgid "°" msgstr "°" -msgid "Position:" -msgstr "Position:" +msgid "Size" +msgstr "Taille" msgid "%" msgstr "%" -msgid "Size" -msgstr "Taille" - msgid "uniform scale" msgstr "échelle uniforme" @@ -257,10 +252,10 @@ msgid "Height:" msgstr "Hauteur:" msgid "Keep upper part" -msgstr "Conserver la partie supérieure" +msgstr "Garder la partie du haut" msgid "Keep lower part" -msgstr "Garder la partie inférieure" +msgstr "Garder la partie du bas" msgid "Cut to parts" msgstr "Couper la sélection dans le presse-papiers" @@ -281,7 +276,7 @@ msgid "Detail level" msgstr "Niveau de détail" msgid "Decimate ratio" -msgstr "Ratio de décimation" +msgstr "Rapport de décimation" #, boost-format msgid "" @@ -309,30 +304,30 @@ msgid "Extra high" msgstr "Très haut" msgid "High" -msgstr "Haut" +msgstr "Élevé" msgid "Medium" msgstr "Moyen" msgid "Low" -msgstr "Bas" +msgstr "Faible" msgid "Extra low" -msgstr "Très basse" +msgstr "Très bas" #, c-format, boost-format msgid "%d triangles" msgstr "%d triangles" msgid "Show wireframe" -msgstr "Afficher le fil de fer" +msgstr "Afficher la vue filaire" #, boost-format msgid "%1%" -msgstr "" +msgstr "%1%" msgid "Can't apply when proccess preview." -msgstr "Ne peut pas s'appliquer lors de l'aperçu du processus." +msgstr "Ne peut pas s'appliquer lors du processus de prévisualisation." msgid "Cancel" msgstr "Annuler" @@ -341,10 +336,10 @@ msgid "Operation already cancelling. Please wait few seconds." msgstr "Opération déjà annulée. Veuillez patienter quelques secondes." msgid "Face recognition" -msgstr "" +msgstr "Face recognition" msgid "Perform Recognition" -msgstr "" +msgstr "Perform Recognition" msgid "Cube" msgstr "Cube" @@ -356,19 +351,19 @@ msgid "Cone" msgstr "Cône" msgid "Timelapse Wipe Tower" -msgstr "" +msgstr "Timelapse Wipe Tower" msgid "Add Modifier" msgstr "Ajouter un modificateur" msgid "Notice" -msgstr "Remarquer" +msgstr "Remarque" msgid "Warning" -msgstr "Avertissement" +msgstr "Alerte" msgid "Undefined" -msgstr "erreur indéfinie" +msgstr "Non défini" #, boost-format msgid "%1% was replaced with %2%" @@ -435,6 +430,13 @@ msgstr "Erreur critique" msgid "BambuStudio got an unhandled exception: %1%" msgstr "BambuStudio a reçu une exception non gérée : %1%" +msgid "Downloading Bambu Network plug-in" +msgstr "" + +#, c-format, boost-format +msgid "Connect %s[SN:%s] failed!" +msgstr "" + msgid "" "BambuStudio configuration file may be corrupted and is not abled to be " "parsed.Please delete the file and try again." @@ -446,10 +448,12 @@ msgstr "" msgid "" "%s\n" "Do you want to continue?" -msgstr "%s Voulez-vous continuer ?" +msgstr "" +"%s\n" +"Voulez-vous continuer ?" msgid "Remember my choice" -msgstr "Souviens-toi de mon choix" +msgstr "Se souvenir de mon choix" msgid "Loading configuration" msgstr "Chargement de la configuration" @@ -460,12 +464,15 @@ msgstr "" "Cliquez pour télécharger la nouvelle version dans le navigateur par défaut : " "%s" -msgid "New version of Bambu Studio" -msgstr "Nouvelle version de Bambu Studio" - msgid "The Bambu Studio needs an upgrade" msgstr "Le Bambu Studio a besoin d'une mise à niveau" +msgid "This is the newest version." +msgstr "Il s'agit de la version la plus récente." + +msgid "Info" +msgstr "Info" + msgid "Loading user presets..." msgstr "Chargement des préréglages utilisateur..." @@ -487,31 +494,27 @@ msgstr "Choisissez un ou plusieurs fichiers (3mf/step/stl/obj/amf) :" msgid "Choose one file (gcode/.gco/.g/.ngc/ngc):" msgstr "Choisissez un fichier (gcode/.gco/.g/.ngc/ngc) :" -msgid "Login information expired. Please login again." -msgstr "Les informations de connexion ont expiré. Veuillez vous reconnecter." - msgid "" "The version of Bambu studio is too low and needs to be updated to the latest " "version before it can be used normally" msgstr "" +"The version of Bambu studio is too low and needs to be updated to the latest " +"version before it can be used normally" -msgid "This is the newest version." -msgstr "Il s'agit de la version la plus récente." - -msgid "Info" -msgstr "Info" +msgid "Login information expired. Please login again." +msgstr "Les informations de connexion ont expiré. Veuillez vous reconnecter." msgid "Loading" msgstr "Chargement" msgid "Loading user preset" -msgstr "" +msgstr "Loading user preset" msgid "Switching application language" msgstr "Changer la langue de l'application" msgid "Select the language" -msgstr "Sélectionnez la langue" +msgstr "Sélectionner la langue" msgid "Language" msgstr "Langue" @@ -530,11 +533,11 @@ msgid "Select a G-code file:" msgstr "Sélectionnez un fichier G-code :" msgid "Bambu Studio GUI initialization failed" -msgstr "" +msgstr "Bambu Studio GUI initialization failed" #, boost-format msgid "Fatal error, exception catched: %1%" -msgstr "" +msgstr "Erreur fatale, exception interceptée : %1%" msgid "Quality" msgstr "Qualité" @@ -549,7 +552,7 @@ msgid "Support" msgstr "Soutien" msgid "Speed" -msgstr "La rapidité" +msgstr "Vitesse" msgid "Strength" msgstr "Force" @@ -567,19 +570,19 @@ msgid "Bottom Minimum Shell Thickness" msgstr "Épaisseur minimale de la coque inférieure" msgid "Ironing" -msgstr "Repassage" +msgstr "Lissage" msgid "Fuzzy Skin" -msgstr "Peau floue" +msgstr "Surface Irrégulière" msgid "Extruders" -msgstr "Extrudeuses" +msgstr "Extrudeurs" msgid "Extrusion Width" -msgstr "Largeur d'extrusion" +msgstr "Largeur d'Extrusion" msgid "Wipe options" -msgstr "Options d'effacement" +msgstr "Options de nettoyage" msgid "Bed adhension" msgstr "Adhérence au lit" @@ -600,13 +603,13 @@ msgid "Add support blocker" msgstr "Ajouter un bloqueur de support" msgid "Add support enforcer" -msgstr "Ajouter un bloqueur de support" +msgstr "Ajouter un générateur de supports" msgid "Select settings" msgstr "Sélectionnez les paramètres" msgid "Delete" -msgstr "Effacer" +msgstr "Supprimer" msgid "Delete the selected object" msgstr "Supprimer l'objet sélectionné" @@ -615,7 +618,7 @@ msgid "Load..." msgstr "Charger..." msgid "Add settings" -msgstr "Ajouter des paramètres" +msgstr "Ajouter des réglages" msgid "Change type" msgstr "Changer le type" @@ -636,7 +639,7 @@ msgid "Fix model" msgstr "Fix Model" msgid "Export as STL" -msgstr "Exporter en STL" +msgstr "Exporter en tant que STL" msgid "Reload item" msgstr "Recharger l'élément" @@ -709,7 +712,7 @@ msgid "Mirror along the Z axis" msgstr "Miroir le long de l'axe Z" msgid "Mirror" -msgstr "Miroir" +msgstr "Symétrie" msgid "Mirror object" msgstr "Objet miroir" @@ -718,22 +721,22 @@ msgid "Add Primitive" msgstr "Ajouter une primitive" msgid "To objects" -msgstr "Aux objets" +msgstr "Vers les objets" msgid "Split the selected object into multiple objects" msgstr "Diviser l'objet sélectionné en plusieurs objets" msgid "To parts" -msgstr "Aux pièces" +msgstr "Vers les parties" msgid "Split the selected object into multiple parts" msgstr "Diviser l'objet sélectionné en plusieurs parties" msgid "Split" -msgstr "Diviser" +msgstr "Scinder" msgid "Split the selected object" -msgstr "Diviser l'objet sélectionné" +msgstr "Scinder l'objet sélectionné" msgid "Auto orientation" msgstr "Orientation automatique" @@ -761,7 +764,7 @@ msgid "delete all objects on current plate" msgstr "supprimer tous les objets sur la plaque actuelle" msgid "Arrange" -msgstr "Organiser" +msgstr "Agencer" msgid "arrange current plate" msgstr "organiser la plaque actuelle" @@ -797,10 +800,10 @@ msgid "current" msgstr "courant" msgid "Set Unprintable" -msgstr "Définir non imprimable" +msgstr "Définir non-Imprimable" msgid "Set Printable" -msgstr "Ensemble imprimable" +msgstr "Définir Imprimable" msgid "Unlock" msgstr "Ouvrir" @@ -880,7 +883,7 @@ msgid "Object" msgstr "Objet" msgid "Part" -msgstr "Partie" +msgstr "Pièce" msgid "Layer" msgstr "Couche" @@ -912,22 +915,22 @@ msgid "Modifier" msgstr "Modificateur" msgid "Support Blocker" -msgstr "Bloqueur de soutien" +msgstr "Bloqueur de Support" msgid "Support Enforcer" -msgstr "Support Enforcer" +msgstr "Générateur de Support" msgid "Type:" -msgstr "Taper:" +msgstr "Type :" msgid "Choose part type" msgstr "Choisissez le type de pièce" msgid "Enter new name" -msgstr "Entrez le nouveau nom" +msgstr "Entrer de nouveaux noms" msgid "Renaming" -msgstr "Renommer" +msgstr "Renommage" msgid "Repairing model object" msgstr "Réparer l'objet modèle" @@ -993,7 +996,7 @@ msgid "Plate" msgstr "Plaque" msgid "Brim" -msgstr "Bord" +msgstr "Bordure" msgid "Object/Part Setting" msgstr "Réglage objet/pièce" @@ -1010,10 +1013,8 @@ msgstr "Type de ligne" msgid "No printer" msgstr "Pas d'imprimante" -msgid "" -"Heat the nozzle to target \n" -"temperature" -msgstr "Chauffer la buse à la température choisie" +msgid "Heat the nozzle to target temperature" +msgstr "" msgid "Cut filament" msgstr "filament coupé" @@ -1021,13 +1022,11 @@ msgstr "filament coupé" msgid "Pull back current filament" msgstr "Retirer le filament actuel" -msgid "" -"Push new filament \n" -"into extruder" -msgstr "Poussez le nouveau filament dans l'extruder" +msgid "Push new filament into extruder" +msgstr "" msgid "Purge old filament" -msgstr "" +msgstr "Purge old filament" msgid "?" msgstr "?" @@ -1039,10 +1038,10 @@ msgid "Click the pencil icon to edit the filament." msgstr "Cliquez sur l'icône du crayon pour modifier le filament." msgid "Load Filament" -msgstr "Charger" +msgstr "Load" msgid "Unload Filament" -msgstr "" +msgstr "Unload" msgid "Tips" msgstr "astuces" @@ -1099,11 +1098,8 @@ msgstr "" "Échec de l'arrangement. Trouvé quelques exceptions lors du traitement des " "géométries d'objets." -msgid "Arranging" -msgstr "" - msgid "Arranging canceled." -msgstr "Arrangement annulé." +msgstr "Agencement annulé." msgid "" "Arranging is done but there are unpacked items. Reduce spacing and try again." @@ -1112,7 +1108,7 @@ msgstr "" "l'espacement et réessayez." msgid "Arranging done." -msgstr "Rangement fait." +msgstr "Agencement terminé." #, c-format, boost-format msgid "" @@ -1120,8 +1116,9 @@ msgid "" "bed:\n" "%s" msgstr "" -"L'arrangement a ignoré les objets suivants qui ne peuvent pas tenir dans un " -"lit simple : %s" +"L'agencement a ignoré les objets suivants qui ne peuvent pas tenir dans un " +"seul plateau :\n" +"%s" msgid "" "All the selected objects are on the locked plate,\n" @@ -1150,160 +1147,232 @@ msgid "Exception" msgstr "Exception" msgid "Logging in" -msgstr "" +msgstr "Logging in" msgid "Login failed" -msgstr "" +msgstr "Login failed" msgid "The region parameter is incorrrect" -msgstr "" +msgstr "The region parameter is incorrrect." msgid "Failure of printer login" -msgstr "" +msgstr "Failure of printer login" msgid "Failed to get ticket" -msgstr "" +msgstr "Failed to get ticket" msgid "User authorization timeout" -msgstr "" +msgstr "User authorization timeout" msgid "Failure of bind" -msgstr "" +msgstr "Failure of bind" msgid "Unknown Failure" -msgstr "" +msgstr "Unknown Failure" msgid "Abnormal print file data. Please slice again" -msgstr "" +msgstr "Abnormal print file data. Please slice again" msgid "Task canceled" -msgstr "" +msgstr "Task canceled" msgid "Upload task timed out. Please check the network problem and try again" -msgstr "" +msgstr "Upload task timed out. Please check the network problem and try again" msgid "Cloud service connection failed. Please try again." -msgstr "" +msgstr "Cloud service connection failed. Please try again." msgid "Print file not found, please slice again" -msgstr "" +msgstr "Print file not found, please slice again" msgid "" "The print file exceeds the maximum allowable size (1GB). Please simplify the " "model and slice again" msgstr "" +"The print file exceeds the maximum allowable size (1GB). Please simplify the " +"model and slice again" msgid "Failed uploading print file" -msgstr "" +msgstr "Failed uploading print file" msgid "Wrong Access code" -msgstr "" +msgstr "Wrong Access code" msgid "Sending print job over LAN" -msgstr "" +msgstr "Sending print job over LAN" msgid "Sending print job through cloud service" +msgstr "Sending print job through cloud service" + +msgid "Service Unavailable" +msgstr "" + +msgid "Unkown Error." msgstr "" msgid "Sending print configuration" -msgstr "" +msgstr "Sending print configuration" #, c-format, boost-format -msgid "Successfully sent.Will automatically jump to the device page in %s s" +msgid "Successfully sent. Will automatically jump to the device page in %s s" +msgstr "" + +msgid "An SD card needs to be inserted before printing via LAN." +msgstr "" + +msgid "Downloading" +msgstr "" + +msgid "Download failed" +msgstr "" + +msgid "Cancelled" +msgstr "" + +msgid "Finish" +msgstr "" + +msgid "Installing" +msgstr "" + +msgid "Install failed" msgstr "" msgid "Portions copyright" -msgstr "" +msgstr "Copyright des sections" msgid "Copyright" -msgstr "" +msgstr "Droits d'auteur" msgid "License" msgstr "Longueur" msgid "Bambu Studio is licensed under " -msgstr "" +msgstr "Bambu Studio is licensed under " msgid "GNU Affero General Public License, version 3" -msgstr "" +msgstr "GNU Affero Licence Publique Générale, version 3" msgid "" "Bambu Studio is based on PrusaSlicer by Prusa Research, which is from Slic3r " "by Alessandro Ranellucci and the RepRap community" msgstr "" +"Bambu Studio is based on PrusaSlicer by Prusa Research, which is from Slic3r " +"by Alessandro Ranellucci and the RepRap community" msgid "Libraries" -msgstr "" +msgstr "Libraries" msgid "" "This software uses open source components whose copyright and other " "proprietary rights belong to their respective owners" msgstr "" +"This software uses open source components whose copyright and other " +"proprietary rights belong to their respective owners" #, c-format, boost-format msgid "About %s" +msgstr "Au sujet de %s" + +msgid "" +"Bambu Studio is based on PrusaSlicer by PrusaResearch and SuperSlicer by " +"Merill(supermerill)." +msgstr "" + +msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." +msgstr "" + +msgid "" +"Slic3r was created by Alessandro Ranellucci with the help of many other " +"contributors." +msgstr "" + +msgid "Bambu Studio also referenced some ideas from Cura by Ultimaker." +msgstr "" + +msgid "" +"There many parts of the software that come from community contributions, so " +"we're unable to list them one-by-one, and instead, they'll be attributed in " +"the corresponding code comments." msgstr "" msgid "Colour" -msgstr "" +msgstr "Colour" msgid "SN" -msgstr "" +msgstr "SN" msgid "" "Nozzle\n" "Temperature" msgstr "" +"Nozzle\n" +"Temperature" msgid "max" -msgstr "" +msgstr "max" msgid "min" -msgstr "" +msgstr "min" #, boost-format msgid "The input value should be greater than %1% and less than %2%" -msgstr "" +msgstr "The input value should be greater than %1% and less than %2%" msgid "Confirm" msgstr "Confirmer" msgid "Insertion update" -msgstr "" +msgstr "Insertion update" msgid "" "The AMS will automatically read the filament information when inserting a " "new Bambu Lab filament. This takes about 20 seconds." msgstr "" +"The AMS will automatically read the filament information when inserting a " +"new Bambu Lab filament. This takes about 20 seconds." msgid "" "Note: if new filament is inserted during printing, the AMS will not " "automatically read any information until printing is completed." msgstr "" +"Note: if new filament is inserted during printing, the AMS will not " +"automatically read any information until printing is completed." msgid "" "When inserting a new filament, the AMS will not automatically read its " "information, leaving it blank for you to enter manually." msgstr "" +"When inserting a new filament, the AMS will not automatically read its " +"information, leaving it blank for you to enter manually." msgid "Power on update" -msgstr "" +msgstr "Power on update" msgid "" "The AMS will automatically read the information of inserted filament on " "start-up. It will take about 1 minute.The reading process will roll filament " "spools." msgstr "" +"The AMS will automatically read the information of inserted filament on " +"start-up. It will take about 1 minute.The reading process will roll filament " +"spools." msgid "" "The AMS will not automatically read information from inserted filament " "during startup and will continue to use the information recorded before the " "last shutdown." msgstr "" +"The AMS will not automatically read information from inserted filament " +"during startup and will continue to use the information recorded before the " +"last shutdown." msgid "File" msgstr "Dossier" +msgid "Close" +msgstr "Fermer" + msgid "" "A error occurred. Maybe memory of system is not enough or it's a bug of the " "program" @@ -1318,7 +1387,7 @@ msgid "Processing G-Code from Previous file..." msgstr "Traitement du G-Code du fichier précédent..." msgid "Slicing complete" -msgstr "Tranchage terminé" +msgstr "Découpe terminée" msgid "Access violation" msgstr "Violation d'accès" @@ -1333,10 +1402,10 @@ msgid "Overflow" msgstr "Débordement" msgid "Underflow" -msgstr "Sous-dépassement" +msgstr "Soupassement" msgid "Floating reserved operand" -msgstr "Opérande réservé flottant" +msgstr "Opérande réservée flottante" msgid "Stack overflow" msgstr "Débordement de pile" @@ -1364,27 +1433,27 @@ msgid "Diameter" msgstr "Diamètre" msgid "Size in X and Y of the rectangular plate." -msgstr "Taille en X et Y de la plaque rectangulaire." +msgstr "Taille en X et Y du plateau rectangulaire." msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." msgstr "" -"Distance de la coordonnée 0,0 du code G à partir du coin avant gauche du " +"Distance des coordonnées 0,0 du G-code depuis le coin avant gauche du " "rectangle." msgid "" "Diameter of the print bed. It is assumed that origin (0,0) is located in the " "center." msgstr "" -"Diamètre du lit d'impression. On suppose que l'origine (0,0) est située au " -"centre." +"Diamètre du plateau d'impression. Il est supposé que l'origine (0,0) est " +"située au centre." msgid "Rectangular" -msgstr "Rectangulaire" +msgstr "Rectangle" msgid "Circular" -msgstr "Rectangulaire" +msgstr "Circulaire" msgid "Custom" msgstr "Personnalisé" @@ -1393,7 +1462,7 @@ msgid "Shape" msgstr "Forme" msgid "Load shape from STL..." -msgstr "Charger la forme depuis STL..." +msgstr "Charger une forme depuis un STL..." msgid "Settings" msgstr "Réglages" @@ -1405,19 +1474,20 @@ msgid "Remove" msgstr "Retirer" msgid "Not found:" -msgstr "Pas trouvé:" +msgstr "Introuvable:" msgid "Model" msgstr "Modèle" msgid "Choose an STL file to import bed shape from:" -msgstr "Choisissez un fichier STL à partir duquel importer la forme du lit :" +msgstr "" +"Choisissez un fichier STL à partir duquel importer la forme du plateau :" msgid "Invalid file format." -msgstr "Format de fichier invalide." +msgstr "Format de fichier non valide." msgid "Error! Invalid model" -msgstr "Erreur! Modèle invalide" +msgstr "Erreur ! Modèle invalide" msgid "The selected file contains no geometry." msgstr "Le fichier sélectionné ne contient aucune géométrie." @@ -1425,18 +1495,18 @@ msgstr "Le fichier sélectionné ne contient aucune géométrie." msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" -"Le fichier sélectionné contient plusieurs zones disjointes. Ceci n'est pas " -"pris en charge." +"Le fichier sélectionné contient plusieurs zones disjointes. Cela n'est pas " +"utilisable." msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "" -"Choisissez un fichier à partir duquel importer la texture du lit (PNG/SVG) :" +"Choisir un fichier à partir duquel importer la texture du plateau (PNG/SVG) :" msgid "Choose an STL file to import bed model from:" msgstr "Choisissez un fichier STL à partir duquel importer le modèle de lit :" msgid "Bed Shape" -msgstr "Forme du lit" +msgstr "Forme du plateau" msgid "" "Nozzle may be blocked when the temperature is out of recommended range.\n" @@ -1596,67 +1666,67 @@ msgstr "" "que 100%\n" msgid "Auto bed leveling" -msgstr "" +msgstr "Auto bed leveling" msgid "Heatbed preheating" -msgstr "" +msgstr "Heatbed preheating" msgid "Sweeping XY mech mode" -msgstr "" +msgstr "Sweeping XY mech mode" msgid "Changing filament" -msgstr "" +msgstr "Changing filament" msgid "M400 pause" -msgstr "" +msgstr "M400 pause" msgid "Paused due to filament runout" -msgstr "" +msgstr "Paused due to filament runout" msgid "Heating hotend" -msgstr "" +msgstr "Heating hotend" msgid "Calibrating extrusion" -msgstr "" +msgstr "Calibrating extrusion" msgid "Scanning bed surface" -msgstr "" +msgstr "Scanning bed surface" msgid "Inspecting first layer" -msgstr "" +msgstr "Inspecting first layer" msgid "Identifying build plate type" -msgstr "" +msgstr "Identifying build plate type" msgid "Calibrating Micro Lidar" -msgstr "" +msgstr "Calibrating Micro Lidar" msgid "Homing toolhead" -msgstr "" +msgstr "Homing toolhead" msgid "Cleaning nozzle tip" -msgstr "" +msgstr "Cleaning nozzle tip" msgid "Checking extruder temperature" -msgstr "" +msgstr "Checking extruder temperature" msgid "Printing was paused by the user" -msgstr "" +msgstr "Printing was paused by the user" msgid "Pause of front cover falling" -msgstr "" +msgstr "Pause of front cover falling" msgid "Calibrating the micro lida" -msgstr "" +msgstr "Calibrating the micro lidar" msgid "Calibrating extrusion flow" -msgstr "" +msgstr "Calibrating extrusion flow" msgid "Paused due to nozzle temperature malfunction" -msgstr "" +msgstr "Paused due to nozzle temperature malfunction" msgid "Paused due to heat bed temperature malfunction" -msgstr "" +msgstr "Paused due to heat bed temperature malfunction" msgid "MC" msgstr "MC" @@ -1674,7 +1744,7 @@ msgid "XCam" msgstr "XCam" msgid "Unknown" -msgstr "Inconnue" +msgstr "Inconnu" msgid "Fatal" msgstr "Mortel" @@ -1697,6 +1767,9 @@ msgstr "Échec de la vérification." msgid "Update failed." msgstr "Mise à jour a échoué." +msgid "Failed to start printing job" +msgstr "" + msgid "N/A" msgstr "N / A" @@ -1712,7 +1785,7 @@ msgid "Value %s is out of range, continue?" msgstr "La valeur %s est hors plage, continuer ?" msgid "Parameter validation" -msgstr "Validation des paramètres" +msgstr "Validation du paramètre" msgid "Value is out of range." msgstr "La valeur est hors plage." @@ -1741,7 +1814,7 @@ msgid "Temperature" msgstr "Température" msgid "Flow" -msgstr "débit" +msgstr "Flux" msgid "Tool" msgstr "Outil" @@ -1762,7 +1835,7 @@ msgid "up to" msgstr "jusqu'à" msgid "above" -msgstr "au dessus" +msgstr "au-dessus" msgid "from" msgstr "de" @@ -1777,10 +1850,10 @@ msgid "Percent" msgstr "Pour cent" msgid "Time" -msgstr "Temps" +msgstr "Durée" msgid "Display" -msgstr "Affichage" +msgstr "Afficher" msgid "Line type" msgstr "Type de ligne" @@ -1804,22 +1877,22 @@ msgid "Volumetric flow rate (mm³/s)" msgstr "Débit volumétrique (mm³/s)" msgid "Used filament" -msgstr "Filament usagé" +msgstr "Filament utilisé" msgid "Filament N XX" msgstr "Filament N XX" msgid "Color Print" -msgstr "Impression couleur" +msgstr "Couleur d'Impression" msgid "Comsumption" msgstr "Consommation" msgid "Travel" -msgstr "Voyager" +msgstr "Déplacement" msgid "Seams" -msgstr "Coutures" +msgstr "Jointures" msgid "Retract" msgstr "Se rétracter" @@ -1831,7 +1904,7 @@ msgid "Filament Changes" msgstr "Changements de filaments" msgid "Wipe" -msgstr "Essuyer" +msgstr "Nettoyer" msgid "Options" msgstr "Choix" @@ -1840,16 +1913,16 @@ msgid "travel" msgstr "voyager" msgid "Extruder" -msgstr "Extrudeuse" +msgstr "Extrudeur" msgid "Filament 1" msgstr "Filament 1" msgid "Flushed filament" -msgstr "" +msgstr "Flushed filament" msgid "Filament change times" -msgstr "" +msgstr "Filament change times" msgid "Color change" msgstr "Changement de couleur" @@ -1864,7 +1937,7 @@ msgid "Printer" msgstr "Imprimante" msgid "Print settings" -msgstr "Paramètres d'impression" +msgstr "Réglages d'impression" msgid "Total Estimation" msgstr "Estimation totale" @@ -1891,13 +1964,13 @@ msgid "Sequence" msgstr "Séquence" msgid "Mirror Object" -msgstr "Objet miroir" +msgstr "Symétriser l'Objet" msgid "Tool Move" msgstr "Déplacement d'outil" msgid "Move Object" -msgstr "Déplacer l'objet" +msgstr "Déplacer l'Objet" msgid "Auto Orientation options" msgstr "Options d'orientation automatique" @@ -1912,7 +1985,7 @@ msgid "Orient" msgstr "Orient" msgid "Arrange options" -msgstr "Disposer les objets sur les plaques sélectionnées" +msgstr "Options d'agencement" msgid "Spacing" msgstr "Espacement" @@ -1939,10 +2012,10 @@ msgid "Auto arrange" msgstr "Organisation automatique" msgid "Split to objects" -msgstr "Fractionner en objets" +msgstr "Diviser en objets individuels" msgid "Split to parts" -msgstr "Diviser en parties" +msgstr "Scinder en pièces" msgid "Assembly View" msgstr "Vue de l'assemblage" @@ -1954,7 +2027,7 @@ msgid "Assembly Return" msgstr "Retour d'assemblage" msgid "return" -msgstr "" +msgstr "return" msgid "Paint Toolbar" msgstr "Barre d'outils de peinture" @@ -1984,11 +2057,10 @@ msgid "Only the object being edit is visible." msgstr "Seul l'objet en cours d'édition est visible." msgid "" -"An object is layed over the boundary of plate.\n" -"Please solve the problem by moving it totally inside or outside plate." +"An object is laid over the boundary of plate or exceeds the height limit.\n" +"Please solve the problem by moving it totally on or off the plate, and " +"confirming that the height is within the build volume." msgstr "" -"Un objet est posé sur la limite de la plaque. Veuillez résoudre le problème " -"en le déplaçant totalement à l'intérieur ou à l'extérieur de la plaque." msgid "Calibration" msgstr "Étalonnage" @@ -2001,6 +2073,9 @@ msgid "" "minimize deviation.\n" "It keeps the device performing optimally." msgstr "" +"The calibration program detects the status of your device automatically to " +"minimize deviation.\n" +"It keeps the device performing optimally." msgid "Calibration Flow" msgstr "Flux d'étalonnage" @@ -2008,6 +2083,9 @@ msgstr "Flux d'étalonnage" msgid "Start Calibration" msgstr "Démarrer l'étalonnage" +msgid "Completed" +msgstr "" + msgid "Calibrating" msgstr "Étalonnage" @@ -2015,48 +2093,20 @@ msgid "Timelapse" msgstr "Laps de temps" msgid "Monitoring Recording" -msgstr "" +msgstr "Monitoring Recording" msgid "ConnectPrinter(LAN)" -msgstr "" +msgstr "ConnectPrinter(LAN)" msgid "Please input the printer access code:" -msgstr "" +msgstr "Please input the printer access code:" msgid "" "You can find it in \"Settings > Network > Connection code\"\n" "on the printer, as shown in the figure:" msgstr "" - -msgid "Creating" -msgstr "" - -msgid "Uploading" -msgstr "" - -msgid "Waiting" -msgstr "" - -msgid "Sending" -msgstr "" - -msgid "Finished" -msgstr "" - -msgid "Please fill report first." -msgstr "Veuillez d'abord remplir le rapport." - -msgid "Unable to create zip file" -msgstr "" - -msgid "Enter a search term" -msgstr "" - -msgid "Online" -msgstr "En ligne" - -msgid "Offline" -msgstr "Hors ligne" +"You can find it in \"Settings > Network > Connection code\"\n" +"on the printer, as shown in the figure:" msgid "Application is closing" msgstr "L'application se ferme" @@ -2075,16 +2125,13 @@ msgid "Preview" msgstr "Aperçu" msgid "Device" -msgstr "" +msgstr "Device" msgid "Project" msgstr "Projet" -msgid "Debug" -msgstr "Déboguer" - msgid "Slice" -msgstr "Tranche" +msgstr "Découper" msgid "Slice all" msgstr "Tout trancher" @@ -2102,7 +2149,7 @@ msgid "Export Sliced File" msgstr "Exporter le fichier découpé" msgid "Keyboard Shortcuts" -msgstr "Raccourcis clavier" +msgstr "Raccourcis Clavier" msgid "Show the list of the keyboard shortcuts" msgstr "Afficher la liste des raccourcis clavier" @@ -2118,7 +2165,7 @@ msgstr "Vérifier la mise à jour" #, c-format, boost-format msgid "&About %s" -msgstr "&À propos de %s" +msgstr "&Au sujet de %s" msgid "Default View" msgstr "Vue par défaut" @@ -2128,41 +2175,41 @@ msgid "Top" msgstr "Haut" msgid "Top View" -msgstr "Vue de dessus" +msgstr "Vue du Dessus" #. TRN To be shown in the main menu View->Bottom msgid "Bottom" -msgstr "Fond" +msgstr "Dessous" msgid "Bottom View" -msgstr "Vue de dessous" +msgstr "Vue du Dessous" msgid "Front" -msgstr "De face" +msgstr "Avant" msgid "Front View" -msgstr "Vue de face" +msgstr "Vue Avant" msgid "Rear" msgstr "Arrière" msgid "Rear View" -msgstr "Vue arrière" +msgstr "Vue Arrière" msgid "Left" -msgstr "La gauche" +msgstr "Gauche" msgid "Left View" -msgstr "Vue de gauche" +msgstr "Vue Gauche" msgid "Right" -msgstr "Droit" +msgstr "Droite" msgid "Right View" -msgstr "Vue de droite" +msgstr "Vue Droite" msgid "New Project" -msgstr "Partie négative" +msgstr "Nouveau Projet" msgid "Start a new project" msgstr "Démarrer un nouveau projet" @@ -2174,7 +2221,7 @@ msgid "Open a project file" msgstr "Ouvrir un fichier de projet" msgid "Recent projects" -msgstr "Les projets récents" +msgstr "Proj&ets récents" msgid "Save Project" msgstr "Sauvegarder le projet" @@ -2200,6 +2247,12 @@ msgstr "Exporter tous les objets au format STL" msgid "Export current Sliced file" msgstr "Exporter le fichier en tranches actuel" +msgid "Export G-code" +msgstr "Exporter le G-code" + +msgid "Export current plate as G-code" +msgstr "" + msgid "Export" msgstr "Exporter" @@ -2207,37 +2260,37 @@ msgid "Quit" msgstr "Quitter" msgid "Undo" -msgstr "annuler" +msgstr "Annuler" msgid "Redo" -msgstr "Refaire" +msgstr "Recommencer" msgid "Cut selection to clipboard" msgstr "Couper la sélection dans le presse-papiers" msgid "Copy" -msgstr "Copie" +msgstr "Copier" msgid "Copy selection to clipboard" -msgstr "Copier la sélection dans le presse-papiers" +msgstr "Copier la sélection dans le presse-papier" msgid "Paste" -msgstr "Pâte" +msgstr "Coller" msgid "Paste clipboard" -msgstr "Coller le presse-papiers" +msgstr "Coller le presse-papier" msgid "Delete selected" -msgstr "Supprimer sélectionnée" +msgstr "Supprimer la sélection" msgid "Deletes the current selection" -msgstr "Supprime la sélection actuelle" +msgstr "Supprime la sélection en cours" msgid "Delete all" -msgstr "Supprimer tout" +msgstr "Tout Supprimer" msgid "Deletes all objects" -msgstr "Supprime tous les objets" +msgstr "Supprimer tous les objets" msgid "Clone selected" msgstr "Cloner sélectionné" @@ -2249,31 +2302,13 @@ msgid "Select all" msgstr "Tout sélectionner" msgid "Selects all objects" -msgstr "Sélectionne tous les objets" +msgstr "Sélectionner tous les objets" msgid "Deselect all" -msgstr "Tout déselectionner" +msgstr "Désélectionner tout" msgid "Deselects all objects" -msgstr "Désélectionne tous les objets" - -msgid "Show Model Mesh(TODO)" -msgstr "Afficher le maillage du modèle (TODO)" - -msgid "Display triangles of models" -msgstr "Afficher les triangles des modèles" - -msgid "Show Model Shadow(TODO)" -msgstr "Afficher l'ombre du modèle (TODO)" - -msgid "Display shadow of objects" -msgstr "Afficher l'ombre des objets" - -msgid "Show Printable Box(TODO)" -msgstr "Afficher la boîte imprimable (TODO)" - -msgid "Display printable box" -msgstr "Afficher la boîte imprimable" +msgstr "Désélectionner tous les objets" msgid "Use Perspective View" msgstr "Utiliser la vue en perspective" @@ -2285,50 +2320,50 @@ msgid "Preferences" msgstr "Préférences" msgid "View" -msgstr "Voir" +msgstr "Vue" msgid "Help" -msgstr "Aider" +msgstr "Aide" msgid "&Open G-code" -msgstr "" +msgstr "&Open G-code" msgid "Open a G-code file" -msgstr "" +msgstr "Open a G-code file" msgid "Re&load from Disk" -msgstr "" +msgstr "Re&load from Disk" msgid "Reload the plater from disk" -msgstr "" +msgstr "Reload the plater from disk" msgid "Export &Toolpaths as OBJ" -msgstr "" +msgstr "Export &Toolpaths as OBJ" msgid "Export toolpaths as OBJ" -msgstr "" +msgstr "Export toolpaths as OBJ" msgid "Open &PrusaSlicer" -msgstr "" +msgstr "Open &PrusaSlicer" msgid "Open PrusaSlicer" -msgstr "" +msgstr "Open PrusaSlicer" msgid "&Quit" -msgstr "" +msgstr "&Quit" #, c-format, boost-format msgid "Quit %s" -msgstr "" +msgstr "Quit %s" msgid "&File" -msgstr "" +msgstr "&File" msgid "&View" -msgstr "" +msgstr "&View" msgid "&Help" -msgstr "" +msgstr "&Help" msgid "Save configuration as:" msgstr "Enregistrer la configuration sous :" @@ -2340,11 +2375,11 @@ msgid "The project is no longer available." msgstr "Le projet n'est plus disponible." msgid "Filament Settings" -msgstr "Paramètres des filaments" +msgstr "Réglages du filament" msgid "" "Do you want to synchronize your personal data from Bambu Cloud? \n" -"Contains the following information:\n" +"It contains the following information:\n" "1. The Process presets\n" "2. The Filament presets\n" "3. The Printer presets\n" @@ -2377,13 +2412,13 @@ msgid "Load failed [%d]!" msgstr "Le chargement a échoué [%d] !" msgid "3Dconnexion settings" -msgstr "Paramètres de connexion 3D" +msgstr "Paramètres 3Dconnexion" msgid "Device:" -msgstr "Dispositif:" +msgstr "Appareil :" msgid "Speed:" -msgstr "La rapidité:" +msgstr "Vitesse:" msgid "Translation" msgstr "Traduction" @@ -2392,19 +2427,19 @@ msgid "Zoom" msgstr "Zoom" msgid "Deadzone:" -msgstr "Zone morte:" +msgstr "Zone morte :" msgid "Options:" -msgstr "Option :" +msgstr "Options :" msgid "Swap Y/Z axes" msgstr "Permuter les axes Y/Z" -msgid "Close" -msgstr "proche" +msgid "Camera" +msgstr "" -msgid "Monitoring" -msgstr "Surveillance" +msgid "Video" +msgstr "" msgid "Printing Progress" msgstr "Progression de l'impression" @@ -2419,7 +2454,7 @@ msgid "0%" msgstr "0%" msgid "Control" -msgstr "" +msgstr "Control" msgid "100%" msgstr "100%" @@ -2434,7 +2469,7 @@ msgid "Aux Cooling" msgstr "Refroidissement auxiliaire" msgid "Bed" -msgstr "Lit" +msgstr "Plateau" msgid "Unload" msgstr "retirer" @@ -2445,6 +2480,9 @@ msgstr "Les informations de débogage" msgid "Printing List" msgstr "Liste d'impression" +msgid "Downloading..." +msgstr "" + msgid "Resume" msgstr "Résumer" @@ -2461,7 +2499,7 @@ msgid "Ludicrous" msgstr "Ridicule" msgid "Status" -msgstr "Statut" +msgstr "État" msgid "Media" msgstr "Médias" @@ -2472,15 +2510,15 @@ msgstr "Mise à jour" msgid "HMS" msgstr "HMS" -msgid "Please upgrade your printer first" -msgstr "" - msgid "Failed to connect to the server" msgstr "Impossible de se connecter au serveur" msgid "Failed to connect to the printer" msgstr "Échec de la connexion à l'imprimante" +msgid "Connecting..." +msgstr "" + msgid "OK" msgstr "OK" @@ -2492,7 +2530,7 @@ msgstr "Non" #, c-format, boost-format msgid "%s error" -msgstr "%s erreur" +msgstr "Erreur %s" #, c-format, boost-format msgid "%s has encountered an error" @@ -2512,7 +2550,7 @@ msgstr "%s infos" #, c-format, boost-format msgid "%s information" -msgstr "%s informations" +msgstr "Information de %s" msgid "Download" msgstr "Télécharger" @@ -2551,10 +2589,10 @@ msgid "Goto download page." msgstr "Allez sur la page de téléchargement." msgid "More" -msgstr "Suite" +msgstr "Plus" msgid "Open Folder." -msgstr "Dossier ouvert." +msgstr "Ouvrir un répertoire." #, c-format, boost-format msgid "%1$d Object has custom supports." @@ -2572,7 +2610,7 @@ msgid "Slice ok." msgstr "Slice complete" msgid "Export G-Code." -msgstr "Exporter le code G." +msgstr "Exporter le G-code." msgid "Export." msgstr "Exporter." @@ -2592,8 +2630,11 @@ msgstr "Exporter ok." msgid " (Repair)" msgstr "(Réparation)" +msgid " Click here to install it." +msgstr "" + msgid "WARNING:" -msgstr "ATTENTION:" +msgstr "ATTENTION :" msgid "Your model needs support ! Please make support material enable." msgstr "" @@ -2612,7 +2653,7 @@ msgid "Layers" msgstr "Couches" msgid "Range" -msgstr "Intervalle" +msgstr "Zone" msgid "default" msgstr "défaut" @@ -2628,7 +2669,7 @@ msgid "Please upgrade your graphics card driver." msgstr "Veuillez mettre à jour le pilote de votre carte graphique." msgid "Unsupported OpenGL version" -msgstr "Version OpenGL non prise en charge" +msgstr "Version d'OpenGL non supportée" #, c-format, boost-format msgid "" @@ -2641,11 +2682,11 @@ msgstr "Erreur lors du chargement des shaders" msgctxt "Layers" msgid "Top" -msgstr "Haut" +msgstr "Du haut" msgctxt "Layers" msgid "Bottom" -msgstr "Fond" +msgstr "Du bas" msgid "Switch to per-object setting mode to edit modifier settings." msgstr "" @@ -2665,7 +2706,7 @@ msgid "Advance" msgstr "Avance" msgid "Compare presets" -msgstr "Comparer les préréglages" +msgstr "Comparer les Préréglages" msgid "View all object's settings" msgstr "Afficher tous les paramètres de l'objet" @@ -2684,16 +2725,16 @@ msgid "Invalid name, the following characters are not allowed:" msgstr "Nom invalide, les caractères suivants ne sont pas autorisés :" msgid "Sliced Info" -msgstr "Informations en tranches" +msgstr "Informations de découpage" msgid "Used Filament (m)" -msgstr "Filament utilisé (m)" +msgstr "Filament Utilisé (m)" msgid "Used Filament (mm³)" -msgstr "Filament utilisé (mm³)" +msgstr "Filament Utilisé (mm³)" msgid "Used Filament (g)" -msgstr "Filament utilisé (g)" +msgstr "Filament Utilisé (g)" msgid "Used Materials" msgstr "Matériaux utilisés" @@ -2708,7 +2749,7 @@ msgid "Filament changes" msgstr "Changements de filaments" msgid "Click to edit preset" -msgstr "Cliquez pour modifier le préréglage" +msgstr "Cliquez pour éditer le préréglage" msgid "Bed type" msgstr "Type de lit" @@ -2766,7 +2807,7 @@ msgid "The name may show garbage characters!" msgstr "Le nom peut afficher des caractères inutiles !" msgid "Attention!" -msgstr "Attention!" +msgstr "Attention !" #, boost-format msgid "Failed loading file \"%1%\". An invalid configuration was found." @@ -2798,13 +2839,8 @@ msgstr "" msgid "Object with multiple parts was detected" msgstr "Un objet en plusieurs parties a été détecté" -msgid "" -"Preview only mode:\n" -"The loaded file contains gcode only." -msgstr "" - msgid "The file does not contain any geometry data." -msgstr "" +msgstr "The file does not contain any geometry data." msgid "Export STL file:" msgstr "Exporter le fichier STL :" @@ -2822,7 +2858,7 @@ msgid "Please select a file" msgstr "Veuillez sélectionner un fichier" msgid "Slicing" -msgstr "Tranchage" +msgstr "Découpe" msgid "There are warnings after slicing models:" msgstr "Il y a des avertissements après le découpage des modèles :" @@ -2831,7 +2867,7 @@ msgid "warnings" msgstr "avertissements" msgid "Invalid data" -msgstr "Données invalides" +msgstr "Donnée non valide" #, c-format, boost-format msgid "Slicing Plate %d" @@ -2840,6 +2876,15 @@ msgstr "Assiette à découper %d" msgid "Please resolve the slicing errors and publish again." msgstr "Veuillez résoudre les erreurs de découpage et republier." +msgid "" +"Network Plug-in is not detected. Network related features are unavailable." +msgstr "" + +msgid "" +"Preview only mode:\n" +"The loaded file contains gcode only, Can not enter the Prepare page" +msgstr "" + msgid "Some presets are modified." msgstr "Certains préréglages sont modifiés." @@ -2856,14 +2901,11 @@ msgstr "" "annuler ou enregistrer les modifications en tant que nouveaux préréglages." msgid "Creating a new project" -msgstr "Créer un nouveau projet" +msgstr "Création d'un nouveau projet" msgid "Load project" msgstr "Charger le projet" -msgid "Preview only mode for gcode file." -msgstr "" - msgid "The selected file" msgstr "Le fichier sélectionné" @@ -2883,16 +2925,16 @@ msgid "Open as project" msgstr "Ouvrir en tant que projet" msgid "Import geometry only" -msgstr "Importer uniquement la géométrie" +msgstr "Importer la géométrie uniquement" msgid "Only one G-code file can be opened at the same time." msgstr "Un seul fichier G-code peut être ouvert à la fois." msgid "Can not add models when in preview mode!" -msgstr "" +msgstr "Unable to add models in preview mode" msgid "Add Models" -msgstr "" +msgstr "Add Models" msgid "All objects will be removed, continue?" msgstr "Tous les objets seront supprimés, continuer ?" @@ -2903,16 +2945,16 @@ msgstr "" "les avant de continuer ?" msgid "Save" -msgstr "sauvegarder" +msgstr "Enregistrer" msgid "Number of copies:" msgstr "Nombre de copies:" msgid "Copies of the selected object" -msgstr "Copies of the selected object" +msgstr "Copies de l'objet sélectionné" msgid "Save G-code file as:" -msgstr "Enregistrer le fichier G-code sous :" +msgstr "Sauvegarder le fichier G-code en tant que :" msgid "Save Sliced file as:" msgstr "Enregistrer le fichier découpé sous :" @@ -2924,11 +2966,8 @@ msgstr "" "Imprimer par objet : nous vous suggérons d'utiliser la disposition " "automatique pour éviter les collisions lors de l'impressio" -msgid "Export G-code" -msgstr "Exporter le code G" - msgid "Send G-code" -msgstr "Envoyer le code G" +msgstr "Envoyer le G-code" msgid "Send to printer" msgstr "Envoyer à l'imprimante" @@ -2959,7 +2998,7 @@ msgstr "Taille : %1% x %2% x %3% mm\n" #, boost-format msgid "Volume: %1% in³\n" -msgstr "" +msgstr "Volume: %1% in³\n" #, boost-format msgid "Volume: %1% mm³\n" @@ -2987,34 +3026,34 @@ msgid "Changing application language" msgstr "Changer la langue de l'application" msgid "Changing the region will log out your account.\n" -msgstr "" +msgstr "Changing the region will log you out of your account.\n" msgid "Region selection" -msgstr "" +msgstr "Region selection" msgid "Second" msgstr "Second" msgid "General Settings" -msgstr "" +msgstr "General Settings" msgid "Asia-Pacific" -msgstr "" +msgstr "Asia-Pacific" msgid "China" -msgstr "" +msgstr "China" msgid "Europe" -msgstr "" +msgstr "Europe" msgid "North America" -msgstr "" +msgstr "North America" msgid "Others" msgstr "Les autres" msgid "Login Region" -msgstr "" +msgstr "Login Region" msgid "Metric" msgstr "Métrique" @@ -3025,15 +3064,14 @@ msgstr "Impérial" msgid "Units" msgstr "Unités" -# [Yifan] Will be removed msgid "User sync" msgstr "Synchronisation utilisateur" msgid "Auto sync user presets(Printer/Filament/Process)" -msgstr "" +msgstr "Auto sync user presets(Printer/Filament/Process)" msgid "User Sync" -msgstr "" +msgstr "User Sync" msgid "Associate files to BambuStudio" msgstr "Associer des fichiers à BambuStudio" @@ -3055,7 +3093,7 @@ msgstr "" "fichiers .stl" msgid "Associate .step/.stp files to BambuStudio" -msgstr "" +msgstr "Associate .step/.stp files to BambuStudio" msgid "If enabled, sets BambuStudio as default application to open .step files" msgstr "" @@ -3132,7 +3170,7 @@ msgid "trace" msgstr "trace" msgid "Host Setting" -msgstr "" +msgstr "Host Setting" msgid "DEV host: api-dev.bambu-lab.com/v1" msgstr "Hôte DEV : api-dev.bambu-lab.com/v1" @@ -3155,8 +3193,8 @@ msgstr "enregistrer les paramètres de débogage" msgid "DEBUG settings have saved successfully!" msgstr "Les paramètres DEBUG ont été enregistrés avec succès !" -msgid "Swith cloud environment, Please login again!" -msgstr "Changez d'environnement cloud, veuillez vous reconnecter !" +msgid "Switch cloud environment, Please login again!" +msgstr "" msgid "System presets" msgstr "Préréglages système" @@ -3174,7 +3212,7 @@ msgid "Click to pick filament color" msgstr "Cliquez pour choisir la couleur du filament" msgid "Add/Remove presets" -msgstr "Ajouter/supprimer des préréglages" +msgstr "Ajouter/Supprimer des préréglages" msgid "Edit preset" msgstr "Modifier le préréglage" @@ -3263,7 +3301,7 @@ msgid "The name is not allowed to end with space character." msgstr "Le nom ne doit pas se terminer par un espace." msgid "The name cannot be the same as a preset alias name." -msgstr "Le nom ne peut pas être identique à un nom d'alias prédéfini." +msgstr "Le nom ne peut pas être le même qu'un nom d'alias prédéfini." msgid "Save preset" msgstr "Enregistrer le préréglage" @@ -3294,6 +3332,12 @@ msgstr "Pour \"%1%\", ajoutez \"%2%\" comme nouveau préréglage" msgid "Simply switch to \"%1%\"" msgstr "Passez simplement à \"%1%\"" +msgid "Online" +msgstr "En ligne" + +msgid "Offline" +msgstr "Hors ligne" + msgid "My Device" msgstr "Mon appareil" @@ -3301,10 +3345,13 @@ msgid "Other Device" msgstr "Autre appareil" msgid "Input access code" -msgstr "" +msgstr "Input access code" + +msgid "Log out successful." +msgstr "Déconnexion réussie." msgid "Busy" -msgstr "" +msgstr "Busy" msgid "Bambu Cool Plate" msgstr "Assiette froide en bambou" @@ -3319,7 +3366,7 @@ msgid "Send print job to" msgstr "Envoyer le travail d'impression à" msgid "Refresh" -msgstr "" +msgstr "Refresh" msgid "Bed Leveling" msgstr "Mise à niveau du lit" @@ -3334,47 +3381,50 @@ msgid "send completed" msgstr "envoi terminé" msgid "No login account, only printers in LAN mode are displayed" -msgstr "" +msgstr "No login account, only printers in LAN mode are displayed" msgid "Connecting to server" -msgstr "" +msgstr "Connecting to server" msgid "Synchronizing device information" -msgstr "" +msgstr "Synchronizing device information" msgid "Synchronizing device information time out" -msgstr "" +msgstr "Synchronizing device information time out" msgid "Cannot send the print task when the upgrade is in progress" -msgstr "" +msgstr "Cannot send the print task when the upgrade is in progress" msgid "" "The printer is executing instructions. Please restart printing after it ends" msgstr "" +"The printer is executing instructions. Please restart printing after it ends" msgid "The printer is busy on other print job" -msgstr "" +msgstr "The printer is busy with another print job." -msgid "" -"The firmware versions of printer and AMS are too low.Please update to the " -"latest version before sending the print job" +msgid "Printer firmware does not support material = >ams slot mapping." msgstr "" msgid "" "Filaments to AMS slots mappings have been established. You can click a " "filament above to change its mapping AMS slot" msgstr "" +"Filaments to AMS slots mappings have been established. You can click a " +"filament above to change its mapping AMS slot" msgid "" "Please click each filament above to specify its mapping AMS slot before " "sending the print job" msgstr "" +"Please click each filament above to specify its mapping AMS slot before " +"sending the print job" msgid "Preparing print job" -msgstr "" +msgstr "Preparing print job" msgid "Modifying the device name" -msgstr "" +msgstr "Modifying the device name" msgid "Log in printer" msgstr "Connectez-vous à l'imprimante" @@ -3400,16 +3450,13 @@ msgstr "" "Un problème est survenu lors de la connexion à l'imprimante. Veuillez " "réessayer." -msgid "Log out successful." -msgstr "Déconnexion réussie." - msgid "Failed to log out." msgstr "Échec de la déconnexion." #. TRN "Save current Settings" #, c-format, boost-format msgid "Save current %s" -msgstr "Enregistrer le %s actuel" +msgstr "Enregistrer l'état actuel %s" msgid "Delete this preset" msgstr "Supprimer ce préréglage" @@ -3461,13 +3508,13 @@ msgid "Prime tower" msgstr "Tour principale" msgid "Flush options" -msgstr "" +msgstr "Flush options" msgid "Special mode" msgstr "Mode spécial" -msgid "Output file" -msgstr "Fichier de sortie" +msgid "G-code output" +msgstr "" msgid "Frequent" msgstr "Frequent" @@ -3491,7 +3538,7 @@ msgid "Reserved keywords found" msgstr "Mots clés réservés trouvés" msgid "Setting Overrides" -msgstr "" +msgstr "Setting Overrides" msgid "Retraction" msgstr "Rétraction" @@ -3526,6 +3573,8 @@ msgid "" "Bed temperature when cool plate is installed. Value 0 means the filament " "does not support to print on the Cool Plate" msgstr "" +"This is the bed temperature when the cool plate is installed. A value of 0 " +"means the filament does not support printing on the Cool Plate." msgid "Engineering plate" msgstr "Plaque d'ingénierie" @@ -3534,6 +3583,8 @@ msgid "" "Bed temperature when engineering plate is installed. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" +"This is the bed temperature when the engineering plate is installed. A value " +"of 0 means the filament does not support printing on the Engineering Plate." msgid "High Temp Plate" msgstr "Plaque haute température" @@ -3542,6 +3593,9 @@ msgid "" "Bed temperature when high temperature plate is installed. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" +"This is the bed temperature when the high temperature plate is installed. A " +"value of 0 means the filament does not support printing on the High Temp " +"Plate." msgid "Volumetric speed limitation" msgstr "Limitation de vitesse volumétrique" @@ -3606,7 +3660,7 @@ msgid "Machine end G-code" msgstr "Code G de fin de machine" msgid "Before layer change G-code" -msgstr "Avant le changement de couche G-code" +msgstr "G-Code avant changement de couche" msgid "Layer change G-code" msgstr "Code G de changement de couche" @@ -3653,16 +3707,16 @@ msgstr "Êtes-vous sûr de %1% le préréglage sélectionné ?" #. TRN Remove/Delete #, boost-format msgid "%1% Preset" -msgstr "%1% prédéfini" +msgstr "%1% Préréglage" msgid "All" -msgstr "Tout" +msgstr "Tous" msgid "Set" -msgstr "Régler" +msgstr "Appliquer" msgid "Custom G-code" -msgstr "Code G personnalisé" +msgstr "G-code personnalisé" msgid "Click to reset current value and attach to the global value." msgstr "" @@ -3690,16 +3744,16 @@ msgid "Old Value" msgstr "Ancienne valeur" msgid "New Value" -msgstr "Nouvelle valeur" +msgstr "Nouvelle Valeur" msgid "Transfer" -msgstr "" +msgstr "Transférer" msgid "Don't save" msgstr "Ne pas enregistrer" msgid "Discard" -msgstr "Jeter" +msgstr "Ignorer" msgid "Click the right mouse button to display the full text." msgstr "" @@ -3712,7 +3766,7 @@ msgid "All changes will be discarded." msgstr "Toutes les modifications seront rejetées." msgid "Save the selected options." -msgstr "Enregistrez les options sélectionnées." +msgstr "Enregistrer les options sélectionnées." msgid "Keep the selected options." msgstr "Conserver les options sélectionnées." @@ -3765,13 +3819,13 @@ msgstr "" "ces paramètres modifiés après avoir changé de préréglage ?" msgid "Extruders count" -msgstr "Les extrudeuses comptent" +msgstr "Nombre d'extrudeurs" msgid "General" msgstr "Général" msgid "Capabilities" -msgstr "Capacités" +msgstr "Fonctionnalités" msgid "Set as cover" msgstr "Définir comme couverture" @@ -3784,7 +3838,7 @@ msgid "The name \"%1%\" already exists." msgstr "Le nom \"%1%\" existe déjà." msgid "Basic Info" -msgstr "" +msgstr "Basic Info" msgid "Pictures" msgstr "Des photos" @@ -3838,14 +3892,14 @@ msgstr "" #, c-format, boost-format msgid "Exit %s" -msgstr "Quitter %s" +msgstr "Sortir de %s" msgid "the Configuration package is incompatible with current APP." msgstr "" "le package de configuration est incompatible avec l'application actuelle." msgid "Configuration updates" -msgstr "Mises à jour de configuration" +msgstr "Mises à jour de la configuration" msgid "No updates available." msgstr "Aucune mise à jour disponible." @@ -3854,7 +3908,7 @@ msgid "The configuration is up to date." msgstr "La configuration est à jour." msgid "Auto-Calc" -msgstr "" +msgstr "Auto-Calc" msgid "Flushing volumes for filament change" msgstr "Volumes de rinçage pour le changement de filament" @@ -3863,7 +3917,7 @@ msgid "Flushing volume (mm³) for each filament pair." msgstr "Volume de rinçage (mm³) pour chaque paire de filaments." msgid "Flush multiplier" -msgstr "" +msgstr "Flush multiplier" msgid "unloaded" msgstr "déchargé" @@ -3914,7 +3968,7 @@ msgid "Copy to clipboard" msgstr "Copier dans le presse-papier" msgid "Paste from clipboard" -msgstr "Coller depuis le presse-papiers" +msgstr "Coller depuis le presse-papier" msgid "Camera view - Default" msgstr "Vue caméra - Par défaut" @@ -3986,34 +4040,34 @@ msgid "Select objects by rectangle" msgstr "Sélectionner les objets par rectangle" msgid "Arrow Up" -msgstr "Flèche vers le haut" +msgstr "Flèche Haut" msgid "Move selection 10 mm in positive Y direction" -msgstr "Déplacer la sélection de 10 mm dans le sens Y positif" +msgstr "Déplacer la sélection de 10 mm dans la direction positive Y" msgid "Arrow Down" -msgstr "Flèche vers le bas" +msgstr "Flèche Bas" msgid "Move selection 10 mm in negative Y direction" -msgstr "Déplacer la sélection de 10 mm dans le sens Y négatif" +msgstr "Déplacer la sélection de 10 mm dans la direction négative Y" msgid "Arrow Left" -msgstr "Flèche gauche" +msgstr "Flèche Gauche" msgid "Move selection 10 mm in negative X direction" -msgstr "Déplacer la sélection de 10 mm dans la direction X négative" +msgstr "Déplacer la sélection de 10 mm dans la direction négative X" msgid "Arrow Right" -msgstr "Flèche vers la droite" +msgstr "Flèche Droite" msgid "Move selection 10 mm in positive X direction" -msgstr "Déplacer la sélection de 10 mm dans la direction X positive" +msgstr "Déplacer la sélection de 10 mm dans la direction positive X" msgid "Shift+Any arrow" msgstr "Maj+n'importe quelle flèche" msgid "Movement step set to 1 mm" -msgstr "Pas de mouvement réglé sur 1 mm" +msgstr "Pas du mouvement réglé sur 1 mm" msgid "⌘+Any arrow" msgstr "⌘+n'importe quelle flèche" @@ -4025,10 +4079,10 @@ msgid "Ctrl+Any arrow" msgstr "Ctrl+n'importe quelle flèche" msgid "Collapse/Expand the sidebar" -msgstr "Réduire/Agrandir la barre latérale" +msgstr "Réduire/développer la barre latérale" msgid "Plater" -msgstr "Plaqueur" +msgstr "Plateau" msgid "Move: press to snap by 1mm" msgstr "Déplacer : appuyez pour aligner de 1 mm" @@ -4072,22 +4126,24 @@ msgstr "" "Sélectionnez l'objet/la pièce et cliquez avec la souris pour changer le nom" msgid "Objects List" -msgstr "Liste des objets" +msgstr "Liste d'objets" msgid "Vertical slider - Move active thumb Up" -msgstr "Curseur vertical - Déplacer le pouce actif vers le haut" +msgstr "Barre de défilement verticale - Déplacer le curseur actif vers le Haut" msgid "Vertical slider - Move active thumb Down" -msgstr "Curseur vertical - Déplacer le pouce actif vers le bas" +msgstr "Barre de défilement verticale - Déplacer le curseur actif vers le Bas" msgid "Horizontal slider - Move active thumb Left" -msgstr "Curseur horizontal - Déplacer le pouce actif vers la gauche" +msgstr "" +"Barre de défilement horizontale - Déplacer le curseur actif vers la Gauche" msgid "Horizontal slider - Move active thumb Right" -msgstr "Curseur horizontal - Déplacer le pouce actif vers la droite" +msgstr "" +"Barre de défilement horizontale - Déplacer le curseur actif vers la Droite" msgid "On/Off one layer mode of the vertical slider" -msgstr "Activer/désactiver le mode une couche du curseur vertical" +msgstr "On/Off mode couche unique de la barre de défilement verticale" msgid "Move slider 5x faster" msgstr "Déplacez le curseur 5 fois plus vite" @@ -4145,7 +4201,7 @@ msgstr "Réparation annulée" #, boost-format msgid "Copying of file %1% to %2% failed: %3%" -msgstr "Échec de la copie du fichier %1% vers %2% : %3%" +msgstr "Échec de la copie du fichier %1% vers %2% : %3%" #, boost-format msgid "Copying directory %1% to %2% failed: %3%" @@ -4160,7 +4216,7 @@ msgid "Configuration package updated to " msgstr "Package de configuration mis à jour pour" msgid "Open G-code file:" -msgstr "Dossier ouvert." +msgstr "Ouvrir un fichier G-code :" msgid "" "One object has empty initial layer and can't be printed. Please Cut the " @@ -4245,28 +4301,28 @@ msgstr "" "valeur de \"%2%\"" msgid "undefined error" -msgstr "erreur indéfinie" +msgstr "erreur non définie" msgid "too many files" msgstr "trop de fichiers" msgid "file too large" -msgstr "fichier trop large" +msgstr "fichier trop volumineux" msgid "unsupported method" -msgstr "méthode non prise en charge" +msgstr "méthode non supportée" msgid "unsupported encryption" -msgstr "cryptage non pris en charge" +msgstr "cryptage non supporté" msgid "unsupported feature" -msgstr "fonctionnalité non prise en charge" +msgstr "fonction non supportée" msgid "failed finding central directory" -msgstr "échec de la recherche du répertoire central" +msgstr "impossible de trouver le répertoire central" msgid "not a ZIP archive" -msgstr "pas une archive ZIP" +msgstr "n'est pas une archive ZIP" msgid "invalid header or corrupted" msgstr "en-tête invalide ou corrompu" @@ -4278,61 +4334,61 @@ msgid "decompression failed" msgstr "la décompression a échoué" msgid "compression failed" -msgstr "la compression a échoué" +msgstr "échec de la compression" msgid "unexpected decompressed size" -msgstr "taille décompressée inattendue" +msgstr "volume de décompression inattendu" msgid "CRC check failed" msgstr "La vérification CRC a échoué" msgid "unsupported central directory size" -msgstr "taille du répertoire central non prise en charge" +msgstr "volume du répertoire central non supporté" msgid "allocation failed" -msgstr "l'attribution a échoué" +msgstr "échec de l'allocation" msgid "file open failed" -msgstr "l'ouverture du fichier a échoué" +msgstr "échec de l'ouverture du fichier" msgid "file create failed" -msgstr "la création du fichier a échoué" +msgstr "échec de création du fichier" msgid "file write failed" -msgstr "l'écriture du fichier a échoué" +msgstr "échec d'écriture du fichier" msgid "file read failed" -msgstr "la lecture du fichier a échoué" +msgstr "échec de lecture du fichier" msgid "file close failed" -msgstr "la fermeture du fichier a échoué" +msgstr "échec de la fermeture du fichier" msgid "file seek failed" -msgstr "la recherche de fichier a échoué" +msgstr "impossible de trouver le fichier" msgid "file stat failed" -msgstr "la statistique du fichier a échoué" +msgstr "impossible d'établir des statistiques pour ce fichier" msgid "invalid parameter" -msgstr "Paramètre invalide" +msgstr "paramètre non valide" msgid "invalid filename" msgstr "nom de fichier non valide" msgid "buffer too small" -msgstr "tampon trop petit" +msgstr "buffer trop petit" msgid "internal error" msgstr "erreur interne" msgid "file not found" -msgstr "fichier introuvable" +msgstr "fichier non trouvé" msgid "archive too large" msgstr "archive trop volumineuse" msgid "validation failed" -msgstr "validation échouée" +msgstr "échec de la validation" msgid "write callback failed" msgstr "Échec du rappel d'écriture" @@ -4355,11 +4411,11 @@ msgstr "" #, boost-format msgid "%1% is too close to others, and collisions may be caused." -msgstr "" +msgstr "%1% is too close to others, and collisions may be caused." #, boost-format msgid "%1% is too tall, and collisions will be caused." -msgstr "" +msgstr "%1% is too tall, and collisions will be caused." msgid " is too close to others, there will be collisions when printing.\n" msgstr "" @@ -4375,10 +4431,10 @@ msgid "Prime Tower" msgstr "Tour principale" msgid " is too close to others, and collisions may be caused.\n" -msgstr "" +msgstr " is too close to others, and collisions may be caused.\n" msgid " is too close to exclusion area, and collisions will be caused.\n" -msgstr "" +msgstr " is too close to exclusion area, and collisions will be caused.\n" msgid "" "Can not print multiple filaments which have large difference of temperature " @@ -4471,10 +4527,10 @@ msgid "Generating skirt & brim" msgstr "Génération jupe et bord" msgid "Exporting G-code" -msgstr "Exportation du code G" +msgstr "Exportation du G-code" msgid "Generating G-code" -msgstr "Génération de code G" +msgstr "Génération du G-code" msgid "Failed processing of the filename_format template." msgstr "Échec du traitement du modèle filename_format." @@ -4486,7 +4542,7 @@ msgid "Bed exclude area" msgstr "Zone d'exclusion de lit" msgid "Elephant foot compensation" -msgstr "Compensation de pied d'éléphant" +msgstr "Compensation de l'effet patte d'éléphant" msgid "" "Shrink the initial layer on build plate to compensate for elephant foot " @@ -4509,7 +4565,7 @@ msgid "Maximum printable height which is limited by mechanism of printer" msgstr "Hauteur imprimable maximale limitée par le mécanisme de l'imprimante" msgid "Printer preset names" -msgstr "Noms prédéfinis de l'imprimante" +msgstr "Noms des préréglages de l'imprimante" msgid "Avoid crossing wall when travel" msgstr "Évitez de traverser le mur lorsque vous voyagez" @@ -4536,22 +4592,28 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Cool Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the Cool Plate." msgid "°C" msgstr "°C" msgid "Bed temperature" -msgstr "Température du lit" +msgstr "Température du plateau" msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the Engineering Plate." msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the High Temp Plate." msgid "Initial layer" msgstr "Couche initiale" @@ -4563,16 +4625,22 @@ msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Cool Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the Cool Plate." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Engineering Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the Engineering Plate." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the High Temp Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the High Temp Plate." msgid "Bed types supported by the printer" msgstr "Types de lit pris en charge par l'imprimante" @@ -4664,12 +4732,14 @@ msgstr "" "de matériaux pour le pont, pour améliorer l'affaissement" msgid "Only one wall on top surfaces" -msgstr "" +msgstr "Only one wall on top surfaces" msgid "" "Use only one wall on flat top surface, to give more space to the top infill " "pattern" msgstr "" +"Use only one wall on flat top surface, to give more space to the top infill " +"pattern" msgid "Slow down for overhang" msgstr "Ralentir pour le surplomb" @@ -4686,13 +4756,13 @@ msgid "Speed of bridge and completely overhang wall" msgstr "Vitesse du pont et mur complètement en porte-à-faux" msgid "Brim width" -msgstr "Largeur du bord" +msgstr "Largeur de la bordure" msgid "Distance from model to the outermost brim line" msgstr "Distance du modèle à la ligne de bord la plus externe" msgid "Brim type" -msgstr "Type de bord" +msgstr "Type de bordure" msgid "" "This controls brim position including outer side of models, inner side of " @@ -4792,7 +4862,7 @@ msgid "layers" msgstr "couches" msgid "Don't support bridges" -msgstr "Ne supporte pas les ponts" +msgstr "Ne pas supporter les ponts" msgid "" "Don't support the whole bridge area which make support very large. Bridge " @@ -4802,17 +4872,32 @@ msgstr "" "important. Le pont peut généralement imprimer directement sans support s'il " "n'est pas très long" -msgid "Max bridge length" +msgid "Thick bridges" msgstr "" +msgid "Layers and Perimeters" +msgstr "" + +msgid "" +"If enabled, bridges are more reliable, can bridge longer distances, but may " +"look worse. If disabled, bridges look better but are reliable just for " +"shorter bridged distances." +msgstr "" + +msgid "Max bridge length" +msgstr "Longueur maximum de pont" + msgid "" "Max length of bridges that don't need support. Set it to 0 if you want all " "bridges to be supported, and set it to a very large value if you don't want " "any bridges to be supported." msgstr "" +"Max length of bridges that don't need support. Set it to 0 if you want all " +"bridges to be supported, and set it to a very large value if you don't want " +"any bridges to be supported." msgid "End G-code" -msgstr "Terminer le code G" +msgstr "G-code de fin" msgid "End G-code when finish the whole printing" msgstr "Terminer le code G lorsque vous avez terminé toute l'impression" @@ -4836,7 +4921,7 @@ msgid "Monotonic" msgstr "Monotone" msgid "Monotonic line" -msgstr "" +msgstr "Monotonic line" msgid "Bottom surface pattern" msgstr "Modèle de surface inférieure" @@ -4901,13 +4986,13 @@ msgstr "" "arrangement pour éviter les collisions lors de l'impression objet par objet" msgid "Extruder Color" -msgstr "Couleur de l'extrudeuse" +msgstr "Couleur de l'extrudeur" msgid "Only used as a visual help on UI" msgstr "Utilisé uniquement comme aide visuelle sur l'interface utilisateur" msgid "Extruder offset" -msgstr "Décalage de l'extrudeuse" +msgstr "Décalage de l'extrudeur" msgid "Flow ratio" msgstr "Rapport de débit" @@ -4931,7 +5016,7 @@ msgstr "" "Largeur de ligne par défaut si une largeur de ligne est définie sur zéro" msgid "Keep fan always on" -msgstr "Gardez le ventilateur toujours allumé" +msgstr "Garder le ventilateur toujours actif" msgid "" "If enable this setting, part cooling fan will never be stoped and will run " @@ -4961,7 +5046,7 @@ msgid "Color" msgstr "Couleur" msgid "Max volumetric speed" -msgstr "Vitesse volumétrique max" +msgstr "Vitesse volumétrique maximale" msgid "" "This setting stands for how much volume of filament can be melted and " @@ -5021,7 +5106,7 @@ msgid "The material type of filament" msgstr "Le type de matériau du filament" msgid "Soluble material" -msgstr "Matière soluble" +msgstr "Matériau soluble" msgid "" "Soluble material is commonly used to print support and support interface" @@ -5030,11 +5115,12 @@ msgstr "" "l'interface de support" msgid "Support material" -msgstr "" +msgstr "Supports" msgid "" "Support material is commonly used to print support and support interface" msgstr "" +"Support material is commonly used to print support and support interface" msgid "Temperature of vitrificaiton" msgstr "Température de vitrification" @@ -5098,7 +5184,7 @@ msgid "Gyroid" msgstr "Gyroïde" msgid "Honeycomb" -msgstr "Rayon de miel" +msgstr "Nid d'abeille" msgid "Adaptive Cubic" msgstr "Cubique adaptatif" @@ -5107,6 +5193,8 @@ msgid "" "Acceleration of top surface infill. Using a lower value may improve top " "surface quality" msgstr "" +"Acceleration of top surface infill. Using a lower value may improve top " +"surface quality" msgid "" "Acceleration of initial layer. Using a lower value can improve build plate " @@ -5165,7 +5253,7 @@ msgstr "" "l'utilisation de ce filament" msgid "Full fan speed at layer" -msgstr "Vitesse maximale du ventilateur à la couche" +msgstr "Ventilateur à pleine vitesse pour la couche" msgid "" "Randomly jitter while printing the wall, so that the surface has a rough " @@ -5178,10 +5266,10 @@ msgid "None" msgstr "Aucun" msgid "All walls" -msgstr "All walls" +msgstr "Toutes les parois" msgid "Fuzzy skin thickness" -msgstr "Épaisseur de peau floue" +msgstr "Épaisseur de la surface Irrégulière" msgid "" "The width within which to jitter. It's adversed to be below outer wall line " @@ -5191,7 +5279,7 @@ msgstr "" "dessous de la largeur de la ligne du mur extérieur" msgid "Fuzzy skin point distance" -msgstr "Distance floue du point de peau" +msgstr "Distance de point de la surface irrégulière" msgid "" "The average diatance between the random points introducded on each line " @@ -5260,7 +5348,7 @@ msgstr "" "refroidissement de pièce auxiliaire" msgid "G-code flavor" -msgstr "Saveur de code G" +msgstr "Version du G-code" msgid "What kind of gcode the printer is compatible with" msgstr "Avec quel type de gcode l'imprimante est-elle compatible" @@ -5297,7 +5385,7 @@ msgid "Speed of internal sparse infill" msgstr "Vitesse de remplissage clairsemé interne" msgid "Ironing Type" -msgstr "Type de repassage" +msgstr "Type de lissage" msgid "" "Ironing is using small flow to print on same height of surface again to make " @@ -5349,9 +5437,6 @@ msgstr "" msgid "Supports silent mode" msgstr "Prend en charge le mode silencieux" -# Is this a user-toggled setting for them to turn on silent mode? -# [Yifan] Yes. But for now, this setting is invisible to user. -# [Cory] Got it! For now, I’ll leave the comment on this, so we can come back to it if this setting becomes visible. msgid "" "Whether the machine supports silent mode in which machine use lower " "acceleration to print" @@ -5372,7 +5457,7 @@ msgid "Maximum speed E" msgstr "Vitesse maximale E" msgid "Machine limits" -msgstr "Limites machines" +msgstr "Limites de la machine" msgid "Maximum X speed" msgstr "Vitesse maximale X" @@ -5387,52 +5472,52 @@ msgid "Maximum E speed" msgstr "Vitesse E maximale" msgid "Maximum acceleration X" -msgstr "Accélération maximale X" +msgstr "Accélérations maximum X" msgid "Maximum acceleration Y" -msgstr "Accélération maximale Y" +msgstr "Accélérations maximum Y" msgid "Maximum acceleration Z" -msgstr "Accélération maximale Z" +msgstr "Accélérations maximum Z" msgid "Maximum acceleration E" -msgstr "Accélération maximale E" +msgstr "Accélérations maximum E" msgid "Maximum acceleration of the X axis" -msgstr "Accélération maximale de l'axe X" +msgstr "Accélération maximum de l'axe X" msgid "Maximum acceleration of the Y axis" -msgstr "Accélération maximale de l'axe Y" +msgstr "Accélération maximum de l'axe Y" msgid "Maximum acceleration of the Z axis" -msgstr "Accélération maximale de l'axe Z" +msgstr "Accélération maximum de l'axe Z" msgid "Maximum acceleration of the E axis" -msgstr "Accélération maximale de l'axe E" +msgstr "Accélération maximum de l'axe E" msgid "Maximum jerk X" -msgstr "À-coup maximal X" +msgstr "Mouvement brusque maximum X" msgid "Maximum jerk Y" -msgstr "À-coup maximal Y" +msgstr "Mouvement brusque maximum Y" msgid "Maximum jerk Z" -msgstr "À-coup maximal Z" +msgstr "Mouvement brusque maximum Z" msgid "Maximum jerk E" -msgstr "À-coup maximal E" +msgstr "Mouvement brusque maximum E" msgid "Maximum jerk of the X axis" -msgstr "Jerk maximum de l'axe X" +msgstr "Mouvement brusque maximum de l'axe X" msgid "Maximum jerk of the Y axis" -msgstr "Jerk maximum de l'axe Y" +msgstr "Mouvement brusque maximum de l'axe Y" msgid "Maximum jerk of the Z axis" -msgstr "Jerk maximum de l'axe Z" +msgstr "Mouvement brusque maximum de l'axe Z" msgid "Maximum jerk of the E axis" -msgstr "Jerk maximum de l'axe E" +msgstr "Mouvement brusque maximum de l'axe E" msgid "Minimum speed for extruding" msgstr "Vitesse minimale d'extrusion" @@ -5476,7 +5561,7 @@ msgstr "" "limitation de vitesse maximale du ventilateur de refroidissement partiel" msgid "Max" -msgstr "Max" +msgstr "Maximum" msgid "" "The largest printable layer height for extruder. Used tp limits the maximum " @@ -5500,7 +5585,7 @@ msgstr "" "refroidissement" msgid "Min" -msgstr "Min" +msgstr "Minimum" msgid "" "The lowest printable layer height for extruder. Used tp limits the minimum " @@ -5519,26 +5604,25 @@ msgstr "" "refroidissement" msgid "Nozzle diameter" -msgstr "Diamètre de buse" +msgstr "Diamètre de la buse" msgid "Diameter of nozzle" msgstr "Diamètre de buse" msgid "Nozzle volume" -msgstr "" +msgstr "Nozzle volume" msgid "Volume of nozzle between the cutter and the end of nozzle" -msgstr "" +msgstr "Volume of nozzle between the cutter and the end of nozzle" msgid "Reduce infill retraction" msgstr "Réduire la rétraction du remplissage" msgid "" "Don't retract when the travel is in infill area absolutely. That means the " -"oozing can't been seen" +"oozing can't been seen. This can reduce times of retraction for complex " +"model and save printing time, but make slicing and G-code generating slower" msgstr "" -"Ne vous rétractez absolument pas lorsque le déplacement est dans la zone de " -"remplissage. Cela signifie que le suintement ne peut pas être vu" msgid "Enable" msgstr "Activer" @@ -5573,13 +5657,13 @@ msgid "Number of walls of every layer" msgstr "Nombre de murs de chaque couche" msgid "Raft contact Z distance" -msgstr "Distance Z de contact du radeau" +msgstr "Distance Z de contact du raft" msgid "Z gap between object and raft. Ignored for soluble interface" msgstr "Écart en Z entre l'objet et le radeau. Ignoré pour l'interface soluble" msgid "Raft expansion" -msgstr "Extension du radeau" +msgstr "Agrandissement du raft" msgid "Expand all raft layers in XY plane" msgstr "Développer toutes les couches de radeau dans le plan XY" @@ -5599,7 +5683,7 @@ msgstr "" "de la plaque d'assise" msgid "Raft layers" -msgstr "Couches de radeau" +msgstr "Couches du radeau" msgid "" "Object will be raised by this number of support layers. Use this function to " @@ -5632,7 +5716,7 @@ msgstr "" "à ce seuil" msgid "Retract amount before wipe" -msgstr "Rétracter le montant avant l'effacement" +msgstr "Quantité de rétractation avant essuyage" msgid "" "The length of fast retraction before wipe, relative to retraction length" @@ -5650,7 +5734,7 @@ msgid "Length" msgstr "Longueur" msgid "Retraction Length" -msgstr "Longueur de rétraction" +msgstr "Longueur de Rétractation" msgid "" "Some amount of material in extruder is pulled back to avoid ooze during long " @@ -5674,13 +5758,13 @@ msgstr "" "spirale pour soulever z peut empêcher l'enfilage" msgid "Retraction Speed" -msgstr "Vitesse de rétraction" +msgstr "Vitesse de Rétractation" msgid "Speed of retractions" msgstr "Vitesse de rétractation" msgid "Deretraction Speed" -msgstr "Vitesse de dérétraction" +msgstr "Vitesse de réinsertion" msgid "" "Speed for reloading filament into extruder. Zero means same speed with " @@ -5690,13 +5774,13 @@ msgstr "" "vitesse avec rétraction" msgid "Seam position" -msgstr "Position de la couture" +msgstr "Position de la jointure" msgid "The start position to print each part of outer wall" msgstr "La position de départ pour imprimer chaque partie du mur extérieur" msgid "Nearest" -msgstr "" +msgstr "Le plus proche" msgid "Aligned" msgstr "Aligné" @@ -5771,7 +5855,7 @@ msgid "Temperature variation" msgstr "Variation de température" msgid "Start G-code" -msgstr "Démarrer le code G" +msgstr "G-code de début" msgid "Start G-code when start the whole printing" msgstr "Démarrer le code G lors du démarrage de l'ensemble de l'impression" @@ -5812,10 +5896,10 @@ msgid "Support/object xy distance" msgstr "Distance support/objet xy" msgid "XY separation between an object and its support" -msgstr "Séparation XY entre un objet et son support" +msgstr "Séparation XY entre un objet et ses supports" msgid "Pattern angle" -msgstr "Angle de motif" +msgstr "Angle du motif" msgid "Use this setting to rotate the support pattern on the horizontal plane." msgstr "" @@ -5852,7 +5936,7 @@ msgstr "Modèle de boucle d'utilisation d'interface" msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -"Couvrir la couche de contact supérieure des supports avec des boucles. " +"Recouvrir la couche de contact supérieure des supports avec des boucles. " "Désactivé par défaut." msgid "" @@ -5901,7 +5985,7 @@ msgid "Rectilinear grid" msgstr "Grille rectiligne" msgid "Interface pattern" -msgstr "Modèle d'interface" +msgstr "Motif d'interface" msgid "" "Line pattern of support interface. Default pattern for non-soluble support " @@ -5925,7 +6009,7 @@ msgid "Style" msgstr "Style" msgid "Snug" -msgstr "Confortable" +msgstr "Ajusté" msgid "Independent support layer height" msgstr "Hauteur de la couche de support indépendante" @@ -5998,7 +6082,7 @@ msgid "Nozzle temperature for layers after the initial one" msgstr "Température de la buse pour les couches après la première" msgid "Nozzle temperature" -msgstr "Température de buse" +msgstr "Température de la buse" msgid "Bed temperature difference" msgstr "Différence de température du lit" @@ -6051,7 +6135,7 @@ msgstr "" "coque supérieure seront augmentées" msgid "Top solid layers" -msgstr "Couches solides supérieures" +msgstr "Couches supérieures solides" msgid "Top shell thickness" msgstr "Épaisseur de la coque supérieure" @@ -6074,7 +6158,7 @@ msgid "Speed of travel which is faster and without extrusion" msgstr "Vitesse de déplacement plus rapide et sans extrusion" msgid "Wipe while retracting" -msgstr "Essuyer en se rétractant" +msgstr "Nettoyer lors des rétractions" msgid "" "Move nozzle along the last extrusion path when retracting to clean leaked " @@ -6115,7 +6199,7 @@ msgid "Width of prime tower" msgstr "Largeur de la tour principale" msgid "Flush into objects' infill" -msgstr "" +msgstr "Flush into objects' infill" msgid "" "Purging after filament change will be done inside objects' infills. This may " @@ -6123,23 +6207,31 @@ msgid "" "printed with transparent filament, the mixed color infill will be seen " "outside" msgstr "" +"Purging after filament change will be done inside objects' infills. This may " +"lower the amount of waste and decrease the print time. If the walls are " +"printed with transparent filament, the mixed color infill will be visible." msgid "Flush into objects' support" -msgstr "" +msgstr "Flush into objects' support" msgid "" "Purging after filament change will be done inside objects' support. This may " "lower the amount of waste and decrease the print time" msgstr "" +"Purging after filament change will be done inside objects' support. This may " +"lower the amount of waste and decrease the print time." msgid "Flush into this object" -msgstr "" +msgstr "Flush into this object" msgid "" "This object will be used to purge the nozzle after a filament change to save " "filament and decrease the print time. Colours of the objects will be mixed " "as a result" msgstr "" +"This object will be used to purge the nozzle after a filament change to save " +"filament and decrease the print time. Colours of the objects will be mixed " +"as a result" msgid "X-Y hole compensation" msgstr "Compensation de trou X-Y" @@ -6196,7 +6288,7 @@ msgid "Show command help." msgstr "Afficher l'aide de la commande." msgid "Output Model Info" -msgstr "Informations sur le modèle de sortie" +msgstr "Information du Modèle de Sortie" msgid "Output the model's information." msgstr "Sortie des informations du modèle." @@ -6214,16 +6306,16 @@ msgid "Arrange options: 0-disable, 1-enable, others-auto" msgstr "Options d'organisation : 0-désactiver, 1-activer, autres-auto" msgid "Convert Unit" -msgstr "" +msgstr "Convert Unit" msgid "Convert the units of model" -msgstr "" +msgstr "Convert the units of model" msgid "Orient the model" msgstr "Orienter le modèle" msgid "Repair" -msgstr "Réparation" +msgstr "Réparer" msgid "Repair the model's meshes if it is non-manifold mesh" msgstr "Réparer les maillages du modèle s'il s'agit d'un maillage non multiple" @@ -6314,1166 +6406,201 @@ msgstr "Erreur à la ligne %1% :\n" #, c-format, boost-format msgid "Support: generate toolpath at layer %d" -msgstr "" +msgstr "Support: generate toolpath at layer %d" msgid "Support: detect overhangs" -msgstr "" +msgstr "Support: detect overhangs" msgid "Support: generate contact points" -msgstr "" +msgstr "Support: generate contact points" msgid "Support: propagate branches" -msgstr "" +msgstr "Support: propagate branches" msgid "Support: draw polygons" -msgstr "" +msgstr "Support: draw polygons" msgid "Support: generate toolpath" -msgstr "" +msgstr "Support: generate toolpath" #, c-format, boost-format msgid "Support: generate polygons at layer %d" -msgstr "" +msgstr "Support: generate polygons at layer %d" #, c-format, boost-format msgid "Support: fix holes at layer %d" -msgstr "" +msgstr "Support: fix holes at layer %d" #, c-format, boost-format msgid "Support: propagate branches at layer %d" -msgstr "" +msgstr "Support: propagate branches at layer %d" -#~ msgid "Fix model through cloud" -#~ msgstr "Correction du modèle via le cloud" +#~ msgid "Creating" +#~ msgstr "Creating" -#~ msgid "Fix model locally" -#~ msgstr "Corriger le modèle localement" +#~ msgid "Uploading" +#~ msgstr "Téléchargement" -#~ msgid "Module" -#~ msgstr "Module" +#~ msgid "Waiting" +#~ msgstr "Waiting" -#~ msgid "Shift + Any arrow" -#~ msgstr "Maj + n'importe quelle flèche" +#~ msgid "Sending" +#~ msgstr "Sending" -#~ msgid "Ctrl + Any arrow" -#~ msgstr "Ctrl + n'importe quelle flèche" +#~ msgid "Finished" +#~ msgstr "Terminé" + +#~ msgid "Please fill report first." +#~ msgstr "Veuillez d'abord remplir le rapport." + +#~ msgid "Unable to create zip file" +#~ msgstr "Unable to create zip file" + +#~ msgid "Enter a search term" +#~ msgstr "Entrer un terme de recherche" + +#~ msgid "Debug" +#~ msgstr "Déboguer" + +#~ msgid "Monitoring" +#~ msgstr "Surveillance" + +#~ msgid "Fragment filter" +#~ msgstr "Fragment filter" + +#~ msgid "Fragment Filter" +#~ msgstr "Fragment Filter" + +#~ msgid "Position:" +#~ msgstr "Position:" #~ msgid "Alt + Mouse wheel" #~ msgstr "Alt + molette de la souris" -#~ msgid "Shift + Mouse wheel" -#~ msgstr "Maj + molette de la souris" +#~ msgid "" +#~ "An object is layed over the boundary of plate.\n" +#~ "Please solve the problem by moving it totally inside or outside plate." +#~ msgstr "" +#~ "Un objet est posé sur la limite de la plaque. Veuillez résoudre le " +#~ "problème en le déplaçant totalement à l'intérieur ou à l'extérieur de la " +#~ "plaque." -#~ msgid "Login with your Account" -#~ msgstr "Connectez-vous avec votre compte" +#~ msgid "Ctrl + Any arrow" +#~ msgstr "Ctrl + n'importe quelle flèche" -#~ msgid "Logout" -#~ msgstr "Se déconnecter" +#~ msgid "Ctrl + Left mouse button" +#~ msgstr "Ctrl + Left mouse button" -#~ msgid "Publish Model/Profile" -#~ msgstr "Publier le modèle/profil" +#~ msgid "Display printable box" +#~ msgstr "Afficher la boîte imprimable" -#~ msgid "Please slice all plates before upload" -#~ msgstr "Veuillez découper toutes les couches avant de les télécharger" +#~ msgid "Display shadow of objects" +#~ msgstr "Afficher l'ombre des objets" -#~ msgid "The bed is auto leveling" -#~ msgstr "Le lit se nivelle automatiquement" - -#~ msgid "The hot bed is preheating" -#~ msgstr "Le lit chauffant préchauffe" - -#~ msgid "Frequncy sweeping" -#~ msgstr "Balayage de fréquence" - -#~ msgid "Change the filament" -#~ msgstr "Changer le filament" - -#~ msgid "Pause(M400)" -#~ msgstr "Pause(M400)" - -#~ msgid "Pause(Lack of filament)" -#~ msgstr "Pause (manque de filament)" - -#~ msgid "The nozzle is preheating" -#~ msgstr "La buse est en train de préchauffer" - -#~ msgid "Extruder compensation scanning" -#~ msgstr "Numérisation de la compensation de l'extrudeuse" - -#~ msgid "Bed surface scanning" -#~ msgstr "Balayage de la surface du lit" - -#~ msgid "First layer scanning" -#~ msgstr "Numérisation de la première couche" - -#~ msgid "Bed surface is auto identifying" -#~ msgstr "La surface du lit s'identifie automatiquement" - -#~ msgid "In the calibration of extrinsic parameters" -#~ msgstr "Dans le calibrage des paramètres extrinsèques" - -#~ msgid "The tool head is homing" -#~ msgstr "La tête de l'outil se dirige" - -#~ msgid "Nozzle cleaning" -#~ msgstr "Nettoyage des buses" - -#~ msgid "In the calibration of temperature protection" -#~ msgstr "Dans l'étalonnage de la protection de la température" - -#~ msgid "Total Size:" -#~ msgstr "Taille totale:" - -#~ msgid "Tiny patch filter" -#~ msgstr "Petit filtre patch" - -#~ msgid "Filter tiny patch" -#~ msgstr "Filtrer le petit patch" - -#~ msgid "Process %1% / 100" -#~ msgstr "Processus %1% / 100" - -#~ msgid "Bambu Studio initialization failed" -#~ msgstr "Échec de l'initialisation de Bambu Studio" - -#~ msgid "Per Object Setting" -#~ msgstr "Paramètre par objet" - -#~ msgid "Reset All" -#~ msgstr "Effacer tout" - -#~ msgid "Object %s has zero size and can't be arranged." -#~ msgstr "L'objet %s a une taille nulle et ne peut pas être organisé." - -#~ msgid "Beginner's Tutorial" -#~ msgstr "Tutoriel du débutant" - -#~ msgid "Show daily tips" -#~ msgstr "Afficher les conseils quotidiens" - -#~ msgid "Choose Filaments" -#~ msgstr "Choisissez des filaments" - -#~ msgid "Bind Dialog" -#~ msgstr "Boîte de dialogue Lier" - -#~ msgid "Show Edges(TODO)" -#~ msgstr "Afficher les bords (TODO)" - -#~ msgid "Show Edges" -#~ msgstr "Afficher les bords" +#~ msgid "Display triangles of models" +#~ msgstr "Afficher les triangles des modèles" #~ msgid "" #~ "Do you want to synchronize your personal data from Bambu Cloud? \n" #~ "Contains the following information:\n" #~ "1. The Process presets\n" #~ "2. The Filament presets\n" -#~ "3. The Machine presets\n" +#~ "3. The Printer presets\n" #~ msgstr "" -#~ "Vous souhaitez synchroniser vos données personnelles depuis Bambu Cloud ? " -#~ "Contient les informations suivantes : 1. Les préréglages du processus 2. " -#~ "Les préréglages du filament 3. Les préréglages de la machine" - -#~ msgid "Machine Control" -#~ msgstr "Contrôle des machines" - -#~ msgid "Temperature and Axis Control" -#~ msgstr "Contrôle de la température et des axes" +#~ "Do you want to synchronize your personal data from Bambu Cloud? \n" +#~ "Contains the following information:\n" +#~ "1. Process presets\n" +#~ "2. Filament presets\n" +#~ "3. Printer presets\n" #~ msgid "" -#~ "Calibration program detects the status of your device systematically to " -#~ "minimise deviation. It keeps the device at its the best performance" +#~ "Don't retract when the travel is in infill area absolutely. That means " +#~ "the oozing can't been seen" #~ msgstr "" -#~ "Le programme d'étalonnage détecte systématiquement l'état de votre " -#~ "appareil pour minimiser les écarts. Il maintient l'appareil à ses " -#~ "meilleures performances" +#~ "Ne vous rétractez absolument pas lorsque le déplacement est dans la zone " +#~ "de remplissage. Cela signifie que le suintement ne peut pas être vu" -#~ msgid "Preparation before calibration" -#~ msgstr "Préparation avant étalonnage" +#~ msgid "Fix model locally" +#~ msgstr "Corriger le modèle localement" + +#~ msgid "Fix model through cloud" +#~ msgstr "Correction du modèle via le cloud" #~ msgid "" -#~ "Before calibration, please make sure a filament is loaded and its nozzle " -#~ "temperature and bed temperature is set in Feeding lab." -#~ msgstr "" -#~ "Avant l'étalonnage, assurez-vous qu'un filament est chargé et que la " -#~ "température de sa buse et de son lit sont réglées dans le laboratoire " -#~ "d'alimentation." +#~ "Heat the nozzle to target \n" +#~ "temperature" +#~ msgstr "Chauffer la buse à la température choisie" -#~ msgid "Silent Mode" -#~ msgstr "Mode silencieux" +#~ msgid "In the calibration of extrusion flow" +#~ msgstr "In the calibration of extrusion flow" -#~ msgid "Model:" -#~ msgstr "Modèle:" +#~ msgid "In the calibration of laser scanner" +#~ msgstr "In the calibration of laser scanner" -#~ msgid "Serial:" -#~ msgstr "Séquence" +#~ msgid "Module" +#~ msgstr "Module" -#~ msgid "Version:" -#~ msgstr "Version:" +#~ msgid "New version of Bambu Studio" +#~ msgstr "Nouvelle version de Bambu Studio" -#~ msgid "Upgrade firmware" -#~ msgstr "Mise à niveau du firmware" +#~ msgid "Output file" +#~ msgstr "Fichier de sortie" -#~ msgid "Relase Note" -#~ msgstr "Note de version" +#~ msgid "Pause(heated bed temperature error)" +#~ msgstr "Pause(heated bed temperature error)" -#~ msgid "Printing" -#~ msgstr "Impression" +#~ msgid "Pause(hotend temperature error)" +#~ msgstr "Pause(hotend temperature error)" -#~ msgid "Idle" -#~ msgstr "Inactif" +#~ msgid "Pause(toolhead shell off)" +#~ msgstr "Pause(toolhead shell off)" -#~ msgid "Lastest version" -#~ msgstr "Dernière version" - -#~ msgid "Upgrading" -#~ msgstr "Mise à niveau" - -#~ msgid "Upgrading success" -#~ msgstr "Succès de la mise à niveau" - -#~ msgid "Upgrading failed" -#~ msgstr "Échec de la mise à niveau" - -#~ msgid "Need to stop slicing first." -#~ msgstr "Il faut d'abord arrêter de trancher." - -#~ msgid "Drop Files when slicing" -#~ msgstr "Déposer des fichiers lors du découpage" - -#~ msgid "Importing Model" -#~ msgstr "Importation de modèle" - -#~ msgid "prepare 3mf file..." -#~ msgstr "préparer le fichier 3mf..." - -#~ msgid "Import project failed, Please try again!" -#~ msgstr "Échec de l'importation du projet, veuillez réessayer !" - -#~ msgid "downloading project ..." -#~ msgstr "projet de téléchargement..." - -#~ msgid "Project downloaded %d%%" -#~ msgstr "Projet téléchargé %d%%" - -#~ msgid "Failed to publish your project. Please try agian!" -#~ msgstr "Échec de la publication de votre projet. Veuillez réessayer !" - -#~ msgid "preparing, export 3mf failed!" -#~ msgstr "préparation, échec de l'export 3mf !" - -#~ msgid "Preparing to upload your project..." -#~ msgstr "Préparation du téléchargement de votre projet..." - -#~ msgid "get_des,err:code=%u,msg=%s" -#~ msgstr "get_des,err:code=%u,msg=%s" - -#~ msgid "req_proj,err:code=%u,msg=%s" -#~ msgstr "req_proj,err:code=%u,msg=%s" - -#~ msgid "req_prof,err:code=%u,msg=%s" -#~ msgstr "req_prof,err:code=%u,msg=%s" - -#~ msgid "Uploading..." -#~ msgstr "Téléchargement..." - -#~ msgid "Uploading %d%%, remaining time %s" -#~ msgstr "Téléchargement de %d%%, temps restant %s" - -#~ msgid "Upload has been canceled." -#~ msgstr "Le téléchargement a été annulé." - -#~ msgid "Publishing..." -#~ msgstr "Édition..." - -#~ msgid "Failed to publish. Please try again!" -#~ msgstr "Échec de la publication. Veuillez réessayer!" - -#~ msgid "Uploading is timed out. Please try again!" -#~ msgstr "Le téléchargement a expiré. Veuillez réessayer!" - -#~ msgid "Internal error." -#~ msgstr "Erreur interne." - -#~ msgid "Design id is empty." -#~ msgstr "L'ID de conception est vide." - -#~ msgid "Chinese (Simplified)" -#~ msgstr "Chinois (simplifié)" - -#~ msgid "GUI" -#~ msgstr "interface graphique" - -#~ msgid "Sync" -#~ msgstr "Synchroniser" - -#~ msgid "Shortcuts" -#~ msgstr "Raccourcis" - -#~ msgid "General settings" -#~ msgstr "Réglages généraux" - -#~ msgid "Associate .step files to BambuStudio" -#~ msgstr "Associer des fichiers .step à BambuStudio" - -#~ msgid "Vibration Calibration" -#~ msgstr "Étalonnage des vibrations" - -#~ msgid "First Layer Inspection" -#~ msgstr "Inspection de la première couche" - -#~ msgid "Record Timelapse" -#~ msgstr "Record timelapse" - -#~ msgid "Please select a printer first." -#~ msgstr "Veuillez d'abord sélectionner une imprimante." - -#~ msgid "Current printer is busy. Please select another one." -#~ msgstr "" -#~ "L'imprimante actuelle est occupée. Veuillez en sélectionner un autre." - -#~ msgid "The printer is being updated. Please try again after the update." -#~ msgstr "" -#~ "L'imprimante est en cours de mise à jour. Veuillez réessayer après la " -#~ "mise à jour." - -#~ msgid "Exporting 3mf..." -#~ msgstr "Exportation de 3mf..." - -#~ msgid "Exporting 3mf failed, please slice again." -#~ msgstr "Échec de l'exportation de 3mf, veuillez découper à nouveau." - -#~ msgid "No printer available" -#~ msgstr "Aucune imprimante disponible" - -#~ msgid "Filament Retraction" -#~ msgstr "Rétraction du filament" - -#~ msgid "Bed temperature when cool plate is installed" -#~ msgstr "Température du lit lorsque la plaque froide est installée" - -#~ msgid "Bed temperature when engineering plate is installed" -#~ msgstr "Température du lit lorsque la plaque d'ingénierie est installée" - -#~ msgid "Bed temperature when high temperature plate is installed" -#~ msgstr "" -#~ "Température du lit lorsque la plaque haute température est installée" - -#~ msgid "Keep" -#~ msgstr "Donjon" - -#~ msgid "YES" -#~ msgstr "YES" - -#~ msgid "NO" -#~ msgstr "NON" - -#~ msgid "Render statistics debugging box" -#~ msgstr "Boîte de débogage des statistiques de rendu" - -#~ msgid "Unable to get system certificate." -#~ msgstr "Impossible d'obtenir le certificat système." - -#~ msgid "use system SSL certificate: %1%" -#~ msgstr "utiliser le certificat SSL du système : %1%" - -#~ msgid "CURL initialization failed. See the log for additional details." -#~ msgstr "" -#~ "L'initialisation de CURL a échoué. Voir le journal pour plus de détails." - -#~ msgid "print project cancelled." -#~ msgstr "projet d'impression annulé." - -#~ msgid "Failed to create the print job. Please try agian." -#~ msgstr "Échec de la création de la tâche d'impression. Veuillez réessayer." - -#~ msgid "Failed to upload the print job. Please try agian." -#~ msgstr "" -#~ "Échec du téléchargement de la tâche d'impression. Veuillez réessayer." - -#~ msgid "Uploading print job timed out. Please try again." -#~ msgstr "" -#~ "Le chargement de la tâche d'impression a expiré. Veuillez réessayer." - -#~ msgid "Failed to send the print job. Please try again." -#~ msgstr "Échec de l'envoi du travail d'impression. Veuillez réessayer." - -#~ msgid "Sending print task timed out. Please try again." -#~ msgstr "L'envoi de la tâche d'impression a expiré. Veuillez réessayer." - -#~ msgid "Creating a print job..." -#~ msgstr "Création d'un travail d'impression..." - -#~ msgid "Uploading the print job..." -#~ msgstr "Téléchargement de la tâche d'impression..." - -#~ msgid "The size of the uploaded file cannot exceed 1 GB." -#~ msgstr "La taille du fichier téléchargé ne peut pas dépasser 1 Go." - -#~ msgid " Failed to upload the print job. Check Md5 failed, please try agian." -#~ msgstr "" -#~ "Échec du téléchargement de la tâche d'impression. La vérification de Md5 " -#~ "a échoué, veuillez réessayer." +#~ msgid "Please upgrade your printer first" +#~ msgstr "Please upgrade your printer first" #~ msgid "" -#~ "\n" -#~ "upload,err:code=%u,msg=%s" -#~ msgstr "télécharger,err:code=%u,msg=%s" - -#~ msgid "Wait for the job to be sent." -#~ msgstr "Attendez que le travail soit envoyé." - -#~ msgid "The print job has been sent to your printer." -#~ msgstr "Le travail d'impression a été envoyé à votre imprimante." - -#~ msgid "Invalid plate index %d" -#~ msgstr "Index de plaque non valide %d" - -#~ msgid "Plate %d" -#~ msgstr "Assiette %d" - -#~ msgid "%s" -#~ msgstr "%s" - -#~ msgid "Start printing..." -#~ msgstr "Lancer l'impression..." - -#~ msgid "%1% is too close to others, there will be collisions when printing." +#~ "Preview only mode:\n" +#~ "The loaded file contains gcode only." #~ msgstr "" -#~ "%1% est trop proche des autres, il y aura des collisions lors de " -#~ "l'impression." +#~ "Preview only mode:\n" +#~ "The loaded file contains gcode only." + +#~ msgid "Preview only mode for gcode file." +#~ msgstr "Preview only mode for gcode file." #~ msgid "" -#~ "\n" -#~ "%1% is too close to others, there will be collisions when printing." -#~ msgstr "" -#~ "%1% est trop proche des autres, il y aura des collisions lors de " -#~ "l'impression." +#~ "Push new filament \n" +#~ "into extruder" +#~ msgstr "Poussez le nouveau filament dans l'extruder" -#~ msgid "%1% is too tall, there will be collisions when printing." +#~ msgid "Shift + Any arrow" +#~ msgstr "Maj + n'importe quelle flèche" + +#~ msgid "Shift + Mouse wheel" +#~ msgstr "Maj + molette de la souris" + +#~ msgid "Show Model Mesh(TODO)" +#~ msgstr "Afficher le maillage du modèle (TODO)" + +#~ msgid "Show Model Shadow(TODO)" +#~ msgstr "Afficher l'ombre du modèle (TODO)" + +#~ msgid "Show Printable Box(TODO)" +#~ msgstr "Afficher la boîte imprimable (TODO)" + +#~ msgid "Successfully sent.Will automatically jump to the device page in %s s" #~ msgstr "" -#~ "\n" -#~ "%1% est trop grand, il y aura des collisions lors de l'impression." +#~ "Successfully sent.Will automatically jump to the device page in %s s" + +#~ msgid "Swith cloud environment, Please login again!" +#~ msgstr "Changez d'environnement cloud, veuillez vous reconnecter !" #~ msgid "" -#~ "\n" -#~ "%1% is too tall, there will be collisions when printing." -#~ msgstr "%1% est trop grand, il y aura des collisions lors de l'impression." - -#~ msgid "bed temperature for layers except the initial one" -#~ msgstr "température du lit pour les couches sauf la première" - -#~ msgid "Bed temperature of the initial layer" -#~ msgstr "Bed temperature for the first layer" - -#~ msgid "Enable spaghetti detector" -#~ msgstr "Activer le détecteur de spaghetti" - -#~ msgid "Enable the camera on printer to check spaghetti" +#~ "The firmware versions of printer and AMS are too low.Please update to the " +#~ "latest version before sending the print job" #~ msgstr "" -#~ "Activer l'appareil photo sur l'imprimante pour vérifier les spaghettis" +#~ "The firmware versions of printer and AMS are too low.Please update to the " +#~ "latest version before sending the print job" -#~ msgid "Smart" -#~ msgstr "Intelligent" - -#~ msgid "X/Y Axis" -#~ msgstr "X/Y axis" - -#~ msgid "Bed temperature for layers except the initial one" -#~ msgstr "Bed temperature after first layer" - -#~ msgid "Use BBL private temperature gcode instead of standard M140/M190" -#~ msgstr "Use BBL private temperature G-code instead of standard M140/M190." - -#~ msgid "Material for support" -#~ msgstr "Support material" - -#~ msgid "Filament to print support and skirt." -#~ msgstr "This is the filament for printing support and skirts." - -#~ msgid "Filament to print support interface" -#~ msgstr "This is the filament for support interfaces." - -#~ msgid "AMS Control" -#~ msgstr "AMS control" - -#~ msgid "Fan speed when printing bridge and overhang wall" -#~ msgstr "Fan speed when printing bridges and overhang walls." - -# I need a little more context to update this one -# [Yifan] It the explanation for setting “cooling overhang threshold”. It controls when the coolin fan should be on. -# The setting is ususally used for filament like ABS which disables the cooling fan by default. -# I will explian overhang concept first. -# overhang 0%: -# ____ upper layer -# ____ lower layer -# overhang 25%: -# ____ upper layer -# ____ lower layer -# overhang 50%: -# ____ upper layer -# ____ lower layer -# overhang 75% -# ____ upper layer -# ____ lower layer -# overhang 100% -# ____ upper layer -# ____ lower layer -# [Cory] I think I get it. Please check for accuracy to confirm. -# [Yifan] Maybe we can replace overhang_fan_speed with “Overhang fan speed”, which is a setting name. -# [Cory] Got it! I think I assumed that it was some sort of set value with the underlining. Updated. -#~ msgid "" -#~ "Force cooling fan speed to be overhang_fan_speed when overhang degree of " -#~ "printed part exceeds this value. Expressed as percentage which indicides " -#~ "how many width of the line without support from lower layer" -#~ msgstr "" -#~ "Force cooling fan speed to match overhang fan speed when the overhang " -#~ "degree of printed parts exceeds this value. This is expressed as " -#~ "percentage which indicates the width of lines without support." - -#~ msgid "" -#~ "Enable auto cooling to adjust printing speed and fan speed according to " -#~ "layer printing time automatically" -#~ msgstr "" -#~ "Enable auto cooling to adjust printing speed and fan speed according to " -#~ "layer printing time automatically." - -#~ msgid "" -#~ "Close cooling fan for the first certain layers. We usually close fan for " -#~ "the initial layer to get better build plate adhesion" -#~ msgstr "" -#~ "Close cooling fan for the first certain layers. We usually close fan for " -#~ "the first layer to get better build plate adhesion" - -#~ msgid "" -#~ "Starting fan from stop state usually costs lots's of time. If enable this " -#~ "setting, fan will never be stoped and will run at least at minimum speed " -#~ "to reduce the frequency of starting and stoping" -#~ msgstr "" -#~ "Starting a fan from a fully stopped state takes a long time. If this " -#~ "setting is enabled, the fan will run at a minimum speed to reduce the " -#~ "frequency of starting and stopping." - -#~ msgid "" -#~ "Cooling fan will be enabled for layers of which estimated time is shorter " -#~ "than this value. Fan speed is interpolated between the minimum and " -#~ "maximum fan speeds according to layer printing time" -#~ msgstr "" -#~ "The cooling fan will be enabled for layers with an estimated time shorter " -#~ "than this value. Fan speed is interpolated between minimum and maximum " -#~ "fan speeds according to layer printing time." - -#~ msgid "Additional cooling fan speed" -#~ msgstr "Auxiliary cooling fan speed" - -#~ msgid "Speed of additional cooling fan" -#~ msgstr "This is the speed for the auxiliary cooling fan." - -#~ msgid "" -#~ "Speed for different overhang degree. Overhang degree is expressed as " -#~ "percentage of line width" -#~ msgstr "" -#~ "This is the speed for various overhang degrees. Overhand degrees are " -#~ "expressed as a percentage of line width." - -#~ msgid "Send Task to" -#~ msgstr "Send task to" - -#~ msgid "Extrusion width value is too low." -#~ msgstr "Extrusion width is too low." - -#~ msgid "Extrusion width value is too high." -#~ msgstr "Extrusion width is too high." - -#~ msgid "" -#~ "Line width of initial layer. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "Line width of first layer: this is relative to nozzle diameter if " -#~ "expressed as a percentage." - -#~ msgid "" -#~ "Line width of internal sparse infill. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "This determines the line width of internal sparse infill. It’s relative " -#~ "to nozzle diameter if expressed as a percentage." - -#~ msgid "" -#~ "Line width of inner wall. It's relative to nozzle diameter if expressed " -#~ "as percentage" -#~ msgstr "" -#~ "Line width of inner walls; it’s relative to nozzle diameter if expressed " -#~ "as a percentage." - -#~ msgid "" -#~ "Line width of internal solid infill. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "This is the line ridge of internal solid infill. It’s relative to nozzle " -#~ "diameter if expressed as a percentage." - -#~ msgid "" -#~ "Used to set line width for support. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "This is used to set line width for support. It’s relative to nozzle " -#~ "diameter if expressed as a percentage." - -#~ msgid "" -#~ "Used to set line width for support transition. It's relative to nozzle " -#~ "diameter if expressed as percentage" -#~ msgstr "" -#~ "This is used to set line width for support transition. It’s relative to " -#~ "nozzle diameter if expressed as a percentage." - -#~ msgid "" -#~ "Used to set line width for top surfaces. It's relative to nozzle diameter " -#~ "if expressed as percentage" -#~ msgstr "" -#~ "This is used to set line width for top surfaces. It’s relative to nozzle " -#~ "diameter if expressed as a percentage." - -# please check for accuracy -# C-See if I can make this more concise/less complex -# Maybe: This is the number of solid layers of top shell, including the surface layer. When the thickness calculated by this is thinner than the top shell thickness, additional top shell layers will be added when slicing. -# [Yifan] “top shell thickness” is a setting name. Maybe it can be expressed as the following. -# This is the number of solid layers of top shell, including the surface layer. When the thickness calculated by this is thinner than “Top shell thickness”, additional top shell layers will be added when slicing. -# [Cory] Updated a bit with the feedback here, and I updated the title of “Top Shell Thickness” to add Title Casing so that it’s in the explanation here and in the name of that item. -#~ msgid "" -#~ "The number of solid layers of top shell, including top surface layer. " -#~ "When the thickness calculated by this value is thinner than top shell " -#~ "thickness, the top shell layers number will be increased when slicing" -#~ msgstr "" -#~ "This is the number of solid layers of top shell, including the surface " -#~ "layer. When the thickness calculated by this value is thinner than top " -#~ "shell thickness, more top shell layers will be added when slicing." - -#~ msgid "" -#~ "The number of solid layers of bottom shell, including bottom surface " -#~ "layer. When the thickness calculated by this value is thinner than bottom " -#~ "shell thickness, the bottom shell layers number will be increased when " -#~ "slicing." -#~ msgstr "" -#~ "This is the number of solid layers of bottom shell, including the bottom " -#~ "surface layer. When the thickness calculated by this value is thinner " -#~ "than bottom shell thickness, the bottom shell layers will be increased." - -#~ msgid "" -#~ "The number of bottom solid layers is increased when slicing if the " -#~ "thickness calculated by bottom_shell_layers is thinner than this value. " -#~ "This can avoid too thin shell when layer height is small" -#~ msgstr "" -#~ "The number of bottom solid layers is increased when slicing if the " -#~ "thickness calculated by bottom shell layers is thinner than this value. " -#~ "This can avoid having shells that are too thin when layer height is small." - -#~ msgid "" -#~ "The number of top solid layers is increased when slicing if the thickness " -#~ "calculated by top_shell_layers is thinner than this value. This can avoid " -#~ "too thin shell when layer height is small" -#~ msgstr "" -#~ "The number of top solid layers is increased when slicing if the thickness " -#~ "calculated by top shell layers is thinner than this value. This can avoid " -#~ "having too thin a shell when layer height is small." - -#~ msgid "Unable to connect server" -#~ msgstr "Unable to connect to server" - -#~ msgid "" -#~ "Speed of outer wall which is outermost and visible. It's used to be " -#~ "slower than inner wall speed to get better quality" -#~ msgstr "" -#~ "This is the speed for the outermost visible wall. It should be slower " -#~ "than inner wall speed for higher quality." - -#~ msgid "Remove frequency sweep gcode" -#~ msgstr "Remove frequency sweep G-code" - -#~ msgid "Enable this to skip frequency sweep when start printing" -#~ msgstr "Enable this to skip frequency sweeping when you start printing." - -#~ msgid "Remove bed leveling gcode" -#~ msgstr "Remove bed leveling G-code" - -#~ msgid "Enable this to skip bed leveling when start printing" -#~ msgstr "Enable this to skip bed leveling when you start printing." - -#~ msgid "Remove extrusion calibration gcode" -#~ msgstr "Remove extrusion calibration G-code" - -#~ msgid "Enable this to skip extrusion calibration when start printing" -#~ msgstr "" -#~ "Enable this to skip the extrusion calibration when you start printing." - -#~ msgid "" -#~ "Speed for line of wall which has degree of overhang between 0% and 25% " -#~ "line width. 0 means using original wall speed" -#~ msgstr "" -#~ "Speed for lines of walls which have a degree of overhang between 0% and " -#~ "25% line width. 0 means using original wall speed." - -#~ msgid "Bmabu Cool Plate" -#~ msgstr "Bambu cool plate" - -#~ msgid "Bmabu Engineering Plate" -#~ msgstr "Bambu engineering plate" - -#~ msgid "Bmabu High Temperature Plate" -#~ msgstr "Bambu high temperature plate" - -#~ msgid "" -#~ "Detect the overhang percentage relative to line width and use different " -#~ "speed to print. For 100% overhang, bridge speed is used" -#~ msgstr "" -#~ "This enables detecting the overhang percentage relative to line width and " -#~ "uses different speed to print. For 100% overhang, bridge speed is used." - -#~ msgid "" -#~ "This plate is locked,\n" -#~ "We can not do auto-arrange on this plate!" -#~ msgstr "" -#~ "This plate is locked.\n" -#~ "Cannot auto-arrange this plate." - -#~ msgid "" -#~ "Arrange failed! Found some exceptions when processing object Geometries" -#~ msgstr "" -#~ "Arrange failed. Exception were found when processing object geometries." - -#~ msgid "" -#~ "All the selected objects are on the locked plate,\n" -#~ "We can not do auto-orient on these objects!" -#~ msgstr "" -#~ "All the selected objects are on a locked plate.\n" -#~ "We cannot auto-orient these objects!" - -#~ msgid "" -#~ "This plate is locked,\n" -#~ "We can not do auto-orient on this plate!" -#~ msgstr "" -#~ "This plate is locked.\n" -#~ "We cannot auto-orient objects on this plate!" - -#~ msgid "Whether to synchronize cloud user data?\n" -#~ msgstr "Synchronize cloud user data?\n" - -#~ msgid "" -#~ "Holes of object will be grown or shrunk in XY plane by the configured " -#~ "value. Negative value makes holes bigger. Positive value makes holes " -#~ "smaller. This function is used to adjust size when the object has " -#~ "assembling issue" -#~ msgstr "" -#~ "Holes in the object will be grown or shrunk in the XY plane by the " -#~ "configured value. Negative values make holes bigger while positive values " -#~ "makes them smaller. This function is used to adjust size when the object " -#~ "has assembly issues." - -#~ msgid "" -#~ "Contour of object will be grown or shrunk in XY plane by the configured " -#~ "value. Positive value makes contour bigger. Negative value makes contour " -#~ "smaller. This function is used to adjust size when the object has " -#~ "assembling issue" -#~ msgstr "" -#~ "Contours of objects will be grown or shrunk in the XY plane by the set " -#~ "value. Positive values will make contours bigger while negative values " -#~ "will make them smaller. This function is used to adjust size when the " -#~ "object has assembly issues." - -#~ msgid "Hotend Fan" -#~ msgstr "Part cooling fan" - -#~ msgid "Big Fan" -#~ msgstr "Aux. cooling fan" - -#~ msgid "Switching Presets: Unsaved Changes" -#~ msgstr "Switching presets: unsaved changes" - -#~ msgid "Show daily tip on startup" -#~ msgstr "Show Daily Tip on Startup" - -#~ msgid "" -#~ "XY separation between an object and its support. It's relative to outer " -#~ "wall line width if expressed as percentage" -#~ msgstr "" -#~ "This determines the XY separation between an object and its support. It’s " -#~ "relative to outer wall line width if expressed as a percentage." - -#~ msgid "" -#~ "Failed to save gcode file\n" -#~ "Error message: %1%" -#~ msgstr "" -#~ "Failed to save G-code file\n" -#~ "Error message: %1%" - -#~ msgid "" -#~ "Speed of outer wall which is outermost and visible. It's expressed as " -#~ "percentage relative to inner wall speed. It's used to be slower than " -#~ "inner wall speed to get better quality" -#~ msgstr "" -#~ "Speed of outer wall which is outermost and visible. It's expressed as " -#~ "percentage relative to inner wall speed. It's used to be slower than " -#~ "inner wall speed to get better quality." - -#~ msgid "Filament to print support, raft and skirt" -#~ msgstr "Filament to print support, raft and skirt" - -#~ msgid "preparing your project" -#~ msgstr "Preparing your project" - -#~ msgid "uploading..." -#~ msgstr "Uploading…" - -#~ msgid "Experimental option for adding support for sharp tails" -#~ msgstr "This is an experimental option to add support for sharp tails." - -#~ msgid "Experimental option for removing support for small overhangs" -#~ msgstr "" -#~ "This is an experimental option to remove support for small overhangs." - -#~ msgid "" -#~ "Enable this option and height of every layer except initial one will be " -#~ "automatically calculated when slicing according to the slope of model " -#~ "surface" -#~ msgstr "" -#~ "Enabling this option means the height of every layer except the first " -#~ "will be automatically calculated when slicing according to the slope of " -#~ "the model’s surface" - -#~ msgid "The z gap between the bottom support interface and object" -#~ msgstr "" -#~ "This determines the z gap between the bottom support interface and the " -#~ "object." - -# I need a little clarification on what this does -# [Yifan] It is a setting which creates a single shell around the supports to makes them sturdier. -# [Cory] Does support wall make sense, or does that conflict with other terminology? -# [Yifan] I agree. It behaves much like a wall around infill. Could you give some suggestions? -# Note: word “shell” has also been used in other place. -# [Cory] I think “Support Wall” is good, but if you want to stress that it makes the support more sturdy, you could call it “Support Fortification Wall” -#~ msgid "Wall around the support" -#~ msgstr "Support Wall" - -#~ msgid "" -#~ "If enabled, bridges may look worse but can cover longer distance. If " -#~ "disabled, bridges look better but just for shorter distance." -#~ msgstr "" -#~ "If enabled, bridges may look worse but can cover longer distance. If " -#~ "disabled, bridges look better but cover shorter distances." - -#~ msgid "Tool Rotate" -#~ msgstr "Tool rotate" - -#~ msgid "Check for Configuration Updates" -#~ msgstr "Check for configuration updates" - -#~ msgid "Enter copies Number" -#~ msgstr "Enter number of copies" - -#~ msgid "" -#~ "Switching the language will trigger the application restart.\n" -#~ "Please confirm to switch?" -#~ msgstr "" -#~ "Switching languages will trigger an application restart.\n" -#~ "Please confirm to switch." - -#~ msgid "" -#~ "Speed of internal solid infill, not the top and bottom surface. It's " -#~ "relative to sparse infill speed if it's percentage" -#~ msgstr "" -#~ "This is the speed of internal solid infill, not the top and bottom " -#~ "surface. It’s relative to sparse infill speed if it is a percentage." - -#~ msgid "" -#~ "Speed of support interface. It's relative to support speed if expressed " -#~ "as percentage" -#~ msgstr "" -#~ "This is the speed of printing support interfaces. It’s relative to " -#~ "support speed if expressed as a percentage." - -#~ msgid "" -#~ "Speed for printing support transition layers in which support infill " -#~ "direction is changed.If expressed as percentage (for example 50%) it will " -#~ "be calculated over support speed." -#~ msgstr "" -#~ "This is the speed for printing support transition layers in which support " -#~ "infill direction is changed. If expressed as a percentage (for example, " -#~ "50%), it will be calculated over support speed." - -#~ msgid "" -#~ "Speed of top surface infill which is solid. It's relative to internal " -#~ "solid infill speed if it's percentage" -#~ msgstr "" -#~ "This determines the speed of the top surface infill, which is solid. It’s " -#~ "relative to internal solid infill speed if expressed as a percentage." - -#~ msgid "" -#~ "The sequential print is on.\n" -#~ "It's impossible to apply any custom G-code for objects printing " -#~ "sequentually.\n" -#~ "This code won't be processed during G-code generation." -#~ msgstr "" -#~ "The sequential print is on.\n" -#~ "It's impossible to apply any custom G-code for objects printing " -#~ "sequentially.\n" -#~ "This code won't be processed during G-code generation." - -#~ msgid "" -#~ "One or more object were assigned an extruder that the printer does not " -#~ "have." -#~ msgstr "" -#~ "One or more objects were assigned an extruder that the printer does not " -#~ "have." - -#~ msgid "Retraction Length (Toolchange)" -#~ msgstr "Retraction Length (Tool change)" - -#~ msgid "" -#~ "A boolean expression using the configuration values of an active printer " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active printer profile." -#~ msgstr "" -#~ "A Boolean expression using the configuration values of an active printer " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active printer profile." - -#~ msgid "" -#~ "A boolean expression using the configuration values of an active print " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active print profile." -#~ msgstr "" -#~ "A Boolean expression using the configuration values of an active print " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active print profile." - -#~ msgid "" -#~ "Set this to a non-zero value to allow a manual extrusion width. If left " -#~ "to zero, Slic3r derives extrusion widths from the nozzle diameter (see " -#~ "the tooltips for perimeter extrusion width, infill extrusion width etc). " -#~ "If expressed as percentage (for example: 230%), it will be computed over " -#~ "layer height." -#~ msgstr "" -#~ "Set this to a non-zero value to allow a manual extrusion width. If left " -#~ "to zero, Slic3r derives extrusion widths from the nozzle diameter (see " -#~ "the tooltips for perimeter extrusion width, infill extrusion width etc.). " -#~ "If expressed as percentage (for example: 230%), it will be computed over " -#~ "layer height." - -#~ msgid "Density of internal infill, expressed in the range 0% - 100%." -#~ msgstr "Density of internal infill, expressed in the range 0 % - 100 %." - -#~ msgid "" -#~ "If enabled, the wipe tower will not be printed on layers with no " -#~ "toolchanges. On layers with a toolchange, extruder will travel downward " -#~ "to print the wipe tower. User is responsible for ensuring there is no " -#~ "collision with the print." -#~ msgstr "" -#~ "If enabled, the wipe tower will not be printed on layers with no tool " -#~ "changes. On layers with a tool change, extruder will travel downward to " -#~ "print the wipe tower. User is responsible for ensuring there is no " -#~ "collision with the print." - -#~ msgid "" -#~ "Support material will not be generated for overhangs whose slope angle " -#~ "(90° = vertical) is above the given threshold. In other words, this value " -#~ "represent the most horizontal slope (measured from the horizontal plane) " -#~ "that you can print without support material. Set to zero for automatic " -#~ "detection (recommended)." -#~ msgstr "" -#~ "Support material will not be generated for overhangs whose slope angle " -#~ "(90° = vertical) is above the given threshold. In other words, this value " -#~ "represents the most horizontal slope (measured from the horizontal plane) " -#~ "that you can print without support material. Set to zero for automatic " -#~ "detection (recommended)." - -#~ msgid "" -#~ "This matrix describes volumes (in cubic milimetres) required to purge the " -#~ "new filament on the wipe tower for any given pair of tools." -#~ msgstr "" -#~ "This matrix describes volumes (in cubic millimetres) required to purge " -#~ "the new filament on the wipe tower for any given pair of tools." - -#~ msgid "" -#~ "Object will be used to purge the nozzle after a toolchange to save " -#~ "material that would otherwise end up in the wipe tower and decrease print " -#~ "time. Colours of the objects will be mixed as a result." -#~ msgstr "" -#~ "Object will be used to purge the nozzle after a tool change to save " -#~ "material that would otherwise end up in the wipe tower and decrease print " -#~ "time. Colours of the objects will be mixed as a result." - -#~ msgid "WHITE BULLET icon indicates a non system (or non default) preset." -#~ msgstr "WHITE BULLET icon indicates a non-system (or non-default) preset." - -#~ msgid "" -#~ "Some objects can get along with a few smaller pads instead of a single " -#~ "big one. This parameter defines how far the center of two smaller pads " -#~ "should be. If theyare closer, they will get merged into one pad." -#~ msgstr "" -#~ "Some objects can get along with a few smaller pads instead of a single " -#~ "big one. This parameter defines how far the center of two smaller pads " -#~ "should be. If they are closer, they will get merged into one pad." - -#~ msgid "Don't notify about new releases any more" -#~ msgstr "Don't notify about new releases anymore" - -#~ msgid "Buttons And Text Colors Description" -#~ msgstr "Buttons and Text Colors Description" - -#~ msgid "Before roll back" -#~ msgstr "Before rollback" - -#~ msgid "" -#~ "If enabled, %s checks for new application versions 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 "" -#~ "If enabled, %s checks for new application versions 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 mechanism, no automatic installation is done." - -#~ msgid "" -#~ "If enabled, %s downloads updates of built-in system presets in the " -#~ "background.These updates are downloaded into a separate temporary " -#~ "location.When a new preset version becomes available it is offered at " -#~ "application startup." -#~ msgstr "" -#~ "If enabled, %s downloads updates of built-in system presets in the " -#~ "background. These updates are downloaded into a separate temporary " -#~ "location. When a new preset version becomes available it is offered at " -#~ "application startup." - -#~ msgid "" -#~ "Additionally a backup snapshot of the whole configuration is created " -#~ "before an update is applied." -#~ msgstr "" -#~ "Additionally, a backup snapshot of the whole configuration is created " -#~ "before an update is applied." - -#~ msgid "Autospeed (advanced)" -#~ msgstr "Auto Speed (advanced)" - -#~ msgid "Toolchange parameters with single extruder MM printers" -#~ msgstr "Toolchange parameters with single extruder MM printers" - -#~ msgid "" -#~ "When printing multi-material objects, this settings will make Slic3r to " -#~ "clip the overlapping object parts one by the other (2nd part will be " -#~ "clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -#~ msgstr "" -#~ "When printing multi-material objects, this settings will make Slic3r to " -#~ "clip the overlapping object parts one by the other (2nd part will be " -#~ "clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc.)." - -#~ msgid "" -#~ "Add solid infill near sloping surfaces to guarantee the vertical shell " -#~ "thickness (top+bottom solid layers)." -#~ msgstr "" -#~ "Add solid infill near sloping surfaces to guarantee the vertical shell " -#~ "thickness (top + bottom solid layers)." - -#~ msgid "" -#~ "Speed used for unloading the filament on the wipe tower (does not affect " -#~ "initial part of unloading just after ramming)." -#~ msgstr "" -#~ "Speed used for unloading the filament on the wipe tower (does not affect " -#~ "initial part of unloading just after ramming)." - -#~ msgid "" -#~ "Time to wait after the filament is unloaded. May help to get reliable " -#~ "toolchanges with flexible materials that may need more time to shrink to " -#~ "original dimensions." -#~ msgstr "" -#~ "Time to wait after the filament is unloaded. May help to get reliable " -#~ "tool changes with flexible materials that may need more time to shrink to " -#~ "original dimensions." - -#~ msgid "" -#~ "When set to zero, the distance the filament is moved from parking " -#~ "position during load is exactly the same as it was moved back during " -#~ "unload. When positive, it is loaded further, if negative, the loading " -#~ "move is shorter than unloading." -#~ msgstr "" -#~ "When set to zero, the distance the filament is moved from parking " -#~ "position during load is exactly the same as it was moved back during " -#~ "unload. When positive, it is loaded further, if negative, the loading " -#~ "move is shorter than unloading." - -#~ msgid "Autogeneration will erase all manually edited points." -#~ msgstr "Auto Generation will erase all manually edited points." - -#~ msgid "Unknown error occured" -#~ msgstr "Unknown error occurred" - -#~ msgid "" -#~ "This end procedure is inserted at the end of the output file, before the " -#~ "printer end gcode (and before any toolchange from this filament in case " -#~ "of multimaterial printers). Note that you can use placeholder variables " -#~ "for all PrusaSlicer settings. If you have multiple extruders, the gcode " -#~ "is processed in extruder order." -#~ msgstr "" -#~ "This end procedure is inserted at the end of the output file, before the " -#~ "printer end gcode (and before any tool change from this filament in case " -#~ "of multimaterial printers). Note that you can use placeholder variables " -#~ "for all PrusaSlicer settings. If you have multiple extruders, the gcode " -#~ "is processed in extruder order." - -#~ msgid "" -#~ "This start procedure is inserted at the beginning, after any printer " -#~ "start gcode (and after any toolchange to this filament in case of multi-" -#~ "material printers). This is used to override settings for a specific " -#~ "filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom " -#~ "codes, such commands will not be prepended automatically so you're free " -#~ "to customize the order of heating commands and other custom actions. Note " -#~ "that you can use placeholder variables for all PrusaSlicer settings, so " -#~ "you can put a \"M109 S[first_layer_temperature]\" command wherever you " -#~ "want. If you have multiple extruders, the gcode is processed in extruder " -#~ "order." -#~ msgstr "" -#~ "This start procedure is inserted at the beginning, after any printer " -#~ "start gcode (and after any tool change to this filament in case of multi-" -#~ "material printers). This is used to override settings for a specific " -#~ "filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom " -#~ "codes, such commands will not be prepended automatically so you're free " -#~ "to customize the order of heating commands and other custom actions. Note " -#~ "that you can use placeholder variables for all PrusaSlicer settings, so " -#~ "you can put a \"M109 S[first_layer_temperature]\" command wherever you " -#~ "want. If you have multiple extruders, the gcode is processed in extruder " -#~ "order." - -#~ 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 "" -#~ "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 mechanism, no automatic installation is done." - -#~ msgid "" -#~ "Purging after toolchange will done inside this object's infills. This " -#~ "lowers the amount of waste but may result in longer print time due to " -#~ "additional travel moves." -#~ msgstr "" -#~ "Purging after tool change will done inside this object's infills. This " -#~ "lowers the amount of waste but may result in longer print time due to " -#~ "additional travel moves." - -#~ msgid "" -#~ "This custom code is inserted before every toolchange. Placeholder " -#~ "variables for all PrusaSlicer settings as well as {previous_extruder} and " -#~ "{next_extruder} can be used. When a tool-changing command which changes " -#~ "to the correct extruder is included (such as T{next_extruder}), " -#~ "PrusaSlicer will emit no other such command. It is therefore possible to " -#~ "script custom behaviour both before and after the toolchange." -#~ msgstr "" -#~ "This custom code is inserted before every tool change. Placeholder " -#~ "variables for all PrusaSlicer settings as well as {previous_extruder} and " -#~ "{next_extruder} can be used. When a tool-changing command which changes " -#~ "to the correct extruder is included (such as T{next_extruder}), " -#~ "PrusaSlicer will emit no other such command. It is therefore possible to " -#~ "script custom behaviour both before and after the tool change." +#~ msgid "User pause" +#~ msgstr "User pause" diff --git a/bbl/i18n/list.txt b/bbl/i18n/list.txt index 4576b9fa70..2ca2d825d3 100644 --- a/bbl/i18n/list.txt +++ b/bbl/i18n/list.txt @@ -33,10 +33,12 @@ src/slic3r/GUI/Jobs/PlaterJob.cpp src/slic3r/GUI/Jobs/RotoptimizeJob.cpp src/slic3r/GUI/Jobs/BindJob.cpp src/slic3r/GUI/Jobs/PrintJob.cpp +src/slic3r/GUI/Jobs/UpgradeNetworkJob.cpp src/slic3r/GUI/AboutDialog.cpp src/slic3r/GUI/AMSMaterialsSetting.cpp src/slic3r/GUI/AMSSetting.cpp src/slic3r/GUI/BBLTopbar.cpp +src/slic3r/GUI/DownloadProgressDialog.cpp src/slic3r/GUI/BackgroundSlicingProcess.cpp src/slic3r/GUI/BedShapeDialog.cpp src/slic3r/GUI/BedShapeDialog.hpp @@ -49,7 +51,6 @@ src/slic3r/GUI/GLCanvas3D.cpp src/slic3r/GUI/Calibration.cpp src/slic3r/GUI/CameraPopup.cpp src/slic3r/GUI/ConnectPrinter.cpp -src/slic3r/GUI/DebugToolDialog.cpp src/slic3r/GUI/HMSPanel.cpp src/slic3r/GUI/MainFrame.cpp src/slic3r/GUI/MediaPlayCtrl.cpp diff --git a/bbl/i18n/nl/BambuStudio_nl.po b/bbl/i18n/nl/BambuStudio_nl.po index a4ab91c1b2..3012cbc3cb 100644 --- a/bbl/i18n/nl/BambuStudio_nl.po +++ b/bbl/i18n/nl/BambuStudio_nl.po @@ -1,13 +1,17 @@ msgid "" msgstr "" +"Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-15 10:25+0800\n" +"POT-Creation-Date: 2022-07-22 18:39+0800\n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Language: nl\n" -"X-Source-Language: C\n" +"Plural-Forms: nplurals=2; plural=(n==1) ? 0 : 1;\n" +"X-Generator: Poedit 3.1\n" msgid "Supports Painting" msgstr "Onderteuning (Support) tekenen" @@ -42,14 +46,14 @@ msgstr "Alle getekende delen wissen" msgid "Highlight overhang areas" msgstr "Overhangende gebieden markeren" -msgid "Fragment filter" +msgid "Gap fill" msgstr "" msgid "Perform" -msgstr "" +msgstr "Perform" msgid "Fragment area" -msgstr "" +msgstr "Fragment area" msgid "Set pen size" msgstr "Selecteer pen formaat" @@ -73,9 +77,9 @@ msgid "Sphere" msgstr "Gebied" msgid "Fill" -msgstr "" +msgstr "Fill" -msgid "Fragment Filter" +msgid "Gap Fill" msgstr "" msgid "Highlight faces according to overhang angle." @@ -145,10 +149,10 @@ msgid "Shortcut Key " msgstr "Sneltoest " msgid "Triangle" -msgstr "" +msgstr "Triangle" msgid "Height Range" -msgstr "" +msgstr "Height Range" msgid "Remove painted color" msgstr "Getekende kleur verwijderen" @@ -226,15 +230,12 @@ msgstr "World coordinates" msgid "°" msgstr "°" -msgid "Position:" -msgstr "Positie:" +msgid "Size" +msgstr "Maat" msgid "%" msgstr "%" -msgid "Size" -msgstr "Maat" - msgid "uniform scale" msgstr "Uniform schalen" @@ -323,7 +324,7 @@ msgstr "Draadmodel tonen" #, boost-format msgid "%1%" -msgstr "" +msgstr "%1%" msgid "Can't apply when proccess preview." msgstr "Toepassen is niet mogelijk bij een voorvertoning." @@ -335,10 +336,10 @@ msgid "Operation already cancelling. Please wait few seconds." msgstr "De toepassing wordt al geannuleerd. Wacht even alstublieft." msgid "Face recognition" -msgstr "" +msgstr "Face recognition" msgid "Perform Recognition" -msgstr "" +msgstr "Perform Recognition" msgid "Cube" msgstr "Kubus" @@ -350,7 +351,7 @@ msgid "Cone" msgstr "Kegel" msgid "Timelapse Wipe Tower" -msgstr "" +msgstr "Timelapse Wipe Tower" msgid "Add Modifier" msgstr "Aanpasser toevoegen" @@ -424,6 +425,13 @@ msgstr "Kritische fout" msgid "BambuStudio got an unhandled exception: %1%" msgstr "Er is een onbekende uitzondering opgetreden in BambuStudio : %1%" +msgid "Downloading Bambu Network plug-in" +msgstr "" + +#, c-format, boost-format +msgid "Connect %s[SN:%s] failed!" +msgstr "" + msgid "" "BambuStudio configuration file may be corrupted and is not abled to be " "parsed.Please delete the file and try again." @@ -450,12 +458,15 @@ msgid "Click to download new version in default browser: %s" msgstr "" "Klik hier om de nieuwe versie te downloaden in je standaard browser: %s" -msgid "New version of Bambu Studio" -msgstr "Nieuwe versie van Bambu Studio" - msgid "The Bambu Studio needs an upgrade" msgstr "Bambu Studio heeft een upgrade nodig" +msgid "This is the newest version." +msgstr "Dit is de nieuwste versie." + +msgid "Info" +msgstr "Informatie" + msgid "Loading user presets..." msgstr "Gebruikersinstellingen worden geladen..." @@ -477,25 +488,21 @@ msgstr "Kies een of meer bestanden (3mf/step/stl/obj/amf):" msgid "Choose one file (gcode/.gco/.g/.ngc/ngc):" msgstr "Kies een bestand (.gcode/.gco/.g/.ngc/ngc):" -msgid "Login information expired. Please login again." -msgstr "Uw inlog is verlopen. Log alstublieft opnieuw in." - msgid "" "The version of Bambu studio is too low and needs to be updated to the latest " "version before it can be used normally" msgstr "" +"The version of Bambu studio is too low and needs to be updated to the latest " +"version before it can be used normally" -msgid "This is the newest version." -msgstr "Dit is de nieuwste versie." - -msgid "Info" -msgstr "Informatie" +msgid "Login information expired. Please login again." +msgstr "Uw inlog is verlopen. Log alstublieft opnieuw in." msgid "Loading" msgstr "Laden" msgid "Loading user preset" -msgstr "" +msgstr "Loading user preset" msgid "Switching application language" msgstr "De taal van de applicatie wordt aangepast" @@ -519,11 +526,11 @@ msgid "Select a G-code file:" msgstr "Selecteer een G-code bestand:" msgid "Bambu Studio GUI initialization failed" -msgstr "" +msgstr "Bambu Studio GUI initialization failed" #, boost-format msgid "Fatal error, exception catched: %1%" -msgstr "" +msgstr "Fatal error, exception catched: %1%" msgid "Quality" msgstr "Kwaliteit" @@ -803,13 +810,13 @@ msgstr "Vergrendelen" msgid "Name" msgstr "Naam" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "%1$d error repaired" msgid_plural "%1$d errors repaired" msgstr[0] "%1$d fouten hersteld@%1$d fouten hersteld" msgstr[1] "%1$d fouten hersteld@%1$d fouten hersteld" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Error: %1$d non-manifold edge." msgid_plural "Error: %1$d non-manifold edges." msgstr[0] "Error: %1$d non-manifold edges.@" @@ -818,7 +825,7 @@ msgstr[1] "Error: %1$d non-manifold edges.@" msgid "Remaining errors" msgstr "Resterende fouten" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "%1$d non-manifold edge" msgid_plural "%1$d non-manifold edges" msgstr[0] "%1$d non-manifold edges@%1$d non-manifold edges" @@ -929,7 +936,6 @@ msgstr "Hernoemen" msgid "Repairing model object" msgstr "Model object repareren" -#, fuzzy msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "" @@ -939,7 +945,6 @@ msgstr[1] "" "De volgende model objecten zijn gerepareerd@De volgende model objecten zijn " "gerepareerd" -#, fuzzy msgid "Failed to repair folowing model object" msgid_plural "Failed to repair folowing model objects" msgstr[0] "Repareren van de volgende modellen is mislukt@" @@ -975,7 +980,7 @@ msgid "No-brim" msgstr "Geen extra rand (brim)" msgid " " -msgstr " " +msgstr "" msgid "Layer height" msgstr "Laaghoogte" @@ -1013,10 +1018,8 @@ msgstr "Lijn type" msgid "No printer" msgstr "Geen printer" -msgid "" -"Heat the nozzle to target \n" -"temperature" -msgstr "Nozzle opwarmen tot doel temperatuur" +msgid "Heat the nozzle to target temperature" +msgstr "" msgid "Cut filament" msgstr "Filament afsnijden" @@ -1024,13 +1027,11 @@ msgstr "Filament afsnijden" msgid "Pull back current filament" msgstr "huidig filament terugtrekken" -msgid "" -"Push new filament \n" -"into extruder" -msgstr "Nieuw filament in de extruder laden" +msgid "Push new filament into extruder" +msgstr "" msgid "Purge old filament" -msgstr "" +msgstr "Purge old filament" msgid "?" msgstr "?" @@ -1042,10 +1043,10 @@ msgid "Click the pencil icon to edit the filament." msgstr "Klik op het potlood icoon om het filament aan te passen." msgid "Load Filament" -msgstr "Laden" +msgstr "Load" msgid "Unload Filament" -msgstr "" +msgstr "Unload" msgid "Tips" msgstr "Tips" @@ -1103,9 +1104,6 @@ msgstr "" "Het rangschikken is mislukt. Er zijn enkele uitzonderingen gevonden tijdens " "het verwerken van het object." -msgid "Arranging" -msgstr "" - msgid "Arranging canceled." msgstr "Rangschikken geannuleerd." @@ -1155,160 +1153,232 @@ msgid "Exception" msgstr "Uitzondering" msgid "Logging in" -msgstr "" +msgstr "Logging in" msgid "Login failed" -msgstr "" +msgstr "Login failed" msgid "The region parameter is incorrrect" -msgstr "" +msgstr "The region parameter is incorrrect." msgid "Failure of printer login" -msgstr "" +msgstr "Failure of printer login" msgid "Failed to get ticket" -msgstr "" +msgstr "Failed to get ticket" msgid "User authorization timeout" -msgstr "" +msgstr "User authorization timeout" msgid "Failure of bind" -msgstr "" +msgstr "Failure of bind" msgid "Unknown Failure" -msgstr "" +msgstr "Unknown Failure" msgid "Abnormal print file data. Please slice again" -msgstr "" +msgstr "Abnormal print file data. Please slice again" msgid "Task canceled" -msgstr "" +msgstr "Task canceled" msgid "Upload task timed out. Please check the network problem and try again" -msgstr "" +msgstr "Upload task timed out. Please check the network problem and try again" msgid "Cloud service connection failed. Please try again." -msgstr "" +msgstr "Cloud service connection failed. Please try again." msgid "Print file not found, please slice again" -msgstr "" +msgstr "Print file not found, please slice again" msgid "" "The print file exceeds the maximum allowable size (1GB). Please simplify the " "model and slice again" msgstr "" +"The print file exceeds the maximum allowable size (1GB). Please simplify the " +"model and slice again" msgid "Failed uploading print file" -msgstr "" +msgstr "Failed uploading print file" msgid "Wrong Access code" -msgstr "" +msgstr "Wrong Access code" msgid "Sending print job over LAN" -msgstr "" +msgstr "Sending print job over LAN" msgid "Sending print job through cloud service" +msgstr "Sending print job through cloud service" + +msgid "Service Unavailable" +msgstr "" + +msgid "Unkown Error." msgstr "" msgid "Sending print configuration" -msgstr "" +msgstr "Sending print configuration" #, c-format, boost-format -msgid "Successfully sent.Will automatically jump to the device page in %s s" +msgid "Successfully sent. Will automatically jump to the device page in %s s" +msgstr "" + +msgid "An SD card needs to be inserted before printing via LAN." +msgstr "" + +msgid "Downloading" +msgstr "" + +msgid "Download failed" +msgstr "" + +msgid "Cancelled" +msgstr "" + +msgid "Finish" +msgstr "" + +msgid "Installing" +msgstr "" + +msgid "Install failed" msgstr "" msgid "Portions copyright" -msgstr "" +msgstr "License Info" msgid "Copyright" -msgstr "" +msgstr "Copyright" msgid "License" msgstr "Licentie" msgid "Bambu Studio is licensed under " -msgstr "" +msgstr "Bambu Studio is licensed under " msgid "GNU Affero General Public License, version 3" -msgstr "" +msgstr "GNU Affero General Public License, version 3" msgid "" "Bambu Studio is based on PrusaSlicer by Prusa Research, which is from Slic3r " "by Alessandro Ranellucci and the RepRap community" msgstr "" +"Bambu Studio is based on PrusaSlicer by Prusa Research, which is from Slic3r " +"by Alessandro Ranellucci and the RepRap community" msgid "Libraries" -msgstr "" +msgstr "Libraries" msgid "" "This software uses open source components whose copyright and other " "proprietary rights belong to their respective owners" msgstr "" +"This software uses open source components whose copyright and other " +"proprietary rights belong to their respective owners" #, c-format, boost-format msgid "About %s" +msgstr "About %s" + +msgid "" +"Bambu Studio is based on PrusaSlicer by PrusaResearch and SuperSlicer by " +"Merill(supermerill)." +msgstr "" + +msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." +msgstr "" + +msgid "" +"Slic3r was created by Alessandro Ranellucci with the help of many other " +"contributors." +msgstr "" + +msgid "Bambu Studio also referenced some ideas from Cura by Ultimaker." +msgstr "" + +msgid "" +"There many parts of the software that come from community contributions, so " +"we're unable to list them one-by-one, and instead, they'll be attributed in " +"the corresponding code comments." msgstr "" msgid "Colour" -msgstr "" +msgstr "Colour" msgid "SN" -msgstr "" +msgstr "SN" msgid "" "Nozzle\n" "Temperature" msgstr "" +"Nozzle\n" +"Temperature" msgid "max" -msgstr "" +msgstr "max" msgid "min" -msgstr "" +msgstr "min" #, boost-format msgid "The input value should be greater than %1% and less than %2%" -msgstr "" +msgstr "The input value should be greater than %1% and less than %2%" msgid "Confirm" msgstr "Bevestigen" msgid "Insertion update" -msgstr "" +msgstr "Insertion update" msgid "" "The AMS will automatically read the filament information when inserting a " "new Bambu Lab filament. This takes about 20 seconds." msgstr "" +"The AMS will automatically read the filament information when inserting a " +"new Bambu Lab filament. This takes about 20 seconds." msgid "" "Note: if new filament is inserted during printing, the AMS will not " "automatically read any information until printing is completed." msgstr "" +"Note: if new filament is inserted during printing, the AMS will not " +"automatically read any information until printing is completed." msgid "" "When inserting a new filament, the AMS will not automatically read its " "information, leaving it blank for you to enter manually." msgstr "" +"When inserting a new filament, the AMS will not automatically read its " +"information, leaving it blank for you to enter manually." msgid "Power on update" -msgstr "" +msgstr "Power on update" msgid "" "The AMS will automatically read the information of inserted filament on " "start-up. It will take about 1 minute.The reading process will roll filament " "spools." msgstr "" +"The AMS will automatically read the information of inserted filament on " +"start-up. It will take about 1 minute.The reading process will roll filament " +"spools." msgid "" "The AMS will not automatically read information from inserted filament " "during startup and will continue to use the information recorded before the " "last shutdown." msgstr "" +"The AMS will not automatically read information from inserted filament " +"during startup and will continue to use the information recorded before the " +"last shutdown." msgid "File" msgstr "Bestand" +msgid "Close" +msgstr "Sluiten" + msgid "" "A error occurred. Maybe memory of system is not enough or it's a bug of the " "program" @@ -1614,67 +1684,67 @@ msgstr "" "Nee - Reset vulling automatisch naar de standaard niet-100% waarde\n" msgid "Auto bed leveling" -msgstr "" +msgstr "Auto bed leveling" msgid "Heatbed preheating" -msgstr "" +msgstr "Heatbed preheating" msgid "Sweeping XY mech mode" -msgstr "" +msgstr "Sweeping XY mech mode" msgid "Changing filament" -msgstr "" +msgstr "Changing filament" msgid "M400 pause" -msgstr "" +msgstr "M400 pause" msgid "Paused due to filament runout" -msgstr "" +msgstr "Paused due to filament runout" msgid "Heating hotend" -msgstr "" +msgstr "Heating hotend" msgid "Calibrating extrusion" -msgstr "" +msgstr "Calibrating extrusion" msgid "Scanning bed surface" -msgstr "" +msgstr "Scanning bed surface" msgid "Inspecting first layer" -msgstr "" +msgstr "Inspecting first layer" msgid "Identifying build plate type" -msgstr "" +msgstr "Identifying build plate type" msgid "Calibrating Micro Lidar" -msgstr "" +msgstr "Calibrating Micro Lidar" msgid "Homing toolhead" -msgstr "" +msgstr "Homing toolhead" msgid "Cleaning nozzle tip" -msgstr "" +msgstr "Cleaning nozzle tip" msgid "Checking extruder temperature" -msgstr "" +msgstr "Checking extruder temperature" msgid "Printing was paused by the user" -msgstr "" +msgstr "Printing was paused by the user" msgid "Pause of front cover falling" -msgstr "" +msgstr "Pause of front cover falling" msgid "Calibrating the micro lida" -msgstr "" +msgstr "Calibrating the micro lidar" msgid "Calibrating extrusion flow" -msgstr "" +msgstr "Calibrating extrusion flow" msgid "Paused due to nozzle temperature malfunction" -msgstr "" +msgstr "Paused due to nozzle temperature malfunction" msgid "Paused due to heat bed temperature malfunction" -msgstr "" +msgstr "Paused due to heat bed temperature malfunction" msgid "MC" msgstr "MC" @@ -1715,6 +1785,9 @@ msgstr "Verificatie mislukt." msgid "Update failed." msgstr "Updaten mislukt." +msgid "Failed to start printing job" +msgstr "" + msgid "N/A" msgstr "N/A" @@ -1867,10 +1940,10 @@ msgid "Filament 1" msgstr "Filament 1" msgid "Flushed filament" -msgstr "" +msgstr "Flushed filament" msgid "Filament change times" -msgstr "" +msgstr "Filament change times" msgid "Color change" msgstr "Kleur veranderen" @@ -1975,7 +2048,7 @@ msgid "Assembly Return" msgstr "Montage terug" msgid "return" -msgstr "" +msgstr "return" msgid "Paint Toolbar" msgstr "Kleur instellingen" @@ -2005,12 +2078,10 @@ msgid "Only the object being edit is visible." msgstr "Alleen het object waaraan gewerkt wordt is zichtbaar." msgid "" -"An object is layed over the boundary of plate.\n" -"Please solve the problem by moving it totally inside or outside plate." +"An object is laid over the boundary of plate or exceeds the height limit.\n" +"Please solve the problem by moving it totally on or off the plate, and " +"confirming that the height is within the build volume." msgstr "" -"Er bevindt zich een object buiten de grenzen van de printplaat.\n" -"Los dit probleem op door het object geheel binnen of buiten de printplaat te " -"plaatsen." msgid "Calibration" msgstr "Kalibratie" @@ -2023,6 +2094,9 @@ msgid "" "minimize deviation.\n" "It keeps the device performing optimally." msgstr "" +"The calibration program detects the status of your device automatically to " +"minimize deviation.\n" +"It keeps the device performing optimally." msgid "Calibration Flow" msgstr "Flow kalibratie" @@ -2030,6 +2104,9 @@ msgstr "Flow kalibratie" msgid "Start Calibration" msgstr "Start kalibreren" +msgid "Completed" +msgstr "" + msgid "Calibrating" msgstr "Kalibreren" @@ -2037,48 +2114,20 @@ msgid "Timelapse" msgstr "Timelapse" msgid "Monitoring Recording" -msgstr "" +msgstr "Monitoring Recording" msgid "ConnectPrinter(LAN)" -msgstr "" +msgstr "ConnectPrinter(LAN)" msgid "Please input the printer access code:" -msgstr "" +msgstr "Please input the printer access code:" msgid "" "You can find it in \"Settings > Network > Connection code\"\n" "on the printer, as shown in the figure:" msgstr "" - -msgid "Creating" -msgstr "" - -msgid "Uploading" -msgstr "" - -msgid "Waiting" -msgstr "" - -msgid "Sending" -msgstr "" - -msgid "Finished" -msgstr "" - -msgid "Please fill report first." -msgstr "Gelieve eerst het rapport in te vullen." - -msgid "Unable to create zip file" -msgstr "" - -msgid "Enter a search term" -msgstr "" - -msgid "Online" -msgstr "Online" - -msgid "Offline" -msgstr "Offline" +"You can find it in \"Settings > Network > Connection code\"\n" +"on the printer, as shown in the figure:" msgid "Application is closing" msgstr "De toepassing wordt afgesloten" @@ -2096,14 +2145,11 @@ msgid "Preview" msgstr "Preview" msgid "Device" -msgstr "" +msgstr "Device" msgid "Project" msgstr "Project" -msgid "Debug" -msgstr "Debuggen" - msgid "Slice" msgstr "Slice" @@ -2221,6 +2267,12 @@ msgstr "Exporteer alle objecten als STL" msgid "Export current Sliced file" msgstr "Exporteer het huidig \"sliced\" bestand" +msgid "Export G-code" +msgstr "Exporteer G-code" + +msgid "Export current plate as G-code" +msgstr "" + msgid "Export" msgstr "Exporteren" @@ -2278,24 +2330,6 @@ msgstr "Alles deselecteren" msgid "Deselects all objects" msgstr "Alle objecten deselecteren" -msgid "Show Model Mesh(TODO)" -msgstr "Toon model mesh(TODO)" - -msgid "Display triangles of models" -msgstr "Toon de driehoeken van modellen" - -msgid "Show Model Shadow(TODO)" -msgstr "Toon schaduw van het model" - -msgid "Display shadow of objects" -msgstr "Toon de schaduw van objecten" - -msgid "Show Printable Box(TODO)" -msgstr "Toon printbare uimte(TODO)" - -msgid "Display printable box" -msgstr "Toon printbare box" - msgid "Use Perspective View" msgstr "Perspectiefweergave gebruiken" @@ -2312,44 +2346,44 @@ msgid "Help" msgstr "Help" msgid "&Open G-code" -msgstr "" +msgstr "&Open G-code" msgid "Open a G-code file" -msgstr "" +msgstr "Open a G-code file" msgid "Re&load from Disk" -msgstr "" +msgstr "Re&load from Disk" msgid "Reload the plater from disk" -msgstr "" +msgstr "Reload the plater from disk" msgid "Export &Toolpaths as OBJ" -msgstr "" +msgstr "Export &Toolpaths as OBJ" msgid "Export toolpaths as OBJ" -msgstr "" +msgstr "Export toolpaths as OBJ" msgid "Open &PrusaSlicer" -msgstr "" +msgstr "Open &PrusaSlicer" msgid "Open PrusaSlicer" -msgstr "" +msgstr "Open PrusaSlicer" msgid "&Quit" -msgstr "" +msgstr "&Quit" #, c-format, boost-format msgid "Quit %s" -msgstr "" +msgstr "Quit %s" msgid "&File" -msgstr "" +msgstr "&File" msgid "&View" -msgstr "" +msgstr "&View" msgid "&Help" -msgstr "" +msgstr "&Help" msgid "Save configuration as:" msgstr "Bewaar configuratie als:" @@ -2365,7 +2399,7 @@ msgstr "Filament instellingen" msgid "" "Do you want to synchronize your personal data from Bambu Cloud? \n" -"Contains the following information:\n" +"It contains the following information:\n" "1. The Process presets\n" "2. The Filament presets\n" "3. The Printer presets\n" @@ -2421,11 +2455,11 @@ msgstr "Opties:" msgid "Swap Y/Z axes" msgstr "Wissel Y/Z assen om" -msgid "Close" -msgstr "Sluiten" +msgid "Camera" +msgstr "" -msgid "Monitoring" -msgstr "Monitoren" +msgid "Video" +msgstr "" msgid "Printing Progress" msgstr "Print voortgang" @@ -2440,7 +2474,7 @@ msgid "0%" msgstr "0%" msgid "Control" -msgstr "" +msgstr "Control" msgid "100%" msgstr "100%" @@ -2466,6 +2500,9 @@ msgstr "Informatie over Debuggen" msgid "Printing List" msgstr "Print lijst" +msgid "Downloading..." +msgstr "" + msgid "Resume" msgstr "Hervatten" @@ -2493,15 +2530,15 @@ msgstr "Update" msgid "HMS" msgstr "HMS" -msgid "Please upgrade your printer first" -msgstr "" - msgid "Failed to connect to the server" msgstr "Verbinding maken met de server is mislukt" msgid "Failed to connect to the printer" msgstr "Verbinding maken met de printer is mislukt" +msgid "Connecting..." +msgstr "" + msgid "OK" msgstr "Offline" @@ -2577,7 +2614,7 @@ msgstr "Meer" msgid "Open Folder." msgstr "Open bestandsmap." -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "%1$d Object has custom supports." msgid_plural "%1$d Objects have custom supports." msgstr[0] "" @@ -2587,7 +2624,7 @@ msgstr[1] "" "%1$d de objecten hebben handmatig toegevoegde supports.@%1$d de objecten " "hebben handmatig toegevoegde supports." -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "%1$d Object has color painting." msgid_plural "%1$d Objects have color painting." msgstr[0] "" @@ -2621,6 +2658,9 @@ msgstr "Exporteren ok" msgid " (Repair)" msgstr " (Repareren)" +msgid " Click here to install it." +msgstr "" + msgid "WARNING:" msgstr "WAARSCHUWING:" @@ -2831,13 +2871,8 @@ msgstr "" msgid "Object with multiple parts was detected" msgstr "Er is een object met meerdere onderdelen gedetecteerd" -msgid "" -"Preview only mode:\n" -"The loaded file contains gcode only." -msgstr "" - msgid "The file does not contain any geometry data." -msgstr "" +msgstr "The file does not contain any geometry data." msgid "Export STL file:" msgstr "Exporteer STL bestand:" @@ -2873,6 +2908,15 @@ msgstr "Slicing printbed %d" msgid "Please resolve the slicing errors and publish again." msgstr "Los aub de slicing fouten op en publiceer opnieuw." +msgid "" +"Network Plug-in is not detected. Network related features are unavailable." +msgstr "" + +msgid "" +"Preview only mode:\n" +"The loaded file contains gcode only, Can not enter the Prepare page" +msgstr "" + msgid "Some presets are modified." msgstr "Sommige voorinstellingen zijn aangepast." @@ -2894,9 +2938,6 @@ msgstr "Start een nieuw project" msgid "Load project" msgstr "Project laden" -msgid "Preview only mode for gcode file." -msgstr "" - msgid "The selected file" msgstr "Het geselecteerde bestand" @@ -2922,10 +2963,10 @@ msgid "Only one G-code file can be opened at the same time." msgstr "Er kan slechts 1 G-code bestand tegelijkertijd geopend worden." msgid "Can not add models when in preview mode!" -msgstr "" +msgstr "Unable to add models in preview mode" msgid "Add Models" -msgstr "" +msgstr "Add Models" msgid "All objects will be removed, continue?" msgstr "Alle objecten zullen verwijderd worden, doorgaan?" @@ -2958,9 +2999,6 @@ msgstr "" "Het wordt geadviseerd om automatisch rangschikken te gebruiken om botsingen " "tijdens het afdrukken te voorkomen." -msgid "Export G-code" -msgstr "Exporteer G-code" - msgid "Send G-code" msgstr "Verstuur G-code" @@ -2993,7 +3031,7 @@ msgstr "Maat: %1% x %2% x %3% mm\n" #, boost-format msgid "Volume: %1% in³\n" -msgstr "" +msgstr "Volume: %1% in³\n" #, boost-format msgid "Volume: %1% mm³\n" @@ -3022,34 +3060,34 @@ msgid "Changing application language" msgstr "Taal van de applicatie wijzigen" msgid "Changing the region will log out your account.\n" -msgstr "" +msgstr "Changing the region will log you out of your account.\n" msgid "Region selection" -msgstr "" +msgstr "Region selection" msgid "Second" msgstr "Seconde" msgid "General Settings" -msgstr "" +msgstr "General Settings" msgid "Asia-Pacific" -msgstr "" +msgstr "Asia-Pacific" msgid "China" -msgstr "" +msgstr "China" msgid "Europe" -msgstr "" +msgstr "Europe" msgid "North America" -msgstr "" +msgstr "North America" msgid "Others" msgstr "Andere" msgid "Login Region" -msgstr "" +msgstr "Login Region" msgid "Metric" msgstr "Metriek" @@ -3064,10 +3102,10 @@ msgid "User sync" msgstr "Gebruikerssynchronisatie" msgid "Auto sync user presets(Printer/Filament/Process)" -msgstr "" +msgstr "Auto sync user presets(Printer/Filament/Process)" msgid "User Sync" -msgstr "" +msgstr "User Sync" msgid "Associate files to BambuStudio" msgstr "Koppel bestanden aan BambuStudio" @@ -3089,7 +3127,7 @@ msgstr "" "om .stl-bestanden te openen" msgid "Associate .step/.stp files to BambuStudio" -msgstr "" +msgstr "Associate .step/.stp files to BambuStudio" msgid "If enabled, sets BambuStudio as default application to open .step files" msgstr "" @@ -3166,7 +3204,7 @@ msgid "trace" msgstr "Traceren" msgid "Host Setting" -msgstr "" +msgstr "Host Setting" msgid "DEV host: api-dev.bambu-lab.com/v1" msgstr "DEV host: api-dev.bambu-lab.com/v1" @@ -3189,8 +3227,8 @@ msgstr "Bewaar debug instellingen" msgid "DEBUG settings have saved successfully!" msgstr "De debug instellingen zijn succesvol opgeslagen!" -msgid "Swith cloud environment, Please login again!" -msgstr "De cloud omgeving is aangepast. Log opnieuw in aub." +msgid "Switch cloud environment, Please login again!" +msgstr "" msgid "System presets" msgstr "Systeem voorinstellingen" @@ -3329,6 +3367,12 @@ msgstr "" msgid "Simply switch to \"%1%\"" msgstr "Schakel eenvoudig over naar \"%1%\"" +msgid "Online" +msgstr "Online" + +msgid "Offline" +msgstr "Offline" + msgid "My Device" msgstr "Mijn apparaat" @@ -3336,10 +3380,13 @@ msgid "Other Device" msgstr "Ander apparaat" msgid "Input access code" -msgstr "" +msgstr "Input access code" + +msgid "Log out successful." +msgstr "Uitloggen gelukt." msgid "Busy" -msgstr "" +msgstr "Busy" msgid "Bambu Cool Plate" msgstr "Bambu Cool (koude) Plate" @@ -3354,7 +3401,7 @@ msgid "Send print job to" msgstr "Stuur de printtaak naar" msgid "Refresh" -msgstr "" +msgstr "Refresh" msgid "Bed Leveling" msgstr "Bed leveling" @@ -3369,47 +3416,50 @@ msgid "send completed" msgstr "Versturen gelukt" msgid "No login account, only printers in LAN mode are displayed" -msgstr "" +msgstr "No login account, only printers in LAN mode are displayed" msgid "Connecting to server" -msgstr "" +msgstr "Connecting to server" msgid "Synchronizing device information" -msgstr "" +msgstr "Synchronizing device information" msgid "Synchronizing device information time out" -msgstr "" +msgstr "Synchronizing device information time out" msgid "Cannot send the print task when the upgrade is in progress" -msgstr "" +msgstr "Cannot send the print task when the upgrade is in progress" msgid "" "The printer is executing instructions. Please restart printing after it ends" msgstr "" +"The printer is executing instructions. Please restart printing after it ends" msgid "The printer is busy on other print job" -msgstr "" +msgstr "The printer is busy with another print job." -msgid "" -"The firmware versions of printer and AMS are too low.Please update to the " -"latest version before sending the print job" +msgid "Printer firmware does not support material = >ams slot mapping." msgstr "" msgid "" "Filaments to AMS slots mappings have been established. You can click a " "filament above to change its mapping AMS slot" msgstr "" +"Filaments to AMS slots mappings have been established. You can click a " +"filament above to change its mapping AMS slot" msgid "" "Please click each filament above to specify its mapping AMS slot before " "sending the print job" msgstr "" +"Please click each filament above to specify its mapping AMS slot before " +"sending the print job" msgid "Preparing print job" -msgstr "" +msgstr "Preparing print job" msgid "Modifying the device name" -msgstr "" +msgstr "Modifying the device name" msgid "Log in printer" msgstr "Inloggen op printer" @@ -3434,9 +3484,6 @@ msgstr "" "Er is een probleem opgetreden tijdens het verbinden met de printer. Probeer " "het opnieuw." -msgid "Log out successful." -msgstr "Uitloggen gelukt." - msgid "Failed to log out." msgstr "Uitloggen mislukt." @@ -3495,18 +3542,18 @@ msgid "Prime tower" msgstr "Prime toren" msgid "Flush options" -msgstr "" +msgstr "Flush options" msgid "Special mode" msgstr "Speciale modus" -msgid "Output file" -msgstr "Bestand weergeven" +msgid "G-code output" +msgstr "" msgid "Frequent" msgstr "Frequent" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "" "Following line %s contains reserved keywords.\n" "Please remove it, or will beat G-code visualization and printing time " @@ -3528,7 +3575,7 @@ msgid "Reserved keywords found" msgstr "Gereserveerde zoekworden gevonden" msgid "Setting Overrides" -msgstr "" +msgstr "Setting Overrides" msgid "Retraction" msgstr "Terugtrekken (retraction)" @@ -3563,6 +3610,8 @@ msgid "" "Bed temperature when cool plate is installed. Value 0 means the filament " "does not support to print on the Cool Plate" msgstr "" +"This is the bed temperature when the cool plate is installed. A value of 0 " +"means the filament does not support printing on the Cool Plate." msgid "Engineering plate" msgstr "Engineering plate (technisch printbed)" @@ -3571,6 +3620,8 @@ msgid "" "Bed temperature when engineering plate is installed. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" +"This is the bed temperature when the engineering plate is installed. A value " +"of 0 means the filament does not support printing on the Engineering Plate." msgid "High Temp Plate" msgstr "High Temp Plate (hoge temperatuur printbed)" @@ -3579,6 +3630,9 @@ msgid "" "Bed temperature when high temperature plate is installed. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" +"This is the bed temperature when the high temperature plate is installed. A " +"value of 0 means the filament does not support printing on the High Temp " +"Plate." msgid "Volumetric speed limitation" msgstr "Volumetrische snelheidsbeperking" @@ -3677,7 +3731,6 @@ msgstr "Terugtrekken (retraction) bij het wisselen van filament" msgid "Detached" msgstr "Losgemaakt" -#, fuzzy msgid "Following preset will be deleted too." msgid_plural "Following presets will be deleted too." msgstr[0] "De volgende voorinstelling zal ook verwijderd worden@" @@ -3729,7 +3782,7 @@ msgid "New Value" msgstr "Nieuwe waarde" msgid "Transfer" -msgstr "" +msgstr "Transfer" msgid "Don't save" msgstr "Niet opslaan" @@ -3823,7 +3876,7 @@ msgid "The name \"%1%\" already exists." msgstr "De naam \"%1%\" bestaat reeds." msgid "Basic Info" -msgstr "" +msgstr "Basic Info" msgid "Pictures" msgstr "Afbeeldingen" @@ -3894,7 +3947,7 @@ msgid "The configuration is up to date." msgstr "De configuratie is up to date." msgid "Auto-Calc" -msgstr "" +msgstr "Auto-Calc" msgid "Flushing volumes for filament change" msgstr "Volumes reinigen voor filament wijziging" @@ -3903,7 +3956,7 @@ msgid "Flushing volume (mm³) for each filament pair." msgstr "Spoelvolume (mm³) voor elk filamentpaar." msgid "Flush multiplier" -msgstr "" +msgstr "Flush multiplier" msgid "unloaded" msgstr "uitgeladen" @@ -4394,11 +4447,11 @@ msgstr "" #, boost-format msgid "%1% is too close to others, and collisions may be caused." -msgstr "" +msgstr "%1% is too close to others, and collisions may be caused." #, boost-format msgid "%1% is too tall, and collisions will be caused." -msgstr "" +msgstr "%1% is too tall, and collisions will be caused." msgid " is too close to others, there will be collisions when printing.\n" msgstr "" @@ -4415,10 +4468,10 @@ msgid "Prime Tower" msgstr "Prime toren" msgid " is too close to others, and collisions may be caused.\n" -msgstr "" +msgstr " is too close to others, and collisions may be caused.\n" msgid " is too close to exclusion area, and collisions will be caused.\n" -msgstr "" +msgstr " is too close to exclusion area, and collisions will be caused.\n" msgid "" "Can not print multiple filaments which have large difference of temperature " @@ -4574,6 +4627,8 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Cool Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the Cool Plate." msgid "°C" msgstr "°C" @@ -4585,11 +4640,15 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the Engineering Plate." msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the High Temp Plate." msgid "Initial layer" msgstr "Eerste laag" @@ -4601,16 +4660,22 @@ msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Cool Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the Cool Plate." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Engineering Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the Engineering Plate." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the High Temp Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the High Temp Plate." msgid "Bed types supported by the printer" msgstr "Printbedden ondersteund door de printer" @@ -4698,12 +4763,14 @@ msgstr "" "bruggen te verminderen, dit om doorzakken te voorkomen." msgid "Only one wall on top surfaces" -msgstr "" +msgstr "Only one wall on top surfaces" msgid "" "Use only one wall on flat top surface, to give more space to the top infill " "pattern" msgstr "" +"Use only one wall on flat top surface, to give more space to the top infill " +"pattern" msgid "Slow down for overhang" msgstr "Afremmen voor overhangende delen" @@ -4839,14 +4906,29 @@ msgstr "" "Bridges can usually be printed directly without support if they are not very " "long." -msgid "Max bridge length" +msgid "Thick bridges" msgstr "" +msgid "Layers and Perimeters" +msgstr "" + +msgid "" +"If enabled, bridges are more reliable, can bridge longer distances, but may " +"look worse. If disabled, bridges look better but are reliable just for " +"shorter bridged distances." +msgstr "" + +msgid "Max bridge length" +msgstr "Max bridge length" + msgid "" "Max length of bridges that don't need support. Set it to 0 if you want all " "bridges to be supported, and set it to a very large value if you don't want " "any bridges to be supported." msgstr "" +"Max length of bridges that don't need support. Set it to 0 if you want all " +"bridges to be supported, and set it to a very large value if you don't want " +"any bridges to be supported." msgid "End G-code" msgstr "Einde G-code" @@ -4875,7 +4957,7 @@ msgid "Monotonic" msgstr "Monotoon" msgid "Monotonic line" -msgstr "" +msgstr "Monotonic line" msgid "Bottom surface pattern" msgstr "Bodem oppvlakte patroon" @@ -5068,11 +5150,12 @@ msgstr "" "support interface te printen " msgid "Support material" -msgstr "" +msgstr "Support material" msgid "" "Support material is commonly used to print support and support interface" msgstr "" +"Support material is commonly used to print support and support interface" msgid "Temperature of vitrificaiton" msgstr "Temperatuur van verglazing" @@ -5146,6 +5229,8 @@ msgid "" "Acceleration of top surface infill. Using a lower value may improve top " "surface quality" msgstr "" +"Acceleration of top surface infill. Using a lower value may improve top " +"surface quality" msgid "" "Acceleration of initial layer. Using a lower value can improve build plate " @@ -5556,20 +5641,19 @@ msgid "Diameter of nozzle" msgstr "Diameter van de nozzle" msgid "Nozzle volume" -msgstr "" +msgstr "Nozzle volume" msgid "Volume of nozzle between the cutter and the end of nozzle" -msgstr "" +msgstr "Volume of nozzle between the cutter and the end of nozzle" msgid "Reduce infill retraction" msgstr "Reduceer terugtrekken (retraction) bij vulling (infill)" msgid "" "Don't retract when the travel is in infill area absolutely. That means the " -"oozing can't been seen" +"oozing can't been seen. This can reduce times of retraction for complex " +"model and save printing time, but make slicing and G-code generating slower" msgstr "" -"Dit schakelt terugtrekken (retraction) uit wanneer reizen volledig binnen " -"een opvulgebied is en het druppelen uit de nozzle niet kan worden gezien." msgid "Enable" msgstr "Inschakelen" @@ -5732,7 +5816,7 @@ msgid "The start position to print each part of outer wall" msgstr "Dit is de startpositie voor ieder deel van de buitenste wand." msgid "Nearest" -msgstr "" +msgstr "Nearest" msgid "Aligned" msgstr "Uitgelijnd" @@ -6164,7 +6248,7 @@ msgid "Width of prime tower" msgstr "Dit is de breedte van de prime toren." msgid "Flush into objects' infill" -msgstr "" +msgstr "Flush into objects' infill" msgid "" "Purging after filament change will be done inside objects' infills. This may " @@ -6172,23 +6256,31 @@ msgid "" "printed with transparent filament, the mixed color infill will be seen " "outside" msgstr "" +"Purging after filament change will be done inside objects' infills. This may " +"lower the amount of waste and decrease the print time. If the walls are " +"printed with transparent filament, the mixed color infill will be visible." msgid "Flush into objects' support" -msgstr "" +msgstr "Flush into objects' support" msgid "" "Purging after filament change will be done inside objects' support. This may " "lower the amount of waste and decrease the print time" msgstr "" +"Purging after filament change will be done inside objects' support. This may " +"lower the amount of waste and decrease the print time." msgid "Flush into this object" -msgstr "" +msgstr "Flush into this object" msgid "" "This object will be used to purge the nozzle after a filament change to save " "filament and decrease the print time. Colours of the objects will be mixed " "as a result" msgstr "" +"This object will be used to purge the nozzle after a filament change to save " +"filament and decrease the print time. Colours of the objects will be mixed " +"as a result" msgid "X-Y hole compensation" msgstr "X-Y-gaten compensatie" @@ -6261,10 +6353,10 @@ msgid "Arrange options: 0-disable, 1-enable, others-auto" msgstr "Rangschik opties: 0-uitzetten, 1-aanzetten, anders-automatisch" msgid "Convert Unit" -msgstr "" +msgstr "Convert Unit" msgid "Convert the units of model" -msgstr "" +msgstr "Convert the units of model" msgid "Orient the model" msgstr "Oriënteer het model" @@ -6360,1145 +6452,201 @@ msgstr "Fout op laag %1%:\n" #, c-format, boost-format msgid "Support: generate toolpath at layer %d" -msgstr "" +msgstr "Support: generate toolpath at layer %d" msgid "Support: detect overhangs" -msgstr "" +msgstr "Support: detect overhangs" msgid "Support: generate contact points" -msgstr "" +msgstr "Support: generate contact points" msgid "Support: propagate branches" -msgstr "" +msgstr "Support: propagate branches" msgid "Support: draw polygons" -msgstr "" +msgstr "Support: draw polygons" msgid "Support: generate toolpath" -msgstr "" +msgstr "Support: generate toolpath" #, c-format, boost-format msgid "Support: generate polygons at layer %d" -msgstr "" +msgstr "Support: generate polygons at layer %d" #, c-format, boost-format msgid "Support: fix holes at layer %d" -msgstr "" +msgstr "Support: fix holes at layer %d" #, c-format, boost-format msgid "Support: propagate branches at layer %d" -msgstr "" +msgstr "Support: propagate branches at layer %d" -#~ msgid "Fix model through cloud" -#~ msgstr "Repareer model in de cloud" +#~ msgid "Creating" +#~ msgstr "Creating" -#~ msgid "Fix model locally" -#~ msgstr "Repareer model lokaal" +#~ msgid "Uploading" +#~ msgstr "Uploading" -#~ msgid "Module" -#~ msgstr "Module" +#~ msgid "Waiting" +#~ msgstr "Waiting" -#~ msgid "Shift + Any arrow" -#~ msgstr "Shift + willekeurige pijl" +#~ msgid "Sending" +#~ msgstr "Sending" -#~ msgid "Ctrl + Any arrow" -#~ msgstr "CTRL + willekeurige pijl" +#~ msgid "Finished" +#~ msgstr "Finished" + +#~ msgid "Please fill report first." +#~ msgstr "Gelieve eerst het rapport in te vullen." + +#~ msgid "Unable to create zip file" +#~ msgstr "Unable to create zip file" + +#~ msgid "Enter a search term" +#~ msgstr "Enter a search term" + +#~ msgid "Debug" +#~ msgstr "Debuggen" + +#~ msgid "Monitoring" +#~ msgstr "Monitoren" + +#~ msgid "Fragment filter" +#~ msgstr "Fragment filter" + +#~ msgid "Fragment Filter" +#~ msgstr "Fragment Filter" + +#~ msgid "Position:" +#~ msgstr "Positie:" #~ msgid "Alt + Mouse wheel" #~ msgstr "Alt + muiswiel" -#~ msgid "Shift + Mouse wheel" -#~ msgstr "Shift + muise wiel" - -#~ msgid "Beginner's Tutorial" -#~ msgstr "Handleiding voor beginners" - -#~ msgid "Render statistics debugging box" -#~ msgstr "Foutopsporingsvenster voor renderstatistieken" - -#~ msgid "The bed is auto leveling" -#~ msgstr "Het printbed wordt automatisch afgesteld" - -#~ msgid "The hot bed is preheating" -#~ msgstr "Het printbed wordt opgewarmd" - -#~ msgid "Frequncy sweeping" -#~ msgstr "Frequentie scannen" - -#~ msgid "Change the filament" -#~ msgstr "Wijzig het filament" - -#~ msgid "Pause(M400)" -#~ msgstr "Pauze(M400)" - -#~ msgid "Pause(Lack of filament)" -#~ msgstr "Pauze (het filament is op)" - -#~ msgid "The nozzle is preheating" -#~ msgstr "De nozzle wordt opgewarmd" - -#~ msgid "Extruder compensation scanning" -#~ msgstr "De compensatie voor de extruder wordt gescand" - -#~ msgid "Bed surface scanning" -#~ msgstr "Het printbed oppervlak wordt gescand" - -#~ msgid "First layer scanning" -#~ msgstr "De eerste laag wordt gescand" - -#~ msgid "Bed surface is auto identifying" -#~ msgstr "Het type printbed wordt automatisch geidentificeerd" - -#~ msgid "In the calibration of extrinsic parameters" -#~ msgstr "Bij de kalibratie van de extrinsieke parameters" - -#~ msgid "The tool head is homing" -#~ msgstr "De printkop beweegt naar de start positie" - -#~ msgid "Nozzle cleaning" -#~ msgstr "De nozzle wordt schoongemaakt" - -#~ msgid "In the calibration of temperature protection" -#~ msgstr "De temperatuurbeveiliging wordt gecalibreerd" - -#~ msgid "Silent Mode" -#~ msgstr "Stille modus" - -#~ msgid "Show Edges(TODO)" -#~ msgstr "Toon randen (TODO)" - -#~ msgid "Show Edges" -#~ msgstr "Toon randen" - -#~ msgid "Associate .step files to BambuStudio" -#~ msgstr "Koppel .step-bestanden aan BambuStudio" - -#~ msgid "Vibration Calibration" -#~ msgstr "Trillingskalibratie" - -#~ msgid "First Layer Inspection" -#~ msgstr "Inspectie van de eerste printlaag" - -#~ msgid "Please select a printer first." -#~ msgstr "Selecteer eerst een printer." - -#~ msgid "Enable spaghetti detector" -#~ msgstr "\"Spaghetti detectie\" inschakelen" - -#~ msgid "Enable the camera on printer to check spaghetti" -#~ msgstr "Schakel de camera in om \"spaghetti detectie\" mogelijk te maken" - -#~ msgid "Preparation before calibration" -#~ msgstr "Voorbereiden op calibreren" - #~ msgid "" -#~ "Before calibration, please make sure a filament is loaded and its nozzle " -#~ "temperature and bed temperature is set in Feeding lab." +#~ "An object is layed over the boundary of plate.\n" +#~ "Please solve the problem by moving it totally inside or outside plate." #~ msgstr "" -#~ "Controleer of er filament is geladen of en op de nozzle en printbed " -#~ "temperatuur zijn ingesteld voordat u start met de calibratie." +#~ "Er bevindt zich een object buiten de grenzen van de printplaat.\n" +#~ "Los dit probleem op door het object geheel binnen of buiten de printplaat " +#~ "te plaatsen." -#~ msgid "" -#~ "Calibration program detects the status of your device systematically to " -#~ "minimise deviation. It keeps the device at its the best performance" -#~ msgstr "" -#~ "Het kalibratieprogramma detecteert systematisch de status van uw printer " -#~ "om afwijkingen te minimaliseren. Het zorgt ervoor dat de printer de beste " -#~ "prestaties levert" +#~ msgid "Ctrl + Any arrow" +#~ msgstr "CTRL + willekeurige pijl" -#~ msgid "Per Object Setting" -#~ msgstr "Per object setting" +#~ msgid "Ctrl + Left mouse button" +#~ msgstr "Ctrl + Left mouse button" -#~ msgid "Reset All" -#~ msgstr "Alles terugzetten" +#~ msgid "Display printable box" +#~ msgstr "Toon printbare box" -#~ msgid "Failed to create the print job. Please try agian." -#~ msgstr "" -#~ "Het is niet gelukt om een printtaak aan te maken. Probeer het aub opnieuw." +#~ msgid "Display shadow of objects" +#~ msgstr "Toon de schaduw van objecten" -#~ msgid "Failed to upload the print job. Please try agian." -#~ msgstr "" -#~ "Het is niet gelukt om de printtaak te verzenden. Probeer het aub opnieuw." - -#~ msgid "Uploading print job timed out. Please try again." -#~ msgstr "" -#~ "Tijdens het uploaden van de printtaak is een time-out opgetreden. Probeer " -#~ "het nogmaals!" - -#~ msgid "Failed to send the print job. Please try again." -#~ msgstr "" -#~ "Het is niet gelukt om de printtaak te verzenden. Probeer het aub opnieuw." - -#~ msgid "Sending print task timed out. Please try again." -#~ msgstr "" -#~ "Er is een time-out opgetreden bij het versturen van de printtaak. Probeer " -#~ "het opnieuw." - -#~ msgid "The printer is being updated. Please try again after the update." -#~ msgstr "De printer wordt geupdated. Probeer het opnieuw na het updaten." - -#~ msgid "Exporting 3mf..." -#~ msgstr "3mf bestand exporteren..." - -#~ msgid "Internal error." -#~ msgstr "Interne fout." - -#~ msgid "Exporting 3mf failed, please slice again." -#~ msgstr "Het exporteren van het 3MF bestand is mislukt, slice opnieuw." - -#~ msgid "No printer available" -#~ msgstr "Geen printer beschikbaar" - -#~ msgid "YES" -#~ msgstr "JA" - -#~ msgid "NO" -#~ msgstr "NO" - -#~ msgid "Login with your Account" -#~ msgstr "Inloggen met uw account" - -#~ msgid "Logout" -#~ msgstr "Uitloggen" - -#~ msgid "Publish Model/Profile" -#~ msgstr "Model/Profiel publiseren" - -#~ msgid "Please slice all plates before upload" -#~ msgstr "Slice alle printbedden voordat u het bestand upload" - -#~ msgid "Total Size:" -#~ msgstr "Totale grootte:" - -#~ msgid "Tiny patch filter" -#~ msgstr "Klein patchfilter" - -#~ msgid "Filter tiny patch" -#~ msgstr "Filter kleine patch" - -#~ msgid "Process %1% / 100" -#~ msgstr "Bezig %1% / 100" - -#~ msgid "Bambu Studio initialization failed" -#~ msgstr "Het initializeren van Bambu Studio is mislukt" - -#~ msgid "Object %s has zero size and can't be arranged." -#~ msgstr "" -#~ "Object %s heeft een grootte van nul en kan daarom niet worden " -#~ "gerangschikt." - -#~ msgid "Show daily tips" -#~ msgstr "Toon dagelijkse tips" - -#~ msgid "Choose Filaments" -#~ msgstr "Kies filamenten" - -#~ msgid "Bind Dialog" -#~ msgstr "Dialoogvenster binden" +#~ msgid "Display triangles of models" +#~ msgstr "Toon de driehoeken van modellen" #~ msgid "" #~ "Do you want to synchronize your personal data from Bambu Cloud? \n" #~ "Contains the following information:\n" #~ "1. The Process presets\n" #~ "2. The Filament presets\n" -#~ "3. The Machine presets\n" +#~ "3. The Printer presets\n" #~ msgstr "" -#~ "Wilt u uw persoonlijke gegevens synchroniseren vanuit Bambu Cloud?\n" -#~ "Deze gegeven bevatten de volgende informatie:\n" -#~ "1. De procesvoorinstellingen\n" -#~ "2. De filament-instellingen\n" -#~ "3. De machine-instellingen" - -#~ msgid "Machine Control" -#~ msgstr "Machine control" - -#~ msgid "Temperature and Axis Control" -#~ msgstr "Temperatuur en as bediening" - -#~ msgid "Model:" -#~ msgstr "Model:" - -#~ msgid "Serial:" -#~ msgstr "Serial:" - -#~ msgid "Version:" -#~ msgstr "Versie:" - -#~ msgid "Upgrade firmware" -#~ msgstr "Upgrade firmware" - -#~ msgid "Relase Note" -#~ msgstr "Relase Note" - -#~ msgid "Printing" -#~ msgstr "Printen" - -#~ msgid "Idle" -#~ msgstr "Inactief" - -#~ msgid "Lastest version" -#~ msgstr "Laatste versie" - -#~ msgid "Upgrading" -#~ msgstr "Upgraden" - -#~ msgid "Upgrading success" -#~ msgstr "Upgraden gelukt" - -#~ msgid "Upgrading failed" -#~ msgstr "Upgraden mislukt" - -#~ msgid "Need to stop slicing first." -#~ msgstr "U dient het slicen te stoppen voordat u verder gaat." - -#~ msgid "Drop Files when slicing" -#~ msgstr "Bestanden neerzetten tijdens slicing" - -#~ msgid "Importing Model" -#~ msgstr "Model importeren" - -#~ msgid "prepare 3mf file..." -#~ msgstr "3mf-bestand voorbereiden..." - -#~ msgid "Import project failed, Please try again!" -#~ msgstr "Het importeren van het project is mislukt. Probeer het aub opnieuw." - -#~ msgid "downloading project ..." -#~ msgstr "Project downloaden ..." - -#~ msgid "Project downloaded %d%%" -#~ msgstr "Project dedownload %d%%" - -#~ msgid "Failed to publish your project. Please try agian!" -#~ msgstr "" -#~ "Het is niet gelukt om het project te publiceren. Probeer het aub opnieuw!" - -#~ msgid "preparing, export 3mf failed!" -#~ msgstr "Het voorbereiden om te exporteren naar 3mf is mislukt!" - -#~ msgid "Preparing to upload your project..." -#~ msgstr "Het uploaden van uw model wordt voorbereid" - -#~ msgid "get_des,err:code=%u,msg=%s" -#~ msgstr "get_des,err:code=%u,msg=%s" - -#~ msgid "req_proj,err:code=%u,msg=%s" -#~ msgstr "req_proj,err:code=%u,msg=%s" - -#~ msgid "req_prof,err:code=%u,msg=%s" -#~ msgstr "req_prof,err:code=%u,msg=%s" - -#~ msgid "Uploading..." -#~ msgstr "Uploading..." - -#~ msgid "Uploading %d%%, remaining time %s" -#~ msgstr "Uploading %d%%, resterende tijd %s" - -#~ msgid "Upload has been canceled." -#~ msgstr "Het uploaden is geannuleerd." - -#~ msgid "Publishing..." -#~ msgstr "Publiceren..." - -#~ msgid "Failed to publish. Please try again!" -#~ msgstr "Het is niet gelukt om te publiceren. Probeer het aub opnieuw!" - -#~ msgid "Uploading is timed out. Please try again!" -#~ msgstr "" -#~ "Tijdens het uploaden is een time-out opgetreden. Probeer het nogmaals!" - -#~ msgid "Design id is empty." -#~ msgstr "Ontwerp ID is leeg." - -#~ msgid "Chinese (Simplified)" -#~ msgstr "Chinees (vereenvoudigd)" - -#~ msgid "GUI" -#~ msgstr "GUI" - -#~ msgid "Sync" -#~ msgstr "Synchroniseren" - -#~ msgid "Shortcuts" -#~ msgstr "Sneltoetsen" - -#~ msgid "General settings" -#~ msgstr "Algemene instellingen" - -#~ msgid "Record Timelapse" -#~ msgstr "Timelapse opnemen" - -#~ msgid "Current printer is busy. Please select another one." -#~ msgstr "De huidige printers is bezig. Selecteer een andere printer." - -#~ msgid "Filament Retraction" -#~ msgstr "Filament Retraction (terugtrekken)" - -#~ msgid "Bed temperature when cool plate is installed" -#~ msgstr "" -#~ "Printbed temperatuur voor wanneer de \"cool plate\" plaat is geplaatst" - -#~ msgid "Bed temperature when engineering plate is installed" -#~ msgstr "" -#~ "Printbed temperatuur voor wanneer de \"engineering plate\" plate is " -#~ "geplaatst" - -#~ msgid "Bed temperature when high temperature plate is installed" -#~ msgstr "" -#~ "Printbed temperatuur voor wanneer de \"high temperature\" plaat is " -#~ "geplaatst" - -#~ msgid "Keep" -#~ msgstr "Bewaar" - -#~ msgid "Unable to get system certificate." -#~ msgstr "Kan het systeemcertificaat niet ophalen." - -#~ msgid "use system SSL certificate: %1%" -#~ msgstr "gebruik het systeem SSL certificaat: %1%" - -#~ msgid "CURL initialization failed. See the log for additional details." -#~ msgstr "" -#~ "CURL-initialisatie is mislukt. Bekijk het logboek voor meer details." - -#~ msgid "print project cancelled." -#~ msgstr "Print project is geannuleerd." - -#~ msgid "Creating a print job..." -#~ msgstr "Maak een printtaak..." - -#~ msgid "Uploading the print job..." -#~ msgstr "Printtaak wordt geupload..." - -#~ msgid "The size of the uploaded file cannot exceed 1 GB." -#~ msgstr "Het bestand dat geupload wordt mag niet niet groter zijn dan 1 GB." - -#~ msgid " Failed to upload the print job. Check Md5 failed, please try agian." -#~ msgstr "" -#~ "Het is niet gelukt om de printtaak te verzenden. Md5 is mislukt, probeer " -#~ "het aub opnieuw." +#~ "Do you want to synchronize your personal data from Bambu Cloud? \n" +#~ "Contains the following information:\n" +#~ "1. Process presets\n" +#~ "2. Filament presets\n" +#~ "3. Printer presets\n" #~ msgid "" -#~ "\n" -#~ "upload,err:code=%u,msg=%s" +#~ "Don't retract when the travel is in infill area absolutely. That means " +#~ "the oozing can't been seen" #~ msgstr "" -#~ "\n" -#~ "upload,err:code=%u,msg=%s" +#~ "Dit schakelt terugtrekken (retraction) uit wanneer reizen volledig binnen " +#~ "een opvulgebied is en het druppelen uit de nozzle niet kan worden gezien." -#~ msgid "Wait for the job to be sent." -#~ msgstr "Wachten tot de taak verzonden is." +#~ msgid "Fix model locally" +#~ msgstr "Repareer model lokaal" -#~ msgid "The print job has been sent to your printer." -#~ msgstr "De printtaak is naar de printer verzonden." - -#~ msgid "Invalid plate index %d" -#~ msgstr "Ongeldige printbed index %d" - -#~ msgid "Plate %d" -#~ msgstr "Printbed %d" - -#~ msgid "%s" -#~ msgstr "%s" - -#~ msgid "Start printing..." -#~ msgstr "Start printen..." - -#~ msgid "%1% is too close to others, there will be collisions when printing." -#~ msgstr "" -#~ "%1% komt te dichtbij andere objecten, er zullen botsingen optreden " -#~ "tijdens het printen." +#~ msgid "Fix model through cloud" +#~ msgstr "Repareer model in de cloud" #~ msgid "" -#~ "\n" -#~ "%1% is too close to others, there will be collisions when printing." -#~ msgstr "" -#~ "\n" -#~ "%1% komt te dichtbij andere objecten, er zullen botsingen optreden " -#~ "tijdens het printen." +#~ "Heat the nozzle to target \n" +#~ "temperature" +#~ msgstr "Nozzle opwarmen tot doel temperatuur" -#~ msgid "%1% is too tall, there will be collisions when printing." -#~ msgstr "%1% is te hoog, er zullen botsingen optreden tijdens het printen." +#~ msgid "In the calibration of extrusion flow" +#~ msgstr "In the calibration of extrusion flow" + +#~ msgid "In the calibration of laser scanner" +#~ msgstr "In the calibration of laser scanner" + +#~ msgid "Module" +#~ msgstr "Module" + +#~ msgid "New version of Bambu Studio" +#~ msgstr "Nieuwe versie van Bambu Studio" + +#~ msgid "Output file" +#~ msgstr "Bestand weergeven" + +#~ msgid "Pause(heated bed temperature error)" +#~ msgstr "Pause(heated bed temperature error)" + +#~ msgid "Pause(hotend temperature error)" +#~ msgstr "Pause(hotend temperature error)" + +#~ msgid "Pause(toolhead shell off)" +#~ msgstr "Pause(toolhead shell off)" + +#~ msgid "Please upgrade your printer first" +#~ msgstr "Please upgrade your printer first" #~ msgid "" -#~ "\n" -#~ "%1% is too tall, there will be collisions when printing." +#~ "Preview only mode:\n" +#~ "The loaded file contains gcode only." #~ msgstr "" -#~ "\n" -#~ "%1% is te hoog, er zullen botsingen optreden tijdens het printen." +#~ "Preview only mode:\n" +#~ "The loaded file contains gcode only." -#~ msgid "bed temperature for layers except the initial one" -#~ msgstr "Printbed temperatuur voor alle lagen behalve de eerste laag" - -#~ msgid "Bed temperature of the initial layer" -#~ msgstr "Printbed temperatuur voor de eerste laag" - -#~ msgid "Smart" -#~ msgstr "Slim" - -#~ msgid "X/Y Axis" -#~ msgstr "X/Y axis" - -#~ msgid "Bed temperature for layers except the initial one" -#~ msgstr "Bed temperature after first layer" - -#~ msgid "Use BBL private temperature gcode instead of standard M140/M190" -#~ msgstr "Use BBL private temperature G-code instead of standard M140/M190." - -#~ msgid "Material for support" -#~ msgstr "Support material" - -#~ msgid "Filament to print support and skirt." -#~ msgstr "This is the filament for printing support and skirts." - -#~ msgid "Filament to print support interface" -#~ msgstr "This is the filament for support interfaces." - -#~ msgid "AMS Control" -#~ msgstr "AMS control" - -#~ msgid "Fan speed when printing bridge and overhang wall" -#~ msgstr "Fan speed when printing bridges and overhang walls." +#~ msgid "Preview only mode for gcode file." +#~ msgstr "Preview only mode for gcode file." #~ msgid "" -#~ "Force cooling fan speed to be overhang_fan_speed when overhang degree of " -#~ "printed part exceeds this value. Expressed as percentage which indicides " -#~ "how many width of the line without support from lower layer" +#~ "Push new filament \n" +#~ "into extruder" +#~ msgstr "Nieuw filament in de extruder laden" + +#~ msgid "Shift + Any arrow" +#~ msgstr "Shift + willekeurige pijl" + +#~ msgid "Shift + Mouse wheel" +#~ msgstr "Shift + muise wiel" + +#~ msgid "Show Model Mesh(TODO)" +#~ msgstr "Toon model mesh(TODO)" + +#~ msgid "Show Model Shadow(TODO)" +#~ msgstr "Toon schaduw van het model" + +#~ msgid "Show Printable Box(TODO)" +#~ msgstr "Toon printbare uimte(TODO)" + +#~ msgid "Successfully sent.Will automatically jump to the device page in %s s" #~ msgstr "" -#~ "Force cooling fan speed to match overhang fan speed when the overhang " -#~ "degree of printed parts exceeds this value. This is expressed as " -#~ "percentage which indicates the width of lines without support." +#~ "Successfully sent.Will automatically jump to the device page in %s s" + +#~ msgid "Swith cloud environment, Please login again!" +#~ msgstr "De cloud omgeving is aangepast. Log opnieuw in aub." #~ msgid "" -#~ "Enable auto cooling to adjust printing speed and fan speed according to " -#~ "layer printing time automatically" +#~ "The firmware versions of printer and AMS are too low.Please update to the " +#~ "latest version before sending the print job" #~ msgstr "" -#~ "Enable auto cooling to adjust printing speed and fan speed according to " -#~ "layer printing time automatically." +#~ "The firmware versions of printer and AMS are too low.Please update to the " +#~ "latest version before sending the print job" -#~ msgid "" -#~ "Close cooling fan for the first certain layers. We usually close fan for " -#~ "the initial layer to get better build plate adhesion" -#~ msgstr "" -#~ "Close cooling fan for the first certain layers. We usually close fan for " -#~ "the first layer to get better build plate adhesion" - -#~ msgid "" -#~ "Starting fan from stop state usually costs lots's of time. If enable this " -#~ "setting, fan will never be stoped and will run at least at minimum speed " -#~ "to reduce the frequency of starting and stoping" -#~ msgstr "" -#~ "Starting a fan from a fully stopped state takes a long time. If this " -#~ "setting is enabled, the fan will run at a minimum speed to reduce the " -#~ "frequency of starting and stopping." - -#~ msgid "" -#~ "Cooling fan will be enabled for layers of which estimated time is shorter " -#~ "than this value. Fan speed is interpolated between the minimum and " -#~ "maximum fan speeds according to layer printing time" -#~ msgstr "" -#~ "The cooling fan will be enabled for layers with an estimated time shorter " -#~ "than this value. Fan speed is interpolated between minimum and maximum " -#~ "fan speeds according to layer printing time." - -#~ msgid "Additional cooling fan speed" -#~ msgstr "Auxiliary cooling fan speed" - -#~ msgid "Speed of additional cooling fan" -#~ msgstr "This is the speed for the auxiliary cooling fan." - -#~ msgid "" -#~ "Speed for different overhang degree. Overhang degree is expressed as " -#~ "percentage of line width" -#~ msgstr "" -#~ "This is the speed for various overhang degrees. Overhand degrees are " -#~ "expressed as a percentage of line width." - -#~ msgid "Send Task to" -#~ msgstr "Send task to" - -#~ msgid "Extrusion width value is too low." -#~ msgstr "Extrusion width is too low." - -#~ msgid "Extrusion width value is too high." -#~ msgstr "Extrusion width is too high." - -#~ msgid "" -#~ "Line width of initial layer. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "Line width of first layer: this is relative to nozzle diameter if " -#~ "expressed as a percentage." - -#~ msgid "" -#~ "Line width of internal sparse infill. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "This determines the line width of internal sparse infill. It’s relative " -#~ "to nozzle diameter if expressed as a percentage." - -#~ msgid "" -#~ "Line width of inner wall. It's relative to nozzle diameter if expressed " -#~ "as percentage" -#~ msgstr "" -#~ "Line width of inner walls; it’s relative to nozzle diameter if expressed " -#~ "as a percentage." - -#~ msgid "" -#~ "Line width of internal solid infill. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "This is the line ridge of internal solid infill. It’s relative to nozzle " -#~ "diameter if expressed as a percentage." - -#~ msgid "" -#~ "Used to set line width for support. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "This is used to set line width for support. It’s relative to nozzle " -#~ "diameter if expressed as a percentage." - -#~ msgid "" -#~ "Used to set line width for support transition. It's relative to nozzle " -#~ "diameter if expressed as percentage" -#~ msgstr "" -#~ "This is used to set line width for support transition. It’s relative to " -#~ "nozzle diameter if expressed as a percentage." - -#~ msgid "" -#~ "Used to set line width for top surfaces. It's relative to nozzle diameter " -#~ "if expressed as percentage" -#~ msgstr "" -#~ "This is used to set line width for top surfaces. It’s relative to nozzle " -#~ "diameter if expressed as a percentage." - -#~ msgid "" -#~ "The number of solid layers of top shell, including top surface layer. " -#~ "When the thickness calculated by this value is thinner than top shell " -#~ "thickness, the top shell layers number will be increased when slicing" -#~ msgstr "" -#~ "This is the number of solid layers of top shell, including the surface " -#~ "layer. When the thickness calculated by this value is thinner than top " -#~ "shell thickness, more top shell layers will be added when slicing." - -#~ msgid "" -#~ "The number of solid layers of bottom shell, including bottom surface " -#~ "layer. When the thickness calculated by this value is thinner than bottom " -#~ "shell thickness, the bottom shell layers number will be increased when " -#~ "slicing." -#~ msgstr "" -#~ "This is the number of solid layers of bottom shell, including the bottom " -#~ "surface layer. When the thickness calculated by this value is thinner " -#~ "than bottom shell thickness, the bottom shell layers will be increased." - -#~ msgid "" -#~ "The number of bottom solid layers is increased when slicing if the " -#~ "thickness calculated by bottom_shell_layers is thinner than this value. " -#~ "This can avoid too thin shell when layer height is small" -#~ msgstr "" -#~ "The number of bottom solid layers is increased when slicing if the " -#~ "thickness calculated by bottom shell layers is thinner than this value. " -#~ "This can avoid having shells that are too thin when layer height is small." - -#~ msgid "" -#~ "The number of top solid layers is increased when slicing if the thickness " -#~ "calculated by top_shell_layers is thinner than this value. This can avoid " -#~ "too thin shell when layer height is small" -#~ msgstr "" -#~ "The number of top solid layers is increased when slicing if the thickness " -#~ "calculated by top shell layers is thinner than this value. This can avoid " -#~ "having too thin a shell when layer height is small." - -#~ msgid "Unable to connect server" -#~ msgstr "Unable to connect to server" - -#~ msgid "" -#~ "Speed of outer wall which is outermost and visible. It's used to be " -#~ "slower than inner wall speed to get better quality" -#~ msgstr "" -#~ "This is the speed for the outermost visible wall. It should be slower " -#~ "than inner wall speed for higher quality." - -#~ msgid "Remove frequency sweep gcode" -#~ msgstr "Remove frequency sweep G-code" - -#~ msgid "Enable this to skip frequency sweep when start printing" -#~ msgstr "Enable this to skip frequency sweeping when you start printing." - -#~ msgid "Remove bed leveling gcode" -#~ msgstr "Remove bed leveling G-code" - -#~ msgid "Enable this to skip bed leveling when start printing" -#~ msgstr "Enable this to skip bed leveling when you start printing." - -#~ msgid "Remove extrusion calibration gcode" -#~ msgstr "Remove extrusion calibration G-code" - -#~ msgid "Enable this to skip extrusion calibration when start printing" -#~ msgstr "" -#~ "Enable this to skip the extrusion calibration when you start printing." - -#~ msgid "" -#~ "Speed for line of wall which has degree of overhang between 0% and 25% " -#~ "line width. 0 means using original wall speed" -#~ msgstr "" -#~ "Speed for lines of walls which have a degree of overhang between 0% and " -#~ "25% line width. 0 means using original wall speed." - -#~ msgid "Bmabu Cool Plate" -#~ msgstr "Bambu cool plate" - -#~ msgid "Bmabu Engineering Plate" -#~ msgstr "Bambu engineering plate" - -#~ msgid "Bmabu High Temperature Plate" -#~ msgstr "Bambu high temperature plate" - -#~ msgid "" -#~ "Detect the overhang percentage relative to line width and use different " -#~ "speed to print. For 100% overhang, bridge speed is used" -#~ msgstr "" -#~ "This enables detecting the overhang percentage relative to line width and " -#~ "uses different speed to print. For 100% overhang, bridge speed is used." - -#~ msgid "" -#~ "This plate is locked,\n" -#~ "We can not do auto-arrange on this plate!" -#~ msgstr "" -#~ "This plate is locked.\n" -#~ "Cannot auto-arrange this plate." - -#~ msgid "" -#~ "Arrange failed! Found some exceptions when processing object Geometries" -#~ msgstr "" -#~ "Arrange failed. Exception were found when processing object geometries." - -#~ msgid "" -#~ "All the selected objects are on the locked plate,\n" -#~ "We can not do auto-orient on these objects!" -#~ msgstr "" -#~ "All the selected objects are on a locked plate.\n" -#~ "We cannot auto-orient these objects!" - -#~ msgid "" -#~ "This plate is locked,\n" -#~ "We can not do auto-orient on this plate!" -#~ msgstr "" -#~ "This plate is locked.\n" -#~ "We cannot auto-orient objects on this plate!" - -#~ msgid "Whether to synchronize cloud user data?\n" -#~ msgstr "Synchronize cloud user data?\n" - -#~ msgid "" -#~ "Holes of object will be grown or shrunk in XY plane by the configured " -#~ "value. Negative value makes holes bigger. Positive value makes holes " -#~ "smaller. This function is used to adjust size when the object has " -#~ "assembling issue" -#~ msgstr "" -#~ "Holes in the object will be grown or shrunk in the XY plane by the " -#~ "configured value. Negative values make holes bigger while positive values " -#~ "makes them smaller. This function is used to adjust size when the object " -#~ "has assembly issues." - -#~ msgid "" -#~ "Contour of object will be grown or shrunk in XY plane by the configured " -#~ "value. Positive value makes contour bigger. Negative value makes contour " -#~ "smaller. This function is used to adjust size when the object has " -#~ "assembling issue" -#~ msgstr "" -#~ "Contours of objects will be grown or shrunk in the XY plane by the set " -#~ "value. Positive values will make contours bigger while negative values " -#~ "will make them smaller. This function is used to adjust size when the " -#~ "object has assembly issues." - -#~ msgid "Hotend Fan" -#~ msgstr "Part cooling fan" - -#~ msgid "Big Fan" -#~ msgstr "Aux. cooling fan" - -#~ msgid "Switching Presets: Unsaved Changes" -#~ msgstr "Switching presets: unsaved changes" - -#~ msgid "Show daily tip on startup" -#~ msgstr "Show Daily Tip on Startup" - -#~ msgid "" -#~ "XY separation between an object and its support. It's relative to outer " -#~ "wall line width if expressed as percentage" -#~ msgstr "" -#~ "This determines the XY separation between an object and its support. It’s " -#~ "relative to outer wall line width if expressed as a percentage." - -#~ msgid "" -#~ "Failed to save gcode file\n" -#~ "Error message: %1%" -#~ msgstr "" -#~ "Failed to save G-code file\n" -#~ "Error message: %1%" - -#~ msgid "" -#~ "Speed of outer wall which is outermost and visible. It's expressed as " -#~ "percentage relative to inner wall speed. It's used to be slower than " -#~ "inner wall speed to get better quality" -#~ msgstr "" -#~ "Speed of outer wall which is outermost and visible. It's expressed as " -#~ "percentage relative to inner wall speed. It's used to be slower than " -#~ "inner wall speed to get better quality." - -#~ msgid "Filament to print support, raft and skirt" -#~ msgstr "Filament to print support, raft and skirt" - -#~ msgid "preparing your project" -#~ msgstr "Preparing your project" - -#~ msgid "uploading..." -#~ msgstr "Uploading…" - -#~ msgid "Experimental option for adding support for sharp tails" -#~ msgstr "This is an experimental option to add support for sharp tails." - -#~ msgid "Experimental option for removing support for small overhangs" -#~ msgstr "" -#~ "This is an experimental option to remove support for small overhangs." - -#~ msgid "" -#~ "Enable this option and height of every layer except initial one will be " -#~ "automatically calculated when slicing according to the slope of model " -#~ "surface" -#~ msgstr "" -#~ "Enabling this option means the height of every layer except the first " -#~ "will be automatically calculated when slicing according to the slope of " -#~ "the model’s surface" - -#~ msgid "The z gap between the bottom support interface and object" -#~ msgstr "" -#~ "This determines the z gap between the bottom support interface and the " -#~ "object." - -#~ msgid "Wall around the support" -#~ msgstr "Support Wall" - -#~ msgid "" -#~ "If enabled, bridges may look worse but can cover longer distance. If " -#~ "disabled, bridges look better but just for shorter distance." -#~ msgstr "" -#~ "If enabled, bridges may look worse but can cover longer distance. If " -#~ "disabled, bridges look better but cover shorter distances." - -#~ msgid "Tool Rotate" -#~ msgstr "Tool rotate" - -#~ msgid "Check for Configuration Updates" -#~ msgstr "Check for configuration updates" - -#~ msgid "Enter copies Number" -#~ msgstr "Enter number of copies" - -#~ msgid "" -#~ "Switching the language will trigger the application restart.\n" -#~ "Please confirm to switch?" -#~ msgstr "" -#~ "Switching languages will trigger an application restart.\n" -#~ "Please confirm to switch." - -#~ msgid "" -#~ "Speed of internal solid infill, not the top and bottom surface. It's " -#~ "relative to sparse infill speed if it's percentage" -#~ msgstr "" -#~ "This is the speed of internal solid infill, not the top and bottom " -#~ "surface. It’s relative to sparse infill speed if it is a percentage." - -#~ msgid "" -#~ "Speed of support interface. It's relative to support speed if expressed " -#~ "as percentage" -#~ msgstr "" -#~ "This is the speed of printing support interfaces. It’s relative to " -#~ "support speed if expressed as a percentage." - -#~ msgid "" -#~ "Speed for printing support transition layers in which support infill " -#~ "direction is changed.If expressed as percentage (for example 50%) it will " -#~ "be calculated over support speed." -#~ msgstr "" -#~ "This is the speed for printing support transition layers in which support " -#~ "infill direction is changed. If expressed as a percentage (for example, " -#~ "50%), it will be calculated over support speed." - -#~ msgid "" -#~ "Speed of top surface infill which is solid. It's relative to internal " -#~ "solid infill speed if it's percentage" -#~ msgstr "" -#~ "This determines the speed of the top surface infill, which is solid. It’s " -#~ "relative to internal solid infill speed if expressed as a percentage." - -#~ msgid "" -#~ "The sequential print is on.\n" -#~ "It's impossible to apply any custom G-code for objects printing " -#~ "sequentually.\n" -#~ "This code won't be processed during G-code generation." -#~ msgstr "" -#~ "The sequential print is on.\n" -#~ "It's impossible to apply any custom G-code for objects printing " -#~ "sequentially.\n" -#~ "This code won't be processed during G-code generation." - -#~ msgid "" -#~ "One or more object were assigned an extruder that the printer does not " -#~ "have." -#~ msgstr "" -#~ "One or more objects were assigned an extruder that the printer does not " -#~ "have." - -#~ msgid "Retraction Length (Toolchange)" -#~ msgstr "Retraction Length (Tool change)" - -#~ msgid "" -#~ "A boolean expression using the configuration values of an active printer " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active printer profile." -#~ msgstr "" -#~ "A Boolean expression using the configuration values of an active printer " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active printer profile." - -#~ msgid "" -#~ "A boolean expression using the configuration values of an active print " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active print profile." -#~ msgstr "" -#~ "A Boolean expression using the configuration values of an active print " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active print profile." - -#~ msgid "" -#~ "Set this to a non-zero value to allow a manual extrusion width. If left " -#~ "to zero, Slic3r derives extrusion widths from the nozzle diameter (see " -#~ "the tooltips for perimeter extrusion width, infill extrusion width etc). " -#~ "If expressed as percentage (for example: 230%), it will be computed over " -#~ "layer height." -#~ msgstr "" -#~ "Set this to a non-zero value to allow a manual extrusion width. If left " -#~ "to zero, Slic3r derives extrusion widths from the nozzle diameter (see " -#~ "the tooltips for perimeter extrusion width, infill extrusion width etc.). " -#~ "If expressed as percentage (for example: 230%), it will be computed over " -#~ "layer height." - -#~ msgid "Density of internal infill, expressed in the range 0% - 100%." -#~ msgstr "Density of internal infill, expressed in the range 0 % - 100 %." - -#~ msgid "" -#~ "If enabled, the wipe tower will not be printed on layers with no " -#~ "toolchanges. On layers with a toolchange, extruder will travel downward " -#~ "to print the wipe tower. User is responsible for ensuring there is no " -#~ "collision with the print." -#~ msgstr "" -#~ "If enabled, the wipe tower will not be printed on layers with no tool " -#~ "changes. On layers with a tool change, extruder will travel downward to " -#~ "print the wipe tower. User is responsible for ensuring there is no " -#~ "collision with the print." - -#~ msgid "" -#~ "Support material will not be generated for overhangs whose slope angle " -#~ "(90° = vertical) is above the given threshold. In other words, this value " -#~ "represent the most horizontal slope (measured from the horizontal plane) " -#~ "that you can print without support material. Set to zero for automatic " -#~ "detection (recommended)." -#~ msgstr "" -#~ "Support material will not be generated for overhangs whose slope angle " -#~ "(90° = vertical) is above the given threshold. In other words, this value " -#~ "represents the most horizontal slope (measured from the horizontal plane) " -#~ "that you can print without support material. Set to zero for automatic " -#~ "detection (recommended)." - -#~ msgid "" -#~ "This matrix describes volumes (in cubic milimetres) required to purge the " -#~ "new filament on the wipe tower for any given pair of tools." -#~ msgstr "" -#~ "This matrix describes volumes (in cubic millimetres) required to purge " -#~ "the new filament on the wipe tower for any given pair of tools." - -#~ msgid "" -#~ "Object will be used to purge the nozzle after a toolchange to save " -#~ "material that would otherwise end up in the wipe tower and decrease print " -#~ "time. Colours of the objects will be mixed as a result." -#~ msgstr "" -#~ "Object will be used to purge the nozzle after a tool change to save " -#~ "material that would otherwise end up in the wipe tower and decrease print " -#~ "time. Colours of the objects will be mixed as a result." - -#~ msgid "WHITE BULLET icon indicates a non system (or non default) preset." -#~ msgstr "WHITE BULLET icon indicates a non-system (or non-default) preset." - -#~ msgid "" -#~ "Some objects can get along with a few smaller pads instead of a single " -#~ "big one. This parameter defines how far the center of two smaller pads " -#~ "should be. If theyare closer, they will get merged into one pad." -#~ msgstr "" -#~ "Some objects can get along with a few smaller pads instead of a single " -#~ "big one. This parameter defines how far the center of two smaller pads " -#~ "should be. If they are closer, they will get merged into one pad." - -#~ msgid "Don't notify about new releases any more" -#~ msgstr "Don't notify about new releases anymore" - -#~ msgid "Buttons And Text Colors Description" -#~ msgstr "Buttons and Text Colors Description" - -#~ msgid "Before roll back" -#~ msgstr "Before rollback" - -#~ msgid "" -#~ "If enabled, %s checks for new application versions 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 "" -#~ "If enabled, %s checks for new application versions 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 mechanism, no automatic installation is done." - -#~ msgid "" -#~ "If enabled, %s downloads updates of built-in system presets in the " -#~ "background.These updates are downloaded into a separate temporary " -#~ "location.When a new preset version becomes available it is offered at " -#~ "application startup." -#~ msgstr "" -#~ "If enabled, %s downloads updates of built-in system presets in the " -#~ "background. These updates are downloaded into a separate temporary " -#~ "location. When a new preset version becomes available it is offered at " -#~ "application startup." - -#~ msgid "" -#~ "Additionally a backup snapshot of the whole configuration is created " -#~ "before an update is applied." -#~ msgstr "" -#~ "Additionally, a backup snapshot of the whole configuration is created " -#~ "before an update is applied." - -#~ msgid "Autospeed (advanced)" -#~ msgstr "Auto Speed (advanced)" - -#~ msgid "Toolchange parameters with single extruder MM printers" -#~ msgstr "Toolchange parameters with single extruder MM printers" - -#~ msgid "" -#~ "When printing multi-material objects, this settings will make Slic3r to " -#~ "clip the overlapping object parts one by the other (2nd part will be " -#~ "clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -#~ msgstr "" -#~ "When printing multi-material objects, this settings will make Slic3r to " -#~ "clip the overlapping object parts one by the other (2nd part will be " -#~ "clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc.)." - -#~ msgid "" -#~ "Add solid infill near sloping surfaces to guarantee the vertical shell " -#~ "thickness (top+bottom solid layers)." -#~ msgstr "" -#~ "Add solid infill near sloping surfaces to guarantee the vertical shell " -#~ "thickness (top + bottom solid layers)." - -#~ msgid "" -#~ "Speed used for unloading the filament on the wipe tower (does not affect " -#~ "initial part of unloading just after ramming)." -#~ msgstr "" -#~ "Speed used for unloading the filament on the wipe tower (does not affect " -#~ "initial part of unloading just after ramming)." - -#~ msgid "" -#~ "Time to wait after the filament is unloaded. May help to get reliable " -#~ "toolchanges with flexible materials that may need more time to shrink to " -#~ "original dimensions." -#~ msgstr "" -#~ "Time to wait after the filament is unloaded. May help to get reliable " -#~ "tool changes with flexible materials that may need more time to shrink to " -#~ "original dimensions." - -#~ msgid "" -#~ "When set to zero, the distance the filament is moved from parking " -#~ "position during load is exactly the same as it was moved back during " -#~ "unload. When positive, it is loaded further, if negative, the loading " -#~ "move is shorter than unloading." -#~ msgstr "" -#~ "When set to zero, the distance the filament is moved from parking " -#~ "position during load is exactly the same as it was moved back during " -#~ "unload. When positive, it is loaded further, if negative, the loading " -#~ "move is shorter than unloading." - -#~ msgid "Autogeneration will erase all manually edited points." -#~ msgstr "Auto Generation will erase all manually edited points." - -#~ msgid "Unknown error occured" -#~ msgstr "Unknown error occurred" - -#~ msgid "" -#~ "This end procedure is inserted at the end of the output file, before the " -#~ "printer end gcode (and before any toolchange from this filament in case " -#~ "of multimaterial printers). Note that you can use placeholder variables " -#~ "for all PrusaSlicer settings. If you have multiple extruders, the gcode " -#~ "is processed in extruder order." -#~ msgstr "" -#~ "This end procedure is inserted at the end of the output file, before the " -#~ "printer end gcode (and before any tool change from this filament in case " -#~ "of multimaterial printers). Note that you can use placeholder variables " -#~ "for all PrusaSlicer settings. If you have multiple extruders, the gcode " -#~ "is processed in extruder order." - -#~ msgid "" -#~ "This start procedure is inserted at the beginning, after any printer " -#~ "start gcode (and after any toolchange to this filament in case of multi-" -#~ "material printers). This is used to override settings for a specific " -#~ "filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom " -#~ "codes, such commands will not be prepended automatically so you're free " -#~ "to customize the order of heating commands and other custom actions. Note " -#~ "that you can use placeholder variables for all PrusaSlicer settings, so " -#~ "you can put a \"M109 S[first_layer_temperature]\" command wherever you " -#~ "want. If you have multiple extruders, the gcode is processed in extruder " -#~ "order." -#~ msgstr "" -#~ "This start procedure is inserted at the beginning, after any printer " -#~ "start gcode (and after any tool change to this filament in case of multi-" -#~ "material printers). This is used to override settings for a specific " -#~ "filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom " -#~ "codes, such commands will not be prepended automatically so you're free " -#~ "to customize the order of heating commands and other custom actions. Note " -#~ "that you can use placeholder variables for all PrusaSlicer settings, so " -#~ "you can put a \"M109 S[first_layer_temperature]\" command wherever you " -#~ "want. If you have multiple extruders, the gcode is processed in extruder " -#~ "order." - -#~ 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 "" -#~ "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 mechanism, no automatic installation is done." - -#~ msgid "" -#~ "Purging after toolchange will done inside this object's infills. This " -#~ "lowers the amount of waste but may result in longer print time due to " -#~ "additional travel moves." -#~ msgstr "" -#~ "Purging after tool change will done inside this object's infills. This " -#~ "lowers the amount of waste but may result in longer print time due to " -#~ "additional travel moves." - -#~ msgid "" -#~ "This custom code is inserted before every toolchange. Placeholder " -#~ "variables for all PrusaSlicer settings as well as {previous_extruder} and " -#~ "{next_extruder} can be used. When a tool-changing command which changes " -#~ "to the correct extruder is included (such as T{next_extruder}), " -#~ "PrusaSlicer will emit no other such command. It is therefore possible to " -#~ "script custom behaviour both before and after the toolchange." -#~ msgstr "" -#~ "This custom code is inserted before every tool change. Placeholder " -#~ "variables for all PrusaSlicer settings as well as {previous_extruder} and " -#~ "{next_extruder} can be used. When a tool-changing command which changes " -#~ "to the correct extruder is included (such as T{next_extruder}), " -#~ "PrusaSlicer will emit no other such command. It is therefore possible to " -#~ "script custom behaviour both before and after the tool change." +#~ msgid "User pause" +#~ msgstr "User pause" diff --git a/bbl/i18n/sv/BambuStudio_sv.po b/bbl/i18n/sv/BambuStudio_sv.po index 0870d7d28e..5f64727728 100644 --- a/bbl/i18n/sv/BambuStudio_sv.po +++ b/bbl/i18n/sv/BambuStudio_sv.po @@ -1,13 +1,17 @@ msgid "" msgstr "" +"Project-Id-Version: Bambu Studio\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-15 10:25+0800\n" +"POT-Creation-Date: 2022-07-22 18:39+0800\n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Language: sv\n" -"X-Source-Language: C\n" +"Plural-Forms: nplurals=2; plural=(n==1) ? 0 : 1;\n" +"X-Generator: Poedit 3.1\n" msgid "Supports Painting" msgstr "Färgläggning av Support" @@ -42,14 +46,14 @@ msgstr "Radera all färgläggning" msgid "Highlight overhang areas" msgstr "Markera områden med överhäng" -msgid "Fragment filter" +msgid "Gap fill" msgstr "" msgid "Perform" -msgstr "" +msgstr "Perform" msgid "Fragment area" -msgstr "" +msgstr "Fragment area" msgid "Set pen size" msgstr "Välj penn storlek" @@ -73,9 +77,9 @@ msgid "Sphere" msgstr "Sfär" msgid "Fill" -msgstr "" +msgstr "Fill" -msgid "Fragment Filter" +msgid "Gap Fill" msgstr "" msgid "Highlight faces according to overhang angle." @@ -145,10 +149,10 @@ msgid "Shortcut Key " msgstr "Snabbkommando " msgid "Triangle" -msgstr "" +msgstr "Triangle" msgid "Height Range" -msgstr "" +msgstr "Height Range" msgid "Remove painted color" msgstr "Ta bort färgläggning" @@ -226,15 +230,12 @@ msgstr "Världskoordinater" msgid "°" msgstr "°" -msgid "Position:" -msgstr "Position:" +msgid "Size" +msgstr "Storlek" msgid "%" msgstr "%" -msgid "Size" -msgstr "Storlek" - msgid "uniform scale" msgstr "enhetlig skala" @@ -322,7 +323,7 @@ msgstr "Visa trådram" #, boost-format msgid "%1%" -msgstr "" +msgstr "%1%" msgid "Can't apply when proccess preview." msgstr "Kan inte tillämpas när processen förhandsgranskas." @@ -334,10 +335,10 @@ msgid "Operation already cancelling. Please wait few seconds." msgstr "Åtgärden avbryts redan. Vänligen vänta." msgid "Face recognition" -msgstr "" +msgstr "Face recognition" msgid "Perform Recognition" -msgstr "" +msgstr "Perform Recognition" msgid "Cube" msgstr "Kub" @@ -349,7 +350,7 @@ msgid "Cone" msgstr "Kon" msgid "Timelapse Wipe Tower" -msgstr "" +msgstr "Timelapse Wipe Tower" msgid "Add Modifier" msgstr "Lägg till Modifierare" @@ -421,6 +422,13 @@ msgstr "Kritiskt fel" msgid "BambuStudio got an unhandled exception: %1%" msgstr "Bambu Studio har ett ohanterat undantag: %1%" +msgid "Downloading Bambu Network plug-in" +msgstr "" + +#, c-format, boost-format +msgid "Connect %s[SN:%s] failed!" +msgstr "" + msgid "" "BambuStudio configuration file may be corrupted and is not abled to be " "parsed.Please delete the file and try again." @@ -446,12 +454,15 @@ msgstr "Konfigurationen laddas" msgid "Click to download new version in default browser: %s" msgstr "Tryck på ladda ner ny version ifrån standard webbläsaren: %s" -msgid "New version of Bambu Studio" -msgstr "Ny version av Bambu Studio" - msgid "The Bambu Studio needs an upgrade" msgstr "Bambu Studio behöver uppdateras" +msgid "This is the newest version." +msgstr "Det är den senaste versionen." + +msgid "Info" +msgstr "Info" + msgid "Loading user presets..." msgstr "Laddar användar inställningarna..." @@ -473,25 +484,21 @@ msgstr "Välj en eller flera filer (3mf/step/stl/obj/amf):" msgid "Choose one file (gcode/.gco/.g/.ngc/ngc):" msgstr "Välj en fil (.gcode/.gco/.g/.ngc/ngc):" -msgid "Login information expired. Please login again." -msgstr "Inloggningsinformationen har löpt ut. Logga in igen." - msgid "" "The version of Bambu studio is too low and needs to be updated to the latest " "version before it can be used normally" msgstr "" +"The version of Bambu studio is too low and needs to be updated to the latest " +"version before it can be used normally" -msgid "This is the newest version." -msgstr "Det är den senaste versionen." - -msgid "Info" -msgstr "Info" +msgid "Login information expired. Please login again." +msgstr "Inloggningsinformationen har löpt ut. Logga in igen." msgid "Loading" msgstr "Laddar" msgid "Loading user preset" -msgstr "" +msgstr "Loading user preset" msgid "Switching application language" msgstr "Byt applikationsspråk" @@ -515,11 +522,11 @@ msgid "Select a G-code file:" msgstr "Välj en G-kod fil:" msgid "Bambu Studio GUI initialization failed" -msgstr "" +msgstr "Bambu Studio GUI initialization failed" #, boost-format msgid "Fatal error, exception catched: %1%" -msgstr "" +msgstr "Fatal error, exception catched: %1%" msgid "Quality" msgstr "Kvalitet" @@ -795,13 +802,13 @@ msgstr "Lås" msgid "Name" msgstr "Namn" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "%1$d error repaired" msgid_plural "%1$d errors repaired" msgstr[0] "%1$d fel åtgärdat@%1$d felen åtgärdade" msgstr[1] "%1$d fel åtgärdat@%1$d felen åtgärdade" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "Error: %1$d non-manifold edge." msgid_plural "Error: %1$d non-manifold edges." msgstr[0] "Fel: %1$d inte mångfaldig kant.@Fel: %1$d inte mångfaldiga kanter." @@ -810,7 +817,7 @@ msgstr[1] "Fel: %1$d inte mångfaldig kant.@Fel: %1$d inte mångfaldiga kanter." msgid "Remaining errors" msgstr "Kvarstående fel" -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "%1$d non-manifold edge" msgid_plural "%1$d non-manifold edges" msgstr[0] "%1$d inte mångfaldig kant@%1$d inte mångfaldiga kanter" @@ -910,7 +917,6 @@ msgstr "Byter namn" msgid "Repairing model object" msgstr "Reparerar modell objektet" -#, fuzzy msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "" @@ -918,7 +924,6 @@ msgstr[0] "" msgstr[1] "" "Följande modellobjekt har reparerats@Följande modellobjekt har reparerats" -#, fuzzy msgid "Failed to repair folowing model object" msgid_plural "Failed to repair folowing model objects" msgstr[0] "" @@ -995,12 +1000,8 @@ msgstr "Linje typ" msgid "No printer" msgstr "Ingen skrivare" -msgid "" -"Heat the nozzle to target \n" -"temperature" +msgid "Heat the nozzle to target temperature" msgstr "" -"Värm nozzel till vald \n" -"temperatur" msgid "Cut filament" msgstr "Skär filament" @@ -1008,15 +1009,11 @@ msgstr "Skär filament" msgid "Pull back current filament" msgstr "Reversera nuvarande filament" -msgid "" -"Push new filament \n" -"into extruder" +msgid "Push new filament into extruder" msgstr "" -"Mata nytt filament\n" -"till extrudern" msgid "Purge old filament" -msgstr "" +msgstr "Purge old filament" msgid "?" msgstr "?" @@ -1028,10 +1025,10 @@ msgid "Click the pencil icon to edit the filament." msgstr "Tryck på penn ikonen för att editera filament." msgid "Load Filament" -msgstr "Ladda Filament" +msgstr "Load" msgid "Unload Filament" -msgstr "" +msgstr "Unload" msgid "Tips" msgstr "Tips" @@ -1087,9 +1084,6 @@ msgstr "" "Placering misslyckades. Avvikelser hittades när objektets geometri " "bearbetades." -msgid "Arranging" -msgstr "" - msgid "Arranging canceled." msgstr "Placering avbruten." @@ -1138,160 +1132,232 @@ msgid "Exception" msgstr "Undantag" msgid "Logging in" -msgstr "" +msgstr "Logging in" msgid "Login failed" -msgstr "" +msgstr "Login failed" msgid "The region parameter is incorrrect" -msgstr "" +msgstr "The region parameter is incorrrect." msgid "Failure of printer login" -msgstr "" +msgstr "Failure of printer login" msgid "Failed to get ticket" -msgstr "" +msgstr "Failed to get ticket" msgid "User authorization timeout" -msgstr "" +msgstr "User authorization timeout" msgid "Failure of bind" -msgstr "" +msgstr "Failure of bind" msgid "Unknown Failure" -msgstr "" +msgstr "Unknown Failure" msgid "Abnormal print file data. Please slice again" -msgstr "" +msgstr "Abnormal print file data. Please slice again" msgid "Task canceled" -msgstr "" +msgstr "Task canceled" msgid "Upload task timed out. Please check the network problem and try again" -msgstr "" +msgstr "Upload task timed out. Please check the network problem and try again" msgid "Cloud service connection failed. Please try again." -msgstr "" +msgstr "Cloud service connection failed. Please try again." msgid "Print file not found, please slice again" -msgstr "" +msgstr "Print file not found, please slice again" msgid "" "The print file exceeds the maximum allowable size (1GB). Please simplify the " "model and slice again" msgstr "" +"The print file exceeds the maximum allowable size (1GB). Please simplify the " +"model and slice again" msgid "Failed uploading print file" -msgstr "" +msgstr "Failed uploading print file" msgid "Wrong Access code" -msgstr "" +msgstr "Wrong Access code" msgid "Sending print job over LAN" -msgstr "" +msgstr "Sending print job over LAN" msgid "Sending print job through cloud service" +msgstr "Sending print job through cloud service" + +msgid "Service Unavailable" +msgstr "" + +msgid "Unkown Error." msgstr "" msgid "Sending print configuration" -msgstr "" +msgstr "Sending print configuration" #, c-format, boost-format -msgid "Successfully sent.Will automatically jump to the device page in %s s" +msgid "Successfully sent. Will automatically jump to the device page in %s s" +msgstr "" + +msgid "An SD card needs to be inserted before printing via LAN." +msgstr "" + +msgid "Downloading" +msgstr "" + +msgid "Download failed" +msgstr "" + +msgid "Cancelled" +msgstr "" + +msgid "Finish" +msgstr "" + +msgid "Installing" +msgstr "" + +msgid "Install failed" msgstr "" msgid "Portions copyright" -msgstr "" +msgstr "License Info" msgid "Copyright" -msgstr "" +msgstr "Copyright" msgid "License" msgstr "License" msgid "Bambu Studio is licensed under " -msgstr "" +msgstr "Bambu Studio is licensed under " msgid "GNU Affero General Public License, version 3" -msgstr "" +msgstr "GNU Affero General Public License, version 3" msgid "" "Bambu Studio is based on PrusaSlicer by Prusa Research, which is from Slic3r " "by Alessandro Ranellucci and the RepRap community" msgstr "" +"Bambu Studio is based on PrusaSlicer by Prusa Research, which is from Slic3r " +"by Alessandro Ranellucci and the RepRap community" msgid "Libraries" -msgstr "" +msgstr "Libraries" msgid "" "This software uses open source components whose copyright and other " "proprietary rights belong to their respective owners" msgstr "" +"This software uses open source components whose copyright and other " +"proprietary rights belong to their respective owners" #, c-format, boost-format msgid "About %s" +msgstr "About %s" + +msgid "" +"Bambu Studio is based on PrusaSlicer by PrusaResearch and SuperSlicer by " +"Merill(supermerill)." +msgstr "" + +msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." +msgstr "" + +msgid "" +"Slic3r was created by Alessandro Ranellucci with the help of many other " +"contributors." +msgstr "" + +msgid "Bambu Studio also referenced some ideas from Cura by Ultimaker." +msgstr "" + +msgid "" +"There many parts of the software that come from community contributions, so " +"we're unable to list them one-by-one, and instead, they'll be attributed in " +"the corresponding code comments." msgstr "" msgid "Colour" -msgstr "" +msgstr "Colour" msgid "SN" -msgstr "" +msgstr "SN" msgid "" "Nozzle\n" "Temperature" msgstr "" +"Nozzle\n" +"Temperature" msgid "max" -msgstr "" +msgstr "max" msgid "min" -msgstr "" +msgstr "min" #, boost-format msgid "The input value should be greater than %1% and less than %2%" -msgstr "" +msgstr "The input value should be greater than %1% and less than %2%" msgid "Confirm" msgstr "Acceptera" msgid "Insertion update" -msgstr "" +msgstr "Insertion update" msgid "" "The AMS will automatically read the filament information when inserting a " "new Bambu Lab filament. This takes about 20 seconds." msgstr "" +"The AMS will automatically read the filament information when inserting a " +"new Bambu Lab filament. This takes about 20 seconds." msgid "" "Note: if new filament is inserted during printing, the AMS will not " "automatically read any information until printing is completed." msgstr "" +"Note: if new filament is inserted during printing, the AMS will not " +"automatically read any information until printing is completed." msgid "" "When inserting a new filament, the AMS will not automatically read its " "information, leaving it blank for you to enter manually." msgstr "" +"When inserting a new filament, the AMS will not automatically read its " +"information, leaving it blank for you to enter manually." msgid "Power on update" -msgstr "" +msgstr "Power on update" msgid "" "The AMS will automatically read the information of inserted filament on " "start-up. It will take about 1 minute.The reading process will roll filament " "spools." msgstr "" +"The AMS will automatically read the information of inserted filament on " +"start-up. It will take about 1 minute.The reading process will roll filament " +"spools." msgid "" "The AMS will not automatically read information from inserted filament " "during startup and will continue to use the information recorded before the " "last shutdown." msgstr "" +"The AMS will not automatically read information from inserted filament " +"during startup and will continue to use the information recorded before the " +"last shutdown." msgid "File" msgstr "Fil" +msgid "Close" +msgstr "Stäng" + msgid "" "A error occurred. Maybe memory of system is not enough or it's a bug of the " "program" @@ -1588,67 +1654,67 @@ msgstr "" "NEJ - Återställ densiteten till standard inte 100% värdet automatiskt\n" msgid "Auto bed leveling" -msgstr "" +msgstr "Auto bed leveling" msgid "Heatbed preheating" -msgstr "" +msgstr "Heatbed preheating" msgid "Sweeping XY mech mode" -msgstr "" +msgstr "Sweeping XY mech mode" msgid "Changing filament" -msgstr "" +msgstr "Changing filament" msgid "M400 pause" -msgstr "" +msgstr "M400 pause" msgid "Paused due to filament runout" -msgstr "" +msgstr "Paused due to filament runout" msgid "Heating hotend" -msgstr "" +msgstr "Heating hotend" msgid "Calibrating extrusion" -msgstr "" +msgstr "Calibrating extrusion" msgid "Scanning bed surface" -msgstr "" +msgstr "Scanning bed surface" msgid "Inspecting first layer" -msgstr "" +msgstr "Inspecting first layer" msgid "Identifying build plate type" -msgstr "" +msgstr "Identifying build plate type" msgid "Calibrating Micro Lidar" -msgstr "" +msgstr "Calibrating Micro Lidar" msgid "Homing toolhead" -msgstr "" +msgstr "Homing toolhead" msgid "Cleaning nozzle tip" -msgstr "" +msgstr "Cleaning nozzle tip" msgid "Checking extruder temperature" -msgstr "" +msgstr "Checking extruder temperature" msgid "Printing was paused by the user" -msgstr "" +msgstr "Printing was paused by the user" msgid "Pause of front cover falling" -msgstr "" +msgstr "Pause of front cover falling" msgid "Calibrating the micro lida" -msgstr "" +msgstr "Calibrating the micro lidar" msgid "Calibrating extrusion flow" -msgstr "" +msgstr "Calibrating extrusion flow" msgid "Paused due to nozzle temperature malfunction" -msgstr "" +msgstr "Paused due to nozzle temperature malfunction" msgid "Paused due to heat bed temperature malfunction" -msgstr "" +msgstr "Paused due to heat bed temperature malfunction" msgid "MC" msgstr "MC" @@ -1689,6 +1755,9 @@ msgstr "Verifikation misslyckade." msgid "Update failed." msgstr "Uppdatering misslyckades." +msgid "Failed to start printing job" +msgstr "" + msgid "N/A" msgstr "N/A" @@ -1841,10 +1910,10 @@ msgid "Filament 1" msgstr "Filament 1" msgid "Flushed filament" -msgstr "" +msgstr "Flushed filament" msgid "Filament change times" -msgstr "" +msgstr "Filament change times" msgid "Color change" msgstr "Färg byte" @@ -1949,7 +2018,7 @@ msgid "Assembly Return" msgstr "Monterings retur" msgid "return" -msgstr "" +msgstr "return" msgid "Paint Toolbar" msgstr "Färgläggningsverktyg" @@ -1979,11 +2048,10 @@ msgid "Only the object being edit is visible." msgstr "Bara objektet som editeras är synligt." msgid "" -"An object is layed over the boundary of plate.\n" -"Please solve the problem by moving it totally inside or outside plate." +"An object is laid over the boundary of plate or exceeds the height limit.\n" +"Please solve the problem by moving it totally on or off the plate, and " +"confirming that the height is within the build volume." msgstr "" -"Ett objekt är placerad över byggplattans begränsningar.\n" -"Flytta objektet så det är helt inom eller utom byggplattans begränsningar." msgid "Calibration" msgstr "Kalibrering" @@ -1996,6 +2064,9 @@ msgid "" "minimize deviation.\n" "It keeps the device performing optimally." msgstr "" +"The calibration program detects the status of your device automatically to " +"minimize deviation.\n" +"It keeps the device performing optimally." msgid "Calibration Flow" msgstr "Kalibrerings Flöde" @@ -2003,6 +2074,9 @@ msgstr "Kalibrerings Flöde" msgid "Start Calibration" msgstr "Starta Kalibrering" +msgid "Completed" +msgstr "" + msgid "Calibrating" msgstr "Kalibrerar" @@ -2010,48 +2084,20 @@ msgid "Timelapse" msgstr "Timelapse" msgid "Monitoring Recording" -msgstr "" +msgstr "Monitoring Recording" msgid "ConnectPrinter(LAN)" -msgstr "" +msgstr "ConnectPrinter(LAN)" msgid "Please input the printer access code:" -msgstr "" +msgstr "Please input the printer access code:" msgid "" "You can find it in \"Settings > Network > Connection code\"\n" "on the printer, as shown in the figure:" msgstr "" - -msgid "Creating" -msgstr "" - -msgid "Uploading" -msgstr "" - -msgid "Waiting" -msgstr "" - -msgid "Sending" -msgstr "" - -msgid "Finished" -msgstr "" - -msgid "Please fill report first." -msgstr "Fyll i rapporten först." - -msgid "Unable to create zip file" -msgstr "" - -msgid "Enter a search term" -msgstr "" - -msgid "Online" -msgstr "Online" - -msgid "Offline" -msgstr "Offline" +"You can find it in \"Settings > Network > Connection code\"\n" +"on the printer, as shown in the figure:" msgid "Application is closing" msgstr "Begäran avslutas" @@ -2069,14 +2115,11 @@ msgid "Preview" msgstr "Förvisning" msgid "Device" -msgstr "" +msgstr "Device" msgid "Project" msgstr "Projekt" -msgid "Debug" -msgstr "Felsök" - msgid "Slice" msgstr "Bered" @@ -2194,6 +2237,12 @@ msgstr "Exportera Alla Objekt som STL" msgid "Export current Sliced file" msgstr "Exportera nuvarande Beredda fil" +msgid "Export G-code" +msgstr "Exportera G-kod" + +msgid "Export current plate as G-code" +msgstr "" + msgid "Export" msgstr "Exportera" @@ -2251,24 +2300,6 @@ msgstr "Avmarkera allt" msgid "Deselects all objects" msgstr "Avmarkera alla objekt" -msgid "Show Model Mesh(TODO)" -msgstr "Visa Modell Mesh(TODO)" - -msgid "Display triangles of models" -msgstr "Visa trianglar från modellerna" - -msgid "Show Model Shadow(TODO)" -msgstr "Visa Modell Skuggor(TODO)" - -msgid "Display shadow of objects" -msgstr "Visa skuggor från objektet" - -msgid "Show Printable Box(TODO)" -msgstr "Visa Utskriftbar Box(TODO)" - -msgid "Display printable box" -msgstr "Visa utskriftbar box" - msgid "Use Perspective View" msgstr "Använd Perspektiv Vy" @@ -2285,44 +2316,44 @@ msgid "Help" msgstr "Hjälp" msgid "&Open G-code" -msgstr "" +msgstr "&Open G-code" msgid "Open a G-code file" -msgstr "" +msgstr "Open a G-code file" msgid "Re&load from Disk" -msgstr "" +msgstr "Re&load from Disk" msgid "Reload the plater from disk" -msgstr "" +msgstr "Reload the plater from disk" msgid "Export &Toolpaths as OBJ" -msgstr "" +msgstr "Export &Toolpaths as OBJ" msgid "Export toolpaths as OBJ" -msgstr "" +msgstr "Export toolpaths as OBJ" msgid "Open &PrusaSlicer" -msgstr "" +msgstr "Open &PrusaSlicer" msgid "Open PrusaSlicer" -msgstr "" +msgstr "Open PrusaSlicer" msgid "&Quit" -msgstr "" +msgstr "&Quit" #, c-format, boost-format msgid "Quit %s" -msgstr "" +msgstr "Quit %s" msgid "&File" -msgstr "" +msgstr "&File" msgid "&View" -msgstr "" +msgstr "&View" msgid "&Help" -msgstr "" +msgstr "&Help" msgid "Save configuration as:" msgstr "Spara konfigurationen som:" @@ -2338,7 +2369,7 @@ msgstr "Filament Inställningar" msgid "" "Do you want to synchronize your personal data from Bambu Cloud? \n" -"Contains the following information:\n" +"It contains the following information:\n" "1. The Process presets\n" "2. The Filament presets\n" "3. The Printer presets\n" @@ -2394,11 +2425,11 @@ msgstr "Val:" msgid "Swap Y/Z axes" msgstr "Byta Y/Z axes" -msgid "Close" -msgstr "Stäng" +msgid "Camera" +msgstr "" -msgid "Monitoring" -msgstr "Övervakar" +msgid "Video" +msgstr "" msgid "Printing Progress" msgstr "Utskriftsförlopp" @@ -2413,7 +2444,7 @@ msgid "0%" msgstr "0%" msgid "Control" -msgstr "" +msgstr "Control" msgid "100%" msgstr "100%" @@ -2439,6 +2470,9 @@ msgstr "Felsöknings Information" msgid "Printing List" msgstr "Utskrifts Lista" +msgid "Downloading..." +msgstr "" + msgid "Resume" msgstr "Återuppta" @@ -2466,15 +2500,15 @@ msgstr "Uppdatera" msgid "HMS" msgstr "HMS" -msgid "Please upgrade your printer first" -msgstr "" - msgid "Failed to connect to the server" msgstr "Uppkoppling till servern misslyckades" msgid "Failed to connect to the printer" msgstr "Uppkoppling till printern misslyckades" +msgid "Connecting..." +msgstr "" + msgid "OK" msgstr "OK" @@ -2550,13 +2584,13 @@ msgstr "Mer" msgid "Open Folder." msgstr "Öppna Mapp." -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "%1$d Object has custom supports." msgid_plural "%1$d Objects have custom supports." msgstr[0] "%1$d Objektet har custom support.@%1$d Objekten har custom support." msgstr[1] "%1$d Objektet har custom support.@%1$d Objekten har custom support." -#, fuzzy, c-format, boost-format +#, c-format, boost-format msgid "%1$d Object has color painting." msgid_plural "%1$d Objects have color painting." msgstr[0] "%1$d Objektet har färgläggning.@%1$d Objekten har färgläggning." @@ -2586,6 +2620,9 @@ msgstr "Exportering OK." msgid " (Repair)" msgstr " (Reparera)" +msgid " Click here to install it." +msgstr "" + msgid "WARNING:" msgstr "VARNING:" @@ -2785,13 +2822,8 @@ msgstr "Ladda dessa filer som ett enkelt objekt med multipla delar?\n" msgid "Object with multiple parts was detected" msgstr "Ett objekt med multipla delar har upptäckts" -msgid "" -"Preview only mode:\n" -"The loaded file contains gcode only." -msgstr "" - msgid "The file does not contain any geometry data." -msgstr "" +msgstr "The file does not contain any geometry data." msgid "Export STL file:" msgstr "Exportera STL-fil:" @@ -2827,6 +2859,15 @@ msgstr "Bereder plattan %d" msgid "Please resolve the slicing errors and publish again." msgstr "Lös berednings felen och publicera igen." +msgid "" +"Network Plug-in is not detected. Network related features are unavailable." +msgstr "" + +msgid "" +"Preview only mode:\n" +"The loaded file contains gcode only, Can not enter the Prepare page" +msgstr "" + msgid "Some presets are modified." msgstr "Några inställningar har ändrats." @@ -2847,9 +2888,6 @@ msgstr "Skapar nytt projekt" msgid "Load project" msgstr "Ladda projekt" -msgid "Preview only mode for gcode file." -msgstr "" - msgid "The selected file" msgstr "Den valda filen" @@ -2875,10 +2913,10 @@ msgid "Only one G-code file can be opened at the same time." msgstr "Endast en G-kod kan öppnas åt gången." msgid "Can not add models when in preview mode!" -msgstr "" +msgstr "Unable to add models in preview mode" msgid "Add Models" -msgstr "" +msgstr "Add Models" msgid "All objects will be removed, continue?" msgstr "Alla objekt kommer att raderas, fortsätta?" @@ -2908,9 +2946,6 @@ msgstr "" "Skriv ut per Objekt:\n" "Rekommenderar att auto-placering för att undvika kollisioner under utskrift." -msgid "Export G-code" -msgstr "Exportera G-kod" - msgid "Send G-code" msgstr "Skicka G-kod" @@ -2941,7 +2976,7 @@ msgstr "Storlek: %1% x %2% x %3% mm\n" #, boost-format msgid "Volume: %1% in³\n" -msgstr "" +msgstr "Volume: %1% in³\n" #, boost-format msgid "Volume: %1% mm³\n" @@ -2967,34 +3002,34 @@ msgid "Changing application language" msgstr "Byter språk" msgid "Changing the region will log out your account.\n" -msgstr "" +msgstr "Changing the region will log you out of your account.\n" msgid "Region selection" -msgstr "" +msgstr "Region selection" msgid "Second" msgstr "Andra" msgid "General Settings" -msgstr "" +msgstr "General Settings" msgid "Asia-Pacific" -msgstr "" +msgstr "Asia-Pacific" msgid "China" -msgstr "" +msgstr "China" msgid "Europe" -msgstr "" +msgstr "Europe" msgid "North America" -msgstr "" +msgstr "North America" msgid "Others" msgstr "Andra" msgid "Login Region" -msgstr "" +msgstr "Login Region" msgid "Metric" msgstr "Metrisk" @@ -3009,10 +3044,10 @@ msgid "User sync" msgstr "Användar synkronisering" msgid "Auto sync user presets(Printer/Filament/Process)" -msgstr "" +msgstr "Auto sync user presets(Printer/Filament/Process)" msgid "User Sync" -msgstr "" +msgstr "User Sync" msgid "Associate files to BambuStudio" msgstr "Associerade filer till Bambu Studio" @@ -3030,7 +3065,7 @@ msgid "If enabled, sets BambuStudio as default application to open .stl files" msgstr "Om aktiverad, väljs Bambu Studio som standard att öppna .stl filer" msgid "Associate .step/.stp files to BambuStudio" -msgstr "" +msgstr "Associate .step/.stp files to BambuStudio" msgid "If enabled, sets BambuStudio as default application to open .step files" msgstr "Om aktiverad, väljs Bambu Studio som standard att öppna .step filer" @@ -3105,7 +3140,7 @@ msgid "trace" msgstr "spåra" msgid "Host Setting" -msgstr "" +msgstr "Host Setting" msgid "DEV host: api-dev.bambu-lab.com/v1" msgstr "DEV host: api-dev.bambu-lab.com/v1" @@ -3128,8 +3163,8 @@ msgstr "spara felsöknings knappen" msgid "DEBUG settings have saved successfully!" msgstr "FELSÖKNINGS inställningarna har sparats!" -msgid "Swith cloud environment, Please login again!" -msgstr "Byte av moln miljö, Logga in igen!" +msgid "Switch cloud environment, Please login again!" +msgstr "" msgid "System presets" msgstr "Systemets förinställningar" @@ -3263,6 +3298,12 @@ msgstr "För \"%1%\", lägg till \"%2%\" som ny förinställning" msgid "Simply switch to \"%1%\"" msgstr "Byta till \"%1%\"" +msgid "Online" +msgstr "Online" + +msgid "Offline" +msgstr "Offline" + msgid "My Device" msgstr "Min Enhet" @@ -3270,25 +3311,28 @@ msgid "Other Device" msgstr "Andra Enheter" msgid "Input access code" -msgstr "" +msgstr "Input access code" + +msgid "Log out successful." +msgstr "Utloggning lyckades." msgid "Busy" -msgstr "" +msgstr "Busy" msgid "Bambu Cool Plate" msgstr "Bambu Cool Plate" msgid "Bamabu Engineering Plate" -msgstr "Bamabu Engineering Plate" +msgstr "Bambu Engineering Plate" msgid "Bamabu High Temperature Plate" -msgstr "Bamabu High Temperature Plate" +msgstr "Bambu High Temperature Plate" msgid "Send print job to" msgstr "Skicka utskriftsjobb till" msgid "Refresh" -msgstr "" +msgstr "Refresh" msgid "Bed Leveling" msgstr "Justering av Byggplattan" @@ -3303,47 +3347,50 @@ msgid "send completed" msgstr "Skicka komplett" msgid "No login account, only printers in LAN mode are displayed" -msgstr "" +msgstr "No login account, only printers in LAN mode are displayed" msgid "Connecting to server" -msgstr "" +msgstr "Connecting to server" msgid "Synchronizing device information" -msgstr "" +msgstr "Synchronizing device information" msgid "Synchronizing device information time out" -msgstr "" +msgstr "Synchronizing device information time out" msgid "Cannot send the print task when the upgrade is in progress" -msgstr "" +msgstr "Cannot send the print task when the upgrade is in progress" msgid "" "The printer is executing instructions. Please restart printing after it ends" msgstr "" +"The printer is executing instructions. Please restart printing after it ends" msgid "The printer is busy on other print job" -msgstr "" +msgstr "The printer is busy with another print job." -msgid "" -"The firmware versions of printer and AMS are too low.Please update to the " -"latest version before sending the print job" +msgid "Printer firmware does not support material = >ams slot mapping." msgstr "" msgid "" "Filaments to AMS slots mappings have been established. You can click a " "filament above to change its mapping AMS slot" msgstr "" +"Filaments to AMS slots mappings have been established. You can click a " +"filament above to change its mapping AMS slot" msgid "" "Please click each filament above to specify its mapping AMS slot before " "sending the print job" msgstr "" +"Please click each filament above to specify its mapping AMS slot before " +"sending the print job" msgid "Preparing print job" -msgstr "" +msgstr "Preparing print job" msgid "Modifying the device name" -msgstr "" +msgstr "Modifying the device name" msgid "Log in printer" msgstr "Logga in skrivare" @@ -3366,9 +3413,6 @@ msgstr "Logga in först." msgid "There was a problem connecting to the printer. Please try again." msgstr "Problem uppstod vid sammankoppling till skrivaren. Försök igen." -msgid "Log out successful." -msgstr "Utloggning lyckades." - msgid "Failed to log out." msgstr "Utloggning misslyckades." @@ -3426,13 +3470,13 @@ msgid "Prime tower" msgstr "Prime torn" msgid "Flush options" -msgstr "" +msgstr "Flush options" msgid "Special mode" msgstr "Special läge" -msgid "Output file" -msgstr "Utdatafil" +msgid "G-code output" +msgstr "" msgid "Frequent" msgstr "Återkommande" @@ -3463,7 +3507,7 @@ msgid "Reserved keywords found" msgstr "Hittade reserverade nyckelord" msgid "Setting Overrides" -msgstr "" +msgstr "Setting Overrides" msgid "Retraction" msgstr "Reduktion" @@ -3498,6 +3542,8 @@ msgid "" "Bed temperature when cool plate is installed. Value 0 means the filament " "does not support to print on the Cool Plate" msgstr "" +"This is the bed temperature when the cool plate is installed. A value of 0 " +"means the filament does not support printing on the Cool Plate." msgid "Engineering plate" msgstr "Engineering plate" @@ -3506,6 +3552,8 @@ msgid "" "Bed temperature when engineering plate is installed. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" +"This is the bed temperature when the engineering plate is installed. A value " +"of 0 means the filament does not support printing on the Engineering Plate." msgid "High Temp Plate" msgstr "High Temp Plate" @@ -3514,6 +3562,9 @@ msgid "" "Bed temperature when high temperature plate is installed. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" +"This is the bed temperature when the high temperature plate is installed. A " +"value of 0 means the filament does not support printing on the High Temp " +"Plate." msgid "Volumetric speed limitation" msgstr "Volumetrisk hastighets begränsning" @@ -3611,7 +3662,6 @@ msgstr "Reduktion vid material byte" msgid "Detached" msgstr "Fristående" -#, fuzzy msgid "Following preset will be deleted too." msgid_plural "Following presets will be deleted too." msgstr[0] "" @@ -3667,7 +3717,7 @@ msgid "New Value" msgstr "Nytt värde" msgid "Transfer" -msgstr "" +msgstr "Transfer" msgid "Don't save" msgstr "Spara inte" @@ -3756,7 +3806,7 @@ msgid "The name \"%1%\" already exists." msgstr "Namnet \"%1%\" finns redan." msgid "Basic Info" -msgstr "" +msgstr "Basic Info" msgid "Pictures" msgstr "Bilder" @@ -3825,7 +3875,7 @@ msgid "The configuration is up to date." msgstr "Konfigurationen är aktuell." msgid "Auto-Calc" -msgstr "" +msgstr "Auto-Calc" msgid "Flushing volumes for filament change" msgstr "Rensnings volym för filament byte" @@ -3834,7 +3884,7 @@ msgid "Flushing volume (mm³) for each filament pair." msgstr "Rensnings volym (mm³) för varje filament." msgid "Flush multiplier" -msgstr "" +msgstr "Flush multiplier" msgid "unloaded" msgstr "utmatad" @@ -4312,11 +4362,11 @@ msgstr "" #, boost-format msgid "%1% is too close to others, and collisions may be caused." -msgstr "" +msgstr "%1% is too close to others, and collisions may be caused." #, boost-format msgid "%1% is too tall, and collisions will be caused." -msgstr "" +msgstr "%1% is too tall, and collisions will be caused." msgid " is too close to others, there will be collisions when printing.\n" msgstr " för tätt inpå andra, utskriften kolliderar.\n" @@ -4329,10 +4379,10 @@ msgid "Prime Tower" msgstr "Prime Torn" msgid " is too close to others, and collisions may be caused.\n" -msgstr "" +msgstr " is too close to others, and collisions may be caused.\n" msgid " is too close to exclusion area, and collisions will be caused.\n" -msgstr "" +msgstr " is too close to exclusion area, and collisions will be caused.\n" msgid "" "Can not print multiple filaments which have large difference of temperature " @@ -4476,6 +4526,8 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Cool Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the Cool Plate." msgid "°C" msgstr "°C" @@ -4487,11 +4539,15 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the Engineering Plate." msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" +"This is the bed temperature for layers except for the initial one. A value " +"of 0 means the filament does not support printing on the High Temp Plate." msgid "Initial layer" msgstr "Första lager" @@ -4503,16 +4559,22 @@ msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Cool Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the Cool Plate." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Engineering Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the Engineering Plate." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the High Temp Plate" msgstr "" +"This is the bed temperature of the initial layer. A value of 0 means the " +"filament does not support printing on the High Temp Plate." msgid "Bed types supported by the printer" msgstr "Byggplattans typ stöds av skrivaren" @@ -4598,12 +4660,14 @@ msgstr "" "bridges/bryggor, detta för att förbättra kvaliteten" msgid "Only one wall on top surfaces" -msgstr "" +msgstr "Only one wall on top surfaces" msgid "" "Use only one wall on flat top surface, to give more space to the top infill " "pattern" msgstr "" +"Use only one wall on flat top surface, to give more space to the top infill " +"pattern" msgid "Slow down for overhang" msgstr "Sakta ner vid överhäng" @@ -4733,14 +4797,29 @@ msgstr "" "support. Bridges/Bryggor kan vanligtvis skrivas ut utan support om de inte " "är för långa avstånd" -msgid "Max bridge length" +msgid "Thick bridges" msgstr "" +msgid "Layers and Perimeters" +msgstr "" + +msgid "" +"If enabled, bridges are more reliable, can bridge longer distances, but may " +"look worse. If disabled, bridges look better but are reliable just for " +"shorter bridged distances." +msgstr "" + +msgid "Max bridge length" +msgstr "Max bridge length" + msgid "" "Max length of bridges that don't need support. Set it to 0 if you want all " "bridges to be supported, and set it to a very large value if you don't want " "any bridges to be supported." msgstr "" +"Max length of bridges that don't need support. Set it to 0 if you want all " +"bridges to be supported, and set it to a very large value if you don't want " +"any bridges to be supported." msgid "End G-code" msgstr "Slut G-kod" @@ -4767,7 +4846,7 @@ msgid "Monotonic" msgstr "Monoton" msgid "Monotonic line" -msgstr "" +msgstr "Monotonic line" msgid "Bottom surface pattern" msgstr "Botten ytans mönster" @@ -4952,11 +5031,12 @@ msgstr "" "gränsyta" msgid "Support material" -msgstr "" +msgstr "Support material" msgid "" "Support material is commonly used to print support and support interface" msgstr "" +"Support material is commonly used to print support and support interface" msgid "Temperature of vitrificaiton" msgstr "Kristalliserings temperatur" @@ -5029,6 +5109,8 @@ msgid "" "Acceleration of top surface infill. Using a lower value may improve top " "surface quality" msgstr "" +"Acceleration of top surface infill. Using a lower value may improve top " +"surface quality" msgid "" "Acceleration of initial layer. Using a lower value can improve build plate " @@ -5431,20 +5513,19 @@ msgid "Diameter of nozzle" msgstr "Diametern på nozzeln" msgid "Nozzle volume" -msgstr "" +msgstr "Nozzle volume" msgid "Volume of nozzle between the cutter and the end of nozzle" -msgstr "" +msgstr "Volume of nozzle between the cutter and the end of nozzle" msgid "Reduce infill retraction" msgstr "Minska ifyllnads retraktionen" msgid "" "Don't retract when the travel is in infill area absolutely. That means the " -"oozing can't been seen" +"oozing can't been seen. This can reduce times of retraction for complex " +"model and save printing time, but make slicing and G-code generating slower" msgstr "" -"Detta inaktiverar retraktion när rörelsen är helt inom ett ifyllnads området " -"och det inte kan läcka filament" msgid "Enable" msgstr "Aktivera" @@ -5600,7 +5681,7 @@ msgid "The start position to print each part of outer wall" msgstr "Utskriftens start position för varje del av yttre väggen" msgid "Nearest" -msgstr "" +msgstr "Nearest" msgid "Aligned" msgstr "Linjerad" @@ -5809,8 +5890,8 @@ msgid "" "interface is Concentric" msgstr "" "Linje mönster för support gränssnittsytan .Standardmönstret för olösligt " -"(material) support gränssnittet är Räta medan standardmönstret för " -"lösligt(material) stödgränssnittet är koncentriskt" +"(material) support gränssnittet är Räta medan standardmönstret för lösligt" +"(material) stödgränssnittet är koncentriskt" msgid "Base pattern spacing" msgstr "Basens mönster mellanrum" @@ -6006,7 +6087,7 @@ msgid "Width of prime tower" msgstr "Prime tornets bredd" msgid "Flush into objects' infill" -msgstr "" +msgstr "Flush into objects' infill" msgid "" "Purging after filament change will be done inside objects' infills. This may " @@ -6014,23 +6095,31 @@ msgid "" "printed with transparent filament, the mixed color infill will be seen " "outside" msgstr "" +"Purging after filament change will be done inside objects' infills. This may " +"lower the amount of waste and decrease the print time. If the walls are " +"printed with transparent filament, the mixed color infill will be visible." msgid "Flush into objects' support" -msgstr "" +msgstr "Flush into objects' support" msgid "" "Purging after filament change will be done inside objects' support. This may " "lower the amount of waste and decrease the print time" msgstr "" +"Purging after filament change will be done inside objects' support. This may " +"lower the amount of waste and decrease the print time." msgid "Flush into this object" -msgstr "" +msgstr "Flush into this object" msgid "" "This object will be used to purge the nozzle after a filament change to save " "filament and decrease the print time. Colours of the objects will be mixed " "as a result" msgstr "" +"This object will be used to purge the nozzle after a filament change to save " +"filament and decrease the print time. Colours of the objects will be mixed " +"as a result" msgid "X-Y hole compensation" msgstr "X-Y håls kompensation" @@ -6103,10 +6192,10 @@ msgid "Arrange options: 0-disable, 1-enable, others-auto" msgstr "Placera val: 0-inaktivera, 1-aktivera, andra-auto" msgid "Convert Unit" -msgstr "" +msgstr "Convert Unit" msgid "Convert the units of model" -msgstr "" +msgstr "Convert the units of model" msgid "Orient the model" msgstr "Orientera modellen" @@ -6198,1125 +6287,204 @@ msgstr "Fel i linje %1%:\n" #, c-format, boost-format msgid "Support: generate toolpath at layer %d" -msgstr "" +msgstr "Support: generate toolpath at layer %d" msgid "Support: detect overhangs" -msgstr "" +msgstr "Support: detect overhangs" msgid "Support: generate contact points" -msgstr "" +msgstr "Support: generate contact points" msgid "Support: propagate branches" -msgstr "" +msgstr "Support: propagate branches" msgid "Support: draw polygons" -msgstr "" +msgstr "Support: draw polygons" msgid "Support: generate toolpath" -msgstr "" +msgstr "Support: generate toolpath" #, c-format, boost-format msgid "Support: generate polygons at layer %d" -msgstr "" +msgstr "Support: generate polygons at layer %d" #, c-format, boost-format msgid "Support: fix holes at layer %d" -msgstr "" +msgstr "Support: fix holes at layer %d" #, c-format, boost-format msgid "Support: propagate branches at layer %d" -msgstr "" +msgstr "Support: propagate branches at layer %d" -#~ msgid "Fix model through cloud" -#~ msgstr "Fixa modell genom molnet" +#~ msgid "Creating" +#~ msgstr "Creating" -#~ msgid "Fix model locally" -#~ msgstr "Fixa modell lokalt" +#~ msgid "Uploading" +#~ msgstr "Uploading" -#~ msgid "Module" -#~ msgstr "Modul" +#~ msgid "Waiting" +#~ msgstr "Waiting" -#~ msgid "Shift + Any arrow" -#~ msgstr "Shift + Valfri pil" +#~ msgid "Sending" +#~ msgstr "Sending" -#~ msgid "Ctrl + Any arrow" -#~ msgstr "CTRL + Valfri pil" +#~ msgid "Finished" +#~ msgstr "Finished" + +#~ msgid "Please fill report first." +#~ msgstr "Fyll i rapporten först." + +#~ msgid "Unable to create zip file" +#~ msgstr "Unable to create zip file" + +#~ msgid "Enter a search term" +#~ msgstr "Enter a search term" + +#~ msgid "Debug" +#~ msgstr "Felsök" + +#~ msgid "Monitoring" +#~ msgstr "Övervakar" + +#~ msgid "Fragment filter" +#~ msgstr "Fragment filter" + +#~ msgid "Fragment Filter" +#~ msgstr "Fragment Filter" + +#~ msgid "Position:" +#~ msgstr "Position:" #~ msgid "Alt + Mouse wheel" -#~ msgstr "ALT + Mushjul" - -#~ msgid "Shift + Mouse wheel" -#~ msgstr "Shift + Mushjul" - -#~ msgid "Beginner's Tutorial" -#~ msgstr "Handledning för nybörjare" - -#~ msgid "Render statistics debugging box" -#~ msgstr "Renderings statistikens felsökningsbox" - -#~ msgid "The bed is auto leveling" -#~ msgstr "Byggplattan auto justeras" - -#~ msgid "The hot bed is preheating" -#~ msgstr "Byggplattan förvärms" - -#~ msgid "Frequncy sweeping" -#~ msgstr "Frekvens svepning" - -#~ msgid "Change the filament" -#~ msgstr "Byta filament" - -#~ msgid "Pause(M400)" -#~ msgstr "Paus(M400)" - -#~ msgid "Pause(Lack of filament)" -#~ msgstr "Paus(Filament saknas)" - -#~ msgid "The nozzle is preheating" -#~ msgstr "Nozzeln förvärms" - -#~ msgid "Extruder compensation scanning" -#~ msgstr "Extruder skanning" - -#~ msgid "Bed surface scanning" -#~ msgstr "Skanning av byggplattan" - -#~ msgid "First layer scanning" -#~ msgstr "Första lager skanning" - -#~ msgid "Bed surface is auto identifying" -#~ msgstr "Byggplattan auto identifieras" - -#~ msgid "In the calibration of extrinsic parameters" -#~ msgstr "Kalibrering av yttre parametrar" - -#~ msgid "The tool head is homing" -#~ msgstr "Nollställning av verktygshuvudet" - -#~ msgid "Nozzle cleaning" -#~ msgstr "Nozzel rengöring" - -#~ msgid "In the calibration of temperature protection" -#~ msgstr "Kalibrering av temperaturskydd" - -#~ msgid "Silent Mode" -#~ msgstr "Tyst Läge" - -#~ msgid "Show Edges(TODO)" -#~ msgstr "Visa Kanter(TODO)" - -#~ msgid "Show Edges" -#~ msgstr "Visa Kanter" - -#~ msgid "Associate .step files to BambuStudio" -#~ msgstr "Associerade .step files till Bambu Studio" - -#~ msgid "Vibration Calibration" -#~ msgstr "Vibrations Kalibrering" - -#~ msgid "First Layer Inspection" -#~ msgstr "Första Lager Inspektion" - -#~ msgid "Please select a printer first." -#~ msgstr "Välj en skrivare först." - -#~ msgid "Enable spaghetti detector" -#~ msgstr "Aktivera spaghetti detektor" - -#~ msgid "Enable the camera on printer to check spaghetti" -#~ msgstr "" -#~ "Aktivera detta för att låta kameran i skrivaren titta efter spagetti " -#~ "fenomen" - -#~ msgid "Preparation before calibration" -#~ msgstr "Förbereder kalibrering" +#~ msgstr "Alt + Mouse wheel" #~ msgid "" -#~ "Before calibration, please make sure a filament is loaded and its nozzle " -#~ "temperature and bed temperature is set in Feeding lab." +#~ "An object is layed over the boundary of plate.\n" +#~ "Please solve the problem by moving it totally inside or outside plate." #~ msgstr "" -#~ "Innan kalibrering, säkerställ att filament är laddat och att nozzel samt " -#~ "byggplattans temperatur är vald i matnings facket." +#~ "Ett objekt är placerad över byggplattans begränsningar.\n" +#~ "Flytta objektet så det är helt inom eller utom byggplattans begränsningar." -#~ msgid "" -#~ "Calibration program detects the status of your device systematically to " -#~ "minimise deviation. It keeps the device at its the best performance" -#~ msgstr "" -#~ "Kalibrerings programmet känner av statusen på enheten systematiskt för " -#~ "att minimera avvikelser. Detta uppehåller enhetens prestanda" +#~ msgid "Ctrl + Any arrow" +#~ msgstr "Ctrl + Any arrow" -#~ msgid "Per Object Setting" -#~ msgstr "Per Objekt Inställningar" +#~ msgid "Ctrl + Left mouse button" +#~ msgstr "Ctrl + Left mouse button" -#~ msgid "Reset All" -#~ msgstr "Återställ Alla" +#~ msgid "Display printable box" +#~ msgstr "Visa utskriftbar box" -#~ msgid "Failed to create the print job. Please try agian." -#~ msgstr "Misslyckades att skapa utskrift. Försök igen." +#~ msgid "Display shadow of objects" +#~ msgstr "Visa skuggor från objektet" -#~ msgid "Failed to upload the print job. Please try agian." -#~ msgstr "Uppladdning av utskrift misslyckades. Försök igen." - -#~ msgid "Uploading print job timed out. Please try again." -#~ msgstr "Uppladdning av utskrift avbröts. Försök igen." - -#~ msgid "Failed to send the print job. Please try again." -#~ msgstr "Misslyckades att skicka utskrift. Försök igen." - -#~ msgid "Sending print task timed out. Please try again." -#~ msgstr "Skickande av utskrift avbröts. Försök igen." - -#~ msgid "The printer is being updated. Please try again after the update." -#~ msgstr "Skrivaren uppdateras. Försök igen efter uppdateringen." - -#~ msgid "Exporting 3mf..." -#~ msgstr "Exporterar 3mf..." - -#~ msgid "Internal error." -#~ msgstr "Internt fel." - -#~ msgid "Exporting 3mf failed, please slice again." -#~ msgstr "Exporten 3mf misslyckades, bered igen." - -#~ msgid "No printer available" -#~ msgstr "Ingen skrivare tillgänglig" - -#~ msgid "YES" -#~ msgstr "JA" - -#~ msgid "NO" -#~ msgstr "NEJ" - -#~ msgid "Login with your Account" -#~ msgstr "Logga in med ditt Konto" - -#~ msgid "Logout" -#~ msgstr "Logga ut" - -#~ msgid "Publish Model/Profile" -#~ msgstr "Publicera Model/Profil" - -#~ msgid "Please slice all plates before upload" -#~ msgstr "Bered alla plattor innan uppladdning" - -#~ msgid "Total Size:" -#~ msgstr "Total Storlek:" - -#~ msgid "Tiny patch filter" -#~ msgstr "Litet patch filter" - -#~ msgid "Filter tiny patch" -#~ msgstr "Filtrera små patch" - -#~ msgid "Process %1% / 100" -#~ msgstr "Process %1% / 100" - -#~ msgid "Bambu Studio initialization failed" -#~ msgstr "Uppstart av Bambu Studio misslyckades" - -#~ msgid "Object %s has zero size and can't be arranged." -#~ msgstr "Objeketet %s har storlek noll och kan inte placeras." - -#~ msgid "Show daily tips" -#~ msgstr "Visa dagliga tips" - -#~ msgid "Choose Filaments" -#~ msgstr "Välj Filament" - -#~ msgid "Bind Dialog" -#~ msgstr "Tvinga Dialog" +#~ msgid "Display triangles of models" +#~ msgstr "Visa trianglar från modellerna" #~ msgid "" #~ "Do you want to synchronize your personal data from Bambu Cloud? \n" #~ "Contains the following information:\n" #~ "1. The Process presets\n" #~ "2. The Filament presets\n" -#~ "3. The Machine presets\n" +#~ "3. The Printer presets\n" #~ msgstr "" -#~ "Vill du synkronisera dina inställningar ifrån Bambu Molnet? \n" -#~ "Innehåller följande:\n" -#~ "1. Process inställningar\n" -#~ "2. Filament inställningar\n" -#~ "3. Maskin inställningar\n" - -#~ msgid "Machine Control" -#~ msgstr "Maskin kontroll" - -#~ msgid "Temperature and Axis Control" -#~ msgstr "Temperatur och Axis Kontroll" - -#~ msgid "Model:" -#~ msgstr "Modell:" - -#~ msgid "Serial:" -#~ msgstr "Serienummer:" - -#~ msgid "Version:" -#~ msgstr "Version:" - -#~ msgid "Upgrade firmware" -#~ msgstr "Uppdatera firmware" - -#~ msgid "Relase Note" -#~ msgstr "Relase Note" - -#~ msgid "Printing" -#~ msgstr "Skriver ut" - -#~ msgid "Idle" -#~ msgstr "Inaktiv" - -#~ msgid "Lastest version" -#~ msgstr "Senaste version" - -#~ msgid "Upgrading" -#~ msgstr "Uppdatera" - -#~ msgid "Upgrading success" -#~ msgstr "Uppdateringen lyckades" - -#~ msgid "Upgrading failed" -#~ msgstr "Uppdateringen misslyckades" - -#~ msgid "Need to stop slicing first." -#~ msgstr "Beredningen måste avslutas först." - -#~ msgid "Drop Files when slicing" -#~ msgstr "Släpp filer när du bereder" - -#~ msgid "Importing Model" -#~ msgstr "Importerar Modell" - -#~ msgid "prepare 3mf file..." -#~ msgstr "Förbered 3mf file…" - -#~ msgid "Import project failed, Please try again!" -#~ msgstr "Import av projektet misslyckades, Försök igen!" - -#~ msgid "downloading project ..." -#~ msgstr "Laddar ner projekt …" - -#~ msgid "Project downloaded %d%%" -#~ msgstr "Nedladdat projekt %d%%" - -#~ msgid "Failed to publish your project. Please try agian!" -#~ msgstr "Publicering av projektet misslyckades. Försök igen!" - -#~ msgid "preparing, export 3mf failed!" -#~ msgstr "Förbereder, exporten till 3mf misslyckades!" - -#~ msgid "Preparing to upload your project..." -#~ msgstr "Förbereder uppladdning av projektet..." - -#~ msgid "get_des,err:code=%u,msg=%s" -#~ msgstr "get_des,err:code=%u,msg=%s" - -#~ msgid "req_proj,err:code=%u,msg=%s" -#~ msgstr "req_proj,err:code=%u,msg=%s" - -#~ msgid "req_prof,err:code=%u,msg=%s" -#~ msgstr "req_prof,err:code=%u,msg=%s" - -#~ msgid "Uploading..." -#~ msgstr "Laddar upp..." - -#~ msgid "Uploading %d%%, remaining time %s" -#~ msgstr "Laddar upp %d%%, kvarstående tid %s" - -#~ msgid "Upload has been canceled." -#~ msgstr "Uppladdningen avbröts." - -#~ msgid "Publishing..." -#~ msgstr "Publicerar..." - -#~ msgid "Failed to publish. Please try again!" -#~ msgstr "Publiceringen misslyckades. Försök igen!" - -#~ msgid "Uploading is timed out. Please try again!" -#~ msgstr "Uppladdningen har gått ut. Försök igen!" - -#~ msgid "Design id is empty." -#~ msgstr "Design id är tom." - -#~ msgid "Chinese (Simplified)" -#~ msgstr "Kinesiska (Förenklad)" - -#~ msgid "GUI" -#~ msgstr "GUI" - -#~ msgid "Sync" -#~ msgstr "Sync" - -#~ msgid "Shortcuts" -#~ msgstr "Genvägar" - -#~ msgid "General settings" -#~ msgstr "Almänna inställningar" - -#~ msgid "Record Timelapse" -#~ msgstr "Spela in Timelapse" - -#~ msgid "Current printer is busy. Please select another one." -#~ msgstr "Nuvarande skrivare upptagen. Välj en annan." - -#~ msgid "Filament Retraction" -#~ msgstr "Filament Reduktion" - -#~ msgid "Bed temperature when cool plate is installed" -#~ msgstr "Byggplattans temperatur när Cool plate används" - -#~ msgid "Bed temperature when engineering plate is installed" -#~ msgstr "Byggplattans temperatur när Engineering plate används" - -#~ msgid "Bed temperature when high temperature plate is installed" -#~ msgstr "Byggplattans temperatur när High Temp Plate används" - -#~ msgid "Keep" -#~ msgstr "Behåll" - -#~ msgid "Unable to get system certificate." -#~ msgstr "Det gick inte att få systemcertifikat." - -#~ msgid "use system SSL certificate: %1%" -#~ msgstr "använd system SSL certifikat: %1%" - -#~ msgid "CURL initialization failed. See the log for additional details." -#~ msgstr "Start av CURL misslyckades. Kontrollera loggen för mer information." - -#~ msgid "print project cancelled." -#~ msgstr "utskrifts projektet avbröts." - -#~ msgid "Creating a print job..." -#~ msgstr "Skapar utskrift..." - -#~ msgid "Uploading the print job..." -#~ msgstr "Laddar upp utskrift..." - -#~ msgid "The size of the uploaded file cannot exceed 1 GB." -#~ msgstr "Storleken på den uppladdade filen får inte överstiga 1GB." - -#~ msgid " Failed to upload the print job. Check Md5 failed, please try agian." -#~ msgstr "" -#~ " Misslyckades att ladda upp utskrift. Kontrollera Md5 felet, försök igen." +#~ "Do you want to synchronize your personal data from Bambu Cloud? \n" +#~ "Contains the following information:\n" +#~ "1. Process presets\n" +#~ "2. Filament presets\n" +#~ "3. Printer presets\n" #~ msgid "" -#~ "\n" -#~ "upload,err:code=%u,msg=%s" +#~ "Don't retract when the travel is in infill area absolutely. That means " +#~ "the oozing can't been seen" #~ msgstr "" -#~ "\n" -#~ "ladda upp,err:code=%u,msg=%s" +#~ "Detta inaktiverar retraktion när rörelsen är helt inom ett ifyllnads " +#~ "området och det inte kan läcka filament" -#~ msgid "Wait for the job to be sent." -#~ msgstr "Vänta på att utskrift har skickats." +#~ msgid "Fix model locally" +#~ msgstr "Fix model locally" -#~ msgid "The print job has been sent to your printer." -#~ msgstr "Utskrift har skickats till skrivaren." - -#~ msgid "Invalid plate index %d" -#~ msgstr "Ogilltlig platta index %d" - -#~ msgid "Plate %d" -#~ msgstr "Platta %d" - -#~ msgid "%s" -#~ msgstr "%s" - -#~ msgid "Start printing..." -#~ msgstr "Startar utskrift..." - -#~ msgid "%1% is too close to others, there will be collisions when printing." -#~ msgstr "%1% för tätt inpå andra, utskriften kolliderar." +#~ msgid "Fix model through cloud" +#~ msgstr "Fix model through cloud" #~ msgid "" -#~ "\n" -#~ "%1% is too close to others, there will be collisions when printing." +#~ "Heat the nozzle to target \n" +#~ "temperature" #~ msgstr "" -#~ "\n" -#~ "%1% för tätt inpå andra, utskriften kolliderar." +#~ "Värm nozzel till vald \n" +#~ "temperatur" -#~ msgid "%1% is too tall, there will be collisions when printing." -#~ msgstr "%1% för hög, utskriften kolliderar." +#~ msgid "In the calibration of extrusion flow" +#~ msgstr "In the calibration of extrusion flow" + +#~ msgid "In the calibration of laser scanner" +#~ msgstr "In the calibration of laser scanner" + +#~ msgid "Module" +#~ msgstr "Module" + +#~ msgid "New version of Bambu Studio" +#~ msgstr "Ny version av Bambu Studio" + +#~ msgid "Output file" +#~ msgstr "Utdatafil" + +#~ msgid "Pause(heated bed temperature error)" +#~ msgstr "Pause(heated bed temperature error)" + +#~ msgid "Pause(hotend temperature error)" +#~ msgstr "Pause(hotend temperature error)" + +#~ msgid "Pause(toolhead shell off)" +#~ msgstr "Pause(toolhead shell off)" + +#~ msgid "Please upgrade your printer first" +#~ msgstr "Please upgrade your printer first" #~ msgid "" -#~ "\n" -#~ "%1% is too tall, there will be collisions when printing." +#~ "Preview only mode:\n" +#~ "The loaded file contains gcode only." #~ msgstr "" -#~ "\n" -#~ "%1% för hög, utskriften kolliderar." +#~ "Preview only mode:\n" +#~ "The loaded file contains gcode only." -#~ msgid "bed temperature for layers except the initial one" -#~ msgstr "byggplattans temperatur förrutom första lager" - -#~ msgid "Bed temperature of the initial layer" -#~ msgstr "Byggplattans temperatur för första lager" - -#~ msgid "Smart" -#~ msgstr "Smart" - -#~ msgid "X/Y Axis" -#~ msgstr "X/Y axis" - -#~ msgid "Bed temperature for layers except the initial one" -#~ msgstr "Bed temperature after first layer" - -#~ msgid "Use BBL private temperature gcode instead of standard M140/M190" -#~ msgstr "Use BBL private temperature G-code instead of standard M140/M190." - -#~ msgid "Material for support" -#~ msgstr "Support material" - -#~ msgid "Filament to print support and skirt." -#~ msgstr "This is the filament for printing support and skirts." - -#~ msgid "Filament to print support interface" -#~ msgstr "This is the filament for support interfaces." - -#~ msgid "AMS Control" -#~ msgstr "AMS control" - -#~ msgid "Fan speed when printing bridge and overhang wall" -#~ msgstr "Fan speed when printing bridges and overhang walls." +#~ msgid "Preview only mode for gcode file." +#~ msgstr "Preview only mode for gcode file." #~ msgid "" -#~ "Force cooling fan speed to be overhang_fan_speed when overhang degree of " -#~ "printed part exceeds this value. Expressed as percentage which indicides " -#~ "how many width of the line without support from lower layer" +#~ "Push new filament \n" +#~ "into extruder" #~ msgstr "" -#~ "Force cooling fan speed to match overhang fan speed when the overhang " -#~ "degree of printed parts exceeds this value. This is expressed as " -#~ "percentage which indicates the width of lines without support." +#~ "Mata nytt filament\n" +#~ "till extrudern" + +#~ msgid "Shift + Any arrow" +#~ msgstr "Shift + Any arrow" + +#~ msgid "Shift + Mouse wheel" +#~ msgstr "Shift + Mouse wheel" + +#~ msgid "Show Model Mesh(TODO)" +#~ msgstr "Visa Modell Mesh(TODO)" + +#~ msgid "Show Model Shadow(TODO)" +#~ msgstr "Visa Modell Skuggor(TODO)" + +#~ msgid "Show Printable Box(TODO)" +#~ msgstr "Visa Utskriftbar Box(TODO)" + +#~ msgid "Successfully sent.Will automatically jump to the device page in %s s" +#~ msgstr "" +#~ "Successfully sent.Will automatically jump to the device page in %s s" + +#~ msgid "Swith cloud environment, Please login again!" +#~ msgstr "Byte av moln miljö, Logga in igen!" #~ msgid "" -#~ "Enable auto cooling to adjust printing speed and fan speed according to " -#~ "layer printing time automatically" +#~ "The firmware versions of printer and AMS are too low.Please update to the " +#~ "latest version before sending the print job" #~ msgstr "" -#~ "Enable auto cooling to adjust printing speed and fan speed according to " -#~ "layer printing time automatically." +#~ "The firmware versions of printer and AMS are too low.Please update to the " +#~ "latest version before sending the print job" -#~ msgid "" -#~ "Close cooling fan for the first certain layers. We usually close fan for " -#~ "the initial layer to get better build plate adhesion" -#~ msgstr "" -#~ "Close cooling fan for the first certain layers. We usually close fan for " -#~ "the first layer to get better build plate adhesion" - -#~ msgid "" -#~ "Starting fan from stop state usually costs lots's of time. If enable this " -#~ "setting, fan will never be stoped and will run at least at minimum speed " -#~ "to reduce the frequency of starting and stoping" -#~ msgstr "" -#~ "Starting a fan from a fully stopped state takes a long time. If this " -#~ "setting is enabled, the fan will run at a minimum speed to reduce the " -#~ "frequency of starting and stopping." - -#~ msgid "" -#~ "Cooling fan will be enabled for layers of which estimated time is shorter " -#~ "than this value. Fan speed is interpolated between the minimum and " -#~ "maximum fan speeds according to layer printing time" -#~ msgstr "" -#~ "The cooling fan will be enabled for layers with an estimated time shorter " -#~ "than this value. Fan speed is interpolated between minimum and maximum " -#~ "fan speeds according to layer printing time." - -#~ msgid "Additional cooling fan speed" -#~ msgstr "Auxiliary cooling fan speed" - -#~ msgid "Speed of additional cooling fan" -#~ msgstr "This is the speed for the auxiliary cooling fan." - -#~ msgid "" -#~ "Speed for different overhang degree. Overhang degree is expressed as " -#~ "percentage of line width" -#~ msgstr "" -#~ "This is the speed for various overhang degrees. Overhand degrees are " -#~ "expressed as a percentage of line width." - -#~ msgid "Send Task to" -#~ msgstr "Send task to" - -#~ msgid "Extrusion width value is too low." -#~ msgstr "Extrusion width is too low." - -#~ msgid "Extrusion width value is too high." -#~ msgstr "Extrusion width is too high." - -#~ msgid "" -#~ "Line width of initial layer. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "Line width of first layer: this is relative to nozzle diameter if " -#~ "expressed as a percentage." - -#~ msgid "" -#~ "Line width of internal sparse infill. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "This determines the line width of internal sparse infill. It’s relative " -#~ "to nozzle diameter if expressed as a percentage." - -#~ msgid "" -#~ "Line width of inner wall. It's relative to nozzle diameter if expressed " -#~ "as percentage" -#~ msgstr "" -#~ "Line width of inner walls; it’s relative to nozzle diameter if expressed " -#~ "as a percentage." - -#~ msgid "" -#~ "Line width of internal solid infill. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "This is the line ridge of internal solid infill. It’s relative to nozzle " -#~ "diameter if expressed as a percentage." - -#~ msgid "" -#~ "Used to set line width for support. It's relative to nozzle diameter if " -#~ "expressed as percentage" -#~ msgstr "" -#~ "This is used to set line width for support. It’s relative to nozzle " -#~ "diameter if expressed as a percentage." - -#~ msgid "" -#~ "Used to set line width for support transition. It's relative to nozzle " -#~ "diameter if expressed as percentage" -#~ msgstr "" -#~ "This is used to set line width for support transition. It’s relative to " -#~ "nozzle diameter if expressed as a percentage." - -#~ msgid "" -#~ "Used to set line width for top surfaces. It's relative to nozzle diameter " -#~ "if expressed as percentage" -#~ msgstr "" -#~ "This is used to set line width for top surfaces. It’s relative to nozzle " -#~ "diameter if expressed as a percentage." - -#~ msgid "" -#~ "The number of solid layers of top shell, including top surface layer. " -#~ "When the thickness calculated by this value is thinner than top shell " -#~ "thickness, the top shell layers number will be increased when slicing" -#~ msgstr "" -#~ "This is the number of solid layers of top shell, including the surface " -#~ "layer. When the thickness calculated by this value is thinner than top " -#~ "shell thickness, more top shell layers will be added when slicing." - -#~ msgid "" -#~ "The number of solid layers of bottom shell, including bottom surface " -#~ "layer. When the thickness calculated by this value is thinner than bottom " -#~ "shell thickness, the bottom shell layers number will be increased when " -#~ "slicing." -#~ msgstr "" -#~ "This is the number of solid layers of bottom shell, including the bottom " -#~ "surface layer. When the thickness calculated by this value is thinner " -#~ "than bottom shell thickness, the bottom shell layers will be increased." - -#~ msgid "" -#~ "The number of bottom solid layers is increased when slicing if the " -#~ "thickness calculated by bottom_shell_layers is thinner than this value. " -#~ "This can avoid too thin shell when layer height is small" -#~ msgstr "" -#~ "The number of bottom solid layers is increased when slicing if the " -#~ "thickness calculated by bottom shell layers is thinner than this value. " -#~ "This can avoid having shells that are too thin when layer height is small." - -#~ msgid "" -#~ "The number of top solid layers is increased when slicing if the thickness " -#~ "calculated by top_shell_layers is thinner than this value. This can avoid " -#~ "too thin shell when layer height is small" -#~ msgstr "" -#~ "The number of top solid layers is increased when slicing if the thickness " -#~ "calculated by top shell layers is thinner than this value. This can avoid " -#~ "having too thin a shell when layer height is small." - -#~ msgid "Unable to connect server" -#~ msgstr "Unable to connect to server" - -#~ msgid "" -#~ "Speed of outer wall which is outermost and visible. It's used to be " -#~ "slower than inner wall speed to get better quality" -#~ msgstr "" -#~ "This is the speed for the outermost visible wall. It should be slower " -#~ "than inner wall speed for higher quality." - -#~ msgid "Remove frequency sweep gcode" -#~ msgstr "Remove frequency sweep G-code" - -#~ msgid "Enable this to skip frequency sweep when start printing" -#~ msgstr "Enable this to skip frequency sweeping when you start printing." - -#~ msgid "Remove bed leveling gcode" -#~ msgstr "Remove bed leveling G-code" - -#~ msgid "Enable this to skip bed leveling when start printing" -#~ msgstr "Enable this to skip bed leveling when you start printing." - -#~ msgid "Remove extrusion calibration gcode" -#~ msgstr "Remove extrusion calibration G-code" - -#~ msgid "Enable this to skip extrusion calibration when start printing" -#~ msgstr "" -#~ "Enable this to skip the extrusion calibration when you start printing." - -#~ msgid "" -#~ "Speed for line of wall which has degree of overhang between 0% and 25% " -#~ "line width. 0 means using original wall speed" -#~ msgstr "" -#~ "Speed for lines of walls which have a degree of overhang between 0% and " -#~ "25% line width. 0 means using original wall speed." - -#~ msgid "Bmabu Cool Plate" -#~ msgstr "Bambu cool plate" - -#~ msgid "Bmabu Engineering Plate" -#~ msgstr "Bambu engineering plate" - -#~ msgid "Bmabu High Temperature Plate" -#~ msgstr "Bambu high temperature plate" - -#~ msgid "" -#~ "Detect the overhang percentage relative to line width and use different " -#~ "speed to print. For 100% overhang, bridge speed is used" -#~ msgstr "" -#~ "This enables detecting the overhang percentage relative to line width and " -#~ "uses different speed to print. For 100% overhang, bridge speed is used." - -#~ msgid "" -#~ "This plate is locked,\n" -#~ "We can not do auto-arrange on this plate!" -#~ msgstr "" -#~ "This plate is locked.\n" -#~ "Cannot auto-arrange this plate." - -#~ msgid "" -#~ "Arrange failed! Found some exceptions when processing object Geometries" -#~ msgstr "" -#~ "Arrange failed. Exception were found when processing object geometries." - -#~ msgid "" -#~ "All the selected objects are on the locked plate,\n" -#~ "We can not do auto-orient on these objects!" -#~ msgstr "" -#~ "All the selected objects are on a locked plate.\n" -#~ "We cannot auto-orient these objects!" - -#~ msgid "" -#~ "This plate is locked,\n" -#~ "We can not do auto-orient on this plate!" -#~ msgstr "" -#~ "This plate is locked.\n" -#~ "We cannot auto-orient objects on this plate!" - -#~ msgid "Whether to synchronize cloud user data?\n" -#~ msgstr "Synchronize cloud user data?\n" - -#~ msgid "" -#~ "Holes of object will be grown or shrunk in XY plane by the configured " -#~ "value. Negative value makes holes bigger. Positive value makes holes " -#~ "smaller. This function is used to adjust size when the object has " -#~ "assembling issue" -#~ msgstr "" -#~ "Holes in the object will be grown or shrunk in the XY plane by the " -#~ "configured value. Negative values make holes bigger while positive values " -#~ "makes them smaller. This function is used to adjust size when the object " -#~ "has assembly issues." - -#~ msgid "" -#~ "Contour of object will be grown or shrunk in XY plane by the configured " -#~ "value. Positive value makes contour bigger. Negative value makes contour " -#~ "smaller. This function is used to adjust size when the object has " -#~ "assembling issue" -#~ msgstr "" -#~ "Contours of objects will be grown or shrunk in the XY plane by the set " -#~ "value. Positive values will make contours bigger while negative values " -#~ "will make them smaller. This function is used to adjust size when the " -#~ "object has assembly issues." - -#~ msgid "Hotend Fan" -#~ msgstr "Part cooling fan" - -#~ msgid "Big Fan" -#~ msgstr "Aux. cooling fan" - -#~ msgid "Switching Presets: Unsaved Changes" -#~ msgstr "Switching presets: unsaved changes" - -#~ msgid "Show daily tip on startup" -#~ msgstr "Show Daily Tip on Startup" - -#~ msgid "" -#~ "XY separation between an object and its support. It's relative to outer " -#~ "wall line width if expressed as percentage" -#~ msgstr "" -#~ "This determines the XY separation between an object and its support. It’s " -#~ "relative to outer wall line width if expressed as a percentage." - -#~ msgid "" -#~ "Failed to save gcode file\n" -#~ "Error message: %1%" -#~ msgstr "" -#~ "Failed to save G-code file\n" -#~ "Error message: %1%" - -#~ msgid "" -#~ "Speed of outer wall which is outermost and visible. It's expressed as " -#~ "percentage relative to inner wall speed. It's used to be slower than " -#~ "inner wall speed to get better quality" -#~ msgstr "" -#~ "Speed of outer wall which is outermost and visible. It's expressed as " -#~ "percentage relative to inner wall speed. It's used to be slower than " -#~ "inner wall speed to get better quality." - -#~ msgid "Filament to print support, raft and skirt" -#~ msgstr "Filament to print support, raft and skirt" - -#~ msgid "preparing your project" -#~ msgstr "Preparing your project" - -#~ msgid "uploading..." -#~ msgstr "Uploading…" - -#~ msgid "Experimental option for adding support for sharp tails" -#~ msgstr "This is an experimental option to add support for sharp tails." - -#~ msgid "Experimental option for removing support for small overhangs" -#~ msgstr "" -#~ "This is an experimental option to remove support for small overhangs." - -#~ msgid "" -#~ "Enable this option and height of every layer except initial one will be " -#~ "automatically calculated when slicing according to the slope of model " -#~ "surface" -#~ msgstr "" -#~ "Enabling this option means the height of every layer except the first " -#~ "will be automatically calculated when slicing according to the slope of " -#~ "the model’s surface" - -#~ msgid "The z gap between the bottom support interface and object" -#~ msgstr "" -#~ "This determines the z gap between the bottom support interface and the " -#~ "object." - -#~ msgid "Wall around the support" -#~ msgstr "Support Wall" - -#~ msgid "" -#~ "If enabled, bridges may look worse but can cover longer distance. If " -#~ "disabled, bridges look better but just for shorter distance." -#~ msgstr "" -#~ "If enabled, bridges may look worse but can cover longer distance. If " -#~ "disabled, bridges look better but cover shorter distances." - -#~ msgid "Tool Rotate" -#~ msgstr "Tool rotate" - -#~ msgid "Check for Configuration Updates" -#~ msgstr "Check for configuration updates" - -#~ msgid "Enter copies Number" -#~ msgstr "Enter number of copies" - -#~ msgid "" -#~ "Switching the language will trigger the application restart.\n" -#~ "Please confirm to switch?" -#~ msgstr "" -#~ "Switching languages will trigger an application restart.\n" -#~ "Please confirm to switch." - -#~ msgid "" -#~ "Speed of internal solid infill, not the top and bottom surface. It's " -#~ "relative to sparse infill speed if it's percentage" -#~ msgstr "" -#~ "This is the speed of internal solid infill, not the top and bottom " -#~ "surface. It’s relative to sparse infill speed if it is a percentage." - -#~ msgid "" -#~ "Speed of support interface. It's relative to support speed if expressed " -#~ "as percentage" -#~ msgstr "" -#~ "This is the speed of printing support interfaces. It’s relative to " -#~ "support speed if expressed as a percentage." - -#~ msgid "" -#~ "Speed for printing support transition layers in which support infill " -#~ "direction is changed.If expressed as percentage (for example 50%) it will " -#~ "be calculated over support speed." -#~ msgstr "" -#~ "This is the speed for printing support transition layers in which support " -#~ "infill direction is changed. If expressed as a percentage (for example, " -#~ "50%), it will be calculated over support speed." - -#~ msgid "" -#~ "Speed of top surface infill which is solid. It's relative to internal " -#~ "solid infill speed if it's percentage" -#~ msgstr "" -#~ "This determines the speed of the top surface infill, which is solid. It’s " -#~ "relative to internal solid infill speed if expressed as a percentage." - -#~ msgid "" -#~ "The sequential print is on.\n" -#~ "It's impossible to apply any custom G-code for objects printing " -#~ "sequentually.\n" -#~ "This code won't be processed during G-code generation." -#~ msgstr "" -#~ "The sequential print is on.\n" -#~ "It's impossible to apply any custom G-code for objects printing " -#~ "sequentially.\n" -#~ "This code won't be processed during G-code generation." - -#~ msgid "" -#~ "One or more object were assigned an extruder that the printer does not " -#~ "have." -#~ msgstr "" -#~ "One or more objects were assigned an extruder that the printer does not " -#~ "have." - -#~ msgid "Retraction Length (Toolchange)" -#~ msgstr "Retraction Length (Tool change)" - -#~ msgid "" -#~ "A boolean expression using the configuration values of an active printer " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active printer profile." -#~ msgstr "" -#~ "A Boolean expression using the configuration values of an active printer " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active printer profile." - -#~ msgid "" -#~ "A boolean expression using the configuration values of an active print " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active print profile." -#~ msgstr "" -#~ "A Boolean expression using the configuration values of an active print " -#~ "profile. If this expression evaluates to true, this profile is considered " -#~ "compatible with the active print profile." - -#~ msgid "" -#~ "Set this to a non-zero value to allow a manual extrusion width. If left " -#~ "to zero, Slic3r derives extrusion widths from the nozzle diameter (see " -#~ "the tooltips for perimeter extrusion width, infill extrusion width etc). " -#~ "If expressed as percentage (for example: 230%), it will be computed over " -#~ "layer height." -#~ msgstr "" -#~ "Set this to a non-zero value to allow a manual extrusion width. If left " -#~ "to zero, Slic3r derives extrusion widths from the nozzle diameter (see " -#~ "the tooltips for perimeter extrusion width, infill extrusion width etc.). " -#~ "If expressed as percentage (for example: 230%), it will be computed over " -#~ "layer height." - -#~ msgid "Density of internal infill, expressed in the range 0% - 100%." -#~ msgstr "Density of internal infill, expressed in the range 0 % - 100 %." - -#~ msgid "" -#~ "If enabled, the wipe tower will not be printed on layers with no " -#~ "toolchanges. On layers with a toolchange, extruder will travel downward " -#~ "to print the wipe tower. User is responsible for ensuring there is no " -#~ "collision with the print." -#~ msgstr "" -#~ "If enabled, the wipe tower will not be printed on layers with no tool " -#~ "changes. On layers with a tool change, extruder will travel downward to " -#~ "print the wipe tower. User is responsible for ensuring there is no " -#~ "collision with the print." - -#~ msgid "" -#~ "Support material will not be generated for overhangs whose slope angle " -#~ "(90° = vertical) is above the given threshold. In other words, this value " -#~ "represent the most horizontal slope (measured from the horizontal plane) " -#~ "that you can print without support material. Set to zero for automatic " -#~ "detection (recommended)." -#~ msgstr "" -#~ "Support material will not be generated for overhangs whose slope angle " -#~ "(90° = vertical) is above the given threshold. In other words, this value " -#~ "represents the most horizontal slope (measured from the horizontal plane) " -#~ "that you can print without support material. Set to zero for automatic " -#~ "detection (recommended)." - -#~ msgid "" -#~ "This matrix describes volumes (in cubic milimetres) required to purge the " -#~ "new filament on the wipe tower for any given pair of tools." -#~ msgstr "" -#~ "This matrix describes volumes (in cubic millimetres) required to purge " -#~ "the new filament on the wipe tower for any given pair of tools." - -#~ msgid "" -#~ "Object will be used to purge the nozzle after a toolchange to save " -#~ "material that would otherwise end up in the wipe tower and decrease print " -#~ "time. Colours of the objects will be mixed as a result." -#~ msgstr "" -#~ "Object will be used to purge the nozzle after a tool change to save " -#~ "material that would otherwise end up in the wipe tower and decrease print " -#~ "time. Colours of the objects will be mixed as a result." - -#~ msgid "WHITE BULLET icon indicates a non system (or non default) preset." -#~ msgstr "WHITE BULLET icon indicates a non-system (or non-default) preset." - -#~ msgid "" -#~ "Some objects can get along with a few smaller pads instead of a single " -#~ "big one. This parameter defines how far the center of two smaller pads " -#~ "should be. If theyare closer, they will get merged into one pad." -#~ msgstr "" -#~ "Some objects can get along with a few smaller pads instead of a single " -#~ "big one. This parameter defines how far the center of two smaller pads " -#~ "should be. If they are closer, they will get merged into one pad." - -#~ msgid "Don't notify about new releases any more" -#~ msgstr "Don't notify about new releases anymore" - -#~ msgid "Buttons And Text Colors Description" -#~ msgstr "Buttons and Text Colors Description" - -#~ msgid "Before roll back" -#~ msgstr "Before rollback" - -#~ msgid "" -#~ "If enabled, %s checks for new application versions 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 "" -#~ "If enabled, %s checks for new application versions 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 mechanism, no automatic installation is done." - -#~ msgid "" -#~ "If enabled, %s downloads updates of built-in system presets in the " -#~ "background.These updates are downloaded into a separate temporary " -#~ "location.When a new preset version becomes available it is offered at " -#~ "application startup." -#~ msgstr "" -#~ "If enabled, %s downloads updates of built-in system presets in the " -#~ "background. These updates are downloaded into a separate temporary " -#~ "location. When a new preset version becomes available it is offered at " -#~ "application startup." - -#~ msgid "" -#~ "Additionally a backup snapshot of the whole configuration is created " -#~ "before an update is applied." -#~ msgstr "" -#~ "Additionally, a backup snapshot of the whole configuration is created " -#~ "before an update is applied." - -#~ msgid "Autospeed (advanced)" -#~ msgstr "Auto Speed (advanced)" - -#~ msgid "Toolchange parameters with single extruder MM printers" -#~ msgstr "Toolchange parameters with single extruder MM printers" - -#~ msgid "" -#~ "When printing multi-material objects, this settings will make Slic3r to " -#~ "clip the overlapping object parts one by the other (2nd part will be " -#~ "clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -#~ msgstr "" -#~ "When printing multi-material objects, this settings will make Slic3r to " -#~ "clip the overlapping object parts one by the other (2nd part will be " -#~ "clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc.)." - -#~ msgid "" -#~ "Add solid infill near sloping surfaces to guarantee the vertical shell " -#~ "thickness (top+bottom solid layers)." -#~ msgstr "" -#~ "Add solid infill near sloping surfaces to guarantee the vertical shell " -#~ "thickness (top + bottom solid layers)." - -#~ msgid "" -#~ "Speed used for unloading the filament on the wipe tower (does not affect " -#~ "initial part of unloading just after ramming)." -#~ msgstr "" -#~ "Speed used for unloading the filament on the wipe tower (does not affect " -#~ "initial part of unloading just after ramming)." - -#~ msgid "" -#~ "Time to wait after the filament is unloaded. May help to get reliable " -#~ "toolchanges with flexible materials that may need more time to shrink to " -#~ "original dimensions." -#~ msgstr "" -#~ "Time to wait after the filament is unloaded. May help to get reliable " -#~ "tool changes with flexible materials that may need more time to shrink to " -#~ "original dimensions." - -#~ msgid "" -#~ "When set to zero, the distance the filament is moved from parking " -#~ "position during load is exactly the same as it was moved back during " -#~ "unload. When positive, it is loaded further, if negative, the loading " -#~ "move is shorter than unloading." -#~ msgstr "" -#~ "When set to zero, the distance the filament is moved from parking " -#~ "position during load is exactly the same as it was moved back during " -#~ "unload. When positive, it is loaded further, if negative, the loading " -#~ "move is shorter than unloading." - -#~ msgid "Autogeneration will erase all manually edited points." -#~ msgstr "Auto Generation will erase all manually edited points." - -#~ msgid "Unknown error occured" -#~ msgstr "Unknown error occurred" - -#~ msgid "" -#~ "This end procedure is inserted at the end of the output file, before the " -#~ "printer end gcode (and before any toolchange from this filament in case " -#~ "of multimaterial printers). Note that you can use placeholder variables " -#~ "for all PrusaSlicer settings. If you have multiple extruders, the gcode " -#~ "is processed in extruder order." -#~ msgstr "" -#~ "This end procedure is inserted at the end of the output file, before the " -#~ "printer end gcode (and before any tool change from this filament in case " -#~ "of multimaterial printers). Note that you can use placeholder variables " -#~ "for all PrusaSlicer settings. If you have multiple extruders, the gcode " -#~ "is processed in extruder order." - -#~ msgid "" -#~ "This start procedure is inserted at the beginning, after any printer " -#~ "start gcode (and after any toolchange to this filament in case of multi-" -#~ "material printers). This is used to override settings for a specific " -#~ "filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom " -#~ "codes, such commands will not be prepended automatically so you're free " -#~ "to customize the order of heating commands and other custom actions. Note " -#~ "that you can use placeholder variables for all PrusaSlicer settings, so " -#~ "you can put a \"M109 S[first_layer_temperature]\" command wherever you " -#~ "want. If you have multiple extruders, the gcode is processed in extruder " -#~ "order." -#~ msgstr "" -#~ "This start procedure is inserted at the beginning, after any printer " -#~ "start gcode (and after any tool change to this filament in case of multi-" -#~ "material printers). This is used to override settings for a specific " -#~ "filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom " -#~ "codes, such commands will not be prepended automatically so you're free " -#~ "to customize the order of heating commands and other custom actions. Note " -#~ "that you can use placeholder variables for all PrusaSlicer settings, so " -#~ "you can put a \"M109 S[first_layer_temperature]\" command wherever you " -#~ "want. If you have multiple extruders, the gcode is processed in extruder " -#~ "order." - -#~ 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 "" -#~ "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 mechanism, no automatic installation is done." - -#~ msgid "" -#~ "Purging after toolchange will done inside this object's infills. This " -#~ "lowers the amount of waste but may result in longer print time due to " -#~ "additional travel moves." -#~ msgstr "" -#~ "Purging after tool change will done inside this object's infills. This " -#~ "lowers the amount of waste but may result in longer print time due to " -#~ "additional travel moves." - -#~ msgid "" -#~ "This custom code is inserted before every toolchange. Placeholder " -#~ "variables for all PrusaSlicer settings as well as {previous_extruder} and " -#~ "{next_extruder} can be used. When a tool-changing command which changes " -#~ "to the correct extruder is included (such as T{next_extruder}), " -#~ "PrusaSlicer will emit no other such command. It is therefore possible to " -#~ "script custom behaviour both before and after the toolchange." -#~ msgstr "" -#~ "This custom code is inserted before every tool change. Placeholder " -#~ "variables for all PrusaSlicer settings as well as {previous_extruder} and " -#~ "{next_extruder} can be used. When a tool-changing command which changes " -#~ "to the correct extruder is included (such as T{next_extruder}), " -#~ "PrusaSlicer will emit no other such command. It is therefore possible to " -#~ "script custom behaviour both before and after the tool change." +#~ msgid "User pause" +#~ msgstr "User pause" diff --git a/bbl/i18n/zh_cn/BambuStudio_zh_CN.po b/bbl/i18n/zh_cn/BambuStudio_zh_CN.po index 8c1253f832..fd99631ba2 100644 --- a/bbl/i18n/zh_cn/BambuStudio_zh_CN.po +++ b/bbl/i18n/zh_cn/BambuStudio_zh_CN.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-15 10:25+0800\n" -"PO-Revision-Date: 2022-07-13 21:50+0800\n" +"POT-Creation-Date: 2022-07-22 18:39+0800\n" +"PO-Revision-Date: 2022-07-22 13:28+0800\n" "Last-Translator: Jiang Yue \n" "Language-Team: \n" "Language: zh_CN\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.1\n" +"X-Generator: Poedit 3.0.1\n" msgid "Supports Painting" msgstr "支撑绘制" @@ -50,8 +50,8 @@ msgstr "擦除所有绘制" msgid "Highlight overhang areas" msgstr "高亮悬空区域" -msgid "Fragment filter" -msgstr "碎片过滤器" +msgid "Gap fill" +msgstr "缝隙填充" msgid "Perform" msgstr "执行" @@ -83,8 +83,8 @@ msgstr "球" msgid "Fill" msgstr "填充" -msgid "Fragment Filter" -msgstr "碎片过滤器" +msgid "Gap Fill" +msgstr "缝隙填充" msgid "Highlight faces according to overhang angle." msgstr "根据当前设置的悬空角度来高亮片面。" @@ -232,15 +232,12 @@ msgstr "世界坐标" msgid "°" msgstr "°" -msgid "Position:" -msgstr "位置:" +msgid "Size" +msgstr "大小" msgid "%" msgstr "%" -msgid "Size" -msgstr "大小" - msgid "uniform scale" msgstr "等比例缩放" @@ -423,6 +420,13 @@ msgstr "严重错误" msgid "BambuStudio got an unhandled exception: %1%" msgstr "Bambu Studio捕捉到一个未处理的异常:%1%" +msgid "Downloading Bambu Network plug-in" +msgstr "正在下载Bambu网络插件" + +#, c-format, boost-format +msgid "Connect %s[SN:%s] failed!" +msgstr "连接 %s[SN:%s]失败." + msgid "" "BambuStudio configuration file may be corrupted and is not abled to be " "parsed.Please delete the file and try again." @@ -445,12 +449,15 @@ msgstr "正在加载配置" msgid "Click to download new version in default browser: %s" msgstr "在默认浏览器中点击下载最新版本: %s" -msgid "New version of Bambu Studio" -msgstr "新版本的Bambu Studio" - msgid "The Bambu Studio needs an upgrade" msgstr "Bambu Studio需要进行升级" +msgid "This is the newest version." +msgstr "已经是最新版本。" + +msgid "Info" +msgstr "信息" + msgid "Loading user presets..." msgstr "正在加载用户预设..." @@ -472,19 +479,13 @@ msgstr "选择一个或多个文件(3mf/step/stl/obj/amf):" msgid "Choose one file (gcode/.gco/.g/.ngc/ngc):" msgstr "选择一个文件(gcode/.gco/.g/.ngc/ngc):" -msgid "Login information expired. Please login again." -msgstr "登录信息过期。请重新登录。" - msgid "" "The version of Bambu studio is too low and needs to be updated to the latest " "version before it can be used normally" msgstr "Bambu Studio版本过低,需要更新到最新版本方可正常使用" -msgid "This is the newest version." -msgstr "已经是最新版本。" - -msgid "Info" -msgstr "信息" +msgid "Login information expired. Please login again." +msgstr "登录信息过期。请重新登录。" msgid "Loading" msgstr "载入中" @@ -976,9 +977,7 @@ msgstr "走线类型" msgid "No printer" msgstr "无打印机" -msgid "" -"Heat the nozzle to target \n" -"temperature" +msgid "Heat the nozzle to target temperature" msgstr "加热喷嘴到目标温度" msgid "Cut filament" @@ -987,9 +986,7 @@ msgstr "切断耗材丝" msgid "Pull back current filament" msgstr "抽回当前耗材丝" -msgid "" -"Push new filament \n" -"into extruder" +msgid "Push new filament into extruder" msgstr "送出新的耗材丝到挤出机" msgid "Purge old filament" @@ -1058,9 +1055,6 @@ msgid "" "Arrange failed. Found some exceptions when processing object geometries." msgstr "自动摆放失败,处理对象几何数据时遇到异常。" -msgid "Arranging" -msgstr "正在摆放" - msgid "Arranging canceled." msgstr "已取消自动摆放。" @@ -1098,7 +1092,7 @@ msgid "Orienting..." msgstr "自动朝向中..." msgid "Orienting" -msgstr "自动朝向" +msgstr "自动朝向中..." msgid "Error! Unable to create thread!" msgstr "发生错误,无法创建线程。" @@ -1154,7 +1148,7 @@ msgid "Failed uploading print file" msgstr "打印任务上传失败" msgid "Wrong Access code" -msgstr "" +msgstr "访问码错误" msgid "Sending print job over LAN" msgstr "正在通过局域网发送打印任务" @@ -1162,12 +1156,39 @@ msgstr "正在通过局域网发送打印任务" msgid "Sending print job through cloud service" msgstr "正在通过云端服务发送打印任务" +msgid "Service Unavailable" +msgstr "服务不可用" + +msgid "Unkown Error." +msgstr "未知错误" + msgid "Sending print configuration" msgstr "正在发送打印配置" #, c-format, boost-format -msgid "Successfully sent.Will automatically jump to the device page in %s s" -msgstr "已发送完成,即将自动跳转到设备页面 (%s 秒)" +msgid "Successfully sent. Will automatically jump to the device page in %s s" +msgstr "已发送完成,即将自动跳转到设备页面(%s秒)" + +msgid "An SD card needs to be inserted before printing via LAN." +msgstr "需要插入SD卡后方可发送局域网打印" + +msgid "Downloading" +msgstr "下载中" + +msgid "Download failed" +msgstr "下载失败" + +msgid "Cancelled" +msgstr "已取消" + +msgid "Finish" +msgstr "完成" + +msgid "Installing" +msgstr "安装中" + +msgid "Install failed" +msgstr "安装失败" msgid "Portions copyright" msgstr "部分版权" @@ -1203,6 +1224,32 @@ msgstr "本软件使用开源组件,其版权和其他所有权属于各自的 msgid "About %s" msgstr "关于 %s" +msgid "" +"Bambu Studio is based on PrusaSlicer by PrusaResearch and SuperSlicer by " +"Merill(supermerill)." +msgstr "" +"Bambu Studio是以PrusaResearch的PrusaSlicer和Merill的SuperSlicer" +"(supermerill)为基础的。" + +msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." +msgstr "MerillPrusasicle最初是以Alessandro Ranellucci为基础的Slic3r。" + +msgid "" +"Slic3r was created by Alessandro Ranellucci with the help of many other " +"contributors." +msgstr "Slic3r是由Alessandro Ranellucci和许多其他贡献者的帮助下创建的。" + +msgid "Bambu Studio also referenced some ideas from Cura by Ultimaker." +msgstr "Bambu Studio还引入了Ultimaker从Cura提出的一些想法。" + +msgid "" +"There many parts of the software that come from community contributions, so " +"we're unable to list them one-by-one, and instead, they'll be attributed in " +"the corresponding code comments." +msgstr "" +"软件中的很多部分都来自于社区贡献,因此,我们无法逐一列出他们,相反的,他们将被" +"注释于相应的代码中。" + msgid "Colour" msgstr "颜色" @@ -1271,6 +1318,9 @@ msgstr "AMS不会在启动时自动读取耗材丝信息。它会使用上次关 msgid "File" msgstr "文件" +msgid "Close" +msgstr "关闭" + msgid "" "A error occurred. Maybe memory of system is not enough or it's a bug of the " "program" @@ -1499,8 +1549,8 @@ msgid "" "by right-click the empty position of build plate and choose \"Add Primitive" "\"->\"Timelapse Wipe Tower\".\n" msgstr "" -"推荐在录制无工具头延时摄影时,添加一个\"延时摄影擦料塔\":\n" -"在构建板的空白位置点击鼠标右键,选择\"添加标准模型\"->\"延时摄影擦料塔\"" +"在录制无工具头延时摄影视频时,建议添加“延时摄影擦料塔”\n" +"右键单击构建板的空白位置,选择“添加标准模型”->“延时摄影擦料塔”。\n" msgid "" "Prime tower does not work when Adaptive Layer Height or Independent Support " @@ -1651,6 +1701,9 @@ msgstr "验证失败。" msgid "Update failed." msgstr "更新失败。" +msgid "Failed to start printing job" +msgstr "发起打印任务失败" + msgid "N/A" msgstr "N/A" @@ -1942,11 +1995,12 @@ msgid "Only the object being edit is visible." msgstr "只有正在编辑的对象是可见的。" msgid "" -"An object is layed over the boundary of plate.\n" -"Please solve the problem by moving it totally inside or outside plate." +"An object is laid over the boundary of plate or exceeds the height limit.\n" +"Please solve the problem by moving it totally on or off the plate, and " +"confirming that the height is within the build volume." msgstr "" -"检测到有对象放置在盘的边界。\n" -"请把它整体移动到盘内或盘外以解决此问题。" +"对象被放置在构建板的边界上或超过高度限制。\n" +"请通过将其完全移动到构建板内或构建板外,并确认高度在构建空间以内来解决问题。" msgid "Calibration" msgstr "校准" @@ -1968,6 +2022,9 @@ msgstr "校准流程" msgid "Start Calibration" msgstr "开始校准" +msgid "Completed" +msgstr "已完成" + msgid "Calibrating" msgstr "校准中" @@ -1990,36 +2047,6 @@ msgstr "" "你可以在打印机“设置->网络->连接->访问码\"\n" "查看,如下图所示:" -msgid "Creating" -msgstr "正在创建" - -msgid "Uploading" -msgstr "正在上传" - -msgid "Waiting" -msgstr "等待中" - -msgid "Sending" -msgstr "发送中" - -msgid "Finished" -msgstr "完成" - -msgid "Please fill report first." -msgstr "请先填写报告。" - -msgid "Unable to create zip file" -msgstr "无法创建zip压缩文件" - -msgid "Enter a search term" -msgstr "输入搜索内容" - -msgid "Online" -msgstr "在线" - -msgid "Offline" -msgstr "离线" - msgid "Application is closing" msgstr "正在关闭应用程序" @@ -2041,9 +2068,6 @@ msgstr "设备" msgid "Project" msgstr "项目" -msgid "Debug" -msgstr "调试" - msgid "Slice" msgstr "切片" @@ -2161,6 +2185,12 @@ msgstr "导出所有对象为STL" msgid "Export current Sliced file" msgstr "导出当前已切片的文件" +msgid "Export G-code" +msgstr "导出 G-code" + +msgid "Export current plate as G-code" +msgstr "导出当前盘的G-code" + msgid "Export" msgstr "导出" @@ -2218,24 +2248,6 @@ msgstr "取消所有选中" msgid "Deselects all objects" msgstr "取消所有选中" -msgid "Show Model Mesh(TODO)" -msgstr "显示模型网格" - -msgid "Display triangles of models" -msgstr "显示模型面片" - -msgid "Show Model Shadow(TODO)" -msgstr "显示模型阴影" - -msgid "Display shadow of objects" -msgstr "显示对象阴影" - -msgid "Show Printable Box(TODO)" -msgstr "显示打印区边界" - -msgid "Display printable box" -msgstr "显示打印区边界" - msgid "Use Perspective View" msgstr "使用透视视角" @@ -2305,15 +2317,15 @@ msgstr "打印丝设置" msgid "" "Do you want to synchronize your personal data from Bambu Cloud? \n" -"Contains the following information:\n" +"It contains the following information:\n" "1. The Process presets\n" "2. The Filament presets\n" "3. The Printer presets\n" msgstr "" -"是否从Bambu云同步您的个人数据?\n" -"包含以下信息:\n" +"想从Bambu 云同步你的个人数据吗?\n" +"包含如下信息:\n" "1. 工艺预设\n" -"2. 耗材丝预设\n" +"2. 打印丝预设\n" "3. 打印机预设\n" msgid "Synchronization" @@ -2366,11 +2378,11 @@ msgstr "选项:" msgid "Swap Y/Z axes" msgstr "交换Y/Z轴" -msgid "Close" -msgstr "关闭" +msgid "Camera" +msgstr "摄像机" -msgid "Monitoring" -msgstr "实时视频" +msgid "Video" +msgstr "录像" msgid "Printing Progress" msgstr "打印进度" @@ -2411,6 +2423,9 @@ msgstr "调试信息" msgid "Printing List" msgstr "项目切片" +msgid "Downloading..." +msgstr "下载中..." + msgid "Resume" msgstr "继续" @@ -2438,15 +2453,15 @@ msgstr "固件更新" msgid "HMS" msgstr "" -msgid "Please upgrade your printer first" -msgstr "请先升级打印机固件" - msgid "Failed to connect to the server" msgstr "无法连接服务器" msgid "Failed to connect to the printer" msgstr "无法连接打印机" +msgid "Connecting..." +msgstr "连接中..." + msgid "OK" msgstr "确认" @@ -2556,6 +2571,9 @@ msgstr "导出成功." msgid " (Repair)" msgstr "(修复)" +msgid " Click here to install it." +msgstr "点击此处安装" + msgid "WARNING:" msgstr "警告:" @@ -2624,7 +2642,7 @@ msgid "Advance" msgstr "高级" msgid "Compare presets" -msgstr "配置集比较" +msgstr "比较预设" msgid "View all object's settings" msgstr "查看所有对象的配置" @@ -2749,11 +2767,6 @@ msgstr "将这些文件加载为一个多零件对象?\n" msgid "Object with multiple parts was detected" msgstr "检测到多零件对象" -msgid "" -"Preview only mode:\n" -"The loaded file contains gcode only." -msgstr "" - msgid "The file does not contain any geometry data." msgstr "此文件不包含任何几何数据。" @@ -2791,6 +2804,17 @@ msgstr "正在切片盘%d" msgid "Please resolve the slicing errors and publish again." msgstr "请解决切片错误后再重新发布。" +msgid "" +"Network Plug-in is not detected. Network related features are unavailable." +msgstr "未检测到网络插件。网络相关功能不可用。" + +msgid "" +"Preview only mode:\n" +"The loaded file contains gcode only, Can not enter the Prepare page" +msgstr "" +"仅预览模式:\n" +"被加载的文件仅包含G-Code,不支持进入准备页面" + msgid "Some presets are modified." msgstr "预设已被修改。" @@ -2808,9 +2832,6 @@ msgstr "创建新项目" msgid "Load project" msgstr "加载项目" -msgid "Preview only mode for gcode file." -msgstr "" - msgid "The selected file" msgstr "已选择的文件" @@ -2836,10 +2857,10 @@ msgid "Only one G-code file can be opened at the same time." msgstr "只能同时打开一个G-code文件。" msgid "Can not add models when in preview mode!" -msgstr "" +msgstr "在预览模式不允许添加模型" msgid "Add Models" -msgstr "" +msgstr "添加模型" msgid "All objects will be removed, continue?" msgstr "即将删除所有对象,是否继续?" @@ -2869,9 +2890,6 @@ msgstr "" "逐件打印:\n" "建议使用自动摆盘避免打印时发生碰撞。" -msgid "Export G-code" -msgstr "导出 G-code" - msgid "Send G-code" msgstr "发送 G 代码" @@ -3089,7 +3107,7 @@ msgstr "保存调试设置" msgid "DEBUG settings have saved successfully!" msgstr "DEBUG模式生效!" -msgid "Swith cloud environment, Please login again!" +msgid "Switch cloud environment, Please login again!" msgstr "切换云环境,请重新登录!" msgid "System presets" @@ -3221,6 +3239,12 @@ msgstr "为“%1%”,添加“%2%”为一个新预设" msgid "Simply switch to \"%1%\"" msgstr "直接切换到“%1%”" +msgid "Online" +msgstr "在线" + +msgid "Offline" +msgstr "离线" + msgid "My Device" msgstr "我的设备" @@ -3230,6 +3254,9 @@ msgstr "其他设备" msgid "Input access code" msgstr "输入访问码" +msgid "Log out successful." +msgstr "登出成功。" + msgid "Busy" msgstr "忙碌" @@ -3270,7 +3297,7 @@ msgid "Synchronizing device information" msgstr "正在同步设备信息" msgid "Synchronizing device information time out" -msgstr "同步设备信息超时,请重试" +msgstr "同步设备信息超时" msgid "Cannot send the print task when the upgrade is in progress" msgstr "设备升级中,无法发送打印任务" @@ -3282,10 +3309,8 @@ msgstr "打印机正在执行指令,请在其结束后重新发起打印" msgid "The printer is busy on other print job" msgstr "打印机正在执行其他打印任务" -msgid "" -"The firmware versions of printer and AMS are too low.Please update to the " -"latest version before sending the print job" -msgstr "打印机和AMS固件版本过低,请更新到最新版本方可发送打印" +msgid "Printer firmware does not support material = >ams slot mapping." +msgstr "打印机固件不支持材料=>AMS槽位映射" msgid "" "Filaments to AMS slots mappings have been established. You can click a " @@ -3326,9 +3351,6 @@ msgstr "请先登录。" msgid "There was a problem connecting to the printer. Please try again." msgstr "连接打印机时发生错误。 请重试。" -msgid "Log out successful." -msgstr "登出成功。" - msgid "Failed to log out." msgstr "登出失败。" @@ -3390,8 +3412,8 @@ msgstr "换料冲刷选项" msgid "Special mode" msgstr "特殊模式" -msgid "Output file" -msgstr "输出文件" +msgid "G-code output" +msgstr "G-code 输出" msgid "Frequent" msgstr "常用" @@ -4624,6 +4646,20 @@ msgstr "" "不对整个桥接面进行支撑,否则支撑体会很大。不是很长的桥接通常可以无支撑直接打" "印。" +msgid "Thick bridges" +msgstr "厚桥" + +msgid "Layers and Perimeters" +msgstr "层和墙" + +msgid "" +"If enabled, bridges are more reliable, can bridge longer distances, but may " +"look worse. If disabled, bridges look better but are reliable just for " +"shorter bridged distances." +msgstr "" +"如果启用,桥接会更可靠,可以桥接更长的距离,但可能看起来更糟。如果关闭,桥梁" +"看起来更好,但只适用于较短的桥接距离。" + msgid "Max bridge length" msgstr "最大桥接长度" @@ -5273,8 +5309,11 @@ msgstr "减小填充回抽" msgid "" "Don't retract when the travel is in infill area absolutely. That means the " -"oozing can't been seen" -msgstr "当完全在填充区域内部空驶时不会抽,即便渗出滴料也是不可见的。" +"oozing can't been seen. This can reduce times of retraction for complex " +"model and save printing time, but make slicing and G-code generating slower" +msgstr "" +"当空驶完全在填充区域内时不触发回抽。这意味着即使漏料也是不可见的。对于复杂模" +"型,该设置能够减少回抽次数以及打印时长,但是会造成G-code生成变慢" msgid "Enable" msgstr "开启" @@ -5477,9 +5516,8 @@ msgid "" "snapshot is taken with the chamber camera. When printing finishes a " "timelapse video is composed of all the snapshots." msgstr "" -"录制无工具头延时摄影。在这种模式下,工具头会在每层切换时停靠在吐料槽附近,同" -"时机箱摄像头会记录一张快照。当打印结束时,所有这些快照会组成一段延时摄影录" -"像。" +"录制打印的延时摄影视频,但不显示工具头。在该模式下,工具头会在换层时停靠在吐" +"料槽附近,然后用内置相机拍摄快照。打印完成后,把所有快照组成延时摄影视频。" msgid "Temperature variation" msgstr "软化温度" @@ -6010,21 +6048,146 @@ msgstr "支撑:正在修补层%d的空洞" msgid "Support: propagate branches at layer %d" msgstr "支撑:正在生长层%d的树枝" +#~ msgid "Creating" +#~ msgstr "正在创建" + +#~ msgid "Uploading" +#~ msgstr "正在上传" + +#~ msgid "Waiting" +#~ msgstr "等待中" + +#~ msgid "Sending" +#~ msgstr "发送中" + +#~ msgid "Finished" +#~ msgstr "完成" + +#~ msgid "Please fill report first." +#~ msgstr "请先填写报告。" + +#~ msgid "Unable to create zip file" +#~ msgstr "无法创建zip压缩文件" + +#~ msgid "Enter a search term" +#~ msgstr "输入搜索内容" + +#~ msgid "Debug" +#~ msgstr "调试" + +#~ msgid "Monitoring" +#~ msgstr "实时视频" + +#~ msgid "Record monitor video" +#~ msgstr "录制监控视频" + +#~ msgid "Fragment filter" +#~ msgstr "碎片过滤器" + +#~ msgid "Fragment Filter" +#~ msgstr "碎片过滤器" + +#~ msgid "Position:" +#~ msgstr "位置:" + +#~ msgid "Updating Bambu Network plug-in" +#~ msgstr "正在更新Bambu网络插件" + +#~ msgid "" +#~ "An object is layed over the boundary of plate.\n" +#~ "Please solve the problem by moving it totally inside or outside plate." +#~ msgstr "" +#~ "检测到有对象放置在盘的边界。\n" +#~ "请把它整体移动到盘内或盘外以解决此问题。" + +#~ msgid "Show Model Mesh(TODO)" +#~ msgstr "显示模型网格" + +#~ msgid "Display triangles of models" +#~ msgstr "显示模型面片" + +#~ msgid "Show Model Shadow(TODO)" +#~ msgstr "显示模型阴影" + +#~ msgid "Display shadow of objects" +#~ msgstr "显示对象阴影" + +#~ msgid "Show Printable Box(TODO)" +#~ msgstr "显示打印区边界" + +#~ msgid "Display printable box" +#~ msgstr "显示打印区边界" + +#~ msgid "" +#~ "Do you want to synchronize your personal data from Bambu Cloud? \n" +#~ "It ontains the following information:\n" +#~ "1. The Process presets\n" +#~ "2. The Filament presets\n" +#~ "3. The Printer presets\n" +#~ msgstr "" +#~ "想从Bambu 云同步你的个人数据吗?\n" +#~ "包含如下信息:\n" +#~ "1. 工艺预设\n" +#~ "2. 打印丝预设\n" +#~ "3. 打印机预设\n" + +#~ msgid "New version of Bambu Studio" +#~ msgstr "新版本的Bambu Studio" + #~ msgid "Fix model through cloud" #~ msgstr "通过云端修复模型" #~ msgid "Fix model locally" #~ msgstr "本地修复模型" -#~ msgid "Arranging %1%" -#~ msgstr "正在自动摆放%1%" - -#~ msgid "Orienting %1%" -#~ msgstr "自动朝向%1%中..." - #~ msgid "Module" #~ msgstr "模块" +#~ msgid "" +#~ "Heat the nozzle to target \n" +#~ "temperature" +#~ msgstr "加热喷嘴到目标温度" + +#~ msgid "" +#~ "Push new filament \n" +#~ "into extruder" +#~ msgstr "送出新的耗材丝到挤出机" + +#~ msgid "Successfully sent.Will automatically jump to the device page in %s s" +#~ msgstr "已发送完成,即将自动跳转到设备页面 (%s 秒)" + +#~ msgid "" +#~ "Do you want to synchronize your personal data from Bambu Cloud? \n" +#~ "Contains the following information:\n" +#~ "1. The Process presets\n" +#~ "2. The Filament presets\n" +#~ "3. The Printer presets\n" +#~ msgstr "" +#~ "是否从Bambu云同步您的个人数据?\n" +#~ "包含以下信息:\n" +#~ "1. 工艺预设\n" +#~ "2. 耗材丝预设\n" +#~ "3. 打印机预设\n" + +#~ msgid "Please upgrade your printer first" +#~ msgstr "请先升级打印机固件" + +#~ msgid "Swith cloud environment, Please login again!" +#~ msgstr "切换云环境,请重新登录!" + +#~ msgid "" +#~ "The firmware versions of printer and AMS are too low.Please update to the " +#~ "latest version before sending the print job" +#~ msgstr "打印机和AMS固件版本过低,请更新到最新版本方可发送打印" + +#~ msgid "Output file" +#~ msgstr "输出文件" + +#~ msgid "" +#~ "Don't retract when the travel is in infill area absolutely. That means " +#~ "the oozing can't been seen" +#~ msgstr "当完全在填充区域内部空驶时不会抽,即便渗出滴料也是不可见的。" + #~ msgid "⌥+Mouse wheel" #~ msgstr "⌥+鼠标滚轮" @@ -7187,9 +7350,6 @@ msgstr "支撑:正在生长层%d的树枝" #~ "该盘处于锁定状态,\n" #~ "无法对其进行自动朝向" -#~ msgid "Export current plate as G-code" -#~ msgstr "导出当前盘的G-code" - #~ msgid "Choose the position" #~ msgstr "选择AMS料仓" @@ -7418,9 +7578,6 @@ msgstr "支撑:正在生长层%d的树枝" #~ msgid "Wall around the support" #~ msgstr "支撑外壁" -#~ msgid "Thick bridges" -#~ msgstr "桥接面大层高" - #~ msgid "" #~ "If enabled, bridges may look worse but can cover longer distance. If " #~ "disabled, bridges look better but just for shorter distance." diff --git a/doc/Dependencies.md b/doc/Dependencies.md deleted file mode 100644 index f37f454668..0000000000 --- a/doc/Dependencies.md +++ /dev/null @@ -1,35 +0,0 @@ -# Dependency report for PrusaSlicer -## Possible dynamic linking on Linux -* zlib: Strict dependency required from the system, linked dynamically. Many other libs depend on zlib. -* wxWidgets: searches for wx-3.1 by default, but with cmake option `SLIC3R_WX_STABLE=ON` it will use wx-3.0 bundled with most distros. -* libcurl -* tbb -* boost -* eigen -* glew -* expat -* openssl -* nlopt -* openvdb: This library depends on other libs, namely boost, zlib, openexr, blosc (not strictly), etc... -* CGAL: Needs additional dependencies - * MPFR - * GMP - -## External libraries in source tree -* ad-mesh: Lots of customization, have to be bundled in the source tree. -* avrdude: Like ad-mesh, many customization, need to be in the source tree. -* clipper: An important library we have to have full control over it. We also have some slicer specific modifications. -* glu-libtess: This is an extract of the mesa/glu library not officially available as a package. -* imgui: no packages for debian, author suggests using in the source tree -* miniz: No packages, author suggests using in the source tree -* qhull: libqhull-dev does not contain libqhullcpp => link errors. Until it is fixed, we will use the builtin version. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=925540 -* semver: One module C library, author expects to use clib for installation. No packages. -* Shiny: no packages - -## Header only -* igl -* nanosvg -* agg -* catch2: Only Arch has packages for catch2, other distros at most catch (v1.x). Being strictly header only, we bundle this in the source tree. Used for the unit-test suites. - - diff --git a/doc/How to build - Linux et al.md b/doc/How to build - Linux et al.md index d0e3056f27..6da6b92306 100644 --- a/doc/How to build - Linux et al.md +++ b/doc/How to build - Linux et al.md @@ -1,131 +1,4 @@ -# Building PrusaSlicer on UNIX/Linux +# Building Bambu Studio on UNIX/Linux -Please understand that PrusaSlicer team cannot support compilation on all possible Linux distros. Namely, we cannot help troubleshoot OpenGL driver issues or dependency issues if compiled against distro provided libraries. **We can only support PrusaSlicer statically linked against the dependencies compiled with the `deps` scripts**, the same way we compile PrusaSlicer for our [binary builds](https://github.com/prusa3d/PrusaSlicer/releases). - -If you have some reason to link dynamically to your system libraries, you are free to do so, but we can not and will not troubleshoot any issues you possibly run into. - -Instead of compiling PrusaSlicer from source code, one may also consider to install PrusaSlicer [pre-compiled by contributors](https://github.com/prusa3d/PrusaSlicer/wiki/PrusaSlicer-on-Linux---binary-distributions). - -## Step by step guide - -This guide describes building PrusaSlicer statically against dependencies pulled by our `deps` script. Running all the listed commands in order should result in successful build. - -#### 0. Prerequisities - -GNU build tools, CMake, git and other libraries have to be installed on the build machine. -Unless that's already the case, install them as usual from your distribution packages. -E.g. on Ubuntu 20.10, run -```shell -sudo apt-get install -y \ -git \ -build-essential \ -autoconf \ -cmake \ -libglu1-mesa-dev \ -libgtk-3-dev \ -libdbus-1-dev \ - -``` -The names of the packages may be different on different distros. - -#### 1. Cloning the repository - - -Cloning the repository is simple thanks to git and Github. Simply `cd` into wherever you want to clone PrusaSlicer code base and run -``` -git clone https://www.github.com/prusa3d/PrusaSlicer -cd PrusaSlicer -``` -This will download the source code into a new directory and `cd` into it. You can now optionally select a tag/branch/commit to build using `git checkout`. Otherwise, `master` branch will be built. - - -#### 2. Building dependencies - -PrusaSlicer uses CMake and the build is quite simple, the only tricky part is resolution of dependencies. The supported and recommended way is to build the dependencies first and link to them statically. PrusaSlicer source base contains a CMake script that automatically downloads and builds the required dependencies. All that is needed is to run the following (from the top of the cloned repository): - - cd deps - mkdir build - cd build - cmake .. -DDEP_WX_GTK3=ON - make - cd ../.. - - -**Warning**: Once the dependency bundle is installed in a destdir, the destdir cannot be moved elsewhere. This is because wxWidgets hardcode the installation path. - - -#### 3. Building PrusaSlicer - -Now when the dependencies are compiled, all that is needed is to tell CMake that we are interested in static build and point it to the dependencies. From the top of the repository, run - - mkdir build - cd build - cmake .. -DSLIC3R_STATIC=1 -DSLIC3R_GTK=3 -DSLIC3R_PCH=OFF -DCMAKE_PREFIX_PATH=$(pwd)/../deps/build/destdir/usr/local - make -j4 - -And that's it. It is now possible to run the freshly built PrusaSlicer binary: - - cd src - ./prusa-slicer - - - - -## Useful CMake flags when building dependencies - -- `-DDESTDIR=` allows to specify a directory where the dependencies will be installed. When not provided, the script creates and uses `destdir` directory where cmake is run. - -- `-DDEP_DOWNLOAD_DIR=` specifies a directory to cache the downloaded source packages for each library. Can be useful for repeated builds, to avoid unnecessary network traffic. - -- `-DDEP_WX_GTK3=ON` builds wxWidgets (one of the dependencies) against GTK3 (defaults to OFF) - - -## Useful CMake flags when building PrusaSlicer -- `-DSLIC3R_ASAN=ON` enables gcc/clang address sanitizer (defaults to `OFF`, requires gcc>4.8 or clang>3.1) -- `-DSLIC3R_GTK=3` to use GTK3 (defaults to `2`). Note that wxWidgets must be built against the same GTK version. -- `-DSLIC3R_STATIC=ON` for static build (defaults to `OFF`) -- `-DSLIC3R_WX_STABLE=ON` to look for wxWidgets 3.0 (defaults to `OFF`) -- `-DCMAKE_BUILD_TYPE=Debug` to build in debug mode (defaults to `Release`) - -See the CMake files to get the complete list. - - - -## Building dynamically - -As already mentioned above, dynamic linking of dependencies is possible, but PrusaSlicer team is unable to troubleshoot (Linux world is way too complex). Feel free to do so, but you are on your own. Several remarks though: - -The list of dependencies can be easily obtained by inspecting the CMake scripts in the `deps/` directory. Some of the dependencies don't have to be as recent as the versions listed - generally versions available on conservative Linux distros such as Debian stable, Ubuntu LTS releases or Fedora are likely sufficient. If you decide to build this way, it is your responsibility to make sure that CMake finds all required dependencies. It is possible to look at your distribution PrusaSlicer package to see how the package maintainers solved the dependency issues. - -#### wxWidgets -By default, PrusaSlicer looks for wxWidgets 3.1. Our build script in fact downloads specific patched version of wxWidgets. If you want to link against wxWidgets 3.0 (which are still provided by most distributions because wxWidgets 3.1 have not yet been declared stable), you must set `-DSLIC3R_WX_STABLE=ON` when running CMake. Note that while PrusaSlicer can be linked against wWidgets 3.0, the combination is not well tested and there might be bugs in the resulting application. - -When building on ubuntu 20.04 focal fossa, the package libwxgtk3.0-gtk3-dev needs to be installed instead of libwxgtk3.0-dev and you should use: -``` --DSLIC3R_WX_STABLE=1 -DSLIC3R_GTK=3 -``` - -## Miscellaneous - -### Installation - -At runtime, PrusaSlicer needs a way to access its resource files. By default, it looks for a `resources` directory relative to its binary. - -If you instead want PrusaSlicer installed in a structure according to the File System Hierarchy Standard, use the `SLIC3R_FHS` flag - - cmake .. -DSLIC3R_FHS=1 - -This will make PrusaSlicer look for a fixed-location `share/slic3r-prusa3d` directory instead (note that the location becomes hardcoded). - -You can then use the `make install` target to install PrusaSlicer. - -### Desktop Integration (PrusaSlicer 2.4 and newer) - -If PrusaSlicer is to be distributed as an AppImage or a binary blob (.tar.gz and similar), then a desktop integration support is compiled in by default: PrusaSlicer will offer to integrate with desktop by manually copying the desktop file and application icon into user's desktop configuration. The built-in desktop integration is also handy on Crosstini (Linux on Chrome OS). - -If PrusaSlicer is compiled with `SLIC3R_FHS` enabled, then a desktop integration support will not be integrated. One may want to disable desktop integration by running - - cmake .. -DSLIC3R_DESKTOP_INTEGRATION=0 - -when building PrusaSlicer for flatpack or snap, where the desktop integration is performed by the installer. +Currently Linux version is not verified, you can try it referring to [PrusaSlicer'S linux building guide](https://github.com/prusa3d/PrusaSlicer/blob/master/doc/How%20to%20build%20-%20Linux%20et%20al.md) \ No newline at end of file diff --git a/doc/How to build - Mac OS.md b/doc/How to build - Mac OS.md index 5c2019454e..b6336d5f5b 100644 --- a/doc/How to build - Mac OS.md +++ b/doc/How to build - Mac OS.md @@ -1,109 +1,41 @@ -# Building PrusaSlicer on Mac OS +# Building Bambu Studio on Mac OS -To build PrusaSlicer on Mac OS, you will need the following software: +## Enviroment setup +Install Following tools: +- Xcode from app store +- Cmake +- git +- gettext -- XCode -- CMake -- git -- gettext +Cmake, git, gettext can be installed from brew(brew install cmake git gettext) -XCode is available through Apple's App Store, the other three tools are available on -[brew](https://brew.sh/) (use `brew install cmake git gettext` to install them). +## building the deps +You need to build the dependence of BambuStudio first. (Only needs for the first time) -### Dependencies +Suppose you download the codes into /Users/_username_/work/projects/BambuStudio +create a directory to store the dependence built: /Users/_username_/work/projects/BambuStudio_dep +**(Please make sure to replace the username with the one on your computer)** -PrusaSlicer comes with a set of CMake scripts to build its dependencies, it lives in the `deps` directory. -Open a terminal window and navigate to PrusaSlicer sources directory and then to `deps`. -Use the following commands to build the dependencies: +`cd BambuStudio/deps` +`mkdir build;cd build` - mkdir build - cd build - cmake .. - make +for arm64 architecture +`cmake ../ -DDESTDIR="/Users/username/work/projects/BambuStudio_dep" -DOPENSSL_ARCH="darwin64-arm64-cc"` +for x86 architeccture +`cmake ../ -DDESTDIR="/Users/username/work/projects/BambuStudio_dep" -DOPENSSL_ARCH="darwin64-x86_64-cc"` +`make -jN` (N can be a number between 1 and the max cpu number) -This will create a dependencies bundle inside the `build/destdir` directory. -You can also customize the bundle output path using the `-DDESTDIR=` option passed to `cmake`. +## building the Bambu Studio +create a directory to store the installed files at /Users/username/work/projects/BambuStudio/install_dir +`cd BambuStudio` +`mkdir install_dir` +`mkdir build;cd build` -**Warning**: Once the dependency bundle is installed in a destdir, the destdir cannot be moved elsewhere. -(This is because wxWidgets hardcodes the installation path.) +building it use cmake +`cmake .. -DBBL_RELEASE_TO_PUBLIC=1 -DCMAKE_PREFIX_PATH="/Users/username/work/projects/BambuStudio_dep/usr/local" -DCMAKE_INSTALL_PREFIX="../install_dir" -DCMAKE_BUILD_TYPE=Release -DCMAKE_MACOSX_RPATH=ON -DCMAKE_INSTALL_RPATH="/Users/username/work/projects/BambuStudio_dep/usr/local" -DCMAKE_MACOSX_BUNDLE=on` +`cmake --build . --target install --config Release -jN` -FIXME The Cereal serialization library needs a tiny patch on some old OSX clang installations -https://github.com/USCiLab/cereal/issues/339#issuecomment-246166717 - - -### Building PrusaSlicer - -If dependencies are built without errors, you can proceed to build PrusaSlicer itself. -Go back to top level PrusaSlicer sources directory and use these commands: - - mkdir build - cd build - cmake .. -DCMAKE_PREFIX_PATH="$PWD/../deps/build/destdir/usr/local" - -The `CMAKE_PREFIX_PATH` is the path to the dependencies bundle but with `/usr/local` appended - if you set a custom path -using the `DESTDIR` option, you will need to change this accordingly. **Warning:** the `CMAKE_PREFIX_PATH` needs to be an absolute path. - -The CMake command above prepares PrusaSlicer for building from the command line. -To start the build, use - - make -jN - -where `N` is the number of CPU cores, so, for example `make -j4` for a 4-core machine. - -Alternatively, if you would like to use XCode GUI, modify the `cmake` command to include the `-GXcode` option: - - cmake .. -GXcode -DCMAKE_PREFIX_PATH="$PWD/../deps/build/destdir/usr/local" - -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 - -By default PrusaSlicer builds against whichever SDK is the default on the current system. - -This can be customized. The `CMAKE_OSX_SYSROOT` option sets the path to the SDK directory location -and the `CMAKE_OSX_DEPLOYMENT_TARGET` option sets the target OS X system version (eg. `10.14` or similar). -Note you can set just one value and the other will be guessed automatically. -In case you set both, the two settings need to agree with each other. (Building with a lower deployment target -is currently unsupported because some of the dependencies don't support this, most notably wxWidgets.) - -Please note that the `CMAKE_OSX_DEPLOYMENT_TARGET` and `CMAKE_OSX_SYSROOT` options need to be set the same -on both the dependencies bundle as well as PrusaSlicer itself. - -Official Mac PrusaSlicer builds are currently built against SDK 10.9 to ensure compatibility with older Macs. - -_Warning:_ XCode may be set such that it rejects SDKs bellow some version (silently, more or less). -This is set in the property list file - - /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Info.plist - -To remove the limitation, simply delete the key `MinimumSDKVersion` from that file. - - -# TL; DR - -Works on a fresh installation of MacOS Catalina 10.15.6 - -- Install [brew](https://brew.sh/): -- Open Terminal - -- Enter: - -``` -brew update -brew install cmake git gettext -brew upgrade -git clone https://github.com/prusa3d/PrusaSlicer/ -cd PrusaSlicer/deps -mkdir build -cd build -cmake .. -make -cd ../.. -mkdir build -cd build -cmake .. -DCMAKE_PREFIX_PATH="$PWD/../deps/build/destdir/usr/local" -make -src/prusa-slicer -``` +building it use xcode +`cmake .. -GXcode -DBBL_RELEASE_TO_PUBLIC=1 -DCMAKE_PREFIX_PATH="/Users/username/work/projects/BambuStudio_dep/usr/local" -DCMAKE_INSTALL_PREFIX="../install_dir" -DCMAKE_BUILD_TYPE=Release -DCMAKE_MACOSX_RPATH=ON -DCMAKE_INSTALL_RPATH="/Users/username/work/projects/BambuStudio_dep/usr/local" -DCMAKE_MACOSX_BUNDLE=on` +then building it using Xcode \ No newline at end of file diff --git a/doc/How to build - Windows.md b/doc/How to build - Windows.md index d0da05d7b5..3d9e8db3b6 100644 --- a/doc/How to build - Windows.md +++ b/doc/How to build - Windows.md @@ -1,216 +1,36 @@ -# Step by Step Visual Studio 2019 Instructions +# Building Bambu Studio on Windows -### Install the tools +## Enviroment setup +Install Following tools: +- Visual Studio Community 2019 from [visualstudio.microsoft.com/vs/](https://visualstudio.microsoft.com/vs/) (Older versions are not supported as Bambu Studio requires support for C++17, and newer versions should also be ok); +- Cmake from [cmake.org](https://cmake.org/download/) +- Git from [gitforwindows.org](https://gitforwindows.org/) +- Perl from [strawberryperl](https://strawberryperl.com/) -Install Visual Studio Community 2019 from [visualstudio.microsoft.com/vs/](https://visualstudio.microsoft.com/vs/). Older versions are not supported as PrusaSlicer requires support for C++17. -Select all workload options for C++ and make sure to launch Visual Studio after install (to ensure that the full setup completes). +## building the deps +Suppose you download the codes into D:/work/Projects/BambuStudio +create a directory to store the dependence built: D:/work/Projects/BambuStudio_dep -Install git for Windows from [gitforwindows.org](https://gitforwindows.org/) -Download and run the exe accepting all defaults +`cd BambuStudio/deps` +`mkdir build;cd build` +`cmake ../ -G "Visual Studio 16 2019" -DDESTDIR="D:/work/Projects/BambuStudio_dep" -DCMAKE_BUILD_TYPE=Release` +`msbuild /m ALL_BUILD.vcxproj` -### Download sources +It takes "00:14:27.37" to finish it on my machine (11th Gen Intel(R) Core(TM) i9-11900 @2.50GHz 2.50 GHz, with 32.0 GB DDR) -Clone the respository. To place it in C:\src\PrusaSlicer, run: -``` -c:> mkdir src -c:> cd src -c:\src> git clone https://github.com/prusa3d/PrusaSlicer.git -``` +## building the Bambu Studio +create a directory to store the installed files at D:/work/Projects/BambuStudio/install_dir +`cd BambuStudio` +`mkdir install_dir` +`mkdir build;cd build` -### Run the automatic build script +set -DWIN10SDK_PATH to your windows sdk path(for example: C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0) in below command: +`cmake .. -G "Visual Studio 16 2019" -DBBL_RELEASE_TO_PUBLIC=1 -DCMAKE_PREFIX_PATH="D:/work/Projects/BambuStudio_dep/usr/local" -DCMAKE_INSTALL_PREFIX="../install_dir" -DCMAKE_BUILD_TYPE=Release -DWIN10SDK_PATH="C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0"` -The script `build_win.bat` will automatically find the default Visual Studio installation, set up the build environment, and then run both CMake and MSBuild to generate the dependencies and application as needed. If you'd rather do these steps manually, you can skip to the [Manual Build Instructions](#manual-build-instructions) in the next section. Otherwise, just run the following command to get everything going with the default configs: +then build it using command +`cmake --build . --target install --config Release` -``` -c:\src>cd c:\src\PrusaSlicer -c:\src\PrusaSlicer>build_win.bat -d=..\PrusaSlicer-deps -r=console -``` +or building it under the Visual Studio 2019 +(set the BambuStudio_app_gui as start project) +![image](https://user-images.githubusercontent.com/106916061/179185940-06135b47-f2a4-415a-9be4-666680fa0f9a.png) -The build script will run for a while (over an hour, depending on your machine) and automatically perform the following steps: -1. Configure and build [deps](#compile-the-dependencies) as RelWithDebInfo with `c:\src\PrusaSlicer-deps` as the destination directory -2. Configure and build all [application targets](#compile-prusaslicer) as RelWithDebInfo -3. Launch the resulting `prusa-slicer-console.exe` binary - -You can change the above command line options to do things like: -* Change the destination for the dependencies by pointing `-d` to a different directory such as: `build_win.bat -d=s:\PrusaSlicerDeps` -* Open the solution in Visual Studio after the build completes by changing the `-r` switch to `-r=ide` -* Generate a release build without debug info by adding `-c=Release` or a full debug build with `-c=Debug` -* Perform an incremental application build (the default) with: `build_win.bat -s=app-dirty` -* Clean and rebuild the application: `build_win.bat -s=app` -* Clean and rebuild the dependencies: `build_win.bat -s=deps` -* Clean and rebuild everything (app and deps): `build_win.bat -s=all` -* _The full list of build script options can be listed by running:_ `build_win.bat -?` - -### Troubleshooting - -You're best off initiating builds from within Visual Studio for day-to-day development. However, the `build_win.bat` script can be very helpful if you run into build failures after updating your source tree. Here are some tips to keep in mind: -* The last several lines of output from `build_win.bat` will usually have the most helpful error messages. -* If CMake complains about missing binaries or paths (e.g. after updating Visual Studio), building with `build_win.bat` will force CMake to regenerate its cache on an error. -* After a deps change, you may just need to rebuild everything with the `-s=all` switch. -* Reading through the instructions in the next section may help diagnose more complex issues. - -# Manual Build Instructions - -_Follow the steps below if you want to understand how to perform a manual build, or if you're troubleshooting issues with the automatic build script._ - -### Compile the dependencies. -Dependencies are updated seldomly, thus they are compiled out of the PrusaSlicer source tree. -Go to the Windows Start Menu and Click on "Visual Studio 2019" folder, then select the ->"x64 Native Tools Command Prompt" to open a command window and run the following: -``` -cd c:\src\PrusaSlicer\deps -mkdir build -cd build -cmake .. -G "Visual Studio 16 2019" -DDESTDIR="c:\src\PrusaSlicer-deps" - -msbuild /m ALL_BUILD.vcxproj // This took 13.5 minutes on my machine: core I7-7700K @ 4.2Ghz with 32GB main memory and 20min on a average laptop -``` - -### Generate Visual Studio project file for PrusaSlicer, referencing the precompiled dependencies. -Go to the Windows Start Menu and Click on "Visual Studio 2019" folder, then select the ->"x64 Native Tools Command Prompt" to open a command window and run the following: -``` -cd c:\src\PrusaSlicer\ -mkdir build -cd build -cmake .. -G "Visual Studio 16 2019" -DCMAKE_PREFIX_PATH="c:\src\PrusaSlicer-deps\usr\local" -``` - -Note that `CMAKE_PREFIX_PATH` must be absolute path. A relative path like "..\..\PrusaSlicer-deps\usr\local" does not work. - -### Compile PrusaSlicer. - -Double-click c:\src\PrusaSlicer\build\PrusaSlicer.sln to open in Visual Studio 2019. -OR -Open Visual Studio for C++ development (VS asks this the first time you start it). - -Select PrusaSlicer_app_gui as your startup project (right-click->Set as Startup Project). - -Run Build->Rebuild Solution once to populate all required dependency modules. This is NOT done automatically when you build/run. If you run both Debug and Release variants, you will need to do this once for each. - -Debug->Start Debugging or press F5 - -PrusaSlicer should start. You're up and running! - -note: Thanks to @douggorgen for the original guide, as an answer for a issue - - -# The below information is out of date, but still useful for reference purposes - -We have switched to MS Visual Studio 2019. - -We don't use MSVS 2013 any more. At the moment we are in the process of creating new pre-built dependency bundles -and updating this document. In the meantime, you will need to compile the dependencies yourself -[the same way as before](#building-the-dependencies-package-yourself) -except with CMake generators for MSVS 2019 instead of 2013. - -Thank you for understanding. - ---- - -# Building PrusaSlicer on Microsoft Windows - -~~The currently supported way of building PrusaSlicer on Windows is with CMake and MS Visual Studio 2013. -You can use the free [Visual Studio 2013 Community Edition](https://www.visualstudio.com/vs/older-downloads/). -CMake installer can be downloaded from [the official website](https://cmake.org/download/).~~ - -~~Building with newer versions of MSVS (2015, 2017) may work too as reported by some of our users.~~ - -_Note:_ Thanks to [**@supermerill**](https://github.com/supermerill) for testing and inspiration for this guide. - -### Dependencies - -On Windows PrusaSlicer is built against statically built libraries. -~~We provide a prebuilt package of all the needed dependencies. This package only works on Visual Studio 2013, so~~ if you are using a newer version of Visual Studio, you need to compile the dependencies yourself as per [below](#building-the-dependencies-package-yourself). -The package comes in a several variants: - - - ~~64 bit, Release mode only (41 MB, 578 MB unpacked)~~ - - ~~64 bit, Release and Debug mode (88 MB, 1.3 GB unpacked)~~ - - ~~32 bit, Release mode only (38 MB, 520 MB unpacked)~~ - - ~~32 bit, Release and Debug mode (74 MB, 1.1 GB unpacked)~~ - -When unsure, use the _Release mode only_ variant, the _Release and Debug_ variant is only needed for debugging & development. - -If you're unsure where to unpack the package, unpack it into `C:\local\` (but it can really be anywhere). - -Alternatively you can also compile the dependencies yourself, see below. - -### Building PrusaSlicer with Visual Studio - -First obtain the PrusaSlicer sources via either git or by extracting the source archive. - -Then you will need to note down the so-called 'prefix path' to the dependencies, this is the location of the dependencies packages + `\usr\local` appended. -For example on 64 bits this would be `C:\local\destdir-64\usr\local`. The prefix path will need to be passed to CMake. - -When ready, open the relevant Visual Studio command line and `cd` into the directory with PrusaSlicer sources. -Use these commands to prepare Visual Studio solution file: - - mkdir build - cd build - cmake .. -G "Visual Studio 12 Win64" -DCMAKE_PREFIX_PATH="" - -Note that if you're building a 32-bit variant, you will need to change the `"Visual Studio 12 Win64"` to just `"Visual Studio 12"`. - -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 `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. - -#### Installing using the `INSTALL` project - -PrusaSlicer can be run from the Visual Studio or from Visual Studio's build directory (`src\Release` or `src\Debug`), -but for longer-term usage you might want to install somewhere using the `INSTALL` project. -By default, this installs into `C:\Program Files\PrusaSlicer`. -To customize the install path, use the `-DCMAKE_INSTALL_PREFIX=` when invoking `cmake`. - -### Building from the command line - -There are several options for building from the command line: - -- [msbuild](https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-reference?view=vs-2017&viewFallbackFrom=vs-2013) -- [Ninja](https://ninja-build.org/) -- [nmake](https://docs.microsoft.com/en-us/cpp/build/nmake-reference?view=vs-2017) - -To build with msbuild, use the same CMake command as in previous paragraph and then build using - - msbuild /m /P:Configuration=Release ALL_BUILD.vcxproj - -To build with Ninja or nmake, replace the `-G` option in the CMake call with `-G Ninja` or `-G "NMake Makefiles"` , respectively. -Then use either `ninja` or `nmake` to start the build. - -To install, use `msbuild /P:Configuration=Release INSTALL.vcxproj` , `ninja install` , or `nmake install` . - -### Building the dependencies package yourself - -The dependencies package is built using CMake scripts inside the `deps` subdirectory of PrusaSlicer sources. -(This is intentionally not interconnected with the CMake scripts in the rest of the sources.) - -Open the preferred Visual Studio command line (64 or 32 bit variant) and `cd` into the directory with PrusaSlicer sources. -Then `cd` into the `deps` directory and use these commands to build: - - mkdir build - cd build - cmake .. -G "Visual Studio 16 2019" -DDESTDIR="C:\local\destdir-custom" - msbuild /m ALL_BUILD.vcxproj - -You can also use the Visual Studio GUI or other generators as mentioned above. - -The `DESTDIR` option is the location where the bundle will be installed. -This may be customized. If you leave it empty, the `DESTDIR` will be placed inside the same `build` directory. - -Warning: If the `build` directory is nested too deep inside other folders, various file paths during the build -become too long and the build might fail due to file writing errors (\*). For this reason, it is recommended to -place the `build` directory relatively close to the drive root. - -Note that the build variant that you may choose using Visual Studio (i.e. _Release_ or _Debug_ etc.) when building the dependency package is **not relevant**. -The dependency build will by default build _both_ the _Release_ and _Debug_ variants regardless of what you choose in Visual Studio. -You can disable building of the debug variant by passing the - - -DDEP_DEBUG=OFF - -option to CMake, this will only produce a _Release_ build. - -Refer to the CMake scripts inside the `deps` directory to see which dependencies are built in what versions and how this is done. - -\*) Specifically, the problem arises when building boost. Boost build tool appends all build options into paths of -intermediate files, which are not handled correctly by either `b2.exe` or possibly `ninja` (?). diff --git a/doc/Localization_guide.md b/doc/Localization_guide.md index 8dfbc54904..8019e2ff36 100644 --- a/doc/Localization_guide.md +++ b/doc/Localization_guide.md @@ -1,6 +1,6 @@ # Localization and translation guide -The purpose of this guide is to describe how to contribute to the PrusaSlicer translations. We use GNUgettext for extracting string resources from the project and PoEdit for editing translations. +The purpose of this guide is to describe how to contribute to the Bambu Studio translations. We use GNUgettext for extracting string resources from the project and PoEdit for editing translations. Those can be downloaded here: - https://sourceforge.net/directory/os:windows/?q=gnu+gettext GNUgettext package contains a set of tools to extract strings from the source code and to create the translation Catalog. @@ -12,41 +12,42 @@ Full manual for GNUgettext can be seen here: http://www.gnu.org/software/gettext ### Scenario 1. How do I add a translation or fix an existing translation -1. Get PO-file from corresponding folder here: -https://github.com/prusa3d/PrusaSlicer/tree/master/resources/localization +1. Get PO-file 'BambuStudio_xx.pot' from corresponding sub-folder here: +https://github.com/bambulab/BambuStudio/tree/master/bbl/i18n 2. Open this file in PoEdit as "Edit a translation" 3. Apply your corrections to the translation -4. Push changed PrusaSlicer.po and PrusaSlicer.mo (will create automatically after saving of PrusaSlicer.po in PoEdit) into the original folder. +4. Push changed BambuStudio_xx.po into the original folder +5. copy BambuStudio_xx.mo into resources/i18n/xx and rename it to BambuStudio.mo, then push the changed file. ### Scenario 2. How do I add a new language support -1. Get file PrusaSlicer.pot here : -https://github.com/prusa3d/PrusaSlicer/tree/master/resources/localization +1. Get file BambuStudio.pot here : +https://github.com/bambulab/BambuStudio/tree/master/bbl/i18n 2. Open it in PoEdit for "Create new translation" 3. Select Translation Language (for example French). 4. As a result you will have fr.po - the file containing translation to French. Notice. When the translation is complete you need to: - - Rename the file to PrusaSlicer.po - - Click "Save file" button. PrusaSlicer.mo will be created immediately - - Both PrusaSlicer.po and PrusaSlicer.mo have to be saved here: -https://github.com/prusa3d/PrusaSlicer/tree/master/resources/localization/fr + - Rename the file to BambuStudio_fr.po + - Click "Save file" button. BambuStudio_fr.mo will be created immediately + - Bambu_Studio_fr.po needs to be copied into the sub-folder fr of https://github.com/bambulab/BambuStudio/tree/master/bbl/i18n, and be pushed + - copy BambuStudio_xx.mo into resources/i18n/xx and rename it to BambuStudio.mo, then push the changed file. ( name of folder "fr" means "French" - the translation language). -### Scenario 3. How do I add a new text resource when implementing a feature to PrusaSlicer -Each string resource in PrusaSlicer available for translation needs to be explicitly marked using L() macro like this: +### Scenario 3. How do I add a new text resource when implementing a feature to Bambu Studio +Each string resource in Bambu Studio available for translation needs to be explicitly marked using L() macro like this: ```C++ auto msg = L("This message to be localized") ``` To get translated text use one of needed macro/function (`_(s)` or `_CHB(s)` ). If you add new file resource, add it to the list of files containing macro `L()` -### Scenario 4. How do I use GNUgettext to localize my own application taking PrusaSlicer as an example +### Scenario 4. How do I use GNUgettext to localize my own application taking Bambu Studio as an example 1. For convenience create a list of files with this macro `L(s)`. We have -https://github.com/prusa3d/PrusaSlicer/tree/master/resources/localization/list.txt. +https://github.com/bambulab/BambuStudio/blob/master/bbl/i18n/list.txt. 2. Create template file(*.POT) with GNUgettext command: ``` - xgettext --keyword=L --add-comments=TRN --from-code=UTF-8 --debug -o PrusaSlicer.pot -f list.txt + xgettext --keyword=L --add-comments=TRN --from-code=UTF-8 --debug -o BambuStudio.pot -f list.txt ``` Use flag `--from-code=UTF-8` to specify that the source strings are in UTF-8 encoding @@ -74,14 +75,14 @@ https://github.com/prusa3d/PrusaSlicer/tree/master/resources/localization/list.t When you have Catalog to translation open POT or PO file in PoEdit and start translating. -## General guidelines for PrusaSlicer translators +## General guidelines for Bambu Studio translators - We recommend using *PoEdit* application for translation (as described above). It will help you eliminate most punctuation errors and will show you strings with "random" translations (if the fuzzy parameter was used). -- To check how the translated text looks on the UI elements, test it :) If you use *PoEdit*, all you need to do is save the file. At this point, a MO file will be created. Rename it PrusaSlicer.mo, and you can run PrusaSlicer (see above). +- To check how the translated text looks on the UI elements, test it :) If you use *PoEdit*, all you need to do is save the file. At this point, a MO file will be created. Rename it Bambu Studio.mo, and you can run Bambu Studio (see above). -- If you see an encoding error (garbage characters instead of Unicode) somewhere in PrusaSlicer, report it. It is likely not a problem of your translation, but a bug in the software. +- If you see an encoding error (garbage characters instead of Unicode) somewhere in Bambu Studio, report it. It is likely not a problem of your translation, but a bug in the software. - See on which UI elements the translated phrase will be used. Especially if it's a button, it is very important to decide on the translation and not write alternative translations in parentheses, as this will significantly increase the width of the button, which is sometimes highly undesirable: diff --git a/doc/images/long_text_on_button.png b/doc/images/long_text_on_button.png deleted file mode 100644 index 5f4ca87be247275a178d3c28e9a45b7af420504c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11913 zcmbVybySq?`ZYOpcf){ylnl}!-CY8Lv>+utAl)!@D4~FqAV|wg4c(p6jewMNNDX`s zzVCO|IcuHY`hDx;4`%Lp>aJ&B``Y`8($Y}G!=}bYLPEk*R+7^}LP7xn-|sOW{zpHf zHv~S=++~#YFo8cm%vUfZBt|4 z?{wo2#JoHw%6__N+5&>iPXA zv*!lCPfNDEzZzZcwca^UJi7>GxMg&^o+>eL-Jh?yBufh)K|fwTtgC$~NOO7GD|rW5 z_C0KdcWYz{2UoP-iF!U=xf=00LL3IR+PS8J&8@o>Ox5Lvpyn*{zqsIipPK}7FgYo! zPLK3maap?QxZqT8V?;p7c@ZeDHWqPpDswRH(v$JUD!|%2v>gLV`-ioboTHk|7;W>SipHB94RW4^zwiW3MKilcSMwRVympSA5rrxR1WcB*RLK!&tTkctrnW$;D#Rfc-#|AQtTIJC z2jL}gmk%@_VHLzCF6`MeMkij^O~j^lG9=m~A{x)NvUI_um+;$0+-G?$w_jiTP^fB3 z4R0}K*kOhsN%vWHOfx-y9mC9C7(O6QM5F83Km*RTRL9`2;&TQW4)$XZ^v2|$s8I7d z*|IC?!uoK6x`Yc^+J^X^GJ% z($m|qX?}{$yjyJ#^)FMDlbcj^gb3$URYCmD#uYD52A>$4ZcP^JQqs_fbrr#2u#3p3 zcI2#QzU0-_)y?>!Fjx_Dyr*SlmlGivoTu@_1WQg%Zo|S-3i$Zca;Q@8b8cTD%LoQj zD``uLjm<)9y)Gvd4m$el5PO zqa%5~cFLNiv|asD;y&>=Zdmw$pH6 z-Xi0o+LQF1A`G~2q8X(KNewG=!WwC4QI(~G4fc&xJWgA!7`j;a0bLgroVRRg=^_`0&(?HLVepNz%B0>2RBXd33QFDqdo)g@yvz7HJipkk2ZcMx zMuMt#D1&>d1YTKNsOVB^A}PgMsqiIP+epbx>Nat%1+`rM!1231?iKbrpnX7*x|IMi z&$*|sM^^VLT6=mK0%M=FT%xR8_6W`MjOxhQqEm?kf_Mc8YP#X|j-;kbSvtA;cNtnw zm+ynoCgrK-Rj}}NY^_g|ssxNA9ArLz<6O`%_frW;tw~g_sYeEbcZFF&7<%laM+c3E zK7oh(`vN9g%IDuTwMo zUDCZ%OLw%8K8pQvxWgWMVaYl%QjWNW^kRC52{$JjgOTINPY^b{6p6nTwHzM$*;bnh zIBz{9s-3CcWesK7?^JzgbaegK9PnykRC;M)YCgQj{{dM!Thj}9@cC- zV3wKHaPg)2K6LGT|8hL3t0}EbYWs28uOOZX0={xaROfsio_AE0ek*QK#+e68KEw~F zD&xu8#(hmf6MnLUX%Th&SP31k$vp{HB$Q4`8xl#t;Bz0imE~30(z4t=L85gk(q{vo zkjw54E0g^?LaxYRf{B7A-PQBng#LA+R#jpC^k0&wr8Q$IWA7;x_sNykBO+wZox;3N}^!0{RG8+cNCplCR&UweCsh|;fwA$V> z%?vF2BVgJ21qCA#B(96fRwN(RyQilIAHo4(1j547Me6nFr|w_B94k5j7}|y9XHjxN zo&35Sdusu7@$fh?9Tb2jVnv3pLmBb7*ge z4oa2ae8v2A+(mB)7?be*{J3ZAt5xT~22*bnSUv(uOR0>!HrD(WvE|5q2S+^0`$RL_ zwK}*jcDZ$bbrU?(dbeWcQ5*ZD6%7dp%-CNvvZ7!1NLIl890trmAUiZxB440n;Mv%5}~D)leyt8)gwq1{_YDji%pBk=p99<(R10v$L_wRK14M z+R4-v2b4;M>U|Db zq${$|yTUekKk(`{&_V_@@dD?A-mNdAGBNf%o}s<)oLgmsHquy;TTKp(I%naib$BUy z-Mp$-S!(zaFv1WU7u zrW0)7&R2*dVo(AOXNZ7Su3z%Tc6g$=3 zI=|8dm`Fo{Q~b2tej55CzKD9(z?E-rdge=M(2zb8RUPxFamxVs(rIuujb}SnB}`VA zhsyjxLA$OwHKe?^>Tq`99VPw#Pz0>V3IK+;C;e>4!_EOuzlGfIuiU*6zrQ`Ls&EcC z&3HKCO9+Lfgkw>WxKad1S;XcA(KQMd*C%(w=vK(gALlwnb<=&Wk@>DQbcS20ztfY5 zGiGB?_O-ep^l{@nm*WH5LG|y+@2nZ9oC`n~ejr3=_G%4A`%~kF+~{_?J(k~9jJq!1 zqq#py4>Np0GBGLq&S@zE!Q&RSx*06=~HM0uAW{On57 zMaGXx^Y(yK_*qTtyHT_4*^AbHV@@NPBB2k==>qz5hzfW=@fiYdApo_CiSH)l6-cFr78p~0EV(v*)~q=^15#Cg9qOY3-64~~((Xh= z^I<=!P%2)AV=_QUx#lFpLd@V>VOt+vChlHwTUEq#w-+4kPb58sl|k#?37BVa&rfQG0d9a{UGwq6*)p z#j^#C3F`B5qL!~W$>YrBXIxr4h}YAT)jo%B6P;kh2!yNE)L7%C+pWb1?fQ_oy23&4m7!irg@sqovmQ#^D{C`0=5lXv@;5 z#0{65PxTj?o-zu?cq#1XZOA|#sbo7{^Q+2h?8@V_-zJBX+7z74$Swr)cqL`^CxIvu zH?qKCM-7zp``rSb7>Pp}CD~QxOZv>2jvv6Jk2$r4gbw5J+u{{DNhD-Cf|q_BypxU3 zUxG$gv6Y&6|5BoEC|^OAl`9ijyLJlSn{v>4S?_}E+;YYGb8E}>;@2F)nLXE1n@6gV z2my6o8q-RoFm|>~Q0D)Yh58xi?<|+Y{fpk>{lx_*$By#9$l{sAw2G>NegiU|E~WFD zzpC}X@fR_X9CrrSziKs5)^&-o@1&oQtwGSHj!8m274gOysV>Pwom5!g3Hx93fAZOV z%pQ%R{{5o4Os~){!Rr#4Hx>NX%99Mr-uI-m!iMzqwTDL>e*F2^tRC0BUwwZ)06Gu>HJ=@=$sP((FMDs%36DsZpX>D13o0ao(b|Px z032xnVW}=Pydb3$#%{ap>DY|v`Z{~+A)GGOeO3TF)?k zG!mp&8;*3{yBaWNU~FF_RVUtT=pwm{8Ooc>hOG{sekON*boQB*5jEY`Vbv6y%2-ib zO_qJP@^rm9DnA8E%rWrAaQ_mO*h7rLevU(`q=i7jZ3LZ$2zDKMlooiE_RM+kevKfI zQUtL(RZ{P{Z)CgxcU=cP1U7#JYx{a{!tv#?6+rKWOfLSVr|h(zinWFUG#K00*Eea; ze@kqo{dem0-85 zcfHYBzX|Z^v7~(l_`tIxku+t1gihhUv^)aRUsNQGY>A}{cy{2O_uycBT-;iIf`t9v zZvu@h(eSFOs@nD4u#;J|d(sbe(L_YrSpXR6J%7`pg^~GpmT&U7ghYpm!m04e4d7f& z|3Q!m{-zz`@L)CET{wLnoSN%VrP_qc{6_{ZW~_Th)yGd53|Z~ku*!^a21CH? zMTp|d0S|K)#9-<@Ime)Jbl@lF0BD{SBUN<8J5K{P2tU7`w|d^<_sW>5ex{YP0S7m- z#z+znF#0}#JOiC9iUV&!g=WWMcD6TiCY}*3&=Ead0a8?*^w#jVUVqT#=216B-sa?S7~B1nn4aUe#^6w20*b1DC)vv@~Cf0BzT{PN@A! z1m>i=_uoe+Ds;_qcaK)QuPW>)sntCldqnag5ZP_Spvu6?u=o*5F|H$BZdgYM*gnXK znM8ZfI6BBfJ2LBc3LWNrTP$cB{^Z>Qba~5dP##ae-mAEXjNolNFtf$^U~Rs`ZDt*) z+&(cYdZ3VC0_cIv=9K{^;{zRC>~3o+ypULJ$D9qM;sJ5rFG1r`m-Bp{Eh*tqD2&)+ zGS#|pxO|H zrceS&N*;&imoTsb~&YDZT^+3br`AVuj@D0Rzc29QUOHyl--sR!sPAF z9uTt~9~fm?;&aA`Mj`x#7;ujZ1H&)R5-DKwN3^Tp5_6Dm$`q}%%y&tcQF*Pl8A6zz z2-+q)^GlZFc4M0EWbCY(VAzo)Q^;C31wCe_pnQ@T^l?;LFdsveb<(e^9<7aEUFq8B zOgN+y&bf9=Ynr`Wjw@I?-@S`+D9#8L9RM99^%ckB__APW6E@k^1o&bo=x`;>YvS;t zIz%ghBa7oaLa#RWKlAap6~*BdrRH9zrv7^lMHos-&9bwP%vT$qmmZ-tX|dId>W)|^ z-pGuJa7La!W>P*FR%s5XuyW)mgt1&9(Gx>!I4drkKr`Pc)>hz13w z-8xms=2#t6-)f4%pRs~^7oP+i#{l3oS$9``z2ZxUqODuT@+AG8t_ z5t-W~gkASIk96P9bBt?Kq-+H2CDB!FAW2*$!it`&fwqN9KHZO^T;kbBp#a#oZD_$K zMY=DvC3lMoh^6BYH%evcm+oBJLeP^%8$f79J!CZdSbDj`ZtMA}_LR!pQVQ9i!gL>s ziMlyoCD|)XpCu z#+N&qV!o2X+GbDhNZ-AC$DX3{_M&lp`4u3(dT@0MG@pFw+Y$a6Kp)_)vB8`awSBo( zkDOSA0R2GxA$Ar4ZnPE z+H@*<8Nyo)K?kxgxZs&3^|JActlrN#*6~TD_gse9Xwp&>E=J4o1(#`cIhZJyM9iWs z@luxNOvaO(DN#5x!_tD^)$o0~brJ=wHx_9(U~?M9l&$5>p&i@2#7IGCJzrQzRX4Hw z;kgzb+GRue{(zJ5ofX)sP4m}DYSwO)Q(Y=QvVioX{kF8BESw1!@5=OD$?O}~tne}? zIVIPJFw!N&G)<(0tJAlEAXC6Tg`<(G+9E!}L|IdU_iQQ;eL8(t9_$HT(M)zWn!YMN zQ9_*PBIKK|le&GEMsMepIpV)?bK&AyT-*^K?C)DtoWP+LR1}fqgyl{^+-TldJJ>w= zHuI$B#l`^#YYA5OG)hDSYZZLqL$ioyEje$D@vOs*y08Q=>@k#Hsfm@TM1B-ySrY>} zwX`rRmJF{KdLQlc2e1YEuWRQjGg)p+{`!WeiY0U|%9}iV(Q6P7geZ=>{2`Ash?;dG z%@iZ{W;rbGG0lhf=#NaoBvx8qv^!KZN9YujiW~xRd-vIyM;bG>yE)6C!8J6+2PZqu zW=rSlG(YF=yVijxW>at6fY`6oa@AULn<|OgFkc|DEDIqf&YvxQH0>?DSMhK_rbv6T zI=w7G67u!bz23y+eggVyf2n8j%7#DX2)KT!R0XR+>do){GdpSLt+;n`u^=hcla?)hU~MNgJI zYejTtRstzE{{rX!^zUtGSzt@SGW{UhgB^WMeSHN!AHDlEdc+oZ!UpYc|B@YmEw6oq z5qO00EV^_E5UBGT`Zy8#5;Vb^%p(PSB%DyJJ#3jywFRET?YWL6sQLA|xsDc8`9;U< zwfdobz}|sqPb#ULfo!8;mSZz#$I1zz6NKGMd$LYn&sgZAKn6w~ooN6L&Kh}iS-6z9 zG0xgS(m+f20A5;kC7CEF*h>48!Gaug&aI&=l}enJip%WnvqZfqD3&~JD6sp~$`3&6 z32$4e85HlUO1PiC5UJE&qG>F7XDXuY8j+y>C4P!X8JEKV0vJ(~ydQDm!!(Pi%(|0< z;OupCQ~yNuC~;({dgLn`)D*i;i8KAd7pKs;&p&fjS-;&N4m^Mf4=TU$z0G+44iINg zO^RZ5`!-%Ndf=i~IjdQytD_kUU6+EX=;_N<@o$wMcE)t$>Ja}#A?d=8iRstOCoehP zSyP3_sjv9p3ko5kQ)nNBh=)LjiOO8UgeW;9w(EwlWrGqWqd~NUHH;ehN1H}RbaHi`f<(8zJ_o~ z-yDg{r75AxrlrrBzN&{~nwM3Ty!iShKf))qEDR(<1zM6VrD=mQjlJ#T}vZ~3tlb<}-L zZHN%83ZCduK!9c))L*L{xVAlcrw*cl@d zxN)xL<-5@R{rx*7><6KEdc0DgsAg1Qs6kHvLO@3|dj`)JtO|at7W=ENY2C{If`^Bp zXktmmhRV=q(BOrsP9=YBd}GV7nx>}J&B&+>84mBWCH9>n$D2>BC?W|Bb*a3y0YZ7` zdFYKLZ>^{djZVC(-Y``+#qAikxQ&cjly{RO%EAZI<6&V;EkiyGvkUb{mK)?BGg`tI zOm$_?DW4lh8cD{x_G9sw^qgJL-8$C6S4Ul5i%DQDAyxx6&NOICn3E~d3VuSB!gtg3 z8nU0xI?@Z6wvf=ik7g%Gj~Oo=L`n2tBCAPjMgM#y$T3d&bS%e;`-HgETg1fTkdcq! zm_Yb1FRes2jxvGvMzZU6NyK+aWK33!yU#hItp>#Q^dfU|a3@-+z3jN2En=+zGo*cm zhA?{_3bmxhs~6%NJ(e6X8RwxGb!o1Uyr_mnm8!VSm^+(|m~#WaG%_wGy{c7g9--^0 zow7#5Ui7B768wnUnEIfb%eI)RdF+WH9{m+VQ0j6=X6u2&^u$CPBI8}UNp??JeKb$` z5NuPTUNWLcw1Etoa&<-FntOepnqZZ`u|dqE>AbG7iMNQDqjS`ZR>KC01@QSFY5~mf zUmiO@F*_Rxj=9)_a&u;h>a%r_DLyg9`0-vVEH?9SB)m4`rkhA9H#K;^7Qu}r=!wn8 zdSTqqlTyv_0^PE{ag}$#E(TQ=3r|orBk}BN%mgLN z^YUsmklyz3(dc1{UQYzi2PF*9P0i(;tq0E)kc4v_z6&p+U?KaQd;hX)_Af>w%ds#viO-zV*kyDaG(N z4HE_}{@(XkoZ3Cur7`RwUf#Xz>$|jC_W7`N{3BeSB(w8dc;nvjR&T-Jlzz5~kPQ1f zY>!7TTWFq^Z>;uyy*I|?dc?2Ny14Nov5@z`Kjw;~ePFe#mPL&D`w5)(4ApaTFi<4Hy z5f#vCvO`~D5?nak&Dp-?L66p|V$bN~m;+^pf;RCwOt7}Lj;_yY4Xz^ISf^G!Gof3& z0C!cvqHTYp${Cd0xtVsS?81kWliKVJIMip1>l>Fl$b1%Sy(HWG53%bP2as2$c4@r8 zwNNi)icS;y;Q_n$@EPazW#URd$Pe;i1?!&r)@(*3$H*0>Ku&4Z-l}gSvt&)w6pl4w z7A3AiA$5*LLmG4?cbd3eM2urwru4!4`V}g~9Mc|?*WX_U)%f$974q>oR=9nAuC=LB zCVr_ssgNXQ9tT(wDK=(iBFyXilCz5TlfM?)-F~P_6_z`Ig~?gU_rNK|n&h`$Pmd(7 z5h_epdx=9H-nbei*>S8}IyqrjRE1RTzIKrkF^GeSbK`W=3I?{y8eTo8o^zh{QLBS< zyVB9?*3X0L4K*7~JqN)1+~{WgLR|qR6wj*)P6#>r^^ho-_AZ4t8WIS|Dn>6{&LJ6}q0>+dJDvYn$p+A_V;T>KB|yZU1&sZZ2DwS+e}j~QGQ z?9DdT1m(ua8eTl1IF}0Dw|+@`lG-sl@$69b_JO{15ZXjeho0u=HHyd0&D|Kny_##9 z8(JcLf3Waed)heed~(h)iRqyh(w;f&q)a`K-^_n7vv8HkkgY zIqLbQ&cbLgr7;}+_$Oh64JQeZkB-(Q_4K+@l)OuEWvZ6V6_e+&B(7Qa2dKqxj92BE zK0@SMvma57?kil?-%g6G1Q^fsJIrpo&CYJU((aE4?ki`Qw7UN(?JmJLJyKuug0WR zaunuesNuqFbNu&`mi`J4QbwU;8XR$+%;PKVqY^wZZ=jU?z_JT%4);PozeIF@tlUs3sk^=pmev$~Ujdp02P@<8kww04}1O0MkjifbQ- zWn6z?A9G!mJX9?pZrRM}1!k#_%}EW31SA@L@w6u#NX4{qF2rDoSm<YB0P{U#@L$`^ftUEY~RO{v=`~Cj?h%4aciOE-e9Sk#7M#Z-` zDF{C2IMw>VaA)ck`^uckP{n*>69c|pvrLu%!g>K`59s7#9Tk0v9 zF$0X9MF5$K^&8O)AlJ%-;x7y{hM!P00CJtdetab~mJzTAZsL>NH@&^drY@rXR_J(e zZ3#J7j*79U*i%u+rhh6RpIE-}M_TrDcjHw6iUJ-S__)VH*y^~Z;sPA43~~5rznfD0 zQ3(Sb1-*E!8@czr_M1nTSAbr>w-}O&**xfaK; z6WupikdYF#a(hhMF8f5xgcMMAKjQbld~Aj&WM!lftbB1(+p8em6Xx8gQH*KFvRgGo z?qrJ@U{(lZ3%PP%w6FZTfD~!DrLNZbxEG{UL^bJ?z)>a}%u;IPblL2bWM!^^>S0oz zJ#&<9a4~$5rMk>FHw$^9Q9NsY9|B^BuoDP}wU9SfBLziyZ)5r=@`gtd-OGR#SaJ+^ ztDk1Wd^mD{%6dKDB)l_vQqGbDWbn6S;ehaG9=`My9?c2Jf`a#Q7dqq>NZ3|tvJe_)3$(yDbe4s@1yqd^Zu5f+w+{&3222B zDC(Qg6!&U>2M@;qtDz7RA|iteq>EEiu^wFhZ9@kmGdi`^OSM=2>n8R$6xLG2q3X_U z7Mxq|mVRF+HY}MOdaRE(570z*$9Npkm0{&gELInW{?DhRkrXvQcV>c>(;zDsKQ!ITF-G40+C ztzQg3&Yj)%S5}uQFW*{dWk*e-B;_yb59&+|i%V6=;0^LWR08Q;hG!QzAOB zYB9~Q^JAF?Dv=+m;9Pyq*a0#lneM!onD_zixRhnFYfrzojBjiG7 z^9SgxX4fkfmHEYvt|m?{axyr%GRc5MX{uY#Dd0kJO63Z{9Zn$$Eu1A$W zRKiB)EOPOv&%KF{WsB|sLdiCaBf(ut?lb_!UV@=PLuQ!SXT-JL>N_qFZu2Anwuy&v zRlvuy2(!>x;>Z@QV2HnxTKrShlGXkYuVLaqL4?%eOtWhPkicnfrGghslXpt&0 zTRTXoAogs2(Z7Cw+~?fq``mNx^PKzroO8d4kKvlkj9iQW0DxKRp_)DbKux&?+^46d zjEf94KPZO5>!F!10C3Ik;-Z>!F7Fog;Ma>QPkBkb&)bA3+lCSVnp_?-%ko4Iq;_n)wzjE;@ zGbB6miDibbeh(+pC&pH)I^IhUR>XU;iClw1+p1NiVx<>Xh9vDZf<(Y-y3Hg8zqp1_G!g48BAn2T8b` z*BD2Wa{dkb`sv)6GT}#=O586r`1wQFxLkb9Jy7QlDUoU{tgIwBIpY&kQ~892r^eUl z8u0Il7b0-M%lE#LHU%O&XsY>YyfKmWZWr}!2(m|Ej(KD=VtQ*G0AZDTduT7X43XBFfGH^!A$w zwYPr;wKBc!0};RslHwUp**)d3+%G90pPEAG!KS}IBZ}u@qd?U6il+I+#hm(J_hUxN zvGR5PCPW#ABd^MRpfb&@gC|9?!2g2#Tx4_o%YJS?w{P*?)WM=@Ka{#dxsQ*J^JRQ# zlY67Tfiw;`7YY0OozY1sbg+N89f`{CQ{V6NWX~(V6ONYFv8Fg{SJ;3o09+tfu3&JD zs7#4_b7PdY8HI}0RXl#h%nkKA*>g5D5|oyH?TzcZ=Q<(Y-My}a=r^MQd>&X4)5^_@ zt*C%)O43A~<|x?7);sA?l7K3ZlA&4H?U}zT$ol@2?WCI++ZL`AVci~&GL{pkBJUab zS>63++t0T22vs2}A|fJ=Xil%J6z9KvoAZthV0?VM(lW1msaJb@d)v!}CAVyGaq+*= zA%Ot5`OPs?jEw&}D2A39m>=qQMZ_7W$j(#zc3f!$$AZVGB7cHnVdv+#n6#v zd?Wue8h4Dx{d!c6^(KcO`mSy`Lts7nX1&?yVY65HI!iIw8dGtMBG<&#Q7o2IE2~GaYjj*}~W}%=t7#vf^YWHF!uKA{hxtu|T54#87*w0@S0~HqxO{ zJ9*`gWls)oG)eTH5;~<139FwDLte2z9wB?21y+73S%5(8=vP!XOHkyXGpxx{co28e zTWW1n-l1Au8|L2zlKrbYq+cyuoz;`nHjlv6%Et@eUiY8ZV(_S8h3AncqD)FWDz(PN zw6S_T!D6d-cU=z7pK#7;j*5gm^>5`+=$6{q*{PX!+grnO$83$U!g(Wy5%1FWunt$ZgHnvJRr}Bene>fg3zpiO|u}(S#Q-9R8dg!(Rv@JO`B; zN0k1d&0Ir14?NEE)H5{H*?2wDhOB#YU+G-U%L|zK5B!$I0eqsg5;m8gYrNkfW{~m0=Ojva%Qt{`~7#>-4$AgEXg1 z4qpkS!t2!?h^>4co^n^y8zXvpZnKRq=m{ac zS>HQ?hvFLVg}a*VXuve(!XXQ=BF7*-Yp*0YcVSVTHMPTSaNjETls!|=`>hdtL6M&t zKeQ7VcIZ*zEYDhMdu3zbIMzwI!Dgl-A6}>kix}-MBA93Cj>GJJWN|FE;@KF>+pk1n zBuk0-Ck6~5krER%iur{{;zdQn-_%U35P??URbRpYqh4j!LBz(A=v(aC_TJtXEOyXA z=IG>PXLye|qY!X23CU4d>cPK{g;fUsc4yrAPFl80+g<0bmU9>Awz&i34)tg5NgA}P zHI?>(WS*AI{j&MhafwbQC#yHypd5G;r1o<{()4&j&W!>aJQda*%1iEbao7)a)r$B- zGtt&i@lDLcB`pxLd!sYwUXJT0e;lFKuF{gM2o7O&RM_#VKb5)1>eQQLJUch*PTTcS%!WF@SCDNHz;)jz?u}39EY8o{=!>H8jav zzWzXe*7q^2s15f@Cn$S>(9Ev7F8bX-dPPut_LRzI4Gep_3imU53xb;?Ca1(I;y#bj z1cAsYT%fu2FgGfxtoJLq9s5g-D+u}T_+l~1GJe_A3acKfck5D>bEIUUe>L7qRCB|C zJlJ0AC8e`Ptv6vi49M!rrfCS2jJpCp4aYn+?4D%+ad6Z-?zf%=Ez_SK63adP=GjyE z)pp^9GReJ9oc%WE-JrWO(M}1U)-(VfpGdSF#|KKUva;$I-jhF`rkaYgXNy~Ez&*gT zpP&l*F3`Lja=FsIB5Ro3NT)Rug`vHHp&g!$053oA_av;`y_Xg1F7QHyo_&STpFEvX z=HdVet76YxqS|r#sc`Fg#+B-)L5{@YCkvM$>U52{U^V|B2;g}k%eYi-?p*S~yNP{j z2&<|kj=argi{=VDdi|TTU0=%L3KD61=Z3_GCU57k0=VYrkl9UnuXK!s zQvZDC>ip~n&o-8*E^MYVt5BUc&RRtB-`jGhPLzhNV`Wv{}997%pN~w8!)$=0y5;_e((W@Ngw3jbKZkS=$%p(kIOLhT2+?eee zrBacB7_{wp-0&DDl`FWQ+8=`QdYxn6s9`2 z=o&qyyQjQyTyEru;lo$RY}>uv5{st3PMpeANu&3DWG=TGR;KxD+YGMZU)H$3_2i|O z&kF_{-&9W{7^6lAZF)GUmCd`y;Y7e*OMh+b{`&{A3tS%u%L5{;YYizh+xXekAa3bd zO6f|`(4nr9BcaN&xuR)%<|u9hqpZ7jo6BDkaYKcjpVvqlDQyKrxq$RDWZbg7)9wP= z*1_UEItuwiM)M{%A77r_E{OIc^$-Yd*ukmhE4EbP%FoeIEQPQ(p z8;}V2d^9{sl0U!nypXl&7$N`2hkgdaTX>#Fl5gO+C`v@c3ykEA247u(Z1@SJc<{*x zhrJB(tT#(r52TTDgX;6wjN1iV+D1mtnYsIB85o3}Zc3U5USwqr$+#xU`+7i6}@iU;;zZU+&_~P6k{zW}6BNtiv$|krC|b z_#^d>cowH0G6G-T()Zi}DIlU*3ZFrZm>V@PkOub&w5ok_i(M671c> z9B$g-;?O$F{J1&3xM^l6u=Q~4w_qTsC!WRjAVu@YZ5O|Ba>5-Q6O+KpJxIuCs$Z<; zl@(7Nuc!+hK4jvR{bJkimhv()b9U#N1E1Q5aVwhi?Cd_2da{LodAnYTMn--cu-$4a z{R5@e(Z8(_71DL|wwY(OcXGlJi7@*u#gtEWhB1BCdau}Vc{;Xk({(w`&9TrG5rmMW zWD_hI;2KG$XdC86hXUE&6q((lU2No1<6;ljv<2E8Z(^N!c9z^$zr$Qb9O-fPUhbPw zkv4U|BpY!S)R)FPze$oLVt((3Q2w72Qc{$$=ugB3P;C1nc5o!xugBd_(1T5+M$1dJX*K}c)?C}0R8jWmp6*s z5?H6|S}wd3ti`XL~d2DZ3o2z3xu8o zc*NPoue_!vN;RGZc>VgUl{16Tg)p;i`g!`*$r0S^rnt4_7Tca1s@VIs=ahr&2BD=q z2SZ8}!v|q#UJ*bn5Ge>58!Mw5pyxwqUnnz6u2AZH;L`f-WI)_SdIV^qE>!OGzscg8 mN&kQS7we_^Hw!=y0-35x1ob^g-(JRocnyA`?}BliG5=Dh~*;xMF0T6qN}5A0szp{UIDT| zM%sOrseFL;VDi$j^Z@`kea|ksX-A;|0D!eiSNnl!K-St+u+0ZVGltSHE6WUIzIRSW zbDGl&8aeO_UgPJ>J*@w%Y?S2i23P-Zvpo-A_CnSpiXu3A>K`Jdy57k6g937N#W$~TPfU4?xBMUNO&$8{k(-vZp(vD=100@< z7tp+xxM>Vu7`u}26Hj*EJzXj(R>8hLcL)$+TBbi+pSrq?lc}t%)YaF&h`8Nq)VHy6 z>dTd541;k-Fv6i`W_OtG^IVSuyk*y@vXB_uW`i^f68d#jTzx~|vu z+wwRU&UH_i1|tYMqIZ&WmwUEzAhu4d8z}$IXx6FQv;O z=^m${fr#5TF#oA^a&jj~Neia?_BeiB`UWLkKqR}Soa>Q*F6Tf^S44Oukh5;W08ztN zGV-o_L9@&(cf>`Sms$Iv3;byl@Y5*&>BF}WR{(YDc<;Qd2nPdgWex^gblTs)dOeH$ zrgymc6Zn&`5hE@gvtG#=8E?!=SP5bm!#|FCczpV zL2~g)YpNS}ta|_Di;>=PcpqWOE53k{c+@pgy#zn;2|dhbo{ zKTrjINW6NS5er3j{YIg}@dzA8czzuif->w^c9j=O4ehIBGxurt&06vdZk3|zX`WT^ z;8W<5g4d+=8e>sh$uUSg+RNAb!{G+3Sawf4)A5`>1wZ^z+>v7O7BP+2>sRsTnMdiratM zgLOwm{geRDOqm;s(pl4paY^0(QW0EQF>&51pKre#gr$RT+@Md@dy6HmR5D?TpO!2S z6|&)QI6%ChddB#;l_2uSyT?(MLZJvJKA}P>kA!>*Cfj$uLyycH_4VbXrExUNh6{{7 zw|=avqu|6;`Fx1|=ggA&zjur@F;?2|Io@%(lgSz0RH$ds5XybQD2?+wPR4KMwqRc- zVYnRJ1m|0FDG7W&c{O{yI+SBmUG=9q?(N z2uN3+bKDX;EofUZu?maNpSU#UPrA2js4C9XHA$^{ua>3A7VcF0Vmu)Ra(orNb&IjaDxq!GxfV^KU!VlgAH+OEbfnS04L>)RM`GDR;qS)T4MXz^Ar-^E-l&@xxq z+`2bvD$^2t3J0KIEY~!6>ae|8t&ez0)#SZquT05j|LyuxC@SyOhd z+!YVn2~sz=4TS5EcwW!?s_Yk6$4_`R=65tV9kO{HwKI9NteG(fse85@3Zj3RVg6~KeUPT&H$4dHBRQ!jInqUPpu5fT>L48e&TF9KSw0{;F@qO8V4^!xaNaXCGRD`u1R>Ayo| z=y)epQ)qb)tH5u~^@tfC53sA+7+yI!=4&nk6{ZQ-Oi^}XHdrwuO&NRoDz88V8C9lZ zJ(F3oi2?^~7iJFP?R)ntRW_SuY*mCI)v zRJ|}yS0`&S$E^gA0jszI){jFg^WZPRuU|pWe-~FDFYSg^B)2#VN1&Ve!?Q}Nlxa!( z1xe|@bPI5jc=O5bPX8awy4Pm!3UuetzP*P4$^c}wXxa%~>n|lcdJ)na!=r3F)?b{$ zItOBlxX#yMSuiux=ji_NCwW10`M5c{+E)c8xJ@IihK8x;i1fbWyo zTrW4*nc=#VNl-QL2+l{k6S1^(99t9n}UQ2j5 zG|Wq{4S~F87cv^n>2X8~B|tBXjEwNO1<3QuE02x!*5()Fm6NyCdE#*dZ-(M*>d&7- zwV9zm8mFXfSI^yDw~3e5h^2a{1hpeP6}0VrhG)H$En8eKll|RYyi4oXu@fP4jVn(| z#_9x+w_A%gghCF;ZNseyX%TO)FVb9*^=bu17@E&Ze&3UQrntRGD?% zUmrG23FWcnJsI*E%TQ+7u?KO^SF%?8-5XGC8TsIC%IwddKd;2r=piWP+=r^H0CXYz z^R+TDnLC_-Ms+V}CyxO@Cf;0O>ii}YH}2s)%wNDNh%IaLaH#<67PjQ&nEuUI|N8SL zg-W!c9sMajoifT!64A|)FDM`3la`x+jpH!Miua#AMT>#VWoD1v+?emAa#l0k&o?Qz zlKg4ofr|PsT%?O0*Y}pa3`_}n(SUbyrps_TGMqO zQd19?YRX-5t&r2dmW`Y!Z$T_GYC(*7#}(rSw}{L-z0L}1LKoK(3cbTx`izYf-9H#% zYt0wAj|07qt~&C7=6C94ZBkKDSaPa7fIgE}&OESgKbV$_Pq%5VJj`WUR_}1Hu#lKv zSg=>f6bFHBiHeFYOUKOUtWTFW|8*!1e;~|y3&4E9z?%AD#;-BcV+^5mbrtM2u)&0= z|8D=TfTGG0$!f{h~HX<5xVhJ-OCD(4)(w^AsjwR+4I9O?b$J@g4uIB`P9% z%XXRxlXEw$Gitxv;>4Z#%PV>RY@e-eY+pv3F7LZE3bSV%f&mSo-$6)=L}Q&wrE%H(OuTI&d&iI+SvjXZd8WrzxYWqBT?$0km`K zH=FZov>qF(;e3NaacUgzKmi2?nWM1Not2@$?Ow%*Yaf9*@7tm&``J<%yQs!@#y208 zKc7~2n?7I_LN;8Ec+lTINr`XrmLn@1)e%VE^^>dnb6?{5m0LaGwGYLmz(evv_d)G& z46MRyQ9rOT=z!L-{_~H82~=uB_*HJjg^5~scx&WGSGe}l6JvYQzzs|%p{2`o8b*js z5&Ps%@C@9dKy1LI@x(~JT8)EwXm;4YQe3|(<29OsFO&)f3gocUab3HX@H+?VSdvRI z`!y=xgCp;z)q0u5bVCRlq3N%NL@we>;q#mJ!j}GnpOilvnxTUu#1#!LIuqH>n&>Ak zH5qw%Ge06YTFq%4wnak-B=eA`C$qcBXXB-RppO&5V6LDy#J?bGx+&=3W_!6ety`m3 zyhvAASPaLD(pW(=vVN?JUvPcYigU)5$i`CFa6rG~=nx6JU0k%eVs2GAO+oxduSc=+agv^Bhj#(b zRL49D+gZ56A)})c%n&?JDb_p=lS0FgSy^2`Ynlk)S@aoieOd8UDK74NOY8UPm-<4J z4Dnm3Yu~otL&9m_@(cHtFt0z>bfoqNuC$3EB7qM_oX0ssIsI@;<6001$;1V~em5$;Qr zRl|gZ(nH(S3jkpBzP^a&?ScLP0G*(Y`eQ@?tlhaF3qv0~@?er9nxTE^`|TA079lnI zv9VgwJ}!d*Q`AJ?otsCW@xIkNYlYJq0}E>cQqFz+;888tMzwoIs-Ji905)zHf+FQ@s^OJuPisz74rQnV95E6DE zr@ywAb%<_9(yP|r76K3!3bwDlz5rhJWk%+)X*5Hpt7>tdpYIJ6zyLtO>!$PgU1EV& zHEJ6>n8;UVE0yjXq6bbjgHAZtMn*?7u(R93AqdZ}0D4uE^1Me{_G{LBe0&E-M}EHC z)`bW}^#d}`YIJbNl~w7t4J8f^a-y#kj>P|t?{1(VgtL?sj+;C85SkUrqpf)1N1wvN zK6~$S>iFUqga8=;(;N39t1@0y!la>Wt9!t(S5OpMGLlA{AfPG(4XMD2f@NIe^2Z)( z+~#DvmSdbk+~%W0H0*tSn~G)cbn;qrJT0B85eZk`Z8NPTq}(P z2$Nqy%P#1{R#G1r+>r77w^_x0QL4=_T+;(2W<>n%xA#gg8o8Sii$JIz9vA}>un$X@=H}3m4`T+XPEBD+AL-~&=7!)TCd$o` zJt=~coC&Ar=S)n}kxrvUs9&|K13m=j5@kbrZHx5NcXrqj?atZ6r;saHJJ1Zf-)m}8Q3YC~<>qpqC9L$cwJFeObbl@=_xRX5^lVeG;SZ|Q(9m#y z?GWzo?MVG4`yu-4fMfw)8`A$e#&umcTTPLHOFB}ZkLmAz^H+kq-y@f5GlMdnit5_su(uma?mk*)OzQZg@Y`Oyt(F zu;3=R2sqwBM{I1|i`OhjVVZ`;#E_esn)(L@8iR0cBy@Skr2$(d#oawUyrQE0v6NBe zA#mvg>Aw#(6WHCVWt*Fn4h|2?&ZA_f2hoJBK{oRi+x3b$rP(W@My!pG6RLby88THJ z8~!0`oV4v-lP=>6(4XOwJ2Ed^*gf>E?2)?Vx2D*Fe}o^wB=&dmbeiyg-_mCF+g<=Q z_b-xqL{Hz4D*p7XUhbk9uM}%C?Ci#<`HMVApG7E{IbEjvTX7czQm>ZpmQH0H@Cd9H zdQ(!ae$vYM^3>y-#_!D406(Oe%4sVWKuE6}ZBz3dX(v-xGX7SHD?mX)YDEN?rgHXD z;Ap;HS%#$XNRx(XWTu=x^kM_*>+ny>4R2X}b_}MXqPm~1JL~h(1iNU}g@WM+?4|Ff zaNH-M68>bv%Kb|5^reuvxF(o6I5>D`zSW~l0$$9>!lCngcn?|chd)r!&|qU%@&Et} z%LMk|3;QQ0He>IXsCks$ucX!n6M{K1VxX$%V|$j`6Y0C<_~Q}-#8s&Xp!1uxqJLKf z?mkS+?e3Z}?+XbzyT92ZxWB(&zv&ClSjLimkT*Bc9x?9|#i1uIZ@}H2sr$>%7`$+= zBwn0CTY-hBcw0W*gh}bI?~i>)A7j`DMnD4vr*S!}GoTgqB_V^mV&y7rS@)E>q+Qk} zf1cA9fnOG@!ivQ6Pih7rzQ(kNFJz1YEAlM+J-o?x(DoLmu>b> zj%@nsD*aC`KYb0Yj>v0!lyiQhOU=R(e2Q{r6~$X6FF-5L>O=34hYl`k`_kGVJ3Y0u zDYV|cHEG7#%#OL~1_h2hgIC+p24R^v7zROCwg1IY70js=`>+D;R{v+9#t{XJJH^3( zCe7Qq)E{m|w!T~i;Bk|sl*ev8aR<<@x$>V1Kz*^%$$qot1DFxwpEtaj)CX3sIAG z(5&OJfy&TK5Ntn4_+#UVcSGhJ2(xs!D$);KE!-M<-~M_rK@OH&DRP^?-Y3Dg!qt7g zPlA4~oC^S+<5LLbgEgOD1&tE7O(^V)>zk|(rhbBX9U9)^*=riz!fzK05-(1(oQ3A7 z=r&0ta?pW@42`itiC5|tLnelC;V46eT#h-+EdcGBoe^EeEzH3CgdMBO=NPxGt#)8u z!|w=ygjL`?hpF-@Nu-5krU%A=!SzzDtkrLcQbewN$=y>~nfrWVkGH>tcDG6wiOPdClj*mz18nTABsHmuW z)4=Z~l@`&8Thx1uzI$2jdq-GmHb~tU{WmwpzBce^jvX zKhwV5T`Zt7P+Nm@v-9-$W$;QhAnF|!6gqeY1XccU^^9#fyCOWUFWK^|TiV{VT$a=T z@4L+-4kd*b)JMlj(jNp=ID81v$w+GZoZD(QN5}PdvGL<3+r$U9H$@{~jAqQvS)Re# zp9iGR*-9CKCW@YMv5H%02M0HG5w|5LGb$E??}>=06`)?rW(pCE!nd^RbJsG$X)JkL&X%w0m#;AaS18^O!AnB8#CHqujNb z84RchcCWpH2RZH~*v7)=!mAU5VVucG*7JOW5`R%=z()<5#eH`)KcP`jisY`Au1}8S zn=YHj3PYZj8y{^J=MH~SBmXRJiKreLd~32G{0UL`G*DPLK8!;HJZ_S@p$!IuzZnWA z0zsG>Y6R{(ncQVzhM+k-(4umnyl%3Jn@aAxggEo0(o^>h{1z4l71bIVjZd6e@vPqR! zn$j`#t~FO8Mp~LMH;pg+Axt;x>+x!`65oz|KE04J+AC3(sprpp;LoUa_)*ezfZKqs z_yM-F|Q?AY@mTIw`df|d&&+a?uFG`3dO0mhF$_T7Ft`qI^?y@%s5HN zY59eOVqItI{>#YdO%`~{E^SY3ZEYP71kIxvqG(7-N&oDvBbUmovUs}0192OA2VEbU z8kGJ!CLu>RYzMsx!1^#N>K5}n%+l!#12nP%XjFJM0+E)Gv|r(VEjmlJSEB0%XuDwL zkc~M>Dmp(T6kDPaa2Abw-5X(p_Fi<6ErNCt`gg3OmtO=EYs_qeW9@@=9gXFQ;>qTnIrzdK(T0+ZnPR!oVx@ti0dt-6P&qt4 zw3C*jKMYUz)2%~LcDpzq(cN-+Rp_2OFY9uonR;;{ooG%a8hP`ZnNzD>A1mQEv;9F) zB}=D#On;M=pD;@89*Y5HD5;zWU{-GS8^akccIwN|pXa#@^R<0nXw`#REjP?sLG60u zK}TCzu!hz>ASdIf-R>+_`6laC_NTpyypTp;-|cl=8a;D9WeI0n3=P-sD(jA{EKNe) zuMP={2Axs#xJ--?M8F4rrTj*`zF!qMhopucGc?lTZK$ul2mgoeVSJQ>2wW%FoErCSgYkj45j8Fcd6M}%{n!O63i>Z7)@nc1O1 zF4kPvoKkj|G;BMWIBzqF_z{KmgL31iU{rtul3vdPf1yw_odJiiC43YmW>z&3laYy! zkB=ZAR%|OYta_P(s~#7p=larbFc*aUq6T8Rb!+LH2_o?yqLpv$bvrl!A6K?+tjHkD z&%_rE^!YpT}K&{MBa HeI5QkK~k^x diff --git a/doc/updating/snapshots_dialog.png b/doc/updating/snapshots_dialog.png deleted file mode 100644 index d4d28955057976f1310021e79600df0ed4681bb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78805 zcmcF~RZv`8(C(l?gL`m-y99!3a0%}2?t|-~AxMDW?ruSX2X}Xu1cw>i;ZDvufBjGQ z;Xd4|*)>zU_FmnqSIgHjQ7TH(=qSV}00018Rz^}40D#?qUcpF+&^yKomHyB#WM>&2 zHvj1Dn3@Qx4N;5{GHht_+bWF_GTGi-R%6 z!L><6XRLpy=cc}Im>j-un+q#q;|a#qg_V_|?zrV&Z*rf!jj-3bSRz~9O;cF9^v#xK z*83h?ZGJdE?K_D;7;f_a?~{s#)y5x0yBF8#kJif${RDDbYrUCLe@XxylH2J0OE{H2 z5Q(F+?aTbSP{6;;&2-Py~cv~1? zlN8>%nB(m2>cC$TXuWfEYLx5w2ww8|C5HnG-&{X#c$}?{=e>=+dkyj`hV@H{1{<)nb78H=-maPYs)vNBYigbyo&Lw#Hx(5XOf6hx#BWg$ zuT7h}9bYZvnE})@cvFGwq3VhXv+ePJHa#11{`h2-r>^vP=I8&h44W_`-)+0-tF%q33>w7Sx^CF~ z%Sr^HqJ}%&m}?1DOO~l#*~~%xNagF8%1}TJ_c*%ozp}0${WNGdzFQ{=emL+|b*!Xo zSHs#$3=Xf~Y*X;#ZGMKh6Jq8-Y*jNXl=`oI{9w-fp2(=!fY4kS6AjUZ>6DtKHx-LYdG^#**8O(p z$hw{Nt%IiSplJkV!18BS$ZFd1L|k1u9|A8HGDQvYhm3#iNjA$CiSkHCf$CMuhWI1b zwh|0k#&c{EwY`d8iIafMbdSKb{q0g6L)4j<&YAYFDwHJp5UxuH4pd}4iqIdO>H2HYRW~^b(=M8mPLUL60awU0S=tg>mP8jT^iO9is@D4 z_z-}VOR)VGeQE zSGT{d!x3}s2* z67PXS%8~&IV*U;mor0rm2ZX4|A$MUyP=kZWMJe8hl2T1Xh*PShRe(xa z;Xl7GOhTfwh5@uzQxl>^3k#ELx>sRobG+;J%QYd8(bT6>Ogpb8-_kao+dD9)n*Pd} z%MA|?75tCygx-{g6R!IxTH&j;oSVfLs8sKVltYpjm|c{5oB)(@CE9GP0_o|Vk}Ch1 z1&oi&^5=l9w0INys!MHrB1(AVL+WxI8W0Wne1b~!(Nh9iOHN^uIU&zX+VesMDxL~V z_e^Y&aL$S){v*gS)_nggn_WvuLy4%DXt9F2I5kKfLBXOp1PDpHUYW@0B0T>kc^RA4q#`zG?(;)QlZLrvS*Gksl*rk zvB0|p@r_$yW?#nNRFpFd1KKX1Au`hfD*4x41XRO!A|0_iYr9stJH9;?s}wU(hpeg_ zGVPx7AV8(XDeDE3S}1G!=igY+AWvB&OG-%uPazmW5h;U|pPPJm!w=8L9dy+GTLM#@ z0p<6R-287qX|i*qlZF9(5XxUYxx7z82B5^xjHs6wf3%sY1ag_TuWKk^>nMyhP4lm_ zDg$As9nyQpQ6mce9eMD%cTRWVg*`}Tl`xBVtg_J(iotOejIWT&#`KUW2mkX2I)uRg4mLqegXrwO5Px3FlHAj8Aj zf}x`9P^CNw!}RzKhpFYaFZM}rGu%X52iyc`N}@{pLsL8=n>bClouvz&OtlAsBK!O1 z(`Kq?9W>a6G2Y{^L+$cjVOv8ky;wSZ8;zIYy{r@huNd-0{Q56dBF2gyJ%nQw0Vm?$ zF>zb#^{}m+6p}w|{8lSW9Cc!kj6|e0ZaY+JUy+9ng^}bQ>haZu~ zuVAURs40RZciM_YQPlB!xGUfRNw&lv1@vGYN0H;XkF!dDa@t1QTeX|@d0p58;kgDD zNg0R;%M7uV-I;1ESU42plGkrizu_Vq=**6ojYKZpq_*ZBz@f3|;VF)ZqI(8BBl0`l z;k^M1A?5hh<6>TerMVR)m<+_LUdWDie@-cNpj$==)not9ZV2ORoHgIz2)SvjO-jS^ zb&Pd?BaT{JJWMr8&N?UH`KHQb^)I^MQ#4#wP~6qiveK1?tKVM4Ge4qHqo>i|k^?Y1OmxvOAFAT995(K_HtO+FjO3fYn6GcSCcBJn09x)Ho2y9I)E z^C-t61!Oj41E~L$#!gacMfu{qj=ilC;vQ|@-7xd>TT;|1xiFmBk-&l96cpBnQc!6% z3Cv&`l3HicP38I9*&q7DYc`$!lG6AmOe_~2!16U01XIh8CGCOJDx9S!DTG%mx91!A zi3Kz(z7>km%X^W8a9h)WC?tsG4rmG~lP!>pMg(k)viny}@hSZHs21JoWA z)Y6N!7;6})vmJ|=r>mIa)Fr8?T0M&7rQ{eDW$6v9CBMla2Z3fNk#sOOJd&3lhQCaW zVS+GSxYmP`56`Ah4pzl-s|N$Lr_QzKZ0`XKNSt{)ei8p5o#L{OHHm2n2eGx%c|AW# z(c5eJFU6*0zZHw7TLuBd#I4Oy@?^N+6&T#}nBWi#->6VxT-9DnG5{dmBsYH42Vodu zb~K~>^ono{MUug)`KmfTsLe1eNOat zG;&=GNhVQ_RM?Pj5PIyUgAa;|YOTqCH07|pLB&aEdI~fNtV4{vOV-;4T>AoZtZ85M zYY4(ka;vM~dV6~}-QfdV+eITxjcXi1`LU-EiQ`}Ka$?b#NZ8?5LC>`R1OjeeI8-F* zrZ3TFiXI>-4V1@bMb`WhM~-O$qx`JR83E}=wbV`nV?)!j6kI9>JTV;AcuYhwr1$8Q z3S~_1CB$X0)ANuM(I|xg;;P<}pzZf!d9{x)lt^7Pco5Vsq)5?fT-H(9mOkV9N+5h& zHSlSgxj~$^M}Q>*d8>N$w9?#k;b+6T6hPcWFKX5_KZzlk=*A;LKy@YCG2(#MKvp$< zPDYMO?c1ksNvx4cb3?eboEu*+yimC!yGIa^G|qzP8Q}qQ3k%|M$T^d56lddi5%`-B zA3SggXR5GI<#--&DF#zOk#yG^IV?mE5aaqThLq0GMmbZ(FrwIn5|5uGlkoH#xT7- zco%OrjDhciuRhccgh6`Ye-!QS(K(JYuWRy5qFsH}3aQ z++~r4#R|xzAu>1=NK``u>O6U^a-gP4L{XkhejP>qn%sKSr1X3y)kYvOHOB;GB~01->C#XlCs1Wn90X%?l;>@`?ALFuchK z_we{?Wa<5OifNMcc{b|nePq$^yN?Bpj}@GeUu6>EWvnR_ zQ{j7Yi|3N&;3*WWi$P^SO7HM#rTTc0L$@@^L#SC;y@#B4;oAo|EuesE(U%&KpI)-33mFV$0 zOjmIiCCn5i|Dly7MpjLSPofB!BDUelGiDh(l0$+4iBsPB2_sQbz;EFp%DI+L)fl`F z$Kal>(IdMEz3-l|{ZU=nSJ#-cMYL%VbOl=|dU9^*DWU5d+~ujI{TXiUrcJUtf$!eM z_jjrz|M0>9D(+$TXhzUS0ctR|@Fu)pXPGR2o>j6CDsliaX2S9CVs+$eBzDi01MI6l zju65463mmY!Kjloz%z3BT?Xa!i^&VHrIahrifp@S^Sv!`%l*iFkiY{ya~b~K;K+&L ztiWAx+XG`|d1Ep7$Zls3p?-SD7p!@XaT2){i?^vXokdU539RcG@i=tqqA6ksvGhnu zq~TVxDaJ0w6h~4-8pl;Sugc&jV$T(euNIsUMUwosV=bk%pvUl@hFet*xtCqCu$uS7 zLL5Wvx;ZaB-BQqapH4Fg;6#p=W7$#d9^qbm+P--(-Xy0<#izvwnL$=g=LVbQ+qLHR z@jhZQL(GJ^Nal*DZ(qqc4M9#$p}#1SRHt~*?}c;SNQ|97vb$sEDW~ZFPD2p2z+BRO zGl%(L*Hys%17@`2Cx!WqcDRWrk90ETh5OdI1*`{yd6VxRjFl(V6;rLxbWJJDh7lXP zgPwc#mo`kOhT>?UX6h*&WMRyuLbZ0QUjueEWWjHjA9gTF_qe@SU_1Q`G^`gC@f}5f zEzDU4*?A@AU^vi=X{*vz{3m%ScaT#Pz>NvP5iG&CO$U=0bnJ`mvj>wh=4r$o>x7{{ z7v{WzW@07Gb|!vs@FrWE)me(SXG?r*pR{|E0QK&@vp5lZeyYme8wFT=4W09vw?=%E zXOetBL$4pcnk{Vw%5+s4m$o6&4Mj< zf-}^8Z=a#M|86VOReaNrLK?0KG5BY4HNxUrFER;o+@=Xk~C{L1o5_=!I$KQBDX{Vq`PJ zQ;H1eVhJw#N!vv-3wmMshG3ZmflY2H#bDfeV%+JR1(l0wrSDj4o{8Vpl%{0;19^9F z!AhcqjzIU7wA1RG>znvR;&;*s8k{N({HoY#CV8j0>vFd6SlRe0G?D5BpyuMo+&=`t zNbHJmzeGtdqFq04d@`0H2p01X4p>J?sBxtzS1@+NQz-&Sh`=HlHdP$%ZBil zh0<4ezl`FhUG(Pl?4JLw>dWa5hwe7JU`(A&bOvKc>&n9 zVXs4^L=Wefjxm=enoK0}V&7~a7_j#C-NIYG4(jcWYZ-b9HG=>~2h2QaGRR^!2x9@x z?l?&JzFQ|Nh*M;H?|vcdPjx_dx~}{jD9Ix9Fd1WxUjZU)vo84TOUmxz!QIqz20D*j zQni_se0(Fx(BJdKp{<9y#*NX^EaGfM-ot|WS=n#jwmZu|sL9Z7!^2}4Z~gWPu4#_4 z-O+BjnHfNPg>ZH#-C`rmiN9GTG%ON_w}~F**zE(w8BN%Qg=k+KuxX7$dSKV!(@+*# zB4}m2WNgAg49rpopJ&XxhI3V7G}WssoAD>yJ`F@C)H8k+J-)8D|3Rp%@g!#*2wdwXa+LFrmiBpU8tb@1g#FdJ`AeR+Jcl%F*+M1t>; z4_M+6%vbOZf+T-ZSq3u(0ozEB*0zk)ak{<+`p_BcVYaxLxUY*i!ex`9{I~$^7w~Py zH46?NbBaJtT$>>Xl^*&ci_eC2Z(0hOrsUpuf`ryG;1;Y#%Y$vL_WM)s8rD6}y<8CD zYhbM0>-+Ya^@8F)04i+PT#8zs)K@6##{|(^oWdFv6D&f4F59$u6-kaO!JT!)sXy1# z>1R72d-)NiOenid(ZoHO~1l}yH{>o zVS%~jhshm4`T`DE5L`9{77UB($rf=-6~c%I(}=0XBg)7kh=zWmRTymojH?$GDivm^ z@_KNF5jCcQIyPv;L!M~VMWOX2DkO9)R4(pu{H>;S8d>{-`1(l!7LM$3vVgL(Va^H( z3v*Qlwco3=-nshnemM6C4DbE6KS}YeqPK8u5hs9@LWc0Swr{t8e3!wLWsv>$qmnl5 zg#qwW2(fpy82&yWS5GhO<+Qw3x=R=BK#86cuhxOCwh_NHD%z1Afu$DCr<8Hm?g4YJE?VUnsY@z+Qi28KKd zYk2v68*>|h83cEfxN+?HAW?0S@Dl%R1>OV=@YGC_Hz3Gw7FSN{xcWJBZ;faQfj z#&}~Y0GJtLafbEeey@kco1MYEMSll zR_<^UG4Zz->o~OCd}!ipQ0?Oy97k`NOiv8+H~bP>pX%gGIS`I^lGv=lZzc|C*b8NH zzw+uHQeZc_8JvGVjwvWxVa57V9u$#+X{e2?zieQvPZ#_XuX~L2kVWMB0|2&IG;+sD zFWYh4e^Im35TyN6mNEv2@hZWQ&*y#{b8fk({rL6^B8#?PhH|6^qgWtT9`uIFo7gs*Yh*dL&xeh2$u3Wv2!f z<>1ob9_Ew5>FV52oisn!vll#YDh&c^-8z+wC%&der*DD+ zGRE06^nv){H;$#fvj4qJBMkB#Pd7D^SOj`8y`NNhj6F$^YzA`T2RH*a1lBWJ=S@JA zd>~I<^;?F)@0z|;0c||EsF#Blis;V0`aP(=x)xWg5B+1UP)K9d3(KEe51L1Wq-;_t zTg~WA-s%Or2`r}AMo9wmZRx5l9P@m-s?;g8ThUZ7(~ENz#DV}e;?!#NCdr`-L%7lI zl*ax_{K%YDm0ovGEFg^9Q(CO^swB**lWtT04NH2O%7;zlGvf5zP>U~w9^Hr6v3G3= zaCcvwXHsRnU`h!yqLj8xwvsjK;5D-xj~l5*XIZN3`LJXG3vcZtaZprMXjFC`BA!Ag zCBW^spMT?sA_S2FY@xLW)gY{T$>z_f@Qk(do1|YZ--t56m}c-cWL%v4gcYpXwdA+; zonC6p{4xw!7F#OO7L7Y6B41i4hp(&cp>!;LLFh~SQ%%>7wI8ypJ+Q;r12L6X7hp3F zjm{sXtS3uoa&)*4&Z2Uz(L~;f#<62Xuo?9uR9V|V6uW;D z*C7Sv=Qei7YN(9e{oxNWkVzHDfz4$?pez5SeY65unVGV^Jtf@H8`h3G%U5mfMtzm* z@WqB6e-C3cop`G!O_R8lL6X;41IBjbp1QJ<_Q_E8Kn)X*O079nwjzbEAE*=SJb&@h z@vXMLn8Oej3FV7Z#S=LIQ!IjFwtOk3c7d8yoVPcWf&YZo5b&umhayPj?bekyoJm!g zP21C8x&^ehD}^)axkKv;G)+K7vFa&^Lu(HaEDo~aaqXLgi|(Wyy>zf@doKn^=jm!R z3o9P}WRanW1i((t2dwM8nHIYh(+tbM!43sb0|-5Wi0TdBFap-rD)Ikk7JxcPM~b?3 zVUZ}oEZW3VT5}Pg%%ag!UeZ?}K_jd$t!-epEFk9(`;i#(i(kH@y@=CRM zSV9e|>0jUp^U0-ZXH{u*-mC9-&K)5}uo2(oew+`CdJV?8`LpCrB=P;o>JI0(!<`h; zMSi#R!Bj7Dpo@8p@~WK`JI7H46R@YD(qX|XwffO!ACC1j&t&0kPdLALBaHh97NHhv zZCxz8cY~{6^Y)*TSwu-t5cZuLMwBL5STYaD@E&&GJt6gH7R0wmypEvdM_YJKGlM;v zHqmv#s-DL#fo36r9{(wk(`#i#0iv17%UxxejaT+M3@oI_HS7(dbiW(eFA6!dLpCCY zT(7!-SvnWk+2*^2I*O+rE&{7)%RU~Dr1uD)i!3WgFE(AtE9H?R|0wk%Hv*o>5Qgyc zcxe*A6-K+Gs2AK8!i`2PMVW2TB@69ztaz`gYL8X??O~v! z*kX&n{Zx&;cs;X~*gZnr^W2qjXKVJXN^;Etr*wWCP?;{H@@XTZBh-1(Z)=Pd8;CZg zf(6^TQ3%=44ZCc${k+}r6>?y@RTztngJ@mK83g{o^z;nG0bhhQ_>X`wWCwZMe z^P&T<7FFzE)tcz_c~`qh9=-I>C)Z`YED)T{eWOC;!=%^aeqBG~A8kTQpz+Pyo;P*~v0&?{1J8hM zVnkuAx}K-dMwA914ShxuHVwC8gsP?FF>)St=ARgAk>fzpAe2`IyT4!5nyi;SH z6lqa|zMZc_knSRaj^fJ5OpH;bvEalX+odlcg&9Y>r7fdc0nK7tAneF{dp#B!xGyW07gm8Iw;s-|cC0 zDh2l)TLndhvKvkJ#SyUD?r`qjoN+Gp$i=0@(#x*%JH(M#>7;afsSMry)G9q@)Yq0! zt$e%BrX7ROQY%m1xCcP$+c;6#y&mI$(mcjx%qN1&oA7UM0lTHIt5l6xnPnS!R zL$X0BOH%E@6=yU_FaDO!kZh9<<(^wn(I&i%K@C*M$@oe zV>w7$WppB&k>Y^-m_<1j(qrfn#Y!}kxDVwzeDCi#QJ5BBNRUeLgJwTUnBPN(dEiy@ z8ha|TUSlTZm4>`J(0a|^z!+=S^&O%4ZgDOD;*2y8V6`MHJ_q5l2N)uycr3d34Td+Y zE4?%<^finU)3xr#d(wWCP;8N3J_P~IJ`b(gm}0Xt@nPO-Zh&SNgueu9bWvj{>Qm%T2=n%YGrsxRggMX#rGtzd-v ziWM`JU8FCz#vrPfwU2$Qn%W#Tj_m{F)G|!I_4r`58xV-fgfz**MQplyfii+Fv^#)wq9V+U@?#)I)Yq@# z!SuK(IY=M%@Lc@iG8YfGce9MZ@3hSlSU?!=QkSPmX|(7p3nY~ygMqEB|Fj((Myarp zS}4Oh`+G@4THBjT;fwKtCyv$__w;)$Q}ZavMZw??!t$6-=$M-7IK>W{+ByYyA2p~= zwzCj>a^5J*S`DpHoiN*m0&O3+xHQ7V%R`J10GPI6eIEi@%i9f+6eGwcoKc0`Hj!WuHURZw3tE$*)BEqf_OkNBs5YGGbOrn|6ZCl@WpLV`){5ybQZ~%d6jW+*T8eH{ej*8Y-R1>! zmvY5*8__C7wzcaRy+lstykg)h%VrqEj(q&n+ZHH*9(QNQu6lGEG0M$h3r{lw0aKH`Aa z@?&zibg3SW)E78l*7btZssCF2_RI2DlkIh+PT$Kf58#e-?}f12t6N%={>=V^wJw1h zk?Sd+91K2Z<#+!5+RTsFz@%&D!2r6riKB;%bcES`<0r}#N^OE4o2x&)1p;2YP%Qm8 z@d!k22;TYrX(=2{y`EQYN|g;uc1u~I;;qquxe>kr02UO-B&^n>=TX16?bWOp2LD~> z*VV_nvvD@(N2|D1f;;5GBCGX7mk0%F&5h^os1!8~VbBSaaf*VGv1UPP2jo6_Vq#yP5*Se8N zXvhbtuhDH~%?#_iNwO1aDI0cQjzxsL{bx1{Iq@t5J_v2!-$%SEct$zy1xA=JE`=Pn1^oQM zo0fLt0u7K`>wx9+_BaJn16^v-r|s=gnya7^^juNboV)uOq6W!Do+jS6dc?(E1gytv zB{_99yPm1GyYAwkvoa-KTbbp2!c@&4%=SOEDU(gQJ^;n~w=Q*k1ZWHUau|}oDirKE z9yyHs=Ci=&x@j|P{ZdIbhtW4MZeKsgd{2 zD#Y!4UJN`vgjzXzH?~Kh@2;bln;&HV&sM&4b#I@d(bl22({A!Sc^mu|0h=EHKo~Fv z<7GZzhy3~}$M?r`7SyN2@E;E)?ZPmN-9Fq|LAnolskKRJcNGR=luMRtzQ{$NkM#i0 zub!IEk6I_$PlldPCIjxlx5Ffiy?-Uh|M7X@%amPB0HN=!x0lDMm6zl2qnGD)+uh*K z?NpPRfN!T!*InLc7vAd+MZTGw!}pLn-qS^CBaRP;?NrP=f7fCc|I{&Q$5_tsc$@=6 zL5+%^=r3rf+)zoEY*&d1D{bJ30yti~*xq%b&B`(P_NzxgqSKe_=yCND;$N2{G39sr z$yM1{QHp2d`LW{eIP%iPa+ol4izt{&eqif6ht^hu)$7;RBV9oE9I&&;O-sl)(CMM8 z%f&-DO~eB~s4q*kdSw^wvBNGriPZJv6Q~hl|tsi zk#S~bn+Pj7kkRmA)r=Kv4uTr=?g*vTR#H101hU*5qTUg^3^A2*}3;={V=<&1&cl)e$c~muK6|M8!ppCT^lyFuHNNN+*J9X(_#EEyX{C!UwBJBQ&W(b?%}5QJ}d55 z2c1!z)9dwSOFqx~CFs)cI*zI8a@8r(%JeBO#Y}&i9x8hiIv(u0fMMImPZf%T*k~d? zuZ5R?nSvgq0Ms!Z`M+Easu{ye04guN1*^$?ib-#6`U`fO`gaMGoU@dvyN)FbXE!E1 zeRoWchldNJa<;?aSO;42Kl6RGqWODVes@b5E-YM>Udk0eGTr`JT;db8 zi^<~d-_tNXWJ5jnAN)CSeA|T-bX~apkU(H+|4WRo%8UC#vN6Ka#PwXi?)}QC{z_K{fMtK-wK!-o%pW>-(0PM13Zwm>6ilaLYN{l zW3`<8u)ALQ2=MegySWwA?U#f9?t-A&7rxkJXP0hsU{krH>~q`@#>ZR2$Lkp*eADL{ zp6k7|7jVt#qQu}y=mM$S3Ey8B0QG~+e^JO$mIl%SVy(|F*Y?*fN&Sz%uYBU>Mf^?_ zD^nW?gVXsH((j0%fqd3DMxK=JM3@?}RhXpqmF(si>X5%r>YO~RA%#Qk!f-_8er4?T zVx?p*Z9M>tp)q}>21EFfUVsGOWD`d^Z?v22x|851yYvvlP!(@nq7B&30xUuaAKNMz zpvkHu7?J6VhWM2jalK&o!pgDl=dEF|sG`Bl^$oFbcR&Z^aZ`V1Fby5tFbUw6q&=QA z&-vhff<*MH{s;HNgogz-u%0mem~Z?yZxTzui#a3ooE7}8`t-Dg0zZ}m)q9Y_Yb~xn zDFixUlL=npE4XUs2aQeODE);_MxA#sj>5lP$6g++=G4_CW_eN?naH?aAB7?-Ne1&G zzFI?U2I8lCPZve})w^^*^;uGZx~FBk~GKs zgiWLk2#111s23Hb$LuRkKIX95v1)MyyK!8f)?g2`-IaLX{VoGK4^A)sg#e`$;!(hb#uoiwJGSm}w1%{>3>r#~&O zkV7y3CoXM4v*2~w7L*mE8Bmy`~O|0nwH=<)T5bVox8uE#)@NQnjH9 z+IVP?AK`{_@onJaQ6;s3@RAKU;Pk<7xl&5InNQaT z5`W2@M^;+a>tC`KG+yyxDW~yt?yZFo|1zxg;DAHRV_(=;{pk6TqVhHr8zCACB{*wd z3>B_p_fKUG+O&4%*>k!)aaCuGzU>(KywR26pZR#{=F;85akHP6O_%u>*(>Y2#(Aji z+~!{fogMttdPOwzu%vneatIhEbce9FIRri&2rOFtS_yJ!JK{2>K+#Y_nt8F1;#pLIWX8%j5pa6${r41C zX%V!QW3oF>47K)6=spc~Hw1Q)W5QYpjV9<3cD%qJhj?AJ3+S)Trk=v(?@!*W3$*UQ zSDN?lCB;6bJ~H{L6m zRhcP53remN_`PQ4JWpn2d~eSb`oZhUu;p;QtK^;4XIYML(w{l&$nGlwM!QKQ6OAG{ zH%i=X30g^USadPRec`ZCaTaYe*IUriW07?|U`>5(te9(?i;a_CljP~v@aH619-v+ETt z7yVgX)n1v`Tx6<)OyO>aVJ%>8UYo;;1Ddt$9nCFzivpi4cHrH~ri7s3S0}LekvrLJ zzo<(%{FXfZz(*M=_*cPg58msY2=q*oT>b{%iCyk>Xz+E3{{A;@(-IEk3bK~IkkJ`O zf-03MWs&pIIDzqr;(mXlX}{UyjMY z`!4A=0_Jd5r?2469FQ!INT^LJWbe)y>VNo-F4Xidt$ea0E&k@;CvB|qI__}J7T>?9 z(MQ?9hg81+CZg3R=yV>la5vjXw^gJUydJ}=peExqZ4rQpw?VB$IG>BhvVIe50XD;M zo{tsTUg6SLR@m_%6uc>)odRx(Ro}lAJY`=L6!_q%*fPOE@Xks^an>Due={)IPUo^@ zd}8GWUBog_&mFFNcrj;JH)U4*Hqk7wiG{5n>dk9QMjwH_E{mCt%7bkmO5{Gb9n|3; z+K;mz_VfrS7I$7IKM(2JV*8Tv%)C@?280@rmY5#HY`nO!gN#aOFe&4V!MOdsD74WEMBic(Gl^kSls%HHk0TH0{b`8dnoWe306_+ zxQA^UQgv8ey=(+y(vnb&jnUZc=Lp)Ja-j)li^zH@sF~xfd{5DR zPy7gMIQD>YNXVvti^O{DE2rNZpGgQ_&1w(8Lw?{ z(LJ|*R|5`(RV>Ox5!WaClEC-z7NDiP?_^e< zakBRAIS)U%P&2ro?tqN+O;$jQ5UIBU|8>A90R?XNN|+P+pn4jPiL&5sm^u+QO)j|Q}(X{F2jaXLOX)0 zo~%Lr3`m_%v3b3++MkvR8?tt}ZwYvtRUa z-@2r;)^$S6dxp95P2b=6_QtMZ1m;`_K7=s^0lJ&6^&op70%w;v9LTU5xMgp0!8@OQ zB3F9Y*&zp$A=#IfD(Mz%X=Ot2%#8sp`t>>`TISleT|aJs3qwitW8-J8aXDN=Ne}G+ z+B(xh1AXA!LmH?t7HPCSq`fSaaA18O(+?8Cco*?E?8*n~L>`eQ6QSedvV8$R`NNkN zJpQa()zV)n-tdiTs;Mqt2p|Ou68pwjq*r;;>U-6`r&ZJTD*3h0n8D!`-6kPLkLms_ z<+B2(+2kHp&=Wj49aZpA9_yo>EZd8>a8vdA$;eP_?788d06zgJZK7LKK!KJ6t=Y0~b z>v-#oJ~ODdAq+gg^DM5;Rm3`bI67>ZSIYcrR$mD6h4!Vhyx}i&@%plOv%FOMk;3(l zyDsiC93E9~^ZX&*R|F1qZ9cy)TJXq-C7}7NS}WSgHujHStrUA7#EOFVgq3EcY-i@h zm=iR*%d>HXzvuKUbP>KEqd!4p<%sl^vHSYFycLKWF0g+t-EtotKogw z@rYaEjcHvBtuSiEdtJG}6IK`5{xcuN^ra7*ZS>eaFtBr#bxwbEU%_0X?`P9M=c0;9 zh$J6^Z!2#M8cwi)R`IW-=1yniWA(e6uWVBuwbzk93+2`MJ-~MD%EMP z-YsAlyt(d+-uw=L{^RLWIWrQ20bCP6ljSh-O*OOtwsyPj_BECg%m0?tT%_6ncNR4; zxR;HdC+bY%aceY1WW-wNZ+Y?P9y;5DP=(6zbdZ3&Uj?lcLz9*s$IyJwDwo9+<&{Sc zBBRcy1SV=9g%G9W!@k6~BwCd~9ZI>jpG=Opjdov~{uFt}9CKdr(^9YduMn1-N@}Tj z=Vw6kwj?EJ{mkMq;CV-ykg_2A_9+X_{$FCI)Ruc0HI|*{Wyy2UHF`ie#(8{rvP2Up9usL(u&+cn@Cuqi8O`~d~5SD|a z*x^s=1FWk`l(!s<;7n!`IKA3|6WxEA_RpH&Y3gBUCnaqrq9x_q%|e_AcKJ(5`pRuh zq{N~3<5cWyVza|De!JiEZuOwXm%!|}{px_BMkOnb(CNwlnFSawPVQoHG2p{V_K%L> zIu<%zw=OBAj6ef=0GQ8CS`t^Vv+BNT%2L2pFHUr!DqbU=AiQEWrJa_>&l5|op zzgi?fOMoQ8o@l~c?qkBxvd!m}MrIRD7S+&qweTvFCeJ6+v|ZjT=?2i9njkxQ*)o>9 ztYT@ILUA6T^4G_gmvuJ==!ggkdDt6Sm`YBosLm8y!NYIlY9_nm$ZV~M?rG3;K^qVM z37|3)jt_0c(BmEL+!A%3K8aOvE)Z>+tow7i?eSQoekKq;&rAI;-Xcq)^gnFzu$@tDzZm zwc5tP7gz8%S6s}hvg6(D?-ESEaD{sOvFbe&Vp_wW+sKRiaPQ_-(%l~4@(cMeI~ueR zIVnYIisVF>}Kj&r$UyQSm0 zY*Mt-y+#|nZacL;&lCy8h$0E_IyDRMeyqroM0^EQV$H|i&B`8t3H52n-eh_bzId;S z)VkdBV`2@&-E;9@pN2r?(fX-I;LvGdC}VfPDAHw@EvBuq`OIfJASNd<=ZmzZw#6!x ztcSZ|QUWJB4o+;xLSs%*@%Aq+rzrBr77kDSpm~$gWj*1~O#<^?oOz`Nc4)*rV`OXF z8H>Wd{#FCpSS_G^lHU2UvRVfwt@qjX31`9x*yI9vxxqDtFG&A~xwn9-vhDYTH;r_6 z2`b&)k}4^Ubcl3Hr?fPvgi_Mo-J1}Q2I+2)4(Xa}KhHVud(OA!oip>ztXZ=b>t5Tn zVDJ0B;(z_>zcp;R#dR)2$i*;TT6(=uAK=%Y*#9Ni*pPT^L$Rwo$!E5zhw zcZF7J2)n^8l#0%%JMS0A+Aqu4Z;`t)qWcLEdgr8&q}$=)qtP{cNh>^X8b1bNLb7JD zn`pbEt7`urkvL3b3Xbto1unlG7A=|hw=We@=U-p0=*xXDq zYogNfCFQNU6gyA@N&~%&e=6)Y^8szqL1_k;!9pzvQ+^7HN{XYJ>-<>@9N)Vk>49T* zl&@<_ItZ;p4K_+u#FO9O$VQ72P>WoL=%1WL38(dh#%CF5QytR1L;dt5Z{voFv#6nzyx2jLl=R z*o0?X+GkshnTY^5aovj5%qiLbY_g7+teZr95wLdV<=7vJ-BcM0NHPD z`Su7KXlLDS2US&A*#w%yh6i}u=1VT5$ilK|@`;A`!V7FA8k1G?XVM+7^fjV<;G@eu zCXhkNqd7>gLJ?o4;>dFe#oJ3>Hc7J*`Ra5gU)RX;tR|jUThOgQ-g%3d*yI)kJ4Zv~ zi3Zn9UIB%$EJsjHgr+f&Y|f-FmIE(3YRV?52iYh;{TQJDULEHXx;hSQH}CWMq9F3u zZ3sy?@bvd*ERp1XaCjLC!I=G%CRcku*y6?klM*foS*$!vLv3< zsF2Ce80N)-NDVNWzozMB6}|sURLIWr;?ULH8cL?`eD`VMyy9_o7ub9nhu;!+c=>=t z)_ioA3pAaQ=IOxrlR zZW(dL{INf0l)i>ljY9fy#KnPK;qrtLgG!X5A=u;Sve`n{AY2rCiFjeG_=+-_a_M25 zvsCGglAKUokCb?80CRd9Da;fClI-{2WX*zNFuO1bJ*G$WbDE0_g~rtC6K}btEMILH}6{L92)GkDu?s zI|>dv3_x}|)=t5mhTRFj6DphgvK8?Cet6c@atkWI4Fvl$W9g;!<-wW!)U<}Ts_}5= zi~1lb;?&rB` zU%weY=Kw7TdlBpGG#MoC_@jy+CP{-y?0xV%KM*brJB>lO+&aMfNUIjYMUWz3r7!Rt zQAV8rWfdB>syQxHq`8}4`@@!UBHT;UF`%lxy@XO{cTz}#4;S@`+r>@bH?l{u9Fl(f z7k8e=o{nzAN+b4ZA{Qw+q#~ZzMl&@fWZ1i$&JQ2jmLfW}6lC{_(xKyh7X1*$PDvMSz2;`nTPZ7ufvCLLVzf?IqP$q#AJ8)6_p zdnPQLtWuyJDVJk{*dAR`tI0JpGgGWu@K%Efe{x*i=!@Lb{!^}m#N*-$xgUkNQkGsP{Rj#c6!zWZOEL64Q<}yr_h>aVx#+bS3Z>YWU%YFjX&um%mIZ=o;^mMU zQV5@Z!jNE!N9*qHmNdy!e>>x@LL2uHFHD+;kB`WV>#K#86;m3*hxdH6<=7ChTdV!G zvKi<5*{FBTj~)lzE;$~KBHN|Df8cKOK1%US#FYwL^p>V{mXC^BJ{}z`e2|47CQjQn z+`cWv-}yerpUsT4kgd&d^ehPH#Lu!Lcc%PuH}1ITg>S04R{WULL!Yh9!!Fz_$Vj8T zR|^%g%)Q^+>^@vEOTiEGUQV*!{5g@j()UZFrQq)+@7cf3=@@&>|Lnj|_>k8o*7fPW z>U*Ec>foBz&WzpHSAu_%xjSfVX+q3RjIGKqNUrR^Lz6*o9%GPPfvULso+#Z{+}!;) zsJiA0_JvP^ZtGN*6;U4t5p>k2a4N7U#62DU@U;estkybY(J*NHwo6_T74EM)mqgRZ zG2q>MC8*}!;TLCxY5iDr+^0xZ^5x3*rko^r3mi#|5AgQ?%dZacT-|@zIUCO(ZKd|? zyw9tXemuR1&3^B$6T*69p2bNE-nh4o5@``RHZ|vYt_Xg!YK~Uxm-;6*$qmRE>4+J5 zVf3E8A{>oM?0esC5Yz?xRIO}h77W)8@0l3fRBH(QYMt#*5w^FSX^&R43p8W*Emr`wxT?VVkFs{#N!J(z$al_<{g& z;EX)RjnT>dY!?!$qmiLn=y2-J;yOI{Vf^xK z`_gJZR>sRH`3~aH1f$ZWOWOF;%SqAO%L!Tci;K?RB`Rc7O2y(Iw6N1mRTKnv+`Z8t z7W~uHYC0iCYwH^pGYia1j*LnMu-PM_x+^OV{nMo$q^uWWJkgjDI)KoA?whnPOq7V7 z#>|mk>#_uijXTF8r!RvZ?JSH+ZTd^Z3!5nQ9QS@QhleOIf3rqhINW&4__}>eozj`w zpo09))*B9TLu}h=)T4yT;o1{u-DYh&d>L}bksU5Btug>MJg4z?AD`6iuc-!Gg?Q7u z`X3~#&~|v#*C7Mt`Z+AghSMid$92nB-2vT z@-QV5Y~$jXdKyP$P-`!wl<}1#tw)ISInPR6DK+h9m+kuky-a*D3r6G%AUV&a(2kW}7 zjwg6vpt_DMx^=Nn@90-20=KsLD%fob)g?Pl1?C0FBEIm4c_zj`9qwA+48(o-!+R@> z)R7~B`K0Yt*KR2L>!Ipqp;Rckd*Y|)lwzAMajz)TrNf@8B`V{-p)#Jn&-6LQr`3lJ ztS7Xd3Y3T;a7DRmtUZUszOp`L-8-kv;V%YSEyk@EP+i&1dw=$IZ>4p{ zU7oNuDxn6{WU=}Rd*Ls|U`l~oLi8gqRJ)U*tQ+`)p>RqPewkM`>S4n!FyYvp{DK{~ z<{fqE3;nLj-8myGvs|TgFoMoyaU69O&tohDX?Q=;dYFTR9*XALF37KkkXdps7N3qaoe(O>drT^ByZL$*`Uth_+#aH*MfQbL<~;Q1j#^z# zxW@3+M(rGkA<&GCrlZ>ndTmda2%#iv@#3b&yM<@xfx)R7{%6GI^H?m4(TNvnEB(D@ z4yPCD>Gq=w=&)U}mAK1cb;c7Vq8VSpd2uOsRtINrCuH=J&@W}qMUv7TTmPEWbC?4D zSNLXdZH54NkmqAXh$Uvk^z5)Q*@w)^ zI~o@^fU4x8@8G-jNKc$B%jIi`SSf`NwlMJxe4rhq{C!1_mUu~fai=_|(}emLe(v_I zk{2|zHr8p?{=bk3$(#{BG?WmMxjDbE=^~9f2yQzqtkl5Nh!)uqOh}EccL10ZoGN}HWvZpvQnKAeMHU5> z96R18ZIc+1^1|Cg3d7KoK> z#i1=P$Uz&wr(#3Rc^2l>Dyd^i~^C&LHHH;ni+AP>r3Y^8*};vb_elNh8?>*MvU8-dn) zi0d$R&%MkXC*7(pkHv1T)|*Tk0?QY8A;#dSM(L7G>AqujTUPIp@lnh)JLeW3Y;^Ac zsBX(GRT`|^dZ%rXN^ZiP4U)q-?Uo8=N&4N*ChLg3hrNcs19IHb*=%;)PaP4*Y73Nb14LY<5;4B&P19WROu$EtO|JMxIz z8NRnpNc>E6xAB>byq!B=RLMR}(lr+z97aL56MdImO<_V&B~_whc&a1i`c<@3r;mMl zN}OC?G&erbgJOO9cw?i*oTIAtxd-=WJWJhIjh^f95ThT<9y(=ybIfiJXM^m~nL1gs z?zg9RB9>H(y$h#J;Ga7EMkKktf1R(Yd=>>^(XjV|5L&;`Rkzkgw|rD^wceMW?8n?C z?h|DlM_gktJfu#;ElM}+;ZN+a8X9P%O?0NqKi0H}eT8^KC#>c_{qfi3RbCNToK>

O)rlq3Rya0u8?v7`@x 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 F{ul1$0T2KH diff --git a/localazy.json b/localazy.json index e70b61cf51..14a2826e7c 100644 --- a/localazy.json +++ b/localazy.json @@ -33,18 +33,13 @@ "type": "po", "pattern": "bbl/i18n/nl/BambuStudio_nl.po", "lang": "nl" - }, - { - "type": "po", - "pattern": "bbl/i18n/zh_cn/BambuStudio_zh_CN.po", - "lang": "zh_cn" } ] }, "download": { "folder": "bbl/i18n", "files": { - "output": "${lang}/BambuStudio_${lang}_new.po" + "output": "${lang}/BambuStudio_${lang}.po" } } } diff --git a/resources/i18n/de/BambuStudio.mo b/resources/i18n/de/BambuStudio.mo index e58879d73967760d07caa99ce48d4d287dd3b395..02c02345e757c028738c304923756b3f688a3d0e 100644 GIT binary patch delta 51446 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

-nShZO1M-i*1s_iHc@yV z2?gzR={t04;uE-+QlJivZsA!1@h#j#2tOu06J(q~goEpC1Q@&5k32IUsn z4ox7huIp-#ypOnN_%Z+d`zh~#$26FV#uC?YX}op5#q6e|*6+U43zvt)l^9ew=m;rJm&Xk2jP4I7EZX$e04(p|OsHOW00* zNP%hOIY{Bn_&LwtU{!a3Btw|(fb!lVeI#*DDI(u+e`Oy| zB0PtO6)04aa5qNTf{Na^o!CdkgGtND-IB1bzi>6r`DLN^s!h0s2|B)@Y&Y)X+yiLi zIQ5R;*)H44v*nd_Q(Jj~(-QmeNB5-;(G&k}D@fFWp6uL}BUAglxqVC+&$UlU*>i>eg`*9LJMO|6QQ{uBUlkK{oZ;DH^62VipPwU*-}gAm z5&wW^9f*HtpT%Hb?v$#7c6w|5I}&)8#xjy|9R4 zr@5`zNx7Bet%HTQ_mV%J_+silK{$-?b6dw&tE#%_A+xS+++TB#Bwm$!B?Z?JUrpve zxg&`ep}|jR@GmOUrC++0C4CXMF0JKb?p2C#-6iiPY{@;7IunTZBkuuqfbd~%@A?yU zL{Vw90$ktP9(EyIl>%e12x02PflE{MtTOdO_RR zhoqIV=`$Gs|A^Gl+Bf<4ZS!bh0Xh9CeZ%G&Ot^?Gt(tV*qX%y865R8tMb}O{3=?Ca z3H-$!Odc2IAJ{tdTl@&}{>h&eD%oxE4MFc>9~L4Zo{oBE9rjR=eg_9fhp8+igLq=kH*jSdHb;)@h%=_ zu%oI@1u@+BxI0nNTJntLSsmil3GX2729;E$l8uzpHIndi!rxau zl0tu)praTSts`ESGMx!`BJVovf!}jafvKc7w1Y`W z-7iS*tp7q{X%b(O;A1OGK!4KQw&uKK+{klXXGxFec|j`H)d<6F1Md)iLE3blA0d2! z^bEFKemZ=L^q!QzM;;eArxfgSnx9PP>Z|==${#Xw4dG4m-Nb>y2^Yt`119fdB+yj5%c9OP?_}f?SRIGmr z3J;)?Nle*e+t73Lv6YnLxt}e#f%K0_Z^yly@F%3tA>4xU$=7b1H;HmHNL~kBI-<}4qXq((;FLcKP3Go@f1AsETW>WB$noWmxSj$Y{bJ2RM3-WJ8Z{x+eR{2 zJCm+Q{m3_ia(9T7qC-h|4nHGZS680xB&`+Uag<$%HS~b1i{Ag^dDw=AbVZTD*A~1- zcmUxhJPW3heb^8$l6Idm$=6cC1Gr1uau2KxZJmG7nH)BpK%w+DJi%Ls=AY|R8VfN& z@4vk7LqnA*7*D2P)K%CPJU|28Y+4D@7ZA=(`7D$f#NC!M)ySKXw5HstNYfQUxjmTK zmQ~s|{XV251v-%FHW|iH;O*-H&lghJYM$4|C&d45wdz7`NKM+1+%UzcW+<0dIt zxEI=7abzt(_yl)e($kSAKDjtHAnr#u7ILp9p20o~pet1<^A72gX`v2fldqSQ`H^Q` zxYv>X3wh@z|Mg&gGRIM<3=h^4)|Hp|W-=8gEf3*$sbCc8 mT>DP!SU-yY8UqLod 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 G8UF=RMrbMk delta 36760 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 b=O6AK8n`yx{dt-IpCunTfmS2kkKF$Uupw2* diff --git a/resources/i18n/en/BambuStudio.mo b/resources/i18n/en/BambuStudio.mo index 08ae63435f9277ec5859fe4ce05c6f6b8379e11f..0793698f0152ffb47d42ffa6aca6aeb5e9dedbe2 100644 GIT binary patch delta 39074 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%0DW?-XD_o7Dn3#z^gHvcMWkK9Go?{b>w zvv~+;_ZC1sSPAt`Z;0x^08~SRur`jwO1K+!yk4WGG`Gt%SQfQ}RZufm549JXqYFEt zma+?~UQbT~T7m(nH5-E(;g>dj5o(4u+w>!-5nM#Qh@PRIOXX)8&W^>17ebA=4Qi^x zQ3INdg>WA7oX4@3fR4in)G>R4nu&x7Ovf^zdRz>3o=c-Ds)?H7x~L8`L5--RjR&FX z8)(xfp=N3pY5?D&@6Z2s63~b*pkB52P+t;1SSuzp=>x43P#v0wn(9TUCHxLm&rhg5 zaSXNl&!T4H32NlY5}Bnbi@x(;jes8+0jM`r15`zQQ6n3I8u;hbng% zb$ZTW34DU8FK1$tUjthbZ;a~jLiA{pthWWWp{DkL^$4oMQ>YHyxA8ZqsZE>2Ol2X| z`=A!8d`HyYh(wL}E7U3SVh8*gwRE|Xx;(ybr3I3jDG5X0aYJpoiKwam28-Y_R0oft z8ai!#h$@#bnRz}LYH6~f$`?S*TrsSO6;SPjCgc38;0O|`;AB*MA8HLxpf=+<)RNq> z@z>aoc;e({Y6qe^JPM299Mopqi+cVTs)LtNoA0_!f9E04h=gP*T)wYfZBd)$Eb5K* z7&U@CDNTn8q0&oX1MG$VxE8fU53vuvLoHFyRK~%mJu)3t-+UYQEFmzHgmtK%)=2Gg zEWzfesd|h9us|Bq;4IV&>LRwl52(%7G_A|`kJ5&tj`MS@jv3Oqd>=ZkP)j%vOW^|K zIgjHg0d0o2)_+k;kSM*&_s?+B;cntzpnBdogIW8QsEYcdI9U-rU`1Z2BSw`2u2cc<3cQmJ5ihPrj36@y=V$#Gv~QBs^JjS zQVqwHI0?1s=2+LF_P|~n{|6@$PoLfFiTT+%|FuZ?kpvyTx2Ux%o5NJt12t7)=*Cf~ zku64@-@~X+wezSB{DJDwJ=Bc8M7@X-&YloV_GpK>2C~T(q zJ1j^1Fc!rRsBcJxikQvq=}JJmGZy`+_yU&4ti@cuA1s;|H$B~s!zlM0n`3ARm+x=E z{Dg{UDCzQjzYoHu#8+c4e2Lmq9ZH$>(YS*6G30vzzyDX-9Isf^nr*{Eco>`DQ&a`j z%b13OuqN@%)@P`ZmoDq_{XOFTScmu(bYq@!F5eFvbx`#!#lrXq{dN8`mUsC!VSC&{ z#@E;#n^bW5{+8-m)b787=g?Kr<@-lz7jQ4}<(15cf-1Xw|JEyU6;t1NR7W#cH6w42 zim$-4cmp5PzGGW8vpH5)clmzke2ZsDFIU5?d7_%;6nIcCoUgDI&Oz;sJD3!!)-vCi z>Y~bZLYnT(YOna! zF%@M*y>g49UQDG??}OT?hFhTaL`STK3sD0(U&mt_xK2VM68^%h_!9LQkSf5$v!h-l z6|AjMpW_jzZ$6Vz9bJlQa2=|Ft*95+9@Gq;LUr^vR6Boo2rfrr zhUM@yYDp3{F!||__mm?C@*;8MLVc>$K{e0`H8bH@7zd*^_Y%~M{*1nV|9^~tHsKxA zruu+-p`>bPDrksGZ)xp?`dzGO)GnWmnz;?A2EC}`wgUWuX5x2L zLsw8sdJ{Dxf1&o+i{_kv_53{vGDQnhQ7+W+D33bN%~79rJx~=#qAD7WdTtDA&1c*E z)u=tO5p&^LRQc!V#^>tAVx3TuN##kqz%Eh6cUxga!kEoID zLM_oj)af{lI&Qa7ujE�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 diff --git a/resources/i18n/es/BambuStudio.mo b/resources/i18n/es/BambuStudio.mo index f8812a5dcfefa6d7cec4ce5d8b3c482441ca1e94..81f8d49d02e474f28a4a57a1e3925537bd68834d 100644 GIT binary patch delta 50469 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 F{{x#x_tyXb delta 37396 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 BtFHh6 diff --git a/resources/i18n/fr/BambuStudio.mo b/resources/i18n/fr/BambuStudio.mo index 594d6d72babddba57a4bc64dfb24fe9ff766100e..929dd898567bfaad4b51f9338a234471dc9cf595 100644 GIT binary patch delta 57138 zcmcHCb(~ez;`i}ALwAROaOm#t?q=vdGjo7}DJFmc;gC{F4c#SOGD=AZC@m;0jY^1w zpnwX(^ZA~&#>>6G-|Kn)xzB#RHt*GI?G^i+8Svhl<5F$?Ftzta=A?5RuJy?sCl3Z! zcAVQO9cR-(r8-WzX^zth%VR1Wg=9OEupZ9D=6DvXVxH-aQy)8G8k~!MxYDMt#)ic2 zVll_@IwfW}P8kvcFbR&u)c7Hm$C=m?4`X%AFw=3$Vsm^C<1j78V{TlI8t7ikjz>@f zzK$93E~?y1OhNxnmRXLIo`l?}j!U2#sEo<5uC+0$qn0+_)!G~Nq`{~sjYNNp!lW3B z8pv?WiZfB=)?hjMch(UI!0)j=mX0@5=*3*b58C)O)C}dFZ3a>R(-AL=rLZ>YNe9~e zXv{%;GHAqN-9Z?PRv~dq=AYqsn2jlxV1B>7m)Ics^ zZ@h!Ou+cm-fR(6nn@|sM&U(xGXdd&g2L2*Jn=ti!vlP`)9e#}2aT97U97e76aV&-x zPy>I1YA5*u^Q76a8SxTW0Haa)bFnWO+`91g?L_zX3$=+%xhQgKYc$WI(66br2}1D%P3i6>j@ zI59XB$KpfuP9PAm&TNk7Sb+E&REPQ3n-SMSZJIWysq2M#F&MRZ$Dx*F9_GMRsJ-xo z%|DMiMfXwdytVQ48<>9`tHK*h!zED-RluZJ2UB4~OpUEkGtw1RZvd)%II8?`Oo?7p zy-BEhPy^Hx2cVv?KfZ^fQER=> zx)s&lSE%w=P;37fi=nfLPeds0C7>xkg__zYsFA(E8kmYBkro@Fo}j(ejhfQII0GkP z8hmey*~EoW9X7H`%Wx z%c2t2M#ZC0Q@G*UQAECIx4*xPSp8tLqH8)#0r?^GxOr9gDTh^ zRk1H>iX%`nFv2>?=FdSr@oMWv%s_lQX2wIP0ban|_zVl{{HOoiG+YT&6R(Hb%`H(c zq;}XG!%=It%ch^h{KTJP6U?&1%tUw0Mmz%b;WPoW;Kw$91wJIc1HCG+YNvUkjhKn} zF4TxmpgO#c8rUD!B)d$*=~4OFt>sYzZiRY)fv6{qK(#v+wfmP~5j?Vs`PXK6M1m^3 zL{0f?Y=!>2%_eJ$T7rJ4fyLVRB+N*B9;*I2RQ=7UrAWYZxCiUwF-(G~_m~GxzlZtP z6XdoDRZzRNAr{3}sN)%f8t6RKOsqidg-xh|?ZOZ|iki{#UziT6V@~2tP@A$3R>j4b z1J8R2)Fki_HR57>O$TMIHBbX+jM_{CFc%I(%|twEZP%cteh-$y%cy}Q+h@KHq{9-# zTcPR=MQvj56dRa_+BBF|kH4d1L z#-JW>8mgT+NIza@2?3304R*xcwm|wX%@k$F7NnO!RgA+jI0g&jHtc{GQA<($Ag^7l zhMM}nQRT89GH=vcs3jbV8R_2{OF&N^k5h3yY6dDFHd9*%wR=0DDh8uEia>3;QK-Ez z4vXV-)DrDRZN~FhAFrThAP=L{QWnJY^zT$8pb8DJ7WTp*T!@;&H|X!j9{AdEni6kz z#C&<2fnmgN;ahBT)C{oAG4n#}h8oZ`)Y9xiJ;-tERrKmf9ud$;U!#`7|G0U=Y^d}? zs7+P^wdQqDGZuhFFa(q144Xd>^AX=<(@$X?;^(j=WF#s;CERitk}})O#W3B=fJSA4`H7 zT7ube9V-0*s^S&Yd3}T$V6s!Dp>(K@ilU~r8mgTZ)=sDg>x(IIAZnn|sDX|35>Uli zsDi6)#un>-R0pR~Q+N|Kki6fR534HJfOrVHa1(0kzro7*2(@GdPn#E7HPi$3#Wv`T zCQz5aAhj!gZEGcUSU#}BI0VIks6(2w`PAq*h?)dlk@ne(E__h5d~ zr=VtP6CTF1Ha_V479=6As?#0Q`r_=Bs=zbcNg1!rLr;tMc6F2T&W z$;J<0TH>d15MISm*z}r7KZ2TxbJp9a0X;!=_|p0sGZ6RlUN=*e33HNA2k&B+#P|(U zunTIl^~Vx87)#<})PRm*9=w3F@fkM3i8sw>#%WYM`z^C~dSMIV-cJc=N?xP(LdM%> zm%fMDiC0FwNLr!Rd@O3l=Gpini0cwq%A5F(Ot)rdv%i=hfOLT$Frr~wT|P4z_7Ow7j8xE`zGCDfkDaL06*7q#|fQT3`?8{r({ z?J+C;JNF1^23})%Ow9&pg|$#mG8xs-0@RbPu<2i-rubVM{}DCd-)ubnJyS0)s$3CF ziq%m|T?f6&Xi7lu?(Ucj`=Lf0ikgWy)C^6v>B~@?aFb2HgqrGKFgdQt<^>0hE|>LTiie#DCS z94lk-Urc@V zXojlS0sXNTs=dCb4hLX59Dy3hWaJcio%saRz-H85*ol2{KdOU#kImE;L_J|;Ou*Kt z-R}3q9LGGUCn|5PZ*6aNqn2Q>b&^lkf0<3#f!Z|RU`hNH3u2yM%`3Vd<|7`4#qeWP z`5o5pt*@>5p7Py+{05jF6Rd}<-$|YSTLknZPpqk*nRsDqJ*-cD56pl|tedU-tlwZK z@~@+ouHtWIMysP{xSox-K+SA>^lC~w5m3WnsN*pb^`r}Id^hS;TtGeXU#K_W`@fr4 zb_LYZwZnAS1=X&{I?_7F=5Iy~@QdGBe{GtBBxJ!;m=bTHKJS0VteE7vd4im%sVson z-Q{h(3Z^0681rL$n;&h{hv6L3$D=lLt`}xWi@sp~OOepgCXBIe!EB^oMJ>%!)NxDu z(hRIHYD(*3Mr@86cz2r~gqq?o)IbNL$_+t1&_t|?i@gMNOwMCnyoQ>>Jb#!cDuL># z3TDE3sN>ZEwK+SXmM#u+;$$q0D^W9h4E4e}hs817pC-L3>H)nC2xtIZQ6ue(T1yXV zN<&c{3_}fU5~|_3*brCXc)WwEH}EgxV9ZQ>7^?nM9EXc+dcIe_H>KC9K%fB`{m_N$ zQ5~N^b$Ai=j7BwT`r~wQ{l^=$+aEgr|MJ>ViI1nFTQGNb*`rB;2 zk*JPmqGn_XYO{P|-HtBe2Wi4n>ul zhkC$`===VkK%fu_dr>34jq2b&Y5;%Q^yK{Xp>vxKm7c}wLJg!es(wAx9%+htkPfK! zf>CeISk!=)`uTZ%BiT=aj?WR)`96bM`x~fT`w;cw$A1t!z^Pm8PovUp^jHq8}EhMj2_H^p{SV~ zk6M~|9E!_OOO_)m=U-3uepb^^S=7{3LUm9FHDygOFLuTb7>jHk=NRgkrO#$MC}pjN znwdtZ0d}(S?wFJKAXNL~vvK}a@FNm5!X>DwTaS8?>_Fw8Ma|5Qs3&}ZTB^Toe&+0c zzAr2VQTeq|r=yXLw?;ikN7Rf2+jz8>fR5idEQ`CW_ff|&XAWZ%)Y`?MKKG~E_*PVh zM^ID#4QgudpgQ`+`WI>dsdC!)1ZoDng$O946zWN9p&D#$3v@*7jh^@(4n@7&XQGyF zF{<7c)GPS_Y5+f=%H7BM_#0Nm%I}#|6^6{H*O^N|9j-@>cpGZ!4xskJG4#i?sI|O+ zYWNCj3GSel>@U=Vq{wB`bD(Cd6e_(TYK8(($8`{<)A^r7Kx;o2OX5n@6Q4#+_0Om$ zN|)Olvn;3%Yobm=Gt?;>h?Iw3pHfL4TlLeq&sX?f3NJFik+Vo$nZ&3rv^1gZCoaogW79yaAs-PNf zf|`LqEQ%vhOY#Y7(`>;cxC8Y<+JmZp1@!v?n*0o?_Vb}{2J>?MwW*qs zpxqvbYH)@vunpT0--jA#`g~>}E>r`>QBzvQS_{=)1Jr~lrZ@;S6A7qtdr_P0Bx-7Zz~XohHLy(i&46-P%cIJ* zMAdKSC7{jM2UTGZYRU#<6&zvX+fn8AqSpABjr$icOOhV7`Ld&)yr_*=#ool5p=N9? zYQUeNHoNyE0d2mQs0REC+D(F*%ABb53fK%AVl;k)+9OUO^J$nH^#E;9d!!@k)!Y;H zF+CjhK)X;&@&tS7{QpfryS+zY<6zWCC!!jhZQ~2EJ@K`u0sV=~Fm)00)oKIwAbtre zV#T87RP@I>#7CfSv*J+VSJ3zS{|?2>RP;wR9FKak)mQ=#U}b!O+6%7Y#-gYtDTBkX z25!Iv)WCa}Ff$m8Wr>eMZSpNx2Crc$FM%{AO~=(xo1!_Yfvz^*8?~lksLeMLbs9cI z&D4C<06#$u_$umski3)`XfD*I%a5vG#99`;>Zlq4O-&ut+Vw_t*bg-$Lr@(~#MZdL zrr)#af8bZ7r!H;EpF!=FTQ*+2j5&5SP)pbvbxM|%;rwfAj+3A%{}Z+8vX(Wwv<&KV zzcIQn7>nQpRQXLdeiZd$d5k*7smqxGS3tdr8=*E`H`HG1Zyi~V^IwaEc$@Gojw5~- z)$zdce!d^eC!?nLII5wys2NIE!3^wu)DzV~E#Uyvht^P3`QfO&G6^-4vr!*HYrF(B zqQj`E{~o*GZ5)NwEBZN$aTl(@PL<4u&P&uTf3LEiGZR~58@!2au}l>|-#5fxRrmA#<1-IxZEvD>eX$yTP76PN z4}d!F4{Q24A7JWQX2vF>9$+78M!VNG1CPT(I{%vq=o`>k)C(d-9rKe)9jr&g!N|ip zpVT!!7hEAx%bb4K6?*cku7Zdj***<|xk=?}0KmTPE!)EkM~L$|P%KL1lR@^coF z&=K`{{{;0-CQDqVxgDY`6-bU?-+09M*L)30B$-G~{rg$9RZ|UcJiT7|7u4`rD zty-H+oUVXJg7CV*}?4o&rmOx zudpE=M@@OU0P`UhfI5D?Q01b~cPdbyIl}`u|9T@$AVC9|hHMI_cSlok9BS(4qtd^$ z>32{K{)MUVtu<9A^8(6(I!%Qz36?_5SUH>D3e|6~PMm+8*M1~uq_L>uIK>uRj#-F* zYU5v{&hbT?{sZb2`~ov!lFnvkvZ3Crg;8(NlBoAUEmX%XumJ{m3DhJo7xg4(Q5{^v zFrO zM2+|ws^T5g5U^fnb&qo!yBYNQ8HGxQZ|2F{`ed=oX`=crAbqK|pPhN$#`sJ-$5 zs{9;OdmFJVZtKJO*ZI6ff*XIrM%bjU`PMoW!-zk?LfF-9-ee;% zCw8Mc3PBAx95o{&PbM<3o!e`u4j!SV(g`vRr9?H59yL=g zRDNaDUZ{;)A~&jIFS>Aojjut~-=qw6uphO{ze9C=%lg#nA8g-jsB(o+4OB!uX=Bur zwLm>_d(^4ujXI7|s8{b;RDTn!-uVR7z($*}4b{P6)IiRnHrbD;4&S1_WM=Z14r^H( zqL#9SwGFDn4yg7!p$6F9#@$A*)6ZrMLha%xEQBL$`f}70t;H$$8EPPP`cuyddhm&;&K0UZ?>N#%wx=;|Zvvg{UW6j@nGyQ8Tg!wK)%? z2KYT{s;{9syoDObW8{3mqC8M|HNuKYO1fI zrtm&$>K!>Gxg?fO-k>=}o2x^9Qp$51Y zwPdGIGkV2KK$|VaU}JXFaVv};Vtv$F9YbvzSCrX&6;U%#2etXyq4rFe&5uP5d^BqB z%ty7m#ipM?)${&9Kn=e|y~#31n+ioy-`8uSo~WmFG!`em8nvlTqdLA|y^fl}JE-@> z1FVGEV$4syEl^7tha>d)Kbyc15;De`Cz^;Ah%Z15?3DGU^%-huk_|Bp=0$x*v_>t> z7pUX*9JPni4z)9jRfrcx4Y()z{{2rd0W~-R193L$1@RI!BPEBKug&$aH*qiO9N$3Y zKf_>55ob1AC~9-Xp_X=nb+*l4W!;9UbpH1dXoN?xA*LN}o}?Y>38tWCVm9jdtVIpr zYwP!@C3$4cF~Y>_VZWH4{Hu{XZ~Ek{h*|N@ELb zjNjo5Jb{5DZT=|pb-l4Q49k%}2el+eP!Dt+zrcH=?D=2CG1S`ZM^$)^WwFR;v&lN6 zUb($c0~~50fGTzKkA=C_2v9`ei#QWiNoQ!kvy$OE4f1bAuR}gRP z{m{?3P2e7C#K$N4ITNtiB=d`i(>R5Ahsl1)QjqOo1gq+lb;@`?{)GL&{P*hZH_XiHLHetg086D8-|+VIO|MQ2kTKU zlmn=xyMikJ0(ENqr}% z81=+SW|)Db!5YN#qxMEm)Xarh$Doey96XE(n1TMCp)<`?Pecu51L`#FMGfdTRK;|& z%qz7d>Qk;Ww!xk_7B^y3EE8`&jE10&-Iu7Dyo6f&hp1DQYBuM;7J(WBlra>wwzE-7 zvIzAAYfx*v2N&W|Y=nVxjBBwO@rS4ZRGw>IU?WlKJFx>g^UTi~0jL?>Jdg9QU3r!S z6?lUhK>PV-t-7K{9*0VwhSzWow#KLh=Ck5UEK2-0)RN?0XqKQLs(vNZQZ`5JnVvR3 zY9Z%e4UZ#1PC;#^nYQ32)UH2-F1(GU(SMPdk#g4Bs3mEEm9QNK;{;TD4^YQ5*<$l* zE{eU0xAzio5!i+*@Ez(D{DzwPzfn(+X$kp$yb)1P*lej8Ks(fv^+J`8M0GeGbqtqT zw^|RNX8a5mL+>jBIu3=FnHgw=C5X2~?TI0%CyK}NcnsC>U#KTez1-}TjHpk~+^Eeu z3RP|~>R4{F>Bmr;`YtBb`FB>BCrXC;YLpK3#JN#ZR1UQ?(@_o1MLoe9>si!y!Z%nG zQ>-+bt08LB4nPek7Bxfhs8g{Pr>Ot^1T>}1SD6mlqt@JwO>i`}#G|O0%Cg$*@`|XX z8iBsgdFyP{jIBbwur8zO{fc_>jGq`wU_SbH8WCuK!Kf!$i_LKxmc_qN4V7492G{_# zi#wnT2cYUrMh$2d>OHd9rf)&DvlF$X_wWEFUCa5`+I&UeOT2|z!xihy6D3`5ralYm zeUJ;)L19z}Ww965N6p|eEP`vXFP=sXtn3E!cfZxJIPpkqj|(?&{?*V!68^w9sI_^y z(Y#{QZ}M|`5^sar#;CE({@F2lYK-9d^W4+ZZ^B?Q#acGNCEfU0o9dLFeYZ=eS7 z+?sxmDPI&d^%bm5P*2_+18@+!@Br##_ZD`+OkXe{o&OL5n)(^o3U{E^Jjq_OIdh_R zdmF5TA=nj{qK@xN)Gp7m&kV32YQVKn^#W`>95q7|P)oQKy;{>91oTS%3bj_hqGsYx zOoK`Hn|Mal4CF@DtAv`$2G*`NKOEPRJ`t;7*#l-z3_vaMY1A9>{sGRvc4Nvf%~~}? z7x5lg9Y4UyxC7^6y@TeP(k0Xq{e?OWNe}t?{*$ddsLeYQmA(Kq;7^ec8|MV7-Wk*@ z{`*6me`WkZf}Z4W)C(!gVKa4wQBzzGHKjdKYa5N4f$=sz3pLot+lm)zBo3-zPl}Q+hzhVNG$JIyJ&AccsqB{Kjs97TaW9AnYX)qb-=}}LX z6-!}W)C0A|(&$F*{^_Xij5|;d>P>dsY_=TujD%9Cj`N)`>FrU+sUNC?@u(S?hMJLO zsQ1JU)Q8L!RQ=Q^%~!HosCY1H?dPI4_co)~`I>+>*%j22+(oV7L)3fWchtyJoHDz% z3~B(CQJb|1Cc(C-845tvbE7_%V^GI?9BNa}z;#&d8@0pvyG=kNdWNc);IurB-iR$wQ#~CEvP64P$N1J6a~zX@YX+1Zb*u|n2crhGAM@z^pCs@#-ba1f zZTZf8tfo0@;vwiJ{RsBLV&}}-eu!F<#i%7(gPN(YupRz_1+dn6Gh=;Fn>iA-Cq6>2 zrhX5BeRu@*!We(SxD2(M_n-?;qh{m@>V@+=s>7rgO~WNo=ejAXo&J~~$D%%6SKIV6 zsNMhIBIjQP@?A2!u|8_e0#FSF+VrugHJ^>zbf2I)*o#_{OQ_xa6!juYa@pjUMJ;Iy z)C~1PZN?E;7dKz#{Hx(dBF`_vQ(6p&BlMd$1O2N?)S(Os*^D*p|h9#674N z&MDN=+(EqopP*hy#jct!r}a>AkC%X^a3reYYSgQDA8O>sP^aQ5Cdb>TiuX}7;aoH6 zIZy-2i%PGEdc(CqJwOOH#u2FRfCo`a=)FNePy86w!3!Jz+s2b!Hv>wGn(`c|V^;z7 zgf(rvF>0V~P{*(%YGwmbFQRCyfRix*_aaNjfB$*I{4%KoRwd&#s)0&3O#=;3FO~q* zOpQY=!3HdY-=G?PZPUx%GMljjYO{u;?~4qo-aORI?!kOI|KAX3Pr@VAIjwu!OxZ`M z3QMsG9z-oo${&nbP*a^3HKmnNQ{Dj!;b7F0&qdALCe)@rirQ=U(D(0uUlGs~7yZ#J zMP<}psEul{Gpa%?YPU~Db-W67TK1p@b{w@N=TR@18`fV?YySsoiR=7imas8;Rj~~L zf9!_Z3q4T-2u5{067?iAQ8Tg@_1-vvYVabC!0V{`-R_wBZY)N8I40mK)J%1`YaT4- zF6Uos5l@0#W8G~%g?i$f)<3OT?wRz`s1BN<&UGZ}{I5j4U`}HxOmg2G({iZyO+V|T z`(Bf zIZ#vg5$YJtMxD=vs5RYS^FKp%ychLGyNyNht+nVwGsSJOFzKOK181QNzro`87}c&f z=OeSm1yEC6#oEp~5Ve`cqXsw=wdoe12C&ZNA3@bWhk6k`LcJ&aADi-NP{%PBYV+nZ z>0YM_0iEN=kt@3LKJR5?b`SMG9Ma6 zuoCeWsNL?x(zpbB;7M$VMPHdG9)#N6BT)}D8#N#Y8MYi7cNB2)EB6=KZvF9B>L7KbxPi%W+cns=D6lV)hmjcnbOu;R&PrJIu_k+ zf(Kp1V^C8(2ld1ou^@hrn!>+PYo6|ndDrJc?U{;L4x3?dj6*%?Dy)JBQ16i!$P9U% zHv}{T@4Yn*RYW~eD^$e*EP@eu3FqQ83}*|C_hTTK4#)cY`!?x}B>uko>rk6^E9z79 zC~5}oqGsedzNhp5ih#~zwxs^PHLieVh_^#cu@_Zw6Y9yoK&|mf)KdIleTZ6u7pOH( zoy^}iv+tuGs2FMn%A#hVANv0Ne>eecrV-c{FQJZC(d7QVT{;2vj^Bt)@f_B`+$sEh zzwzvhF~nzKeoT?lSR88-Z;2Z4MAYV9ih7W>===QNNkF^w5UPQ1QBU>^wFh3Ko-A`J zf8TevBB&3c;n)V3;S_vqjZ1B2G-(<$)%j6RToiS@%c4FDhNbcM`bIL61dZrpJc~=P zDr*{<*57$bd|f)T1PjxfCs>bqb8bfuR>)u;U_R>9tU*2T8PovpqF!8;Gn(`$)Y4AQ z=+!3Rr&khm3cf`R&SDy9hH9`KY5>A<^Ur4LXF;uf71TiLTD?sP=s2`Rz2Q2crY;)w49mOr~mFM?{Y8tOez z-`d9J_dxBXFm&T|?2J!Q57aD&Z;yGMK?F4Qv8WD5quyY%Py<yt+D1>UK9xA;9s@@=*AB}o1OveJ+MQaJ@Nlu`4{W%-Ij(VfrMNRc9REOE$ zGrPDH>P;7m<#7#`#mhE5WiB&->Zmtp2h`GyM)kKG^U}Ywo`7C3$52af3Dx0qRE3PW z&5V>o4X_sKI5t5Is5`2`NYpWo!{Rs*OW>!d8NG(u?DtVK1z^- zVvfB2z7LtYsF?^tZK5%#^Sa8We~UV9k5M1Lsq>lB(gw8@Ls2uj9-H7U)BxUMRm|ct zp9w8pUK1Edg4TL6>dBU(Hpv>)6YWRM&@t3*KZAPmYp8NhPyPZG+U7Uq#@GNQ|sSEo% z!?6fzz$;J#NkA?2KGgf>GBPl)bAy13gnOuu;gm(pKni0a;?+^7pf?u7QP#EAZ&5Sx zCl16+Ma?Gu0DBXkXybQLo9-!UASsGzNjZN72Yt^It|@mhxZ zjM$8NvVAuFD7Gbj0k!!G7dJCo36EGE$KvQ)QwW;o-Ub(MOBOYDC zO#NJ}O?(^bi65g2lb19DFN*q#Ru0QNx-uEnoWOBYtk-}hZ}HhT4B7YXRxUq=+kzzchYj4 z|0yKYC}*bVYt&k2D{lr+8H*F2jN35*_2%kV!QZKeUepqOiG}ex*2N?hO$QB8QyqsI z*jUu@oq}KEyo#Lv(*$}|G6hOiHpi|KmM6UfR>1K#zSG8kMjg*QRm_srK<(<*sM8dH z`j8rcz5$??Y^+URi1mnX^b*jk^&#r`l&@+VLM=@IYLj)h>A}{4s25Ho>d9uIj_*QL zM_W*P;0O-F%QnAJHM5jmv8W$27(qZIoLAj^sx3!7!Oy5Qe}g?RTMaX%gRvIzwW#;O zPu4f6@;Pgoy-^lj#M_|uR0L}G&$aPSkq7oVmkAUl<9Czb---fpppNI{+Ob!+0Cg@n7M8F?Oxz@2tS*SQ_WmH^=vDTu(en1Aixw{+-PPx?skJ z{=WZaYXGXFr`QoQG%}|l7#9%Vg&yqC*x&cR^SujoN(whIpOS4+OY{M1W_F{FVeh8? zzW;Ts!?=jGAJ~lZ?;<043-cwkDC$kM-Rj@cY|0K;kMwZVx!;OSqfydm%8$d?Px8Nl4EU?C<+ewsLsPD|rU$y|N5L(YuB~1c5C5%&s4YI{!0KyL%1l zRBS;VpHES5wu4HigR@wP_=Wyvrcw{^_xZZvyv}I?ya=4D zs1J>om=u$Tn9qVVs0K=+K4hAqj%#OhVHg(1X{b~485Y2^sCv&)Z^q06&E_qFdapD_ z-~ax94+7dWgHR(Jk9u`ZL3Owo)8Gc|jXO}ADBB?O<_t%DdJaXsFUF!CXgaE$ji`_1 zeW>plx3L(e4doTC<58J_3%j5i7>0T!Pry_-4K?NSQ3G6$TEnfVSL+U&ejPQ?A5rZ* zK`r5HRL4of%x6YfRC;^#{qKKwBcQc)qkf_pYzwSJb+p0yDe6tQ3-jSg>o2GoNE2>4 z&W@VVf~cjcg^e))we|~8Gqfd~^RE}m2@-USeny@D+7V`r;;rjZ4IV%>a2YkVk8Ju| z)J)}!G#@erP;b=Qs8{tIREJxUJ?orAEx|XDoPQN~VGCp&Y^J6ZHYL3hHp34v34V>L zcpSCqo}n7f8D(~TCDcrWqXrmXw&)rv4#n&0nLYJXy3k4Qa6& z@!Y7r(h+m;2LtY??=tVLv-V>*bO@j_4oY~jZHY6c*9}l{GY?N#8bwZne2+1i4_>5 z^M8PVc4MXCrlVS@wXAP#iQ4s@P@Aa-YG6^Q^F0;y0P9dwe$M9KLACn^)n4)u=I4ow zsCt#r_y7OXfq-^>cXZ)Y)DmpMQkY=lw=h5Pd#I^Q^?`Y@6hjyBTBwG5+4yj*LVOYG zE7@7plRrScQB#hjAFXK`0($dhMitDD+BDTsQ{M{JaeHgDO`l`q3sLp=qBiqMR7ZDE zZ@MI-%;tO#H6sDm9_ZCt1`&|`Q6n3K>Np%V6VWz4-0HRI<55#P6}3s{*!XGGfG*=k zyoVZCJg2QIZbm&&^3j}sbx>@yIhSQo$E!S6!tSVsrekYdip}w%waOSX;L)fzkVg*Ltt^+sHW`YiYy^%-$|3?tE|c}RlJ?HeqKsm7YkRvEP2lPsYuni|Ce>i1(X+-wY{&PN}@=P+n#bZ>MNCC~p zMeNSqki4@rQq)#zL721a9J38?Bb=Esd~*9{#TIiekyewm#48Eqhj546dh?TV{&mDo zQt%-Ki;?k%tx$o1=<+8|*O!=!ybrm1QLX_`l7#R9Tdp>PfA{)?ytAb7W%r-Ut@6Z* z**d=e{h!q&oT5Q}A6tX|*o!nBA%6-!v;!dOJR*MsX@ekSJ4Cx5U~=U z_!9Yiv*Lf_k557TgY^2gPB!XKwH?)=zOLz%+l%Qa^9OlfDqZXUhJ-#;E=(hfZATDMWQas_`XaQBA_?eLDJhR4Zp!)Ze10qT#WfDRB2Apf}~4dW3bIV)uJ(qB>T5@}2EN1LxQ8EAU}?KCFs6!9PU`{#eIIyBIqn49~RO>Int=@iz- zsIF5~jwVgl9y;Pj0q1+}p7yDfK8*6sD8qMI-?hcc-|#va-YNG3gS)14yp#eI8 zo-#G)Lznt@4%2u_Ti_=$>noA#m_}|3R_GI(#Jb$NzT+N6`Wo8$ zm9ihx_7K9l3X#6a)*h~+q_dWw4eN0RPIhk?-TxtG(X#EJQgP} zC+4#4Tp>RhY4`rsp|92Mq_6Omq5r(L0p(;RqXqG*gvZeFOkZ(cLKH5+{e*^++QyZ& zoA_zl_-yKZM4cnFF_mx-Gj^IXQ%IX*A3}A?*qMAtJEi#k>7=Fb93pcmRDjBf*F0OP z3TabprBS`C| z?|%y^^dkw0S81ML8>7reT5c-j#M%_zM1kM9KO+B_E&S4U(183clzT=zE#Y|b`PZDj zYbfy}gddQ`4d_vhyI{&)n+lB@Z{($f;I!TA=DSVl% z;)m#XBvz%d)mWMIVicc&e-lqhdgAqxvcHhFfHqc;-<%Eu$;?BVuH@uDAnzjak8vjX zT>Sorgx+Khu$?z1^)DLkNBk6dX9*9Z!M;?OLiic-6SUKrdmUvjQ1?HtOr#B>ZU*i^ z>aMZ{hQ2f4&nV-kpTFDCP&Ybj#l4b(-;;5df<>s<%vSi*Hqe5!zX^ZB-Hh^O$k$J} zpVLMPI*TAbp73tMy7m#CKzJNsw;gCZ(kgKGr~YyM@9$k9qlB+G1F(gj+4vL+WunYl z8rD^XcvkMwG@$EK?#B$GEcN;lPEXjyeU5NH)b-ky%}+Rvc3jl|!Iz`?=PIp&Wc*A= z3EaAVAT13A6R&A>u-wM=qqeRTl=+0TJall7dnRQ%kv1A<;9Ta}^%o4yNFPtb9}(BpiL?hQL;XcI&6h!X zUD7slf5Ux&yfPR--Lkk=&!2%pKad*rp{)-{XxeDeBIPFFXZ{x#tfq(zfAj51Sc>lgC)t(=pQ+c*Dz z5jf(Ecc)+#DkNSL30$R-LAa3om6V@FJRfDgupO%GVeVt3jibzLZe5E}zxx?W zdJXRPh!;X#)qVf_+XSA_VL=)SvKh);&PdPOMz$#7ooff>``WTA3G3R*pgQ8$v=c>I zZ|a}3d0A+uvkj|k1IlEe{AzvwKSx6ch>WFB4epH;EJvZAC^S^1xyqCOmF-Z!m`c1R z*a7}Pejhs2)tCCuu{!bR zPz19vApXM3$!zmHq+L*)a^=bUiUxv7yHEHC_fg`%5l_4tk`_bSMQl$!{h~W3VOYZ3oRrjI*OvpsZCJTGu-VdSOEKwUI?Evs8~91 z(TJ`H?$ngI=!=;@y3*Ku?n;!YN?vJ_(-R+J>m(K}NFbJW{V8*reD6~lfA?xl#vty@ z+>Plp=AFT{C7hQ^Gf7WD!=GUkX(b5%ZQI#KJzat1C0?aSD?qt7)O~65ds4@fg!Mm2 zMp;TOwIe-DT-S68uBAc)!WGE7OS}Y~oTlNMwvj)`yG5ElMRV8zv?MJ%ZQLep4CQ{r z4Wxw;K1qAJR*)aaolEPls}uJ;?uOh8xvP=co5DX~UMkMy)-}W6`?DW^CShQo(}Auz zw()VKeaB!HQ#bK)lh%Xy-<0`~ww{px5t$dgBu0=>hysaMLDC8mKSIOl2{**2iJ5qr z%3n}tupN}LwsN=Q?oHWWN#8}i^^|*`Th|ogy7JL(e$oyQABeu^_b{q-M7mJfkIHJd z6MrnE&~aZi$N3U>k@l3bJy5>|*A+#4yKP+YwS))TPPfqB9hIfin%rL!*L91uueh`E z-yb+PNc@6EVoCVoorVHwWISn6R7|`&l3$g32<3I%AYWH5>nIa-9^3p~#Am-#|B1~{ zMxWpM>hS#iC=f?NI2~5BBY%Sd+^HxOW*e|u#n(hb(k_tK!FFWZbvBT;oqC^hSEbG6 zpMEoz}iC1+39k|=*{jaNs&AdtBY&LB@oxCExocL|jwSo>-*#UJX{64dh^PPsv zQto3ri`z&qM%{0?YY^tI3Vqjb>Lp&@r4;V}P6NtlPJ95J3?UrA{U;3+;;uycXEgGP z@D9>5VJ+&9t64As$Eh>D)u;Y;b(}h%DY~#B}AcB`1uZf-b@<{C|8}4jl=ox^n8cBy`<;1ZM;W*D0dIdZ5Ry} zBcm4gG7{HQxGm zWe2xJzgypCD{dyEt1Wqz&NjW%;1W8BCZ2=)IN@HlgO|iVr|dI28O~jY^tbqycG^&G zo$Y)YcHmBLAL1xxVi3!`G@$pZu1_dXfQ(dRxG|V}32A3(Gzf$3sF#}J&imBeO*n+~ zSCrXLyc~Bu;x3$N%devSo76vP2d(NUX?r&6f7`=%{YK^(DitJSD}{BfBkd`7JJR00 z>f46vlNU%GUEwxuGU4T<-|(gK)U+Q&c%tn`$@~Y2zQ2hi$p5zjo!zjRZ)t2N_X^u+ zaT;AfsVBs<687ib@lHc(tTFX((V?!1wOAcqk%>g97K33;TpD*hem2rxFZ(hPHEH2(TJ{@vrV5xI4e(Gp7f4(AU|jp2&W>gCHG{? z7NDaOwllTYS$}ZNvh8@o2n^u9Lxo?c{D92;gx|epkp2ygTz#jZ+H|(bHWFe7aFKd9 zN&AAzt!PZ+(U!&NUO}l|r%?M8;zpgFYob-~^A5VNX_X@&aCei$JeaxMY#C;T+ zMF*LvJQ9a;Cte*%J82^YNDs5&ucqN?MI~36M8x7SVT~`Q=k0yN+H|6;+%6Qq3rfULazQz1Beu2!()cYR)BEKK^ zTUFrNgf9FQ`%tDMZKWiCGWETks2oFLQRhKYU2a>yCgpDvZ=&C=h7y=Wfng*Tr@#T*u^-`l8W=vd6~8C1 zG-c0V03FrG`nVQ9#?z>4AZ2P%Hxu_X?&Nkb%KMXYMYs=f57zrXwQc-33C$@SPJA&H z&d|tr+}DXOP?)@u+@mO$c>PZLw{%*MGI{Ymo444u*$R)5R+4hJ$*;}5m$dA7m-Ojg zBA*fnvlS8>enf@2r1z)bW%82K@hQ@DrLxu{y*cq6$p|nVcgH& z8BmvZ@{%x!UewpM)s*o%0R$S+;AT2rZ#y4upRk9m{F!QycZ53!qtzJ~il z+vp?Gb=}87q;+{`AWGjy`UU)h_CNBK<@tNsN*n2{7#S(vsWgea+*DXcS~>Dcaql9n zIAuR4y%L=#UU$fgd#7%B2C&Cw_OsI(F@ zg50sup5QX6<7bQs&hsB-!rXEHDw1${OeMegl;ftwUmKIN)&H$z8K-dh!mf~LS4>2N zE5;ofTFUhw#s9tY_!;Al6)MssB-G;+Y32!ybc(c%^n|;bmJW&tCaHaFNQ_gYbBJeX zLYMJZ{VE2AM?{6WLtT+kA>lEuepGV>yJOsCT^o+pPP~);j|H2#?>i0B)q@N?Fx+;>WOjJN08@B1$)K2MvmiG~tHs(4d6YGkW`ZT>&w% z!66Z@rk$GeOd&BL3~{)5;(l&sDcEV?4hxJ;EXMi-GF`zgW~5zIY_vN-^A_a_j5ASJ z2gc%#3K~$#HFQ8o&;TuHzo>{Xm&#T2m8&1hm{{7V2v-Mp{culcXlzhWh;OlD26$*7 zvV%L4O&1mx%Xs4cNB`srqVIDVoS=p?iZ>n6u5uRvQcti~A8yOi9Mdb*)Rd`U9Y#0#{%3g8D zc$@~F;P_3qbB6r?=%#Ua|B!Hxhn4LA@4b2dfArQYr2ha{M^9Mfzxr~;5Y?WKjbiqq zT>~h>EXO2dn4QNje(3Dc2Fx@sYE$_4zM1{-4vSKD__sKK@^mICKE7 zr66seNNpdNmst%7kJc-WSLlCnQ~ul1`Fi!dvztuk^zHpGb^f1o>pK|#a}3%*|CZY4 zpOO5R2J#;ZkWhHeM871l(Y$Bp_Ug_#Y8?{9yQWo0ush1(#TOE&H#+H_VKKbHc(?!W zsjhy!)Bi0?8z;=ySSXFf|2_Ad%N-o-3gZJOl+Q-3b4a*e$3yto@g?VvKRWNnYT>>Y zi-(U=wO~GhV%*V#OckZYM)r?#2m213uZ4*Iywjr-*3S3$^SZT&{r`DYISmKc6jhA! z^w)=z@1rp^qQ6TYTyYVxQ7(5-P(*BaOqtY__XG`c^^1sdb&BL8&tnq)nE<^*-#PRD z%C&F8_+tywB?$?4C!Afd#xFy->V-!PAI|4zOh{xx^rCS|%7sS62D|tq8lsQTpos8r zPmu2;(|myZ^AQ^p6=yzR<9}N^Fe#Oy61p$D>sMIC?Ppi9R`uHycN*Fz=!(~{8umoR z*IMy3Q%qDusB($NxH|Fa5MO*{v79FAn?{nN^-1kplK3_&|40!T7sUpQNocrgn_t48 zs~;zgzqS6?gghJn^h+4J`MVTJW1}J>;~RgzFjJ9^9MMR3%z$W@JKEK@L5uiHpTEe& z0RAKO$c|I#dCVwJP(*)yUPgo`OyAkoFLi$p9~vP+gFG?u=XQP5Kp&kfYiNW!SX1_| zuN_VkK34T|Wtf2>;lc05eWh3rRx%_!e#!3E1^9{*>heTIMMRZizv^R6%N^v72^!!D zuHoV<)4aDI`<05%x~E<;x)1XtG~C1g@w4wkO<$#4^;-w<-6n!*33EqAG8A6vZoZcU zdf2TV-a>(Vx1+5xu5J;rG)&`szz*UY%|D-w?m+WJ#ucQU$0q$(WB)Yo@TJ4!`$HcZ z@rC#0N*fwVe3)H|$bI#_91aE)5jc?bjxI`!9w-wU8_m~*f6KC4@7=tZ0kmuC+T^g< zPMEE8r+QgXs#0M}5Aqm^}^1Uy@dh*O??O?&T@h=JHwlqCfV9vrB#O3u zAJPd6PnAxZf>&Quh$lMXt8WV=jX!&Sd{N)4g|ED=wByX5d;`-v#YW5-j_-P*ZmLS< z%DE!-#Xo+|g_G$5qe6n&4556+#0-e{EZ0!CmPJ2aBvy{lj}f+tC)oTrz!zOx(XDlfWO$@l||>IPpDPif^EyappC^cGBkruR7o1&|Y)} zheWf`aeT8Za%)tYsF(q+`eA$v406Y>xE0{_)X<}a^P!Tsr*+Es_+;go*5Fv*Fiq&npksep4GGt4;GZn!R`-$xb!{kY09nU_X< z{Ns8VBY8LcpW?0rI;tv7zyFa1A_!p>6nI1+AfzA!6vCQ?L=XrhVHdHIdPxduqpDs2 z8!hSS7B_U1X>Pk5b=qZ!&d^GbH!j^OWw+gWT0GjPXWD6P99nI+c01b6X_xu_`<8lS zVG)sYIHc+=_uY5zfB*mgzW=)k9_T)-{m|c@%qrlykjSVB`2|RN?{J+&z#XvmKt&Cef&)Tt?pqb$T(mhYZ>c0k_aL@ z>JT~-KCPak0>fV`CWECow{*Sb$-HIf zmvs8jQ7 zckTXS)KGb)97GOFm^Q}ta9$hR_kW>g(USK4U;dH?AdQfTBCj=@Flmo{eJ@>VnY3kL zNEDlb&4xvoQeB4Yq4l(Yct5N%;6@a zH7!xl7#jSEjIP?4K<0F_%p+iWc*CS0Eyto*9G?5#3(#~*wtbw2oFuf1XE>+2ZUG!r z44fAFg2*31&gkidb?zMRNpB-!O+HN@pzEA7YO7X*G=VGQyxP1upMFGQ-T)fef+pdU zgIDl1cJTCs6r~Ov)v+#+i;&j}uEbgmWA#ZYOR2wDsb_!$Lu!QS1w>>39Z0zmt&3>J zHt8(Uqr#dE%Vd&-UixJiwK%Os{s#9R+m|H$8+lqK0XStc>>hI%Ncfa`G=JRZdtROW zj~k!ee!<@&>)qok++&8ZqfQr5|QP4n}5KF_wcdkG8ixMnmxcR=XX%_i3$gn5ioFdV$X zO4wxf;>*KuZiKa3?btUWTjAi$qsZVO?9W2><1-%^ME^%RW(5s6yq{dF$jUe?YSyD+ zozbdfh~?Z{0oS5;6D?5#fegthP`dPj$a5o%#pH-Fy@>(hBU8qhw-2F$ycExvE&-e# zuzDEwZwZEtFlW5c%>ZGDsQg0XimS`VyNEdf7CFR;0*|M}wDJjFu9_{yidhImAZNjQ za9EGx4rYeoc(e`CB@OZ=JlE-4^hQGlY*+zk5SjlVpxXHbC$g|ps{tN9D@Y?`z)dH_ zzESk-2%CC9ctpC)u|TGzu!A_PA!%+ZAQLg)f=*Zs){;wDY%?x}j0AK@{z z5)$NSr~*hUN}?|=2D9x89bu@-mopP=ar>dI@-3|>#|tp*H%mrSMRrO;PB%cyThM$A z35aFNcBW^&qzC!hfEU*$7&E);*v%tzz&FYKjOUhq~K;5jBWtam|K7%%`ZUP0xEy48_ zIK+lFM_Xdg(Hxkw%jYrQP>=`j!Xsik6TouVZ3~Qvo8S{NsnbivhcjrXnVvx(Waap` z;5XSs%)N7HE#<^@)D|LU&v|sY+S^-P5-sIa(sRlbt$2EA$qaFCIn7s_;sSr;{;Gkq zXHV9)ZPOyNXBUsx=7KdS)rv*9f`*BQDk#3|mhGeD+#I7+sfb4^XvMBSZa?>!1xpdH zq$BwXJM*RSbQ}IPhy2aD@Xx0Qzw;WV$gZMElqaTD(V|}S;Wt6tj!B5?t7zuR1s-S) z>@y~zjDgEQa+?e$5;~Ju%Gfdk>GcLsBGv^bQVkWKSJAAqN-7cWBKj8aJZ4!neMqGz zRUbX-vBI~2+IOwEreC#ZeX_-V+xnvC?xKG6d^Ca8!vHlN4T|!`bin+{ z66#CYWk|^z#X~jp{JF`2 zl;&ZEWHa&(SYyNprQ3YoW9Sr?LAp(}ETe5R%l%AMruV=xYSn%NKisdC=pKlA=j_Gs zS4vqTQzSMos3kw0&8a)e#F=98dE$mTswGXlR!7?hl!5a>0LWC1m73l4c#q5KDaYJa zPYcy$@{*IOB-i$@6UC)Mw`ZM->8I4aadybez&ty*>o|vE%sMLVU0qaxfQ%djl^SvPgEV;j z65!-WBitW4sg#GJ2n8r!BEY(_xDsGEY9z#i>!_xOp;d}6*U|s3;>+t%(UL9{!~uU_ z#DyFyl85|SgMBo8T_fXA{#wNJFDU&Wg0kNLgDumZm=1_59}na!#;>Pnz+2-#O|}2H z5bNpP(aR$exg*SabO1<$y%GR%_2u-sW-!{}q8-=`jA0C!OlvT~da#7#FGQ=K3M#*? zP(Z1QS{00lKV;tFrwY2*RS7s?1BLx#=mr=*AU|SIBbgUhJ|JFepmT>;FnHt8A~h2o zBm?5_4FH0W2;dP>2nFM!sF9{R!Osjd(mCXO6R7~bKB6KRZ!|*wAf~+nXr_axz}%n{ z^~g@Q1%gSjsf7;ZR3UNF<7QQmCQ?;}m-J}gvpHhpq3_NX80K*PM9E<7Vha1Q@ zumVhuG`hkC(CcA(kPwT58))`0#_*6Dun3KRa1p>V?WJb_jZ~qEk}%~@1~@{E6@9}s zvL8#Cana-5=@`rnVH!uBbqwOB2#p(tHaNeRsQ_!=B!?hrAMt2}cB%oukgsTPE*=&` z*;`x|r3vEtC|x-b`KLCfWQ-ycM_5=PGDf@?E=)g>#Q#Xz;&PRsOeM4!1$tUFzd)hb z5u;mjEY+krViPSRRV&@Sj|PdG)(S7-MH)7zoy3TJs9V6;cZ3 zB)JBFmPON6nwY(y8SIhx$yT~W#gOi}f+AzNVg`qU8BMprnN6NJ8TCb{HW|=k2Esu| zH%I<}j*z(ZN*diK#vs@#Ex=9>UP(7mpHQI=T>&^W<{-@a6n&E2#~Nq$0Kna1)sN|i zSyj<^qj=-TG`GJ*F(_NM!o6()2@y_+$=A>uNayo+&|^bcsiG_M9TA992bm%m9T>%{ zJ1AYHbrP`PT9z_m;7S%(WxjxFw7TKz;+S~;TDqoZl56pB=A!00YU`|l5g%ViWwyDSXmrDzExV!$#vdr5%-F0|bRED_U&+A|;(zr5#!*n2${Oa~8zSkiz{7s%X`$i##~ z*}l|jRWZ}Ud^4+W%&)GeJ82*@QouRz!x(9k3l)@BE59OCa!IxqhO5RF zaqw0epXy4}V-W&;(dm}^tT5ldm1-dy$Vh#Zs<;k&24_+Uu*wOHvI5l%`xB018YGX9 zzK09k$o{leAaD>ZDBd9{fj5JjVu)U6>%SMoF$T>>D45=ZD2B2r#sG%Nv7M`Z_%N66 za^>PjU7o%!=4TeiO?RBjyse5C1TD*7VKeBi12QN6lzLHdbw;-&g-Up~)GgsHwQ8Fg zVZ(&ux5P_g>TNW4tSxbJm_Eh1R4PC+&$#wB`gbZ~Efezx@SrT6K>R<3yve-m4!Vtc zD(UMWR8O~=U)@RnMX8IUvijl(o|Gj)RO1W%4RF=ai+do@VqC}n$5kOs4B}`b2qK;F%;bZ z9~BL!+mc}5Ax#frBA7ZdU;Y`5?lEJ56l{1z8YimT5}(~q(|h1`#gqqVZGVJ?2=fB0 zEkNW5`;+48S?XZX{s7(9e-Ug79@b5*LqW6Q-)NM2ksQ2MkC`KEgCxW7$&pm5nb46| zjwqT$|6vKBHpDY+G;VTNCtH}2ssO*G6>C>%Gn87HFUA`Y7%NQeLB#iSD`gW3e#ndM zN#a#kEiQYACiG+-E{oC39S_k3J+c--gCPF27x}>@Kc}-yeCkI73@k*D0%0~18Fr0` z`H!EIk9NKC`vGFyBXr0I<(ea6lQ|f3n%xW8kl9oZMLa;^L8%P}f=ELl^>UPLqIMsZ z_u&BL2Z!F+0zV+`+(!q_=TaRSjWio?QF*-s3B{>GW5{_8hBy%?XlSu`nTv>7Y`Mh zNdxmc-D^%ashYCby3EvnqQEx1ZmaD=pop+OalI;3Si{&?eE1mMbqQkew~#DKL8GNz zl!`^LmVo7Z9;Xo1n1i06LOKiCE~Fw{Q(Gmjev+no4y=|3@{l$|KIUGK`Mz3w{v`c? z3=#hYy?6E^1VOYeA#aN=F8w7XM=Y`OS`<~HjN;{2gaF?DfF&jJpQ2}HEa8eU7Bh?4 zSj2V0qDk@lr|4%xmmt}7b(8R~P>UO_4A8~)r)gPg2^6_!P)B(oYUBYxQ9bOB!+e!; z)Oaxrtfcn{D>;?$htqqKR$L7E#RpH*Uh(iVlq>FjhW z&8dk@s%f%>?{=zU2O$oxaAyr&g<3|1ED6;`)vxFe!)sWg>aDtZ3OWgK?yu=kO6oMd zN=~K5XpIAg7!ghiA-G6J0knOd!`Rf;f|Sz1Pf#aH69C=7kGGVc$CiR-8WW?Qqt_@Q zzJ89(ejKH+7}9%SMtI3OarifMu6Xk|G|3$MTWX^IAYE9TAV(9t5lSuQJ}lGTV_FVW*ETh4K&#Hd-|3ro$nU&5SC0%u`u#lTzvEL+4tqFY6(_`}O|>42qi z9aG4}lPqpP%F?D9i8+U9 z@{C$=j}Xjoy+blo9{sFh5ef-b=twvXr6y|H>?9*#RBt>?+j?_u4@+jID{c;cg9=ot z6*G=dYWy+-kTwX)fgK^t8p7p9Na>KPS#&*kuY|D`_lv_vsImZ!WUjy;8?ultZgo$H z^1sl9xw=HjmFD)p&|u158f=Xw#hq``_}+C(l=%@BfMHm~i*M49@tMM~1REWkKC5UP zPAT^-+S#`dJ%FMIy)^WYHby-C7E;1ryhV?L7<^=cdY<@~w`uCxwR!-22*lq^uExbn zZ_~>I>N<;y#XWzep?x+m?&eCsLVPfv{VRoCn!8CIKq>peGbI>LvE0KEqkEOwl3mA} zm4f}`9c;MFQH3AlRM#z_O4XfUd?e@d9Zq^15qng1#h^M!<~mEpzf#qYNZ^lzPf8t6 z6Mhn+aj!rNDFr0t={?xF)lodI@V+I9UEv+XmD%c}sd{)|S1%1NqvPHv_RzdiB;W*d zDVY}brm_;-QO|eMYVs3$zW1?6MXiT|jdS~j?nssH$*ajzP$)}b_Zd=?&to|`oDm3n zpdefNk{M)X_m86{FV0b4COM3NFV>E33(wBel}t%byR7{3 zJoQjkZzR9r^n+l>HW`KHtiI~yxpGLXTv>L6g*D%Y@4If*A?i05RQHSz>R}2OMjudk7k1KT$zH{BZA!Lp@ zN8MnVk;9W?rF}0-^+l*KNZGI!FmE5KzL|rW!}wTR++3|VR);KWeGgLg(HKwb>Bo|) zU!|!&yQ^nHtZu>dzDP_^2MC71E+g61#nWTe_vh3jRqQBUSFi`gfb2p^U#+Z=UmFK6Ed9Qw?S0C zI6=LyH^&-aO;&x`@(zK&oqgVDDcL`^ct0tY zPgcKx?6iw|l1p-(NHs~v>Q8iCmpXnsgFIy^U6ZO^07-GMSPiYP_6TG)4L|~Vg1ZY` zPtnx|gXvS$^#xj~QVx8}!mBX$Q{pGeobody$soFtx_D}ex*)aE`VA##YBPeFTcSQm z+1Of;jEd)`ss-4wkG&wtC<9YP9>#AI0tJk^6jL+~j^&DjvIqwnMZan4ja}?yxMP~S zE`j@NUa z>U33(pNyv{*#T)gy+Kor@!-+j0V(j$Re_3 Ki5tt*^9X2^P^sNF)+M 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 E1N7QjBLDyZ diff --git a/resources/i18n/nl/BambuStudio.mo b/resources/i18n/nl/BambuStudio.mo index f8927e338beb6ca7de4eea7583a51141b60e4767..7364aa8afe8408dfe33b11ca8a0c5361b36a5aa3 100644 GIT binary patch delta 54194 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 delta 35962 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 c0e)Bv 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 delta 35883 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 delta 38860 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%0DL}WTO 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 diff --git a/resources/images/check_half_disabled.svg b/resources/images/check_half_disabled.svg new file mode 100644 index 0000000000..1e6fb24d7b --- /dev/null +++ b/resources/images/check_half_disabled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/check_off_disabled.svg b/resources/images/check_off_disabled.svg new file mode 100644 index 0000000000..d911ee69b9 --- /dev/null +++ b/resources/images/check_off_disabled.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/check_on_disabled.svg b/resources/images/check_on_disabled.svg new file mode 100644 index 0000000000..dfd917fb30 --- /dev/null +++ b/resources/images/check_on_disabled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/fragment_filter.svg b/resources/images/fragment_filter.svg index 6419b20bf5..ed78455cab 100644 --- a/resources/images/fragment_filter.svg +++ b/resources/images/fragment_filter.svg @@ -1,5 +1,9 @@ - - - - + + + + + + + + diff --git a/resources/images/im_slider_delete.svg b/resources/images/im_slider_delete.svg new file mode 100644 index 0000000000..2b4e2430b7 --- /dev/null +++ b/resources/images/im_slider_delete.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/images/menu_export_gcode.svg b/resources/images/menu_export_gcode.svg new file mode 100644 index 0000000000..1f09490f1a --- /dev/null +++ b/resources/images/menu_export_gcode.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/mmu_segmentation.svg b/resources/images/mmu_segmentation.svg index 2b717f01f8..05c5a481cc 100644 --- a/resources/images/mmu_segmentation.svg +++ b/resources/images/mmu_segmentation.svg @@ -1,6 +1,7 @@ - - - - - + + + + + + diff --git a/resources/images/monitor_sdcard_thumbnail.png b/resources/images/monitor_sdcard_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..0b4563f8e534b004839380ddcf459694360a77d1 GIT binary patch literal 9098 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 literal 0 HcmV?d00001 diff --git a/resources/images/monitor_sdcard_thumbnail.svg b/resources/images/monitor_sdcard_thumbnail.svg deleted file mode 100644 index 803e3e6d70..0000000000 --- a/resources/images/monitor_sdcard_thumbnail.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/resources/images/monitor_state_off.svg b/resources/images/monitor_state_off.svg new file mode 100644 index 0000000000..9a6de7d082 --- /dev/null +++ b/resources/images/monitor_state_off.svg @@ -0,0 +1,10 @@ + + + + Layer 1 + + + + + + \ No newline at end of file diff --git a/resources/images/monitor_state_on.svg b/resources/images/monitor_state_on.svg new file mode 100644 index 0000000000..c39cf9be9a --- /dev/null +++ b/resources/images/monitor_state_on.svg @@ -0,0 +1,10 @@ + + + + Layer 1 + + + + + + \ No newline at end of file diff --git a/resources/images/plate_arrange.svg b/resources/images/plate_arrange.svg index 67fff2dae3..c9c3b2501b 100644 --- a/resources/images/plate_arrange.svg +++ b/resources/images/plate_arrange.svg @@ -1,8 +1,8 @@ - - - - - - + + + + + + diff --git a/resources/images/plate_arrange_hover.svg b/resources/images/plate_arrange_hover.svg index 4f8a1ca368..6dce382802 100644 --- a/resources/images/plate_arrange_hover.svg +++ b/resources/images/plate_arrange_hover.svg @@ -1,8 +1,8 @@ - - - - - - + + + + + + diff --git a/resources/images/plate_locked.svg b/resources/images/plate_locked.svg index 9cdd76b549..83d8223e94 100644 --- a/resources/images/plate_locked.svg +++ b/resources/images/plate_locked.svg @@ -1,5 +1,5 @@ - + - + diff --git a/resources/images/plate_locked_hover.svg b/resources/images/plate_locked_hover.svg index 5953967471..bcf4281dae 100644 --- a/resources/images/plate_locked_hover.svg +++ b/resources/images/plate_locked_hover.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/resources/images/plate_orient.svg b/resources/images/plate_orient.svg index feb7592a92..9fee1617c9 100644 --- a/resources/images/plate_orient.svg +++ b/resources/images/plate_orient.svg @@ -1,7 +1,15 @@ - - - - - + + + + + + + + + + + + + diff --git a/resources/images/plate_orient_hover.svg b/resources/images/plate_orient_hover.svg index 3302228456..e97bc42a4e 100644 --- a/resources/images/plate_orient_hover.svg +++ b/resources/images/plate_orient_hover.svg @@ -1,7 +1,15 @@ - - - - - + + + + + + + + + + + + + diff --git a/resources/images/plate_unlocked.svg b/resources/images/plate_unlocked.svg index 934659ecfa..8b780a4f5b 100644 --- a/resources/images/plate_unlocked.svg +++ b/resources/images/plate_unlocked.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/resources/images/plate_unlocked_hover.svg b/resources/images/plate_unlocked_hover.svg index 314616bcca..de3b0794be 100644 --- a/resources/images/plate_unlocked_hover.svg +++ b/resources/images/plate_unlocked_hover.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/resources/images/recording_off_hover.svg b/resources/images/recording_off_hover.svg new file mode 100644 index 0000000000..729484ea2d --- /dev/null +++ b/resources/images/recording_off_hover.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/images/recording_off_normal.svg b/resources/images/recording_off_normal.svg new file mode 100644 index 0000000000..1a4d357621 --- /dev/null +++ b/resources/images/recording_off_normal.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/images/recording_on_hover.svg b/resources/images/recording_on_hover.svg new file mode 100644 index 0000000000..c2cd0833a0 --- /dev/null +++ b/resources/images/recording_on_hover.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/images/recording_on_normal.svg b/resources/images/recording_on_normal.svg new file mode 100644 index 0000000000..f1984fbf19 --- /dev/null +++ b/resources/images/recording_on_normal.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/images/sdcard_state_off.svg b/resources/images/sdcard_state_off.svg new file mode 100644 index 0000000000..5e9fa83a88 --- /dev/null +++ b/resources/images/sdcard_state_off.svg @@ -0,0 +1,20 @@ + + + + + + + + Layer 1 + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/sdcard_state_on.svg b/resources/images/sdcard_state_on.svg new file mode 100644 index 0000000000..c82fdd317c --- /dev/null +++ b/resources/images/sdcard_state_on.svg @@ -0,0 +1,17 @@ + + + + + + + + Layer 1 + + + + + + + + + \ No newline at end of file diff --git a/resources/images/split_objects.svg b/resources/images/split_objects.svg index 6633a722a0..8900e41399 100644 --- a/resources/images/split_objects.svg +++ b/resources/images/split_objects.svg @@ -1,7 +1,5 @@ - - - - - - + + + + diff --git a/resources/images/split_parts.svg b/resources/images/split_parts.svg index c21103dccb..ba7ace092d 100644 --- a/resources/images/split_parts.svg +++ b/resources/images/split_parts.svg @@ -1,27 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + diff --git a/resources/images/tab_auxiliary_avtice.svg b/resources/images/tab_auxiliary_avtice.svg index 3e5754f023..95fb702f7e 100644 --- a/resources/images/tab_auxiliary_avtice.svg +++ b/resources/images/tab_auxiliary_avtice.svg @@ -1,13 +1,9 @@ - - - - Layer 1 - - - - - - - - - \ No newline at end of file + + + + + + + + + diff --git a/resources/images/timelapse_off_hover.svg b/resources/images/timelapse_off_hover.svg new file mode 100644 index 0000000000..583bfd0469 --- /dev/null +++ b/resources/images/timelapse_off_hover.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/resources/images/timelapse_off_normal.svg b/resources/images/timelapse_off_normal.svg new file mode 100644 index 0000000000..b8f0505d93 --- /dev/null +++ b/resources/images/timelapse_off_normal.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/resources/images/timelapse_on_hover.svg b/resources/images/timelapse_on_hover.svg new file mode 100644 index 0000000000..e46f1015fd --- /dev/null +++ b/resources/images/timelapse_on_hover.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/resources/images/timelapse_on_normal.svg b/resources/images/timelapse_on_normal.svg new file mode 100644 index 0000000000..bd8898b5df --- /dev/null +++ b/resources/images/timelapse_on_normal.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/resources/images/toolbar_add_plate.svg b/resources/images/toolbar_add_plate.svg index b691127700..d87731d744 100644 --- a/resources/images/toolbar_add_plate.svg +++ b/resources/images/toolbar_add_plate.svg @@ -1,16 +1,14 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/resources/images/toolbar_arrange.svg b/resources/images/toolbar_arrange.svg index 5d1863b27d..3853540a66 100644 --- a/resources/images/toolbar_arrange.svg +++ b/resources/images/toolbar_arrange.svg @@ -1,7 +1,7 @@ - - - - - - + + + + + + diff --git a/resources/images/toolbar_assemble.svg b/resources/images/toolbar_assemble.svg index 77b1b4f476..781400992f 100644 --- a/resources/images/toolbar_assemble.svg +++ b/resources/images/toolbar_assemble.svg @@ -1,6 +1,6 @@ - - - - - + + + + + diff --git a/resources/images/toolbar_cut.svg b/resources/images/toolbar_cut.svg index 55428bea17..db48d85b78 100644 --- a/resources/images/toolbar_cut.svg +++ b/resources/images/toolbar_cut.svg @@ -1,10 +1,5 @@ - - - - - - - - - + + + + diff --git a/resources/images/toolbar_flatten.svg b/resources/images/toolbar_flatten.svg index f55d991d5d..0bae33edec 100644 --- a/resources/images/toolbar_flatten.svg +++ b/resources/images/toolbar_flatten.svg @@ -1,33 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + diff --git a/resources/images/toolbar_move.svg b/resources/images/toolbar_move.svg index dd5cb953d6..c27915f64f 100644 --- a/resources/images/toolbar_move.svg +++ b/resources/images/toolbar_move.svg @@ -1,17 +1,7 @@ - - - - - - - - - - - - - - - - + + + + + + diff --git a/resources/images/toolbar_open.svg b/resources/images/toolbar_open.svg index f05d1dd7b1..58f632c8f0 100644 --- a/resources/images/toolbar_open.svg +++ b/resources/images/toolbar_open.svg @@ -1,11 +1,9 @@ - - - - - - - - - - + + + + + + + + diff --git a/resources/images/toolbar_orient.svg b/resources/images/toolbar_orient.svg index aac0e90db0..d1bc15ad67 100644 --- a/resources/images/toolbar_orient.svg +++ b/resources/images/toolbar_orient.svg @@ -1,9 +1,10 @@ - - - - - - - - + + + + + + + + + diff --git a/resources/images/toolbar_rotate.svg b/resources/images/toolbar_rotate.svg index 3381534994..2594575c2e 100644 --- a/resources/images/toolbar_rotate.svg +++ b/resources/images/toolbar_rotate.svg @@ -1,9 +1,12 @@ - - - - - - - - + + + + + + + + + + + diff --git a/resources/images/toolbar_scale.svg b/resources/images/toolbar_scale.svg index ce186f00dd..9b9c91338b 100644 --- a/resources/images/toolbar_scale.svg +++ b/resources/images/toolbar_scale.svg @@ -1,23 +1,12 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/resources/images/toolbar_seam.svg b/resources/images/toolbar_seam.svg index 69d32d1dce..33801143b8 100644 --- a/resources/images/toolbar_seam.svg +++ b/resources/images/toolbar_seam.svg @@ -1,13 +1,7 @@ - - - - - - - - - - - - + + + + + + diff --git a/resources/images/toolbar_settings.svg b/resources/images/toolbar_settings.svg index b1b41242d9..59292275a2 100644 --- a/resources/images/toolbar_settings.svg +++ b/resources/images/toolbar_settings.svg @@ -1,7 +1,6 @@ - - - - - + + + + diff --git a/resources/images/toolbar_support.svg b/resources/images/toolbar_support.svg index 89a2ba32f4..62f90c9c0b 100644 --- a/resources/images/toolbar_support.svg +++ b/resources/images/toolbar_support.svg @@ -1,23 +1,12 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/resources/images/video_state_off.svg b/resources/images/video_state_off.svg new file mode 100644 index 0000000000..8d1509867c --- /dev/null +++ b/resources/images/video_state_off.svg @@ -0,0 +1,9 @@ + + + + Layer 1 + + + + + \ No newline at end of file diff --git a/resources/images/video_state_on.svg b/resources/images/video_state_on.svg new file mode 100644 index 0000000000..61c16fdd3e --- /dev/null +++ b/resources/images/video_state_on.svg @@ -0,0 +1,9 @@ + + + + Layer 1 + + + + + \ No newline at end of file diff --git a/resources/profiles/BBL.json b/resources/profiles/BBL.json index 53414fd3b4..af3c773070 100644 --- a/resources/profiles/BBL.json +++ b/resources/profiles/BBL.json @@ -1,7 +1,7 @@ { "name": "Bambulab", "url": "http://www.bambulab.com/Parameters/vendor/BBL.json", - "version": "01.00.10.01", + "version": "01.01.00.10", "force_update": "0", "description": "the initial version of BBL configurations", "machine_model_list": [ @@ -297,6 +297,10 @@ "name": "Bambu PC @BBL X1C", "sub_path": "filament/Bambu PC @BBL X1C.json" }, + { + "name": "Bambu PC @BBL X1C 0.8 nozzle", + "sub_path": "filament/Bambu PC @BBL X1C 0.8 nozzle.json" + }, { "name": "PolyLite PLA @BBL X1C", "sub_path": "filament/PolyLite PLA @BBL X1C.json" diff --git a/resources/profiles/BBL/filament/Bambu ABS @BBL X1C 0.8 nozzle.json b/resources/profiles/BBL/filament/Bambu ABS @BBL X1C 0.8 nozzle.json index 12cd407083..e91cb8154b 100644 --- a/resources/profiles/BBL/filament/Bambu ABS @BBL X1C 0.8 nozzle.json +++ b/resources/profiles/BBL/filament/Bambu ABS @BBL X1C 0.8 nozzle.json @@ -9,7 +9,7 @@ "22" ], "nozzle_temperature": [ - "255" + "260" ], "slow_down_min_speed": [ "10" diff --git a/resources/profiles/BBL/filament/Bambu PC @BBL X1C 0.8 nozzle.json b/resources/profiles/BBL/filament/Bambu PC @BBL X1C 0.8 nozzle.json new file mode 100644 index 0000000000..56256f6090 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PC @BBL X1C 0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "setting_id": "GFSC00_00", + "name": "Bambu PC @BBL X1C 0.8 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "Bambu PC @base", + "nozzle_temperature": [ + "270" + ], + "compatible_printers": [ + "Bambu Lab X1 Carbon 0.8 nozzle" + ] +} diff --git a/resources/profiles/BBL/filament/Bambu PC @BBL X1C.json b/resources/profiles/BBL/filament/Bambu PC @BBL X1C.json index fd464679c7..6daa0d9954 100644 --- a/resources/profiles/BBL/filament/Bambu PC @BBL X1C.json +++ b/resources/profiles/BBL/filament/Bambu PC @BBL X1C.json @@ -7,6 +7,7 @@ "inherits": "Bambu PC @base", "compatible_printers": [ "Bambu Lab X1 Carbon 0.4 nozzle", - "Bambu Lab X1 0.4 nozzle" + "Bambu Lab X1 0.4 nozzle", + "Bambu Lab X1 Carbon 0.6 nozzle" ] } diff --git a/resources/profiles/BBL/filament/Bambu TPU 95A @BBL X1C.json b/resources/profiles/BBL/filament/Bambu TPU 95A @BBL X1C.json index d65c12d95b..35c3322605 100644 --- a/resources/profiles/BBL/filament/Bambu TPU 95A @BBL X1C.json +++ b/resources/profiles/BBL/filament/Bambu TPU 95A @BBL X1C.json @@ -9,6 +9,8 @@ "6.4" ], "compatible_printers": [ - "Bambu Lab X1 Carbon 0.4 nozzle" + "Bambu Lab X1 Carbon 0.4 nozzle", + "Bambu Lab X1 Carbon 0.6 nozzle", + "Bambu Lab X1 Carbon 0.8 nozzle" ] } diff --git a/resources/profiles/BBL/filament/fdm_filament_pet.json b/resources/profiles/BBL/filament/fdm_filament_pet.json index 94cf6210b6..449046fd31 100644 --- a/resources/profiles/BBL/filament/fdm_filament_pet.json +++ b/resources/profiles/BBL/filament/fdm_filament_pet.json @@ -44,7 +44,7 @@ "30" ], "nozzle_temperature_initial_layer": [ - "250" + "255" ], "reduce_fan_stop_start_freq": [ "1" diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json index c6449b2b06..ada196c74e 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json @@ -9,6 +9,7 @@ "0.6" ], "printer_variant": "0.6", + "printer_model": "Bambu Lab X1 Carbon", "default_filament_profile": [ "Bambu PLA Basic @BBL X1C" ], diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon.json index 67ded914c7..3c83beb495 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon.json @@ -3,7 +3,7 @@ "name": "Bambu Lab X1 Carbon", "model_id": "BL-P001", "url": "http://www.bambulab.com/Parameters/printer_model/Bambu Lab X1 Carbon.json", - "nozzle_diameter": "0.4; 0.2; 0.6; 0.8", + "nozzle_diameter": "0.4;0.2;0.6;0.8", "machine_tech": "FFF", "family": "BBL-3DP", "bed_model": "bbl-3dp-X1.stl", diff --git a/resources/profiles/BBL/process/fdm_process_bbl_0.10_nozzle_0.2.json b/resources/profiles/BBL/process/fdm_process_bbl_0.10_nozzle_0.2.json index 369d221a4e..a33070f2e5 100644 --- a/resources/profiles/BBL/process/fdm_process_bbl_0.10_nozzle_0.2.json +++ b/resources/profiles/BBL/process/fdm_process_bbl_0.10_nozzle_0.2.json @@ -12,7 +12,7 @@ "bridge_flow": "1", "line_width": "0.22", "outer_wall_line_width": "0.2", - "initial_layer_line_width": "0.21", + "initial_layer_line_width": "0.25", "sparse_infill_line_width": "0.22", "inner_wall_line_width": "0.22", "internal_solid_infill_line_width": "0.22", diff --git a/resources/profiles/BBL/process/fdm_process_bbl_common.json b/resources/profiles/BBL/process/fdm_process_bbl_common.json index d2319dcd82..729080de57 100644 --- a/resources/profiles/BBL/process/fdm_process_bbl_common.json +++ b/resources/profiles/BBL/process/fdm_process_bbl_common.json @@ -7,7 +7,7 @@ "adaptive_layer_height": "0", "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", - "bottom_surface_pattern": "monotonicline", + "bottom_surface_pattern": "monotonic", "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", @@ -18,7 +18,7 @@ "compatible_printers_condition": "", "print_sequence": "by layer", "default_acceleration": "10000", - "bridge_no_support": "1", + "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0", "enable_arc_fitting": "1", diff --git a/resources/profiles/BBL/process/fdm_process_common.json b/resources/profiles/BBL/process/fdm_process_common.json index f6d5b1ca55..2f46423f61 100644 --- a/resources/profiles/BBL/process/fdm_process_common.json +++ b/resources/profiles/BBL/process/fdm_process_common.json @@ -11,7 +11,7 @@ "compatible_printers": [], "print_sequence": "by layer", "default_acceleration": "10000", - "bridge_no_support": "1", + "bridge_no_support": "0", "elefant_foot_compensation": "0.1", "outer_wall_line_width": "0.4", "outer_wall_speed": "120", diff --git a/resources/tooltip/styled.html b/resources/tooltip/styled.html index 64df994d9b..ea79b58e13 100644 --- a/resources/tooltip/styled.html +++ b/resources/tooltip/styled.html @@ -12,7 +12,7 @@
Back
-
finish
+
Next
diff --git a/resources/web/guide/31/31.css b/resources/web/guide/31/31.css new file mode 100644 index 0000000000..7879352d62 --- /dev/null +++ b/resources/web/guide/31/31.css @@ -0,0 +1,40 @@ + +#PolicyTxt +{ + background-color: #EBEBEB; + padding: 12px; + word-wrap:break-word; + overflow-y: scroll; + min-height: 200px; + text-indent: 2em; +} + +#PolicyTxt::-webkit-scrollbar {/*滚动条整体样式*/ + width: 5px; /*高宽分别对应横竖滚动条的尺寸*/ + height: 1px; +} + +#PolicyTxt::-webkit-scrollbar-thumb {/*滚动条里面小方块*/ + border-radius: 10px; + -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2); + box-shadow: inset 0 0 5px rgba(0,0,0,0.2); + background-color: #AAAAAA; +} + +#PolicyTxt::-webkit-scrollbar-track {/*滚动条里面轨道*/ + -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2); + box-shadow: inset 0 0 5px rgba(0,0,0,0.2); + border-radius: 10px; + background: #EDEDED; +} + +#C_List li +{ + margin-left: 4em; +} + +p +{ + text-indent:2em; + margin-bottom: 2px; +} \ No newline at end of file diff --git a/resources/web/guide/31/31.js b/resources/web/guide/31/31.js new file mode 100644 index 0000000000..1418d50dda --- /dev/null +++ b/resources/web/guide/31/31.js @@ -0,0 +1,80 @@ + +function OnInit() +{ + TranslatePage(); + + SendPrivacySelect(); +} + + +function SendPrivacySelect() +{ + let nVal="refuse"; + if( $('#ChoosePrivacy').is(':checked') ) + nVal="agree"; + + var tSend={}; + tSend['sequence_id']=Math.round(new Date() / 1000); + tSend['command']="user_private_choice"; + tSend['data']={}; + tSend['data']['action']=nVal; + + SendWXMessage( JSON.stringify(tSend) ); +} + + +function GotoNextPage() +{ + RequestProfile(); +} + +function RequestProfile() +{ + var tSend={}; + tSend['sequence_id']=Math.round(new Date() / 1000); + tSend['command']="request_userguide_profile"; + + SendWXMessage( JSON.stringify(tSend) ); +} + +function HandleStudio( pVal ) +{ + let strCmd=pVal['command']; + //alert(strCmd); + + if(strCmd=='response_userguide_profile') + { + HandleModelInfo(pVal['response']); + } +} + +function HandleModelInfo( pVal ) +{ + let Modellist=pVal["model"]; + let nModel=Modellist.length; + + if(nModel==1) + { +// let pModel=Modellist[0]; +// +// var tSend={}; +// tSend['sequence_id']=Math.round(new Date() / 1000); +// tSend['command']="save_userguide_models"; +// tSend['data']={}; +// +// let ModelName=pModel['model']; +// +// tSend['data'][ModelName]={}; +// tSend['data'][ModelName]['model']=pModel['model']; +// tSend['data'][ModelName]['nozzle_diameter']=pModel['nozzle_diameter']; +// tSend['data'][ModelName]['vendor']=pModel['vendor']; +// +// SendWXMessage( JSON.stringify(tSend) ); + + window.location.href="../22/index.html"; + + return; + } + + window.location.href="../21/index.html"; +} \ No newline at end of file diff --git a/resources/web/guide/31/index.html b/resources/web/guide/31/index.html new file mode 100644 index 0000000000..c5a386d176 --- /dev/null +++ b/resources/web/guide/31/index.html @@ -0,0 +1,38 @@ + + + + + +引导_P1 + + + + + + + + + + +
+
We kindly request your help to improve
everyone's printing
+
+
+
+
Back
+
Next
+
+ + diff --git a/resources/web/guide/5/5.css b/resources/web/guide/5/5.css index 603b223b62..62f5d90d00 100644 --- a/resources/web/guide/5/5.css +++ b/resources/web/guide/5/5.css @@ -1,41 +1,27 @@ -#NoteText + +#Content { - border:0px solid #787878; - font-size: 14px; - line-height: 22px; - height: 90%; - color: #535353; - overflow-y: auto; - overflow-x: hidden; - margin: 10mm 30mm; + padding:10% 15%; } -#NoteText h +#FeatureText { - font-size:22px; - line-height: 32px; -} - -#NoteText::-webkit-scrollbar {/*滚动条整体样式*/ - width: 5px; /*高宽分别对应横竖滚动条的尺寸*/ - height: 1px; -} - -#NoteText::-webkit-scrollbar-thumb {/*滚动条里面小方块*/ - border-radius: 10px; - -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2); - box-shadow: inset 0 0 5px rgba(0,0,0,0.2); - background-color: #AAAAAA; -} - -#NoteText::-webkit-scrollbar-track {/*滚动条里面轨道*/ - -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2); - box-shadow: inset 0 0 5px rgba(0,0,0,0.2); - border-radius: 10px; - background: #EDEDED; + line-height: 30px; } +#CheckArea +{ + margin-top:10mm; + line-height: 30px; +} +#InstallCheck +{ + width: 30px; +} - +#RestartText +{ + padding-left:30px; +} \ No newline at end of file diff --git a/resources/web/guide/5/5.js b/resources/web/guide/5/5.js index ca795b02fb..b537501249 100644 --- a/resources/web/guide/5/5.js +++ b/resources/web/guide/5/5.js @@ -1,4 +1,28 @@ +function OnInit() +{ + TranslatePage(); + + SendInstallPluginCheck(); +} + + + +function SendInstallPluginCheck() +{ + let nVal="no"; + if( $('#InstallCheck').is(':checked') ) + nVal="yes"; + + var tSend={}; + tSend['sequence_id']=Math.round(new Date() / 1000); + tSend['command']="network_plugin_install"; + tSend['data']={}; + tSend['data']['action']=nVal; + + SendWXMessage( JSON.stringify(tSend) ); +} + function FinishGuide() diff --git a/resources/web/guide/5/index.html b/resources/web/guide/5/index.html index 01693c664e..2482174d20 100644 --- a/resources/web/guide/5/index.html +++ b/resources/web/guide/5/index.html @@ -13,49 +13,25 @@ - +
-
Release note
+
Bambu Network Plugin
-
-7.5.0 -

更新日志:

-

1.新增关联内容设置

-

2.优化编辑器里的图片上传组件中的在线图片列表和后台默认上传组件中的图片库列表增加图片预览图标和链接;

-

3.新增对国产达梦数据库的兼容

-

4.新增免费模板metv75一套

-

5.优化管理员内容权限控制

-

6.优化编辑器里的图片上传组件中的在线图片列表和后台默认上传组件中的图片库列表增加图片预览图标和链接;

-

7.优化数据备份与导入功能

-

8.修复XSS漏洞

+ +
+ +
  
+
  
+
  
+
  
+
-

-7.4.0 -

更新日志:

-

1.新增关联内容设置

-

2.优化编辑器里的图片上传组件中的在线图片列表和后台默认上传组件中的图片库列表增加图片预览图标和链接;

-

3.新增对国产达梦数据库的兼容

-

4.新增免费模板metv75一套

-

5.优化管理员内容权限控制

-

6.优化前台内容限控制

-

7.优化数据备份与导入功能

-

8.修复XSS漏洞

-

-7.3.0 -

更新日志:

-

1.新增关联内容设置

-

2.优化编辑器里的图片上传组件中的在线图片列表和后台默认上传组件中的图片库列表增加图片预览图标和链接;

-

3.新增对国产达梦数据库的兼容

-

4.新增免费模板metv75一套

-

5.优化管理员内容权限控制

-

6.优化编辑器里的图片上传组件中的在线图片列表和后台默认上传组件中的图片库列表增加图片预览图标和链接;

-

7.优化数据备份与导入功能

-

8.修复XSS漏洞

- -
+ +
+
Back
diff --git a/resources/web/guide/6/6.css b/resources/web/guide/6/6.css new file mode 100644 index 0000000000..ca27c8eaa0 --- /dev/null +++ b/resources/web/guide/6/6.css @@ -0,0 +1,136 @@ +* +{ + padding: 0; + border: 0; + margin: 0; +} + +html,body +{ + font-size: 14px; + height:100%; +} + +.LinkBtn +{ + color: #1200FF; + cursor: pointer; +} + +.LinkBtn:hover +{ + text-decoration:underline; +} + +.Btn_Green +{ + padding: 1.5mm 6mm; + font-size: 14px; + text-align: center; + background-color: #00AE42; + border-radius: 6px; + color: #fff; + cursor: pointer; + display: inline-block; + border: 1px solid #009A3A; +} + +.Btn_Green:hover +{ + background-color: #009A3A; +} + + +#DownBlock +{ + height: 60%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +#DownArea +{ + width:80%; + height: 50%; + line-height: 50px; + display: inline; +} + +#DownText +{ + display: flex; + align-items: center; +} + +#RetryBtn +{ + background-image:url("restart.png"); + background-size: 100% 100%; + width: 20px; + height: 20px; + margin-left: 20px; + display: none; +} + + +#DownPercent +{ + height:20px; +} + +#PercentBkg +{ + height:20px; + background-color:#CFCFCF; + border-radius: 20px; +} + +#PercentTip +{ + float: left; + height:20px; + width: 0%; + background-color:#00AE42; + border-radius: 20px; +} + +#DownSuccessTip +{ + width:80%; + display: none; + text-align: center; +} + +#InstallFailedTip +{ + display:none; + height: auto; +} + + +/*------Btn Area------*/ + +#BtnBlock +{ + height:40%; + display: flex; + justify-content: center; + align-items: center; +} + +#CancelBtn +{ + display: inline; +} + +#RestartBtn +{ + display: none; +} + +#CloseBtn +{ + display: none; +} \ No newline at end of file diff --git a/resources/web/guide/6/6.js b/resources/web/guide/6/6.js new file mode 100644 index 0000000000..453343fdb1 --- /dev/null +++ b/resources/web/guide/6/6.js @@ -0,0 +1,167 @@ + + +function OnInit() +{ + //let strInput=JSON.stringify(cData); + //HandleStudio(strInput); + +// let tVal={}; +// tVal['status']=3; +// tVal['percent']=30; +// +// HandStatusPercent(tVal); + + TranslatePage(); + SendDownloadCmd(); +} + +function SendDownloadCmd() +{ + var tSend={}; + tSend['sequence_id']=Math.round(new Date() / 1000); + tSend['command']="Begin_Download_network_plugin"; + + SendWXMessage( JSON.stringify(tSend) ); +} + + +function HandleStudio( pVal ) +{ + let strCmd=pVal['command']; + //alert(strCmd); + + if(strCmd=='ShowStatusPercent') + { + HandStatusPercent(pVal['data']); + } +} + + +function HandStatusPercent( pVal ) +{ + let nStatus=pVal['status']*1; + let nPercent=pVal['percent']; + + if(nStatus==0) + { + //正常下载 + $('#DownStepText').attr("tid","t71"); + $('#RetryBtn').hide(); + + $('#PercentTip').css("width",nPercent+'%'); + } + else if(nStatus==1) + { + //下载失败 或 解压缩补丁包失败 + $('#DownStepText').attr("tid","t72"); + $('#PercentTip').css("width",0+'%'); + $('#RetryBtn').show(); + } + else if(nStatus==2) + { + //下载完成 + $('#PercentTip').css("width",100+'%'); + + setTimeout("SendInstallPluginCmd()",100); + } + else if(nStatus==3) + { + //解压缩补丁包失败 + $('#DownArea').hide(); + $("#InstallFailedTip").show(); + + $('#CancelBtn').hide(); + $('#RestartBtn').hide(); + $('#CloseBtn').show(); + } + else if(nStatus==4) + { + //安装补丁包完成 + $('#DownArea').hide(); + $('#DownSuccessTip').show(); + + $('#CancelBtn').hide(); + $('#CloseBtn').hide(); + $('#RestartBtn').show(); + + //pTimer=setInterval("RunInverse()",1000); + } + + TranslatePage(); +} + +var nCount=3; +var pTimer=null; +function RunInverse() +{ + $('#CountNumber').text(nCount+''); + nCount--; + + if(nCount==-1) + { + RestartBambuStudio(); + } + +} + +function RetryDownload() +{ + $('#DownStepText').attr("tid","t71"); + $('#PercentTip').css("width",0+'%'); + SendDownloadCmd(); +} + + +function CancelDownload() +{ + var tSend={}; + tSend['sequence_id']=Math.round(new Date() / 1000); + tSend['command']="netplugin_download_cancel"; + + SendWXMessage( JSON.stringify(tSend) ); + +} + +function SendInstallPluginCmd() +{ + var tSend={}; + tSend['sequence_id']=Math.round(new Date() / 1000); + tSend['command']="begin_install_plugin"; + + SendWXMessage( JSON.stringify(tSend) ); +} + + + +function RestartBambuStudio() +{ + if( pTimer!=null ) + { + clearInterval(pTimer); + pTimer=null; + } + + var tSend={}; + tSend['sequence_id']=Math.round(new Date() / 1000); + tSend['command']="restart_studio"; + + SendWXMessage( JSON.stringify(tSend) ); +} + +function CloseDownDialog() +{ + var tSend={}; + tSend['sequence_id']=Math.round(new Date() / 1000); + tSend['command']="close_download_dialog"; + + SendWXMessage( JSON.stringify(tSend) ); +} + +function OpenPluginFolder() +{ + var tSend={}; + tSend['sequence_id']=Math.round(new Date() / 1000); + tSend['command']="open_plugin_folder"; + + SendWXMessage( JSON.stringify(tSend) ); +} diff --git a/resources/web/guide/6/index.html b/resources/web/guide/6/index.html new file mode 100644 index 0000000000..b00437c1fe --- /dev/null +++ b/resources/web/guide/6/index.html @@ -0,0 +1,48 @@ + + + + + +引导_P1 + + + + + + + + + + +
+
+
+
Downloading
+
+
+
+
+
+
+
+ +
Installation successful.
+ +
+ + +
2, Close all open Bambu Studio
+
3, Delete all files under the plug-in directory
+
4, Reopen Bambu studio and install the plug-in again
+
+ + +
+ +
+
Cancel
+ + +
+ + diff --git a/resources/web/guide/6/restart.png b/resources/web/guide/6/restart.png new file mode 100644 index 0000000000000000000000000000000000000000..215e731af2d4b708e91322cfb8f488e9ee5eaa96 GIT binary patch literal 16368 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 literal 0 HcmV?d00001 diff --git a/resources/web/homepage/css/home.css b/resources/web/homepage/css/home.css index 851ebc3381..e287a76cbd 100644 --- a/resources/web/homepage/css/home.css +++ b/resources/web/homepage/css/home.css @@ -14,6 +14,24 @@ html, body { line-height: 20px; } +.RedFont +{ + font-size:12px; + color: #F07E4A; +} + +.LinkBtn +{ + font-size:12px; + color: #1200FF; + cursor: pointer; +} + +.LinkBtn:hover +{ + text-decoration:underline; +} + /*------------------*/ body { @@ -36,6 +54,7 @@ body align-items: center; justify-content: center; flex-wrap: nowrap; + position: relative; } @@ -52,6 +71,25 @@ body cursor:pointer; } +#NoPluginTip +{ + position: absolute; + top: 0px; + left: 0px; + bottom: 0px; + right: 0px; + z-index: 1; + display: flex; + flex-direction: column; + justify-content: flex-end; + padding: 5px; +} + + +#DownloadBtn +{ + color:#0A00FF; +} #Icon1 diff --git a/resources/web/homepage/index.html b/resources/web/homepage/index.html index bc085f64a7..2d0a467950 100644 --- a/resources/web/homepage/index.html +++ b/resources/web/homepage/index.html @@ -26,7 +26,12 @@
log out
- + + +
+
diff --git a/resources/web/homepage/js/home.js b/resources/web/homepage/js/home.js index c968da3547..d77a36c00c 100644 --- a/resources/web/homepage/js/home.js +++ b/resources/web/homepage/js/home.js @@ -42,6 +42,20 @@ function HandleStudio( pVal ) GotoMenu(strName); } + else if( strCmd=="network_plugin_installtip" ) + { + let nShow=pVal["show"]*1; + + if(nShow==1) + { + $("#NoPluginTip").show(); + $("#NoPluginTip").css("display","flex"); + } + else + { + $("#NoPluginTip").hide(); + } + } } function GotoMenu( strMenu ) @@ -192,4 +206,13 @@ function OnLogOut() SendWXMessage( JSON.stringify(tSend) ); } -window.postMessage = HandleStudio +function BeginDownloadNetworkPlugin() +{ + var tSend={}; + tSend['sequence_id']=Math.round(new Date() / 1000); + tSend['command']="begin_network_plugin_download"; + + SendWXMessage( JSON.stringify(tSend) ); +} + +window.postMessage = HandleStudio; diff --git a/src/BambuStudio.cpp b/src/BambuStudio.cpp index 7e3b654e3b..4b89913ba1 100644 --- a/src/BambuStudio.cpp +++ b/src/BambuStudio.cpp @@ -1220,7 +1220,7 @@ int CLI::run(int argc, char **argv) for (int i = 0; i < plate_data_list.size(); i++) { PlateData *plate_data = plate_data_list[i]; - for (auto it = plate_data->slice_flaments_info.begin(); it != plate_data->slice_flaments_info.end(); it++) { + for (auto it = plate_data->slice_filaments_info.begin(); it != plate_data->slice_filaments_info.end(); it++) { it->type = filament_types?filament_types->get_at(it->id):"PLA"; it->color = filament_color?filament_color->get_at(it->id):"#FFFFFF"; //it->filament_id = filament_id?filament_id->get_at(it->id):"unknown"; @@ -1729,7 +1729,7 @@ extern "C" { argv_ptrs[i] = argv_narrow[i].data(); //BBS: register default exception handler -#if BBL_RELEASE_TO_PUBLIC +#if 1 SET_DEFULTER_HANDLER(); #else AddVectoredExceptionHandler(1, CBaseException::UnhandledExceptionFilter); diff --git a/src/imgui/imconfig.h b/src/imgui/imconfig.h index b8cb562122..b9de0a9678 100644 --- a/src/imgui/imconfig.h +++ b/src/imgui/imconfig.h @@ -164,9 +164,8 @@ namespace ImGui const wchar_t HeightRangeIcon = 0x0813; const wchar_t FoldButtonIcon = 0x0814; const wchar_t UnfoldButtonIcon = 0x0815; - const wchar_t GcodePauseIcon = 0x0816; - const wchar_t SphereButtonIcon = 0x0817; - const wchar_t FragmentFilterIcon = 0x0818; + const wchar_t SphereButtonIcon = 0x0816; + const wchar_t FragmentFilterIcon = 0x0817; // void MyFunction(const char* name, const MyMatrix44& v); } diff --git a/src/imgui/imgui_widgets.cpp b/src/imgui/imgui_widgets.cpp index 9cd668c406..c363347e5d 100644 --- a/src/imgui/imgui_widgets.cpp +++ b/src/imgui/imgui_widgets.cpp @@ -4117,7 +4117,7 @@ bool ImGui::BBLInputScalar(const char *label, ImGuiDataType data_type, void *p_d if (format == NULL) format = DataTypeGetInfo(data_type)->PrintFmt; - char buf[16]; + char buf[8]; DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format); bool value_changed = false; @@ -6235,7 +6235,11 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl if (g.Style.FrameBorderSize > 0.0f) RenderFrameBorder(bb.Min, bb.Max, rounding); else + #ifdef __APPLE__ + window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), rounding,NULL,2.0f); // Color button are often in need of some sort of border + #else window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), rounding); // Color button are often in need of some sort of border + #endif } // Drag and Drop Source diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 6a79668c44..527e94da39 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -256,9 +256,15 @@ void AppConfig::set_defaults() set("backup_interval", "10"); } +#if BBL_RELEASE_TO_PUBLIC if (get("iot_environment").empty()) { set("iot_environment", "3"); } +#else + if (get("iot_environment").empty()) { + set("iot_environment", "1"); + } +#endif // Remove legacy window positions/sizes erase("app", "main_frame_maximized"); @@ -1003,12 +1009,7 @@ std::string AppConfig::get_region() std::string AppConfig::get_country_code() { std::string region = get_region(); - /* fix PRE environment when release to public */ -#if 0 - this->set("iot_environment", "2"); - return "ENV_CN_PRE"; -#else - //if (is_engineering_region()) { return region; } + if (is_engineering_region()) { return region; } if (region == "CHN" || region == "China") return "CN"; else if (region == "USA") @@ -1022,7 +1023,7 @@ std::string AppConfig::get_country_code() else return "Others"; return ""; -#endif + } bool AppConfig::is_engineering_region(){ diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index 75f4b60eb2..c130d48226 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -762,40 +762,7 @@ bool compSecondMoment(const ExPolygons& expolys, double& smExpolysX, double& smE return true; } -// BBS: thermal length is calculated according to the material of a volume -double getThermalLength(const ModelVolume* modelVolumePtr) { - double thermalLength = 200.; - auto aa = modelVolumePtr->extruder_id(); - if (Model::extruderParamsMap.find(aa) != Model::extruderParamsMap.end()) { - if (Model::extruderParamsMap.at(aa).materialName == "ABS" || - Model::extruderParamsMap.at(aa).materialName == "PA-CF" || - Model::extruderParamsMap.at(aa).materialName == "PET-CF") { - thermalLength = 100; - } - if (Model::extruderParamsMap.at(aa).materialName == "PC") { - thermalLength = 40; - } - if (Model::extruderParamsMap.at(aa).materialName == "TPU") { - thermalLength = 1000; - } - } - return thermalLength; -} - -// BBS: thermal length calculation for a group of volumes -double getThermalLength(const std::vector modelVolumePtrs) -{ - double thermalLength = 1250.; - - for (const auto& modelVolumePtr : modelVolumePtrs) { - if (modelVolumePtr != nullptr) { - // the thermal length of a group is decided by the volume with shortest thermal length - thermalLength = std::min(thermalLength, getThermalLength(modelVolumePtr)); - } - } - return thermalLength; -} //BBS: config brimwidth by volumes double configBrimWidthByVolumes(double deltaT, double adhension, double maxSpeed, const ModelVolume* modelVolumePtr, const ExPolygons& expolys) @@ -825,7 +792,7 @@ double configBrimWidthByVolumes(double deltaT, double adhension, double maxSpeed const double& bboxX = bbox2.size()(0); const double& bboxY = bbox2.size()(1); double thermalLength = sqrt(bboxX * bboxX + bboxY * bboxY) * SCALING_FACTOR; - double thermalLengthRef = getThermalLength(modelVolumePtr); + double thermalLengthRef = Model::getThermalLength(modelVolumePtr); double height_to_area = std::max(height / Ixx * (bbox2.size()(1) * SCALING_FACTOR), height / Iyy * (bbox2.size()(0) * SCALING_FACTOR)); double brim_width = adhension * std::min(std::min(std::max(height_to_area * maxSpeed / 24, thermalLength * 8. / thermalLengthRef * std::min(height, 30.) / 30.), 18.), 1.5 * thermalLength); @@ -846,8 +813,12 @@ double configBrimWidthByVolumeGroups(double adhension, double maxSpeed, const st BoundingBoxf3 mergedBbx; for (const auto& modelVolumePtr : modelVolumePtrs) { if (modelVolumePtr->is_model_part()) { - auto rawBoundingbox = modelVolumePtr->mesh().transformed_bounding_box(modelVolumePtr->get_matrix()); - auto bbox = modelVolumePtr->get_object()->instances.front()->transform_bounding_box(rawBoundingbox); + Slic3r::Transform3d t; + if (modelVolumePtr->get_object()->instances.size() > 0) + t = modelVolumePtr->get_object()->instances.front()->get_matrix() * modelVolumePtr->get_matrix(); + else + t = modelVolumePtr->get_matrix(); + auto bbox = modelVolumePtr->mesh().transformed_bounding_box(t); mergedBbx.merge(bbox); } } @@ -870,7 +841,7 @@ double configBrimWidthByVolumeGroups(double adhension, double maxSpeed, const st const double& bboxX = bbox2.size()(0); const double& bboxY = bbox2.size()(1); double thermalLength = sqrt(bboxX * bboxX + bboxY * bboxY) * SCALING_FACTOR; - double thermalLengthRef = getThermalLength(modelVolumePtrs); + double thermalLengthRef = Model::getThermalLength(modelVolumePtrs); double height_to_area = std::max(height / Ixx * (bbox2.size()(1) * SCALING_FACTOR), height / Iyy * (bbox2.size()(0) * SCALING_FACTOR)); double brim_width = adhension * std::min(std::min(std::max(height_to_area * maxSpeed / 24, thermalLength * 8. / thermalLengthRef * std::min(height, 30.) / 30.), 18.), 1.5 * thermalLength); @@ -884,26 +855,13 @@ double configBrimWidthByVolumeGroups(double adhension, double maxSpeed, const st } //BBS: create all brims -static ExPolygons outer_inner_brim_area(const Print& print, const ConstPrintObjectPtrs& top_level_objects_with_brim, +static ExPolygons outer_inner_brim_area(const Print& print, const float no_brim_offset, std::map& brimAreaMap, std::map& supportBrimAreaMap, std::vector>& objPrintVec, std::vector& printExtruders) { - std::unordered_set top_level_objects_idx; - top_level_objects_idx.reserve(top_level_objects_with_brim.size()); - for (const PrintObject* object : top_level_objects_with_brim) - top_level_objects_idx.insert(object->id().id); - unsigned int support_material_extruder = printExtruders.front() + 1; - auto allExtruders = print.extruders(); - if (print.has_support_material()) { - assert(top_level_objects_with_brim.front()->config().support_filament >= 0); - if (top_level_objects_with_brim.front()->config().support_filament > 0) - support_material_extruder = top_level_objects_with_brim.front()->config().support_filament; - allExtruders.push_back(support_material_extruder - 1); - sort_remove_duplicates(allExtruders); - } ExPolygons brim_area; ExPolygons no_brim_area; @@ -927,7 +885,6 @@ static ExPolygons outer_inner_brim_area(const Print& print, const ConstPrintObje float brim_offset = scale_(object->config().brim_object_gap.value); double flowWidth = print.brim_flow().scaled_spacing() * SCALING_FACTOR; float brim_width = scale_(floor(object->config().brim_width.value / flowWidth / 2) * flowWidth * 2); - const bool top_outer_brim = top_level_objects_idx.find(object->id().id) != top_level_objects_idx.end(); const float scaled_flow_width = print.brim_flow().scaled_spacing(); const float scaled_additional_brim_width = scale_(floor(5 / flowWidth / 2) * flowWidth * 2); const float scaled_half_min_adh_length = scale_(1.1); @@ -1017,8 +974,13 @@ static ExPolygons outer_inner_brim_area(const Print& print, const ConstPrintObje if (brimAreaMap.find(object->id()) != brimAreaMap.end()) expolygons_append(brim_area, brimAreaMap[object->id()]); } - if ((print.config().print_sequence == PrintSequence::ByObject) && top_level_objects_with_brim.front()->config().support_filament == 0) - support_material_extruder = objectWithExtruder.second; + support_material_extruder = object->config().support_filament; + if (support_material_extruder == 0 && object->has_support_material()) { + if (print.config().print_sequence == PrintSequence::ByObject) + support_material_extruder = objectWithExtruder.second; + else + support_material_extruder = printExtruders.front() + 1; + } if (support_material_extruder == extruderNo && brimToWrite.at(object->id()).sup) { if (!object->support_layers().empty()) { for (const Polygon& support_contour : object->support_layers().front()->support_fills.polygons_covered_by_spacing()) { @@ -1658,10 +1620,7 @@ void make_brim(const Print& print, PrintTryCancel try_cancel, Polygons& islands_ std::map supportBrimAreaMap; Flow flow = print.brim_flow(); const auto scaled_resolution = scaled(print.config().resolution.value); - std::vector bottom_layers_expolygons = get_print_bottom_layers_expolygons(print); - ConstPrintObjectPtrs top_level_objects_with_brim = get_top_level_objects_with_brim(print, bottom_layers_expolygons); - Polygons islands = top_level_outer_brim_islands(top_level_objects_with_brim, scaled_resolution); - ExPolygons islands_area_ex = outer_inner_brim_area(print, top_level_objects_with_brim, + ExPolygons islands_area_ex = outer_inner_brim_area(print, float(flow.scaled_spacing()), brimAreaMap, supportBrimAreaMap, objPrintVec, printExtruders); // BBS: Find boundingbox of the first layer diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index a0b17ec10a..8c4410bf23 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -122,8 +122,6 @@ set(lisbslic3r_sources GCode/SpiralVase.hpp GCode/SeamPlacer.cpp GCode/SeamPlacer.hpp - GCode/SpeedGenerator.cpp - GCode/SpeedGenerator.hpp GCode/ToolOrdering.cpp GCode/ToolOrdering.hpp GCode/WipeTower.cpp @@ -317,6 +315,12 @@ set(lisbslic3r_sources SLA/ReprojectPointsOnMesh.hpp ) +if (APPLE) + list(APPEND lisbslic3r_sources + MacUtils.mm + ) +endif () + add_library(libslic3r STATIC ${lisbslic3r_sources} "${CMAKE_CURRENT_BINARY_DIR}/libslic3r_version.h" ${OpenVDBUtils_SOURCES}) diff --git a/src/libslic3r/Circle.cpp b/src/libslic3r/Circle.cpp index 79a9fd85cd..bcd7fc47c1 100644 --- a/src/libslic3r/Circle.cpp +++ b/src/libslic3r/Circle.cpp @@ -4,6 +4,9 @@ #include #include "Geometry.hpp" + +//BBS: Refer to ArcWelderLib for the arc fitting functions + namespace Slic3r { //BBS: threshold used to judge collineation diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 8cdf6918cb..a821340c19 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -127,6 +127,7 @@ std::vector group_fills(const Layer &layer) std::vector> region_to_surface_params(layer.regions().size(), std::vector()); SurfaceFillParams params; bool has_internal_voids = false; + const PrintObjectConfig& object_config = layer.object()->config(); for (size_t region_id = 0; region_id < layer.regions().size(); ++ region_id) { const LayerRegion &layerm = *layer.regions()[region_id]; region_to_surface_params[region_id].assign(layerm.fill_surfaces.size(), nullptr); @@ -163,7 +164,7 @@ std::vector group_fills(const Layer &layer) params.bridge = is_bridge || Fill::use_bridge_flow(params.pattern); params.flow = params.bridge ? //BBS: always enable thick bridge for internal bridge - layerm.bridging_flow(extrusion_role, (surface.is_bridge() && !surface.is_external()) || g_config_thick_bridges) : + layerm.bridging_flow(extrusion_role, (surface.is_bridge() && !surface.is_external()) || object_config.thick_bridges) : layerm.flow(extrusion_role, (surface.thickness == -1) ? layer.height : surface.thickness); // Calculate flow spacing for infill pattern generation. diff --git a/src/libslic3r/Fill/FillConcentricWGapFill.cpp b/src/libslic3r/Fill/FillConcentricWGapFill.cpp index 1d76a8016f..8f037fc9a5 100644 --- a/src/libslic3r/Fill/FillConcentricWGapFill.cpp +++ b/src/libslic3r/Fill/FillConcentricWGapFill.cpp @@ -80,9 +80,8 @@ void FillConcentricWGapFill::fill_surface_extrusion(const Surface* surface, cons ThickPolylines polylines; for (ExPolygon& ex : gaps_ex_sorted) { - //BBS: medial axis algorithm can't handle duplicated points in expolygon. - //Use DP simplify to avoid duplicated points and accelerate medial-axis calculation as well. - ex.douglas_peucker(SCALED_RESOLUTION); + //BBS: Use DP simplify to avoid duplicated points and accelerate medial-axis calculation as well. + ex.douglas_peucker(SCALED_RESOLUTION * 0.1); ex.medial_axis(max, min, &polylines); } @@ -114,9 +113,8 @@ void FillConcentricWGapFill::fill_surface_extrusion(const Surface* surface, cons ThickPolylines polylines; for (ExPolygon& ex : external_gaps_collapsed) { - //BBS: medial axis algorithm can't handle duplicated points in expolygon. - //Use DP simplify to avoid duplicated points and accelerate medial-axis calculation as well. - ex.douglas_peucker(SCALED_RESOLUTION); + //BBS: Use DP simplify to avoid duplicated points and accelerate medial-axis calculation as well. + ex.douglas_peucker(SCALED_RESOLUTION * 0.1); ex.medial_axis(max, min, &polylines); } diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index 49ba9c76a7..0bf27609ef 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -3156,7 +3156,7 @@ void FillMonotonicLineWGapFill::fill_surface_extrusion(const Surface* surface, c ThickPolylines polylines; for (ExPolygon& ex : gaps_ex_sorted) { //BBS: Use DP simplify to avoid duplicated points and accelerate medial-axis calculation as well. - ex.douglas_peucker(SCALED_RESOLUTION); + ex.douglas_peucker(SCALED_RESOLUTION * 0.1); ex.medial_axis(max, min, &polylines); } diff --git a/src/libslic3r/Format/bbs_3mf.cpp b/src/libslic3r/Format/bbs_3mf.cpp index 760d45db2d..95f9b87f2c 100644 --- a/src/libslic3r/Format/bbs_3mf.cpp +++ b/src/libslic3r/Format/bbs_3mf.cpp @@ -232,6 +232,7 @@ static constexpr const char* LOCK_ATTR = "locked"; static constexpr const char* GCODE_FILE_ATTR = "gcode_file"; static constexpr const char* THUMBNAIL_FILE_ATTR = "thumbnail_file"; static constexpr const char* PATTERN_FILE_ATTR = "pattern_file"; +static constexpr const char* PATTERN_BBOX_FILE_ATTR = "pattern_bbox_file"; static constexpr const char* OBJECT_ID_ATTR = "object_id"; static constexpr const char* INSTANCEID_ATTR = "instance_id"; static constexpr const char* PLATERID_ATTR = "plater_id"; @@ -451,7 +452,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) info.id = it->first; info.used_m = used_filament_m; info.used_g = used_filament_g; - slice_flaments_info.push_back(info); + slice_filaments_info.push_back(info); } } @@ -1464,9 +1465,10 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) plate_data_list[it->first-1]->gcode_prediction = it->second->gcode_prediction; plate_data_list[it->first-1]->gcode_weight = it->second->gcode_weight; plate_data_list[it->first-1]->toolpath_outside = it->second->toolpath_outside; - plate_data_list[it->first-1]->slice_flaments_info = it->second->slice_flaments_info; + plate_data_list[it->first-1]->slice_filaments_info = it->second->slice_filaments_info; plate_data_list[it->first-1]->thumbnail_file = (m_load_restore || it->second->thumbnail_file.empty()) ? it->second->thumbnail_file : m_backup_path + "/" + it->second->thumbnail_file; plate_data_list[it->first-1]->pattern_file = (m_load_restore || it->second->pattern_file.empty()) ? it->second->pattern_file : m_backup_path + "/" + it->second->pattern_file; + plate_data_list[it->first-1]->pattern_bbox_file = (m_load_restore || it->second->pattern_bbox_file.empty()) ? it->second->pattern_bbox_file : m_backup_path + "/" + it->second->pattern_bbox_file; it++; } @@ -3039,6 +3041,10 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) { m_curr_plater->pattern_file = value; } + else if (key == PATTERN_BBOX_FILE_ATTR) + { + m_curr_plater->pattern_bbox_file = value; + } else if (key == INSTANCEID_ATTR) { m_curr_instance.instance_id = atoi(value.c_str()); @@ -3110,7 +3116,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) filament_info.color = color; filament_info.used_m = atof(used_m.c_str()); filament_info.used_g = atof(used_g.c_str()); - m_curr_plater->slice_flaments_info.push_back(filament_info); + m_curr_plater->slice_filaments_info.push_back(filament_info); } return true; } @@ -5327,10 +5333,14 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << THUMBNAIL_FILE_ATTR << "\" " << VALUE_ATTR << "=\"" << std::boolalpha << thumbnail_file_in_3mf << "\"/>\n"; } - if (plate_data->pattern_thumbnail.is_valid()) { + if (!plate_data->pattern_file.empty()) { std::string pattern_file_in_3mf = (boost::format(PATTERN_FILE_FORMAT) % (plate_data->plate_index + 1)).str(); stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << PATTERN_FILE_ATTR << "\" " << VALUE_ATTR << "=\"" << std::boolalpha << pattern_file_in_3mf << "\"/>\n"; } + if (!plate_data->pattern_bbox_file.empty()) { + std::string pattern_bbox_file_in_3mf = (boost::format(PATTERN_CONFIG_FILE_FORMAT) % (plate_data->plate_index + 1)).str(); + stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << PATTERN_BBOX_FILE_ATTR << "\" " << VALUE_ATTR << "=\"" << std::boolalpha << pattern_bbox_file_in_3mf << "\"/>\n"; + } if (instance_size > 0) { @@ -5430,7 +5440,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << SLICE_WEIGHT_ATTR << "\" " << VALUE_ATTR << "=\"" << plate_data->get_gcode_weight_str() << "\"/>\n"; stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << OUTSIDE_ATTR << "\" " << VALUE_ATTR << "=\"" << std::boolalpha<< plate_data->toolpath_outside << "\"/>\n"; - for (auto it = plate_data->slice_flaments_info.begin(); it != plate_data->slice_flaments_info.end(); it++) + for (auto it = plate_data->slice_filaments_info.begin(); it != plate_data->slice_filaments_info.end(); it++) { stream << " <" << FILAMENT_TAG << " " << FILAMENT_ID_TAG << "=\"" << std::to_string(it->id + 1) << "\" " << FILAMENT_TYPE_TAG << "=\"" << it->type << "\" " @@ -5903,7 +5913,8 @@ private: break; case AddObject: { { - _BBS_3MF_Exporter e; + CNumericLocalesSetter locales_setter; + _BBS_3MF_Exporter e; e.save_object_mesh(t.path, *t.object, (int) t.id); // response to delete cloned object } diff --git a/src/libslic3r/Format/bbs_3mf.hpp b/src/libslic3r/Format/bbs_3mf.hpp index c14fb76d39..ff47b05aee 100644 --- a/src/libslic3r/Format/bbs_3mf.hpp +++ b/src/libslic3r/Format/bbs_3mf.hpp @@ -30,7 +30,7 @@ public: std::string _3mf_thumbnail; std::string _3mf_printer_thumbnail_middle; std::string _3mf_printer_thumbnail_small; - + PackingTemporaryData() {} }; @@ -63,9 +63,10 @@ struct PlateData ThumbnailData plate_thumbnail; ThumbnailData pattern_thumbnail; std::string pattern_file; + std::string pattern_bbox_file; std::string gcode_prediction; std::string gcode_weight; - std::vector slice_flaments_info; + std::vector slice_filaments_info; bool is_sliced_valid = false; bool toolpath_outside {false}; @@ -114,7 +115,7 @@ enum class LoadStrategy { Default = 0, AddDefaultInstances = 1, - CheckVersion = 2, + CheckVersion = 2, LoadModel = 4, LoadConfig = 8, LoadAuxiliary = 16, @@ -223,7 +224,7 @@ extern bool store_bbs_3mf(StoreParams& store_params); extern void release_PlateData_list(PlateDataPtrs& plate_data_list); -// backup & restore project +// backup & restore project extern void save_object_mesh(ModelObject& object); diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index bff2faef89..05daa99484 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2542,6 +2542,24 @@ GCode::LayerResult GCode::process_layer( // Shall the support interface be printed with the active extruder, preferably with non-soluble, to avoid tool changes? bool interface_dontcare = object.config().support_interface_filament.value == 0; + // BBS: apply wiping overridden extruders + WipingExtrusions& wiping_extrusions = const_cast(layer_tools).wiping_extrusions(); + if (support_dontcare) { + int extruder_override = wiping_extrusions.get_support_extruder_overrides(&object); + if (extruder_override >= 0) { + support_extruder = extruder_override; + support_dontcare = false; + } + } + + if (interface_dontcare) { + int extruder_override = wiping_extrusions.get_support_interface_extruder_overrides(&object); + if (extruder_override >= 0) { + interface_extruder = extruder_override; + interface_dontcare = false; + } + } + // BBS: try to print support base with a filament other than interface filament if (support_dontcare && !interface_dontcare) { unsigned int dontcare_extruder = first_extruder_id; @@ -2609,7 +2627,16 @@ GCode::LayerResult GCode::process_layer( // Shall the support interface be printed with the active extruder, preferably with non-soluble, to avoid tool changes? bool interface_dontcare = object.config().support_interface_filament.value == 0; + // BBS: apply wiping overridden extruders WipingExtrusions& wiping_extrusions = const_cast(layer_tools).wiping_extrusions(); + if (support_dontcare) { + int extruder_override = wiping_extrusions.get_support_extruder_overrides(&object); + if (extruder_override >= 0) { + support_extruder = extruder_override; + support_dontcare = false; + } + } + if (support_dontcare || interface_dontcare) { // Some support will be printed with "don't care" material, preferably non-soluble. // Is the current extruder assigned a soluble filament? @@ -2897,8 +2924,12 @@ GCode::LayerResult GCode::process_layer( // BBS WipingExtrusions& wiping_extrusions = const_cast(layer_tools).wiping_extrusions(); + bool support_overridden = wiping_extrusions.is_support_overridden(layer.object()); + bool support_intf_overridden = wiping_extrusions.is_support_interface_overridden(layer.object()); + ExtrusionRole support_extrusion_role = instance_to_print.object_by_extruder.support_extrusion_role; - if (print_wipe_extrusions == 0) + bool is_overridden = support_extrusion_role == erSupportMaterialInterface ? support_intf_overridden : support_overridden; + if (is_overridden == (print_wipe_extrusions != 0)) support_eec.entities = filter_by_extrusion_role(instance_to_print.object_by_extruder.support->entities, instance_to_print.object_by_extruder.support_extrusion_role); for (auto& ptr : support_eec.entities) diff --git a/src/libslic3r/GCode/SpeedGenerator.cpp b/src/libslic3r/GCode/SpeedGenerator.cpp deleted file mode 100644 index c1877b594f..0000000000 --- a/src/libslic3r/GCode/SpeedGenerator.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include "SpeedGenerator.hpp" -#include "libslic3r/ExtrusionEntity.hpp" -#include "libslic3r/Utils.hpp" - -#define BOOST_SPIRIT_THREADSAFE -#include -#include -#include -#include - -namespace Slic3r { - -SpeedGenerator::SpeedGenerator() { - // default is 100 speed - for (int i = 0; i < 6; i++) { - speed_table[i] = 100; - } - std::string config_file = resources_dir() + "/PerimeterSpeedConfig.json"; - std::string encoded_path = encode_path(config_file.c_str()); - boost::property_tree::read_json(encoded_path, root); - if (root.count("speed_table")) { - int i = 0; - auto array6 = root.get_child("speed_table"); - for (auto pos = array6.begin(); pos != array6.end() && i < 6; pos++, i++) - speed_table[i] = pos->second.get_value(); - } -} - -double SpeedGenerator::calculate_speed(const ExtrusionPath& path, double max_speed, double min_speed) { - // limit the speed in case of F0 generated in gcode when user set 0 speed in UI - // which cause printer stopped. 1mm/s is slow enough and can make printer not really stopped. - max_speed = max_speed < 1 ? 1 : max_speed; - min_speed = min_speed < 1 ? 1 : min_speed; - // switch min and max speed if user set the max speed to be slower than min_speed - if (max_speed < min_speed) { - double temp = max_speed; - max_speed = min_speed; - min_speed = temp; - } - speed_table[0] = max_speed; - - int overhang_degree = path.get_overhang_degree(); - assert(overhang_degree >= 0 && overhang_degree <= 6); - double speed = (double)speed_table[overhang_degree]; - speed = std::max(speed, min_speed); - speed = std::min(speed, max_speed); - return speed; -} - -} diff --git a/src/libslic3r/GCode/SpeedGenerator.hpp b/src/libslic3r/GCode/SpeedGenerator.hpp deleted file mode 100644 index fc702fae17..0000000000 --- a/src/libslic3r/GCode/SpeedGenerator.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef libslic3r_SpeedGenerator_hpp_ -#define libslic3r_SpeedGenerator_hpp_ - -#include - -namespace Slic3r { - -class ExtrusionPath; - -class SpeedGenerator { -public: - SpeedGenerator(); - double calculate_speed(const ExtrusionPath& path, double max_speed, double min_speed); - -private: - boost::property_tree::ptree root; - int speed_table[6]; -}; - -} - -#endif // libslic3r_SpeedGenerator_hpp_ diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index b334f526b4..1c4b45466a 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -304,6 +304,7 @@ void ToolOrdering::collect_extruders(const PrintObject &object, const std::vecto layer_tools.extruders.push_back(extruder_interface); if (has_support || has_interface) { layer_tools.has_support = true; + layer_tools.wiping_extrusions().is_support_overriddable_and_mark(role, object); } } @@ -321,6 +322,7 @@ void ToolOrdering::collect_extruders(const PrintObject &object, const std::vecto layer_tools.extruders.push_back(extruder_interface); if (has_support || has_interface) { layer_tools.has_support = true; + layer_tools.wiping_extrusions().is_support_overriddable_and_mark(role, object); } } @@ -797,6 +799,19 @@ void WipingExtrusions::set_extruder_override(const ExtrusionEntity* entity, size copies_vector[copy_id] = extruder; } +// BBS +void WipingExtrusions::set_support_extruder_override(const PrintObject* object, size_t copy_id, int extruder, size_t num_of_copies) +{ + something_overridden = true; + support_map.emplace(object, extruder); +} + +void WipingExtrusions::set_support_interface_extruder_override(const PrintObject* object, size_t copy_id, int extruder, size_t num_of_copies) +{ + something_overridden = true; + support_intf_map.emplace(object, extruder); +} + // Finds first non-soluble extruder on the layer int WipingExtrusions::first_nonsoluble_extruder_on_layer(const PrintConfig& print_config) const { @@ -834,6 +849,25 @@ bool WipingExtrusions::is_overriddable(const ExtrusionEntityCollection& eec, con return true; } +// BBS +bool WipingExtrusions::is_support_overriddable(const ExtrusionRole role, const PrintObject& object) const +{ + if (!object.config().flush_into_support) + return false; + + if (role == erMixed) { + return object.config().support_filament == 0 || object.config().support_interface_filament == 0; + } + else if (role == erSupportMaterial || role == erSupportTransition) { + return object.config().support_filament == 0; + } + else if (role == erSupportMaterialInterface) { + return object.config().support_interface_filament == 0; + } + + return false; +} + // Following function iterates through all extrusions on the layer, remembers those that could be used for wiping after toolchange // and returns volume that is left to be wiped on the wipe tower. float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int old_extruder, unsigned int new_extruder, float volume_to_wipe) @@ -844,6 +878,10 @@ float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int if (! this->something_overridable || volume_to_wipe <= 0. || print.config().filament_soluble.get_at(old_extruder) || print.config().filament_soluble.get_at(new_extruder)) return std::max(0.f, volume_to_wipe); // Soluble filament cannot be wiped in a random infill, neither the filament after it + // BBS + if (print.config().filament_is_support.get_at(old_extruder)) + return std::max(0.f, volume_to_wipe); // Support filament cannot be used to print support, infill, wipe_tower, etc. + // we will sort objects so that dedicated for wiping are at the beginning: ConstPrintObjectPtrs object_list = print.objects().vector(); std::sort(object_list.begin(), object_list.end(), [](const PrintObject* a, const PrintObject* b) { return a->config().flush_into_objects; }); @@ -876,7 +914,7 @@ float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int for (const LayerRegion *layerm : this_layer->regions()) { const auto ®ion = layerm->region(); - if (!object->config().flush_into_infill && !object->config().flush_into_objects) + if (!object->config().flush_into_infill && !object->config().flush_into_objects && !object->config().flush_into_support) continue; bool wipe_into_infill_only = !object->config().flush_into_objects && object->config().flush_into_infill; bool is_infill_first = print.config().wall_infill_order == WallInfillOrder::InfillInnerOuter || @@ -918,6 +956,46 @@ float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int } } } + + // BBS + if (object->config().flush_into_support) { + auto& object_config = object->config(); + const SupportLayer* this_support_layer = object->get_support_layer_at_printz(lt.print_z, EPSILON); + const TreeSupportLayer* this_tree_support_layer = object->get_tree_support_layer_at_printz(lt.print_z, EPSILON); + + do { + if (this_support_layer == nullptr && this_tree_support_layer == nullptr) + break; + + bool support_overriddable = object_config.support_filament == 0; + bool support_intf_overriddable = object_config.support_interface_filament == 0; + if (!support_overriddable && !support_intf_overriddable) + break; + + auto& entities = this_support_layer != nullptr ? this_support_layer->support_fills.entities : this_tree_support_layer->support_fills.entities; + if (support_overriddable && !is_support_overridden(object)) { + set_support_extruder_override(object, copy, new_extruder, num_of_copies); + for (const ExtrusionEntity* ee : entities) { + if (ee->role() == erSupportMaterial || ee->role() == erSupportTransition) + volume_to_wipe -= ee->total_volume(); + + if (volume_to_wipe <= 0.f) + return 0.f; + } + } + + if (support_intf_overriddable && !is_support_interface_overridden(object)) { + set_support_interface_extruder_override(object, copy, new_extruder, num_of_copies); + for (const ExtrusionEntity* ee : entities) { + if (ee->role() == erSupportMaterialInterface) + volume_to_wipe -= ee->total_volume(); + + if (volume_to_wipe <= 0.f) + return 0.f; + } + } + } while (0); + } } } // Some purge remains to be done on the Wipe Tower. @@ -1010,4 +1088,24 @@ const WipingExtrusions::ExtruderPerCopy* WipingExtrusions::get_extruder_override return overrides; } +// BBS +int WipingExtrusions::get_support_extruder_overrides(const PrintObject* object) +{ + auto iter = support_map.find(object); + if (iter != support_map.end()) + return iter->second; + + return -1; +} + +int WipingExtrusions::get_support_interface_extruder_overrides(const PrintObject* object) +{ + auto iter = support_intf_map.find(object); + if (iter != support_intf_map.end()) + return iter->second; + + return -1; +} + + } // namespace Slic3r diff --git a/src/libslic3r/GCode/ToolOrdering.hpp b/src/libslic3r/GCode/ToolOrdering.hpp index f2ba1b3e1e..d0b60e2c8a 100644 --- a/src/libslic3r/GCode/ToolOrdering.hpp +++ b/src/libslic3r/GCode/ToolOrdering.hpp @@ -32,6 +32,8 @@ public: // This is called from GCode::process_layer - see implementation for further comments: const ExtruderPerCopy* get_extruder_overrides(const ExtrusionEntity* entity, int correct_extruder_id, size_t num_of_copies); + int get_support_extruder_overrides(const PrintObject* object); + int get_support_interface_extruder_overrides(const PrintObject* object); // This function goes through all infill entities, decides which ones will be used for wiping and // marks them by the extruder id. Returns volume that remains to be wiped on the wipe tower: @@ -46,6 +48,22 @@ public: return out; } + // BBS + bool is_support_overriddable(const ExtrusionRole role, const PrintObject& object) const; + bool is_support_overriddable_and_mark(const ExtrusionRole role, const PrintObject& object) { + bool out = this->is_support_overriddable(role, object); + this->something_overridable |= out; + return out; + } + + bool is_support_overridden(const PrintObject* object) const { + return support_map.find(object) != support_map.end(); + } + + bool is_support_interface_overridden(const PrintObject* object) const { + return support_intf_map.find(object) != support_intf_map.end(); + } + void set_layer_tools_ptr(const LayerTools* lt) { m_layer_tools = lt; } private: @@ -54,6 +72,9 @@ private: // This function is called from mark_wiping_extrusions and sets extruder that it should be printed with (-1 .. as usual) void set_extruder_override(const ExtrusionEntity* entity, size_t copy_id, int extruder, size_t num_of_copies); + // BBS + void set_support_extruder_override(const PrintObject* object, size_t copy_id, int extruder, size_t num_of_copies); + void set_support_interface_extruder_override(const PrintObject* object, size_t copy_id, int extruder, size_t num_of_copies); // Returns true in case that entity is not printed with its usual extruder for a given copy: bool is_entity_overridden(const ExtrusionEntity* entity, size_t copy_id) const { @@ -62,6 +83,9 @@ private: } std::map entity_map; // to keep track of who prints what + // BBS + std::map support_map; + std::map support_intf_map; bool something_overridable = false; bool something_overridden = false; const LayerTools* m_layer_tools = nullptr; // so we know which LayerTools object this belongs to diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index 777f34e4a0..66cc0b5893 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -251,6 +251,12 @@ public: }; std::vector> area_groups; + enum OverhangType { + Detected=0, + Enforced + }; + std::map overhang_types; + virtual bool has_extrusions() const { return !support_fills.empty(); } void simplify_support_extrusion_path() { this->simplify_support_entity_collection(&support_fills);} diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index e125430022..e57648237e 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -70,6 +70,7 @@ void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollec const PrintConfig &print_config = this->layer()->object()->print()->config(); const PrintRegionConfig ®ion_config = this->region().config(); + const PrintObjectConfig& object_config = this->layer()->object()->config(); // This needs to be in sync with PrintObject::_slice() slicing_mode_normal_below_layer! bool spiral_mode = print_config.spiral_mode && //FIXME account for raft layers. @@ -100,7 +101,7 @@ void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollec g.layer_id = (int)this->layer()->id(); g.ext_perimeter_flow = this->flow(frExternalPerimeter); - g.overhang_flow = this->bridging_flow(frPerimeter, g_config_thick_bridges); + g.overhang_flow = this->bridging_flow(frPerimeter, object_config.thick_bridges); g.solid_infill_flow = this->flow(frSolidInfill); g.process(); @@ -118,6 +119,9 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly const bool has_infill = this->region().config().sparse_infill_density.value > 0.; const float margin = float(scale_(EXTERNAL_INFILL_MARGIN)); + // BBS + const PrintObjectConfig& object_config = this->layer()->object()->config(); + #ifdef SLIC3R_DEBUG_SLICE_PROCESSING export_region_fill_surfaces_to_svg_debug("3_process_external_surfaces-initial"); #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ @@ -285,7 +289,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly // would get merged into a single one while they need different directions // also, supply the original expolygon instead of the grown one, because in case // of very thin (but still working) anchors, the grown expolygon would go beyond them - BridgeDetector bd(initial, lower_layer->lslices, this->bridging_flow(frInfill, g_config_thick_bridges).scaled_width()); + BridgeDetector bd(initial, lower_layer->lslices, this->bridging_flow(frInfill, object_config.thick_bridges).scaled_width()); #ifdef SLIC3R_DEBUG printf("Processing bridge at layer %zu:\n", this->layer()->id()); #endif diff --git a/src/libslic3r/MacUtils.hpp b/src/libslic3r/MacUtils.hpp new file mode 100644 index 0000000000..388baa1190 --- /dev/null +++ b/src/libslic3r/MacUtils.hpp @@ -0,0 +1,10 @@ +#ifndef __MAC_UTILS_H +#define __MAC_UTILS_H + +namespace Slic3r { + +bool is_macos_support_boost_add_file_log(); + +} + +#endif diff --git a/src/libslic3r/MacUtils.mm b/src/libslic3r/MacUtils.mm new file mode 100644 index 0000000000..bb9ecd1e46 --- /dev/null +++ b/src/libslic3r/MacUtils.mm @@ -0,0 +1,15 @@ +#import +#import "MacUtils.hpp" + +namespace Slic3r { + +bool is_macos_support_boost_add_file_log() +{ + if (@available(macOS 12.0, *)) { + return true; + } else { + return false; + } +} + +}; // namespace Slic3r diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 470b401dfc..2160ff6276 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -2754,6 +2754,41 @@ double Model::findMaxSpeed(const ModelObject* object) { if (objMaxSpeed <= 0) objMaxSpeed = 250.; return objMaxSpeed; } + +// BBS: thermal length is calculated according to the material of a volume +double Model::getThermalLength(const ModelVolume* modelVolumePtr) { + double thermalLength = 200.; + auto aa = modelVolumePtr->extruder_id(); + if (Model::extruderParamsMap.find(aa) != Model::extruderParamsMap.end()) { + if (Model::extruderParamsMap.at(aa).materialName == "ABS" || + Model::extruderParamsMap.at(aa).materialName == "PA-CF" || + Model::extruderParamsMap.at(aa).materialName == "PET-CF") { + thermalLength = 100; + } + if (Model::extruderParamsMap.at(aa).materialName == "PC") { + thermalLength = 40; + } + if (Model::extruderParamsMap.at(aa).materialName == "TPU") { + thermalLength = 1000; + } + + } + return thermalLength; +} + +// BBS: thermal length calculation for a group of volumes +double Model::getThermalLength(const std::vector modelVolumePtrs) +{ + double thermalLength = 1250.; + + for (const auto& modelVolumePtr : modelVolumePtrs) { + if (modelVolumePtr != nullptr) { + // the thermal length of a group is decided by the volume with shortest thermal length + thermalLength = std::min(thermalLength, getThermalLength(modelVolumePtr)); + } + } + return thermalLength; +} // max printing speed, difference in bed temperature and envirument temperature and bed adhension coefficients are considered double ModelInstance::get_auto_brim_width(double deltaT, double adhension) const { @@ -2763,9 +2798,10 @@ double ModelInstance::get_auto_brim_width(double deltaT, double adhension) const auto bbox_size = transform_bounding_box(raw_bbox).size(); double height_to_area = std::max(bbox_size(2) / (bbox_size(0) * bbox_size(0) * bbox_size(1)), bbox_size(2) / (bbox_size(1) * bbox_size(1) * bbox_size(0))); - double thermalLength = std::max(bbox_size(0), bbox_size(1)); + double thermalLength = sqrt(bbox_size(0)* bbox_size(0) + bbox_size(1)* bbox_size(1)); + double thermalLengthRef = Model::getThermalLength(object->volumes); - double brim_width = adhension * std::min(std::min(std::max(height_to_area * 200 * maxSpeed/200, (deltaT-30)/75 * thermalLength * 0.15), 20.), 1.5 * thermalLength); + double brim_width = adhension * std::min(std::min(std::max(height_to_area * 200 * maxSpeed/200, thermalLength * 8. / thermalLengthRef * std::min(bbox_size(2), 30.) / 30.), 20.), 1.5 * thermalLength); // small brims are omitted if (brim_width < 5 && brim_width < 1.5 * thermalLength) brim_width = 0; diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index fafad72fea..3a5b7e7f6d 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -1274,6 +1274,9 @@ public: ImportStepProgressFn stepFn = nullptr, StepIsUtf8Fn stepIsUtf8Fn = nullptr, BBLProject* project = nullptr); // BBS static double findMaxSpeed(const ModelObject* object); + static double getThermalLength(const ModelVolume* modelVolumePtr); + static double getThermalLength(const std::vector modelVolumePtrs); + // BBS: backup static Model read_from_archive( const std::string& input_file, diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 3b19036d52..7a495edab8 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -553,58 +553,33 @@ void PerimeterGenerator::process() offset_top_surface = 0; //don't takes into account too thin areas double min_width_top_surface = std::max(double(ext_perimeter_spacing / 2 + 10), 1.0 * (double(perimeter_width))); - //make thin upper surfaces disapear with -+offset_top_surface - ExPolygons grown_upper_slices; - //do offset2 per island, to avoid big blob merging - //remove polygon too thin (but don't mess with holes) - for (const ExPolygon& expoly_to_grow : *this->upper_slices) { - //only offset the contour, as it can merge holes - Polygons contour = offset2({ ExPolygon(expoly_to_grow.contour) }, -offset_top_surface, offset_top_surface + min_width_top_surface); - if (!contour.empty()) { - if (expoly_to_grow.holes.empty()) { - for (Polygon& p : contour) - grown_upper_slices.push_back(ExPolygon{ p }); - } - else { - Polygons holes = expoly_to_grow.holes; - for (Polygon& h : holes) - h.reverse(); - holes = offset(holes, -min_width_top_surface); - for (ExPolygon p : diff_ex(contour, holes)) - grown_upper_slices.push_back(p); - } - } - } - grown_upper_slices = union_ex(grown_upper_slices); + ExPolygons grown_upper_slices = offset_ex(*this->upper_slices, min_width_top_surface); //set the clip to a virtual "second perimeter" fill_clip = offset_ex(last, -double(ext_perimeter_spacing)); - auto fill_clip_old = fill_clip; // get the real top surface - const ExPolygons top_grown_polygons = diff_ex(last, grown_upper_slices, ApplySafetyOffset::Yes); + ExPolygons top_polygons = diff_ex(last, grown_upper_slices, ApplySafetyOffset::Yes); + //get the not-top surface, from the "real top" but enlarged by external_infill_margin (and the min_width_top_surface we removed a bit before) - //also remove the ext_perimeter_spacing/2 width because we are faking the external periemter, and we will remove ext_perimeter_spacing2 - const ExPolygons inner_polygons = diff_ex(last, - offset_ex(top_grown_polygons, offset_top_surface + min_width_top_surface - double(ext_perimeter_spacing / 2)), - ApplySafetyOffset::Yes); + ExPolygons inner_polygons = diff_ex(last, + offset_ex(top_polygons, offset_top_surface + min_width_top_surface - double(ext_perimeter_spacing / 2)), + ApplySafetyOffset::Yes); // get the enlarged top surface, by using inner_polygons instead of upper_slices, and clip it for it to be exactly the polygons to fill. - const ExPolygons top_polygons = diff_ex(fill_clip, inner_polygons, ApplySafetyOffset::Yes); + top_polygons = diff_ex(fill_clip, inner_polygons, ApplySafetyOffset::Yes); // increase by half peri the inner space to fill the frontier between last and stored. top_fills = union_ex(top_fills, top_polygons); //set the clip to the external wall but go back inside by infill_extrusion_width/2 to be sure the extrusion won't go outside even with a 100% overlap. double infill_spacing_unscaled = this->config->sparse_infill_line_width.value; - //if (infill_spacing_unscaled == 0) infill_spacing_unscaled = Flow::auto_extrusion_width(frInfill, nozzle_diameter); fill_clip = offset_ex(last, double(ext_perimeter_spacing / 2) - scale_(infill_spacing_unscaled / 2)); last = intersection_ex(inner_polygons, last); //{ // std::stringstream stri; // stri << this->layer->id() << "_1_"<< i <<"_only_one_peri"<< ".svg"; // SVG svg(stri.str()); - // svg.draw(to_polylines(oldLast), "orange"); - // svg.draw(to_polylines(fill_clip), "purple"); + // svg.draw(to_polylines(top_fills), "green"); // svg.draw(to_polylines(inner_polygons), "yellow"); // svg.draw(to_polylines(top_polygons), "cyan"); + // svg.draw(to_polylines(oldLast), "orange"); // svg.draw(to_polylines(last), "red"); - // svg.draw(to_polylines(fill_clip_old), "green"); // svg.Close(); //} } @@ -700,9 +675,8 @@ void PerimeterGenerator::process() offset2_ex(gaps, - float(max / 2.), float(max / 2. + ClipperSafetyOffset))); ThickPolylines polylines; for (ExPolygon& ex : gaps_ex) { - //BBS: medial axis algorithm can't handle duplicated points in expolygon. - //Use DP simplify to avoid duplicated points and accelerate medial-axis calculation as well. - ex.douglas_peucker(SCALED_RESOLUTION); + //BBS: Use DP simplify to avoid duplicated points and accelerate medial-axis calculation as well. + ex.douglas_peucker(surface_simplify_resolution); ex.medial_axis(max, min, &polylines); } diff --git a/src/libslic3r/PerimeterGenerator.hpp b/src/libslic3r/PerimeterGenerator.hpp index c42d5e4fb8..3b70bfd776 100644 --- a/src/libslic3r/PerimeterGenerator.hpp +++ b/src/libslic3r/PerimeterGenerator.hpp @@ -58,7 +58,7 @@ public: overhang_flow(flow), solid_infill_flow(flow), config(config), object_config(object_config), print_config(print_config), m_spiral_vase(spiral_mode), - m_scaled_resolution(scaled(print_config->resolution.value)), + m_scaled_resolution(scaled(print_config->resolution.value > EPSILON ? print_config->resolution.value : EPSILON)), loops(loops), gap_fill(gap_fill), fill_surfaces(fill_surfaces), m_ext_mm3_per_mm(-1), m_mm3_per_mm(-1), m_mm3_per_mm_overhang(-1), m_ext_mm3_per_mm_smaller_width(-1) {} diff --git a/src/libslic3r/Polyline.cpp b/src/libslic3r/Polyline.cpp index 89ac8c0b79..ca11357bb4 100644 --- a/src/libslic3r/Polyline.cpp +++ b/src/libslic3r/Polyline.cpp @@ -311,6 +311,54 @@ bool Polyline::is_straight() const return true; } +void Polyline::append(const Polyline &src) +{ + if (!src.is_valid()) return; + + if (this->points.empty()) { + this->points = src.points; + this->fitting_result = src.fitting_result; + } else { + //BBS: append the first point to create connection first, update the fitting date as well + this->append(src.points[0]); + //BBS: append a polyline which has fitting data to a polyline without fitting data. + //Then create a fake fitting data first, so that we can keep the fitting data in last polyline + if (this->fitting_result.empty() && + !src.fitting_result.empty()) { + this->fitting_result.emplace_back(PathFittingData{ 0, this->points.size() - 1, EMovePathType::Linear_move, ArcSegment() }); + } + //BBS: then append the remain points + MultiPoint::append(src.points.begin() + 1, src.points.end()); + //BBS: finally append the fitting data + append_fitting_result_after_append_polyline(src); + } +} + +void Polyline::append(Polyline &&src) +{ + if (!src.is_valid()) return; + + if (this->points.empty()) { + this->points = std::move(src.points); + this->fitting_result = std::move(src.fitting_result); + } else { + //BBS: append the first point to create connection first, update the fitting date as well + this->append(src.points[0]); + //BBS: append a polyline which has fitting data to a polyline without fitting data. + //Then create a fake fitting data first, so that we can keep the fitting data in last polyline + if (this->fitting_result.empty() && + !src.fitting_result.empty()) { + this->fitting_result.emplace_back(PathFittingData{ 0, this->points.size() - 1, EMovePathType::Linear_move, ArcSegment() }); + } + //BBS: then append the remain points + MultiPoint::append(src.points.begin() + 1, src.points.end()); + //BBS: finally append the fitting data + append_fitting_result_after_append_polyline(src); + src.points.clear(); + src.fitting_result.clear(); + } +} + void Polyline::append_fitting_result_after_append_points() { if (!fitting_result.empty()) { if (fitting_result.back().is_linear_move()) { @@ -326,14 +374,6 @@ void Polyline::append_fitting_result_after_append_points() { void Polyline::append_fitting_result_after_append_polyline(const Polyline& src) { - //BBS: append a polyline which has fitting data to a polyline without fitting data. - //Then create a fake fitting data first, so that we can keep the fitting data in last polyline - if (this->fitting_result.empty() && - !src.fitting_result.empty()) { - if (!this->points.empty()) - this->fitting_result.emplace_back(PathFittingData{ 0, this->size() - 1, EMovePathType::Linear_move, ArcSegment() }); - } - if (!this->fitting_result.empty()) { //BBS: offset and save the fitting_result from src polyline if (!src.fitting_result.empty()) { @@ -346,7 +386,7 @@ void Polyline::append_fitting_result_after_append_polyline(const Polyline& src) } } else { //BBS: the append polyline has no fitting data, then append as linear move directly - size_t new_start = fitting_result.back().end_point_index; + size_t new_start = this->fitting_result.back().end_point_index; size_t new_end = this->size() - 1; if (new_start != new_end) this->fitting_result.emplace_back(PathFittingData{ new_start, new_end, EMovePathType::Linear_move, ArcSegment() }); diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp index 00aeb5b14f..d97801ac63 100644 --- a/src/libslic3r/Polyline.hpp +++ b/src/libslic3r/Polyline.hpp @@ -99,41 +99,8 @@ public: MultiPoint::append(std::move(src)); append_fitting_result_after_append_points(); } - void append(const Polyline &src) - { - if (!src.is_valid()) return; - - if (this->points.empty()) { - this->points = src.points; - this->fitting_result = src.fitting_result; - } else { - //BBS: append the first point to create connection first, update the fitting date as well - this->append(src.points[0]); - //BBS: then append the remain points - MultiPoint::append(src.points.begin() + 1, src.points.end()); - //BBS: finally append the fitting data - append_fitting_result_after_append_polyline(src); - } - } - - void append(Polyline &&src) - { - if (!src.is_valid()) return; - - if (this->points.empty()) { - this->points = std::move(src.points); - this->fitting_result = std::move(src.fitting_result); - } else { - //BBS: append the first point to create connection first, update the fitting date as well - this->append(src.points[0]); - //BBS: then append the remain points - MultiPoint::append(src.points.begin() + 1, src.points.end()); - //BBS: finally append the fitting data - append_fitting_result_after_append_polyline(src); - src.points.clear(); - src.fitting_result.clear(); - } - } + void append(const Polyline& src); + void append(Polyline&& src); const Point& last_point() const override { return this->points.back(); } const Point& leftmost_point() const; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 3a23a7d132..5d1c03921c 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -666,7 +666,7 @@ static std::vector s_Preset_print_options { //"independent_support_layer_height", "support_angle", "support_interface_top_layers", "support_interface_bottom_layers", "support_interface_pattern", "support_interface_spacing", "support_interface_loop_pattern", - "support_top_z_distance", "support_on_build_plate_only", "bridge_no_support","max_bridge_length", "print_sequence", + "support_top_z_distance", "support_on_build_plate_only", "bridge_no_support", "thick_bridges", "max_bridge_length", "print_sequence", "filename_format", "wall_filament", "sparse_infill_filament", "solid_infill_filament", "support_filament", "support_interface_filament", "ooze_prevention", "standby_temperature_delta", "interface_shells", "line_width", "initial_layer_line_width", @@ -675,7 +675,7 @@ static std::vector s_Preset_print_options { "elefant_foot_compensation", "xy_contour_compensation", "xy_hole_compensation", "resolution", "enable_prime_tower", "prime_tower_width", "prime_tower_brim_width", "prime_volume", "wipe_tower_no_sparse_layers", "compatible_printers", "compatible_printers_condition", "inherits", - "flush_into_infill", "flush_into_objects", + "flush_into_infill", "flush_into_objects", "flush_into_support", // BBS "tree_support_branch_angle", "tree_support_with_infill", "tree_support_wall_count", "tree_support_branch_distance", "tree_support_branch_diameter", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 0cf30d48f5..a4ba79b662 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -181,6 +181,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n || opt_key == "flush_volumes_matrix" || opt_key == "prime_volume" || opt_key == "flush_into_infill" + || opt_key == "flush_into_support" || opt_key == "initial_layer_infill_speed" || opt_key == "travel_speed" || opt_key == "travel_speed_z" diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 9f3c670ce1..15cde3ee69 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -165,7 +165,6 @@ class ConstSupportLayerPtrsAdaptor : public ConstVectorOfPtrsAdaptor TreeSupportLayerPtrs; -typedef std::vector ConstTreeSupportLayerPtrs; class ConstTreeSupportLayerPtrsAdaptor : public ConstVectorOfPtrsAdaptor { friend PrintObject; ConstTreeSupportLayerPtrsAdaptor(const TreeSupportLayerPtrs* data) : ConstVectorOfPtrsAdaptor(data) {} @@ -300,7 +299,8 @@ public: const Layer* current_layer, float extrusion_width, PolysType* overhang_regions, - float max_bridge_length = scale_(10)); + float max_bridge_length = scale_(10), + bool break_bridge=false); // Bounding box is used to align the object infill patterns, and to calculate attractor for the rear seam. // The bounding box may not be quite snug. @@ -340,6 +340,10 @@ public: // Get a layer approximately at print_z. const Layer* get_layer_at_printz(coordf_t print_z, coordf_t epsilon) const; Layer* get_layer_at_printz(coordf_t print_z, coordf_t epsilon); + // BBS + const Layer* get_layer_at_bottomz(coordf_t bottom_z, coordf_t epsilon) const; + Layer* get_layer_at_bottomz(coordf_t bottom_z, coordf_t epsilon); + // Get the first layer approximately bellow print_z. const Layer* get_first_layer_bellow_printz(coordf_t print_z, coordf_t epsilon) const; @@ -354,6 +358,7 @@ public: void clear_tree_support_layers(); size_t tree_support_layer_count() const { return m_tree_support_layers.size(); } std::shared_ptr alloc_tree_support_preview_cache(); + void clear_tree_support_preview_cache() { m_tree_support_preview_cache.reset(); } size_t support_layer_count() const { return m_support_layers.size(); } void clear_support_layers(); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index faf54bc698..9fdd1b3754 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -686,7 +686,15 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Don't support the whole bridge area which make support very large. " "Bridge usually can be printing directly without support if not very long"); def->mode = comAdvanced; - def->set_default_value(new ConfigOptionBool(true)); + def->set_default_value(new ConfigOptionBool(false)); + + def = this->add("thick_bridges", coBool); + def->label = L("Thick bridges"); + def->category = L("Layers and Perimeters"); + def->tooltip = L("If enabled, bridges are more reliable, can bridge longer distances, but may look worse. " + "If disabled, bridges look better but are reliable just for shorter bridged distances."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); def = this->add("max_bridge_length", coFloat); def->label = L("Max bridge length"); @@ -722,10 +730,7 @@ void PrintConfigDef::init_fff_params() def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("concentric"); def->enum_values.push_back("zig-zag"); -#if !BBL_RELEASE_TO_PUBLIC def->enum_values.push_back("monotonic"); -#endif - //BBS: use monotonicline pattern to replace monotonic for top and bottom surface def->enum_values.push_back("monotonicline"); //def->enum_values.push_back("alignedrectilinear"); //def->enum_values.push_back("hilbertcurve"); @@ -733,9 +738,7 @@ void PrintConfigDef::init_fff_params() //def->enum_values.push_back("octagramspiral"); def->enum_labels.push_back(L("Concentric")); def->enum_labels.push_back(L("Zig zag")); -#if !BBL_RELEASE_TO_PUBLIC def->enum_labels.push_back(L("Monotonic")); -#endif def->enum_labels.push_back(L("Monotonic line")); //def->enum_labels.push_back(L("Aligned Rectilinear")); //def->enum_labels.push_back(L("Hilbert Curve")); @@ -1627,8 +1630,10 @@ void PrintConfigDef::init_fff_params() def = this->add("reduce_infill_retraction", coBool); def->label = L("Reduce infill retraction"); - def->tooltip = L("Don't retract when the travel is in infill area absolutely. That means the oozing can't been seen"); - def->mode = comDevelop; + def->tooltip = L("Don't retract when the travel is in infill area absolutely. That means the oozing can't been seen. " + "This can reduce times of retraction for complex model and save printing time, but make slicing and " + "G-code generating slower"); + def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(true)); def = this->add("ooze_prevention", coBool); @@ -2545,6 +2550,13 @@ void PrintConfigDef::init_fff_params() "If the walls are printed with transparent filament, the mixed color infill will be seen outside"); def->set_default_value(new ConfigOptionBool(false)); + def = this->add("flush_into_support", coBool); + def->category = L("Flush options"); + def->label = L("Flush into objects' support"); + def->tooltip = L("Purging after filament change will be done inside objects' support. " + "This may lower the amount of waste and decrease the print time"); + def->set_default_value(new ConfigOptionBool(true)); + def = this->add("flush_into_objects", coBool); def->category = L("Flush options"); def->label = L("Flush into this object"); @@ -3345,12 +3357,6 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va //But now these key-value must be absolute value. //Reset to default value by erasing these key to avoid parsing error. opt_key = ""; - } else if (opt_key == "top_surface_pattern" || opt_key == "bottom_surface_pattern") { -#if BBL_RELEASE_TO_PUBLIC - //BBS: replace monotonic pattern to be monotonicline for top and bottom surface - if (value == "monotonic") - value = "monotonicline"; -#endif } else if (opt_key == "filament_type" && value == "PA-CF") { value == "PA"; } else if (opt_key == "inherits_cummulative") { @@ -3372,7 +3378,7 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va , "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative" #endif /* HAS_PRESSURE_EQUALIZER */ // BBS - , "thick_bridges","support_sharp_tails","remove_small_overhangs", "support_with_sheath", + , "support_sharp_tails","remove_small_overhangs", "support_with_sheath", "tree_support_branch_diameter_angle", "tree_support_collision_resolution", "small_perimeter_speed", "max_volumetric_speed", "max_print_speed", "support_bottom_z_distance", "support_closing_radius", "slicing_mode", "slice_closing_radius", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index c51d85da1c..c20f9609f6 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -596,6 +596,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionEnum, support_style)) // BBS ((ConfigOptionBool, independent_support_layer_height)) + ((ConfigOptionBool, thick_bridges)) // Overhang angle threshold. ((ConfigOptionInt, support_threshold_angle)) ((ConfigOptionFloat, support_object_xy_distance)) @@ -604,6 +605,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, flush_into_objects)) // BBS ((ConfigOptionBool, flush_into_infill)) + ((ConfigOptionBool, flush_into_support)) // BBS ((ConfigOptionFloat, tree_support_branch_distance)) ((ConfigOptionFloat, tree_support_branch_diameter)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index c5e952130f..00e6dd9815 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -566,7 +566,7 @@ void PrintObject::clear_tree_support_layers() std::shared_ptr PrintObject::alloc_tree_support_preview_cache() { - if (m_tree_support_preview_cache == nullptr) { + if (!m_tree_support_preview_cache) { const coordf_t layer_height = m_config.layer_height.value; const coordf_t xy_distance = m_config.support_object_xy_distance.value; const double angle = m_config.tree_support_branch_angle.value * M_PI / 180.; @@ -787,7 +787,8 @@ bool PrintObject::invalidate_state_by_config_options( invalidated |= m_print->invalidate_step(psGCodeExport); } else if ( opt_key == "flush_into_infill" - || opt_key == "flush_into_objects") { + || opt_key == "flush_into_objects" + || opt_key == "flush_into_support") { invalidated |= m_print->invalidate_step(psWipeTower); invalidated |= m_print->invalidate_step(psGCodeExport); } else { @@ -827,7 +828,7 @@ bool PrintObject::invalidate_step(PrintObjectStep step) } // Wipe tower depends on the ordering of extruders, which in turn depends on everything. - // It also decides about what the flush_into_infill / wipe_into_object features will do, + // It also decides about what the flush_into_infill / wipe_into_object / flush_into_support features will do, // and that too depends on many of the settings. invalidated |= m_print->invalidate_step(psWipeTower); // Invalidate G-code export in any case. @@ -2297,7 +2298,8 @@ void PrintObject::remove_bridges_from_contacts( const Layer* current_layer, float extrusion_width, PolysType* overhang_regions, - float max_bridge_length) + float max_bridge_length, + bool break_bridge) { // Extrusion width accounts for the roundings of the extrudates. // It is the maximum widh of the extrudate. @@ -2305,6 +2307,7 @@ void PrintObject::remove_bridges_from_contacts( Lines overhang_perimeters = to_lines(*overhang_regions); auto layer_regions = current_layer->regions(); Polygons lower_layer_polygons = to_polygons(lower_layer->lslices); + const PrintObjectConfig& object_config = current_layer->object()->config(); Polygons all_bridges; for (LayerRegion* layerm : layer_regions) @@ -2321,7 +2324,7 @@ void PrintObject::remove_bridges_from_contacts( // since we're dealing with bridges, we can't assume width is larger than spacing, // so we take the largest value and also apply safety offset to be ensure no gaps // are left in between - Flow bridge_flow = layerm->bridging_flow(frPerimeter, g_config_thick_bridges); + Flow bridge_flow = layerm->bridging_flow(frPerimeter, object_config.thick_bridges); float w = float(std::max(bridge_flow.scaled_width(), bridge_flow.scaled_spacing())); for (Polyline& polyline : overhang_perimeters) if (polyline.is_straight()) { @@ -2338,12 +2341,16 @@ void PrintObject::remove_bridges_from_contacts( if (supported[0] && supported[1]) { Polylines lines; if (polyline.length() > max_bridge_length + 10) { - // equally divide the polyline - float len = polyline.length() / ceil(polyline.length() / max_bridge_length); - lines = polyline.equally_spaced_lines(len); - for (auto& line : lines) { - line.clip_start(fw); - line.clip_end(fw); + if (break_bridge) { + // equally divide the polyline + float len = polyline.length() / ceil(polyline.length() / max_bridge_length); + lines = polyline.equally_spaced_lines(len); + for (auto& line : lines) { + if (line.is_valid()) + line.clip_start(fw); + if (line.is_valid()) + line.clip_end(fw); + } } } else @@ -2357,8 +2364,52 @@ void PrintObject::remove_bridges_from_contacts( // remove the entire bridges and only support the unsupported edges //FIXME the brided regions are already collected as layerm->bridged. Use it? for (const Surface& surface : layerm->fill_surfaces.surfaces) - if (surface.surface_type == stBottomBridge && surface.bridge_angle != -1) - polygons_append(bridges, surface.expolygon); + if (surface.surface_type == stBottomBridge && surface.bridge_angle != -1) { + auto bbox = get_extents(surface.expolygon); + auto bbox_size = bbox.size(); + if (bbox_size[0] < max_bridge_length || bbox_size[1] < max_bridge_length) + polygons_append(bridges, surface.expolygon); + else { + if (break_bridge) { + Polygons holes; + int x0 = bbox.min.x(); + int x1 = bbox.max.x(); + int y0 = bbox.min.y(); + int y1 = bbox.max.y(); + const int grid_lw = int(w/2); // grid line width + +#if 1 + if (fabs(surface.bridge_angle-0)( const Layer* current_layer, float extrusion_width, ExPolygons* overhang_regions, - float max_bridge_length); + float max_bridge_length, bool break_bridge); template void PrintObject::remove_bridges_from_contacts( const Layer* lower_layer, const Layer* current_layer, float extrusion_width, Polygons* overhang_regions, - float max_bridge_length); + float max_bridge_length, bool break_bridge); bool PrintObject::is_support_necessary() @@ -2721,4 +2772,20 @@ const Layer *PrintObject::get_first_layer_bellow_printz(coordf_t print_z, coordf return (it == m_layers.begin()) ? nullptr : *(--it); } +// BBS +const Layer* PrintObject::get_layer_at_bottomz(coordf_t bottom_z, coordf_t epsilon) const { + coordf_t limit_upper = bottom_z + epsilon; + coordf_t limit_lower = bottom_z - epsilon; + + for (const Layer* layer : m_layers) { + if (layer->bottom_z() > limit_lower) + return layer->bottom_z() < limit_upper ? layer : nullptr; + } + + return nullptr; +} + +Layer* PrintObject::get_layer_at_bottomz(coordf_t bottom_z, coordf_t epsilon) { return const_cast(std::as_const(*this).get_layer_at_bottomz(bottom_z, epsilon)); } + + } // namespace Slic3r diff --git a/src/libslic3r/PrintObjectSlice.cpp b/src/libslic3r/PrintObjectSlice.cpp index b5bca386c9..2b5a7f1c89 100644 --- a/src/libslic3r/PrintObjectSlice.cpp +++ b/src/libslic3r/PrintObjectSlice.cpp @@ -446,6 +446,9 @@ static std::vector> slices_to_regions( std::string fix_slicing_errors(PrintObject* object, LayerPtrs &layers, const std::function &throw_if_canceled) { std::string error_msg;//BBS + + if (layers.size() == 0) return error_msg; + // Collect layers with slicing errors. // These layers will be fixed in parallel. std::vector buggy_layers; @@ -740,24 +743,39 @@ static inline void apply_mm_segmentation(PrintObject &print_object, ThrowOnCance bool doesVolumeIntersect(VolumeSlices& vs1, VolumeSlices& vs2) { if (vs1.volume_id == vs2.volume_id) return true; - if (vs1.slices.size() != vs1.slices.size()) return false; + if (vs1.slices.size() != vs2.slices.size()) return false; double offsetValue = 0.4 / SCALING_FACTOR; for (int i = 0; i != vs1.slices.size(); ++i) { - auto eps1 = offset_ex(vs1.slices[i], offsetValue); - auto eps2 = offset_ex(vs2.slices[i], offsetValue); - if (!intersection_ex(eps1, eps2).empty()) return true; + if (vs1.slices[i].empty()) continue; + if (!vs2.slices[i].empty() && !intersection_ex(vs1.slices[i], vs2.slices[i]).empty()) return true; + if (i + 1 != vs2.slices.size() && !vs2.slices[i + 1].empty()) { + if (!intersection_ex(vs1.slices[i], vs2.slices[i + 1]).empty()) return true; + } + if (i - 1 >= 0 && !vs2.slices[i - 1].empty()) { + if (!intersection_ex(vs1.slices[i], vs2.slices[i - 1]).empty()) return true; + } } return false; } //BBS: grouping the volumes of an object according to their connection relationship -bool groupingVolumes(std::vector& objSliceByVolume, std::vector& groups) +bool groupingVolumes(std::vector objSliceByVolume, std::vector& groups, double resolution) { int existGroups = 0; std::vector groupIndex(objSliceByVolume.size(), -1); + double offsetValue = 0.4 / SCALING_FACTOR; + + for (int i = 0; i != objSliceByVolume.size(); ++i) { + for (int j = 0; j != objSliceByVolume[i].slices.size(); ++j) { + objSliceByVolume[i].slices[j] = offset_ex(objSliceByVolume[i].slices[j], offsetValue); + for (ExPolygon& poly_ex : objSliceByVolume[i].slices[j]) + poly_ex.douglas_peucker(resolution); + } + } + for (int i = 0; i != objSliceByVolume.size(); ++i) { if (groupIndex[i] < 0) { groupIndex[i] = i; @@ -765,7 +783,7 @@ bool groupingVolumes(std::vector& objSliceByVolume, std::vector& objSliceByVolume, std::vector& objSliceByVolume, std::vector findPartVolumes(const std::vector& objSl return outPut; } +void applyNegtiveVolumes(ModelVolumePtrs model_volumes, const std::vector& objSliceByVolume, std::vector& groups, double resolution) { + ExPolygons negTotal; + for (const auto& vs : objSliceByVolume) { + for (const auto& mv : model_volumes) { + if (vs.volume_id == mv->id() && mv->is_negative_volume()) { + if (vs.slices.size() > 0) { + append(negTotal, vs.slices.front()); + } + } + } + } + + for (auto& g : groups) { + g.slices = diff_ex(g.slices, negTotal); + for (ExPolygon& poly_ex : g.slices) + poly_ex.douglas_peucker(resolution); + } +} // 1) Decides Z positions of the layers, // 2) Initializes layers and their regions // 3) Slices the object meshes @@ -873,9 +904,10 @@ void PrintObject::slice_volumes() } //BBS: "model_part" volumes are grouded according to their connections + const auto scaled_resolution = scaled(print->config().resolution.value); std::vector objSliceByVolumeParts = findPartVolumes(objSliceByVolume, this->model_object()->volumes); - groupingVolumes(objSliceByVolumeParts, firstLayerObjSliceByGroups); - + groupingVolumes(objSliceByVolumeParts, firstLayerObjSliceByGroups, scaled_resolution); + applyNegtiveVolumes(this->model_object()->volumes, objSliceByVolume, firstLayerObjSliceByGroups, scaled_resolution); std::vector> region_slices = slices_to_regions(this->model_object()->volumes, *m_shared_regions, slice_zs, std::move(objSliceByVolume), diff --git a/src/libslic3r/ProjectTask.hpp b/src/libslic3r/ProjectTask.hpp index f454e7fc4b..a2c6bcf442 100644 --- a/src/libslic3r/ProjectTask.hpp +++ b/src/libslic3r/ProjectTask.hpp @@ -29,12 +29,13 @@ enum MachineBedType { struct FilamentInfo { - int id; // filament id = extruder id, start with 0. + int id; // filament id = extruder id, start with 0. std::string type; std::string color; float used_m; float used_g; - int tray_id; + int tray_id; // start with 0 + float distance; }; class BBLSliceInfo { diff --git a/src/libslic3r/SVG.hpp b/src/libslic3r/SVG.hpp index fed4831dfc..5f57961053 100644 --- a/src/libslic3r/SVG.hpp +++ b/src/libslic3r/SVG.hpp @@ -19,6 +19,7 @@ public: float height; bool flipY; + SVG() = default; SVG(const char* afilename) : arrows(false), fill("grey"), stroke("black"), filename(afilename), flipY(false) { open(filename); } diff --git a/src/libslic3r/Slicing.hpp b/src/libslic3r/Slicing.hpp index 31fa319165..9b8d21e1c4 100644 --- a/src/libslic3r/Slicing.hpp +++ b/src/libslic3r/Slicing.hpp @@ -118,10 +118,11 @@ inline bool equal_layering(const SlicingParameters &sp1, const SlicingParameters sp1.first_print_layer_height == sp2.first_print_layer_height && sp1.first_object_layer_height == sp2.first_object_layer_height && sp1.first_object_layer_bridging == sp2.first_object_layer_bridging && + // BBS: following are not required for equal layer height. + // Since the z-gap diff may be multiple of layer height. +#if 0 sp1.soluble_interface == sp2.soluble_interface && sp1.gap_raft_object == sp2.gap_raft_object && - // BBS -#if 0 sp1.gap_object_support == sp2.gap_object_support && sp1.gap_support_object == sp2.gap_support_object && #endif diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index 1c427c4a19..d251ccc8ac 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -379,7 +379,7 @@ PrintObjectSupportMaterial::PrintObjectSupportMaterial(const PrintObject *object m_support_params.gap_xy = m_object_config->support_object_xy_distance.value; bridge_flow /= object->num_printing_regions(); - m_support_params.support_material_bottom_interface_flow = m_slicing_params.soluble_interface || ! g_config_thick_bridges ? + m_support_params.support_material_bottom_interface_flow = m_slicing_params.soluble_interface || ! m_object_config->thick_bridges ? m_support_params.support_material_interface_flow.with_flow_ratio(bridge_flow) : Flow::bridging_flow(bridge_flow * m_support_params.support_material_interface_flow.nozzle_diameter(), m_support_params.support_material_interface_flow.nozzle_diameter()); @@ -1339,7 +1339,7 @@ namespace SupportMaterialInternal { } } - static void remove_bridges_from_contactsxx( + static void remove_bridges_from_contacts( const PrintConfig &print_config, const Layer &lower_layer, const Polygons &lower_layer_polygons, @@ -1374,7 +1374,9 @@ namespace SupportMaterialInternal { // since we're dealing with bridges, we can't assume width is larger than spacing, // so we take the largest value and also apply safety offset to be ensure no gaps // are left in between - Flow perimeter_bridge_flow = layerm.bridging_flow(frPerimeter, g_config_thick_bridges); + // BBS + const PrintObjectConfig& object_config = layerm.layer()->object()->config(); + Flow perimeter_bridge_flow = layerm.bridging_flow(frPerimeter, object_config.thick_bridges); //FIXME one may want to use a maximum of bridging flow width and normal flow width, as the perimeters are calculated using the normal flow // and then turned to bridging flow, thus their centerlines are derived from non-bridging flow and expanding them by a bridging flow // may not expand them to the edge of their respective islands. @@ -1509,7 +1511,7 @@ static inline Polygons detect_overhangs( M_PI * double(object_config.support_threshold_angle.value + 1) / 180. : // +1 makes the threshold inclusive 0.; const coordf_t max_bridge_length = scale_(object_config.max_bridge_length.value); - const bool bridge_no_support = max_bridge_length > 0;// config.bridge_no_support.value; + const bool bridge_no_support = object_config.bridge_no_support.value; if (layer_id == 0) { @@ -1667,7 +1669,8 @@ static inline Polygons detect_overhangs( if (bridge_no_support) { //FIXME Expensive, potentially not precise enough. Misses gap fill extrusions, which bridge. - PrintObject::remove_bridges_from_contacts(&lower_layer, &layer, fw, &diff_polygons, max_bridge_length); + SupportMaterialInternal::remove_bridges_from_contacts( + print_config, lower_layer, lower_layer_polygons, *layerm, fw, diff_polygons); } if (diff_polygons.empty() || offset(diff_polygons, -0.1 * fw).empty()) @@ -1861,7 +1864,7 @@ static inline std::pairregion().bridging_height_avg(print_config); @@ -2429,7 +2432,7 @@ static inline PrintObjectSupportMaterial::MyLayer* detect_bottom_contacts( layer.print_z + layer_new.height + slicing_params.gap_object_support; layer_new.bottom_z = layer.print_z; layer_new.idx_object_layer_below = layer_id; - layer_new.bridging = !slicing_params.soluble_interface && g_config_thick_bridges; + layer_new.bridging = !slicing_params.soluble_interface && object.config().thick_bridges; //FIXME how much to inflate the bottom surface, as it is being extruded with a bridging flow? The following line uses a normal flow. layer_new.polygons = expand(touching, float(support_params.support_material_flow.scaled_width()), SUPPORT_SURFACES_OFFSET_PARAMETERS); @@ -3234,7 +3237,7 @@ void PrintObjectSupportMaterial::trim_support_layers_by_object( polygons_append(polygons_trimming, offset({ expoly }, trimming_offset, SUPPORT_SURFACES_OFFSET_PARAMETERS)); } } - if (! m_slicing_params.soluble_interface && g_config_thick_bridges) { + if (! m_slicing_params.soluble_interface && m_object_config->thick_bridges) { // Collect all bottom surfaces, which will be extruded with a bridging flow. for (; i < object.layers().size(); ++ i) { const Layer &object_layer = *object.layers()[i]; @@ -4515,6 +4518,7 @@ void PrintObjectSupportMaterial::generate_toolpaths( angles[support_layer_id % angles.size()] : // Use interface angle for the interface layers. m_support_params.interface_angle + interface_angle_delta; + double density = interface_as_base ? m_support_params.support_density : m_support_params.interface_density; filler_interface->spacing = interface_as_base ? m_support_params.support_material_flow.spacing() : m_support_params.support_material_interface_flow.spacing(); filler_interface->link_max_length = coord_t(scale_(filler_interface->spacing * link_max_length_factor / density)); diff --git a/src/libslic3r/TreeSupport.cpp b/src/libslic3r/TreeSupport.cpp index 630f2dc167..bbd641f0ae 100644 --- a/src/libslic3r/TreeSupport.cpp +++ b/src/libslic3r/TreeSupport.cpp @@ -9,15 +9,11 @@ #include "SVG.hpp" #include "ShortestPath.hpp" #include "I18N.hpp" +#include #define _L(s) Slic3r::I18N::translate(s) -#define SQUARE_SUPPORT 0 -#if SQUARE_SUPPORT -#define CIRCLE_RESOLUTION 4 // 100 //The number of vertices in each circle. -#else -#define CIRCLE_RESOLUTION 100 //The number of vertices in each circle. -#endif + #define MAX_BRANCH_RADIUS 10.0 #define HEIGHT_TO_SWITCH_INFILL_DIRECTION 30 // change infill direction every 20mm #define DO_NOT_MOVER_UNDER_MM 5 // do not move contact points under 5mm @@ -31,7 +27,7 @@ #define TAU (2.0 * M_PI) #define NO_INDEX (std::numeric_limits::max()) -//#define SUPPORT_TREE_DEBUG_TO_SVG +#define SUPPORT_TREE_DEBUG_TO_SVG namespace Slic3r { @@ -225,14 +221,18 @@ static void draw_contours_and_nodes_to_svg bbox.max.x() = std::max(bbox.max.x(), (coord_t)scale_(10)); bbox.max.y() = std::max(bbox.max.y(), (coord_t)scale_(10)); - SVG svg(get_svg_filename(std::to_string(layer_nr), name_prefix), bbox); + SVG svg; + if(layer_nr>=0) + svg.open(get_svg_filename(std::to_string(layer_nr), name_prefix), bbox); + else + svg.open(name_prefix, bbox); if (!svg.is_opened()) return; // draw grid svg.draw_grid(bbox, "gray", coord_t(scale_(0.05))); // draw overhang areas - svg.draw(union_ex(overhangs), colors[0]); + svg.draw_outline(union_ex(overhangs), colors[0]); svg.draw_outline(union_ex(overhangs_after_offset), colors[1]); svg.draw_outline(outlines_below, colors[2]); @@ -661,6 +661,8 @@ void TreeSupport::detect_object_overhangs() // Create Tree Support Layers m_object->clear_tree_support_layers(); + m_object->clear_tree_support_preview_cache(); + create_tree_support_layers(); m_ts_data = m_object->alloc_tree_support_preview_cache(); @@ -932,7 +934,7 @@ void TreeSupport::detect_object_overhangs() if (bridge_no_support && overhang_areas.size()>0) { - m_object->remove_bridges_from_contacts(lower_layer, layer, extrusion_width_scaled, &overhang_areas, max_bridge_length); + m_object->remove_bridges_from_contacts(lower_layer, layer, extrusion_width_scaled, &overhang_areas, max_bridge_length, true); } TreeSupportLayer* ts_layer = m_object->get_tree_support_layer(layer_nr + m_raft_layers); @@ -1081,9 +1083,6 @@ void TreeSupport::detect_object_overhangs() } } - total_overhang_area = 0; - max_overhang_area = 0; - total_overhang_layer_cnt = 0; for (int layer_nr = 0; layer_nr < m_object->layer_count(); layer_nr++) { if (m_object->print()->canceled()) break; @@ -1095,6 +1094,10 @@ void TreeSupport::detect_object_overhangs() ts_layer->overhang_areas = diff_ex(ts_layer->overhang_areas, offset_ex(blocker, scale_(radius_sample_resolution))); } + for (auto &area : ts_layer->overhang_areas) { + ts_layer->overhang_types.emplace(&area, TreeSupportLayer::Detected); + } + if (layer_nr < enforcers.size()) { Polygons& enforcer = enforcers[layer_nr]; // coconut: enforcer can't do offset2_ex, otherwise faces with angle near 90 degrees can't have enforcers, which @@ -1102,15 +1105,9 @@ void TreeSupport::detect_object_overhangs() //enforcer = std::move(offset2_ex(enforcer, -0.1 * extrusion_width_scaled, 0.1 * extrusion_width_scaled)); for (const Polygon& poly : enforcer) { ts_layer->overhang_areas.emplace_back(poly); + ts_layer->overhang_types.emplace(&ts_layer->overhang_areas.back(), TreeSupportLayer::Enforced); } } - - if (!ts_layer->overhang_areas.empty()) { - float a = area(ts_layer->overhang_areas); - total_overhang_area += a; - max_overhang_area = std::max(max_overhang_area, a); - total_overhang_layer_cnt++; - } } #ifdef SUPPORT_TREE_DEBUG_TO_SVG @@ -1825,17 +1822,25 @@ void TreeSupport::draw_circles(const std::vector>& contact_no { const PrintObjectConfig &config = m_object->config(); bool has_brim = m_object->print()->has_brim(); + bool has_infill = config.tree_support_with_infill.value; int bottom_gap_layers = round(m_slicing_params.gap_object_support / m_slicing_params.layer_height); const coordf_t branch_radius = config.tree_support_branch_diameter.value / 2; const coordf_t branch_radius_scaled = scale_(branch_radius); Polygon branch_circle; //Pre-generate a circle with correct diameter so that we don't have to recompute those (co)sines every time. + + // Use square support if there are too many nodes per layer because circle support needs much longer time to compute + // Hower circle support can be printed faster, so we prefer circle for fewer nodes case. + const bool SQUARE_SUPPORT = avg_node_per_layer > 200; + const int CIRCLE_RESOLUTION = SQUARE_SUPPORT ? 4 : 100; // The number of vertices in each circle. + + for (unsigned int i = 0; i < CIRCLE_RESOLUTION; i++) { -#if SQUARE_SUPPORT - double angle = (double)i / CIRCLE_RESOLUTION * TAU + TAU/8.0; -#else - double angle = (double)i / CIRCLE_RESOLUTION * TAU; -#endif + double angle; + if (SQUARE_SUPPORT) + angle = (double) i / CIRCLE_RESOLUTION * TAU + PI / 4.0 + nodes_angle; + else + angle = (double) i / CIRCLE_RESOLUTION * TAU; branch_circle.append(Point(cos(angle) * branch_radius_scaled, sin(angle) * branch_radius_scaled)); } @@ -1850,7 +1855,6 @@ void TreeSupport::draw_circles(const std::vector>& contact_no } // generate areas - const coordf_t circle_side_length = 2 * branch_radius * sin(M_PI / CIRCLE_RESOLUTION); //Side length of a regular polygon. const coordf_t layer_height = config.layer_height.value; const size_t top_interface_layers = config.support_interface_top_layers.value; const size_t bottom_interface_layers = config.support_interface_bottom_layers.value; @@ -2024,16 +2028,12 @@ void TreeSupport::draw_circles(const std::vector>& contact_no base_areas = std::move(diff_ex(base_areas, roof_areas)); base_areas = std::move(diff_ex(base_areas, roof_1st_layer)); -#if SQUARE_SUPPORT - if (m_object->print()->config().enable_arc_fitting.value == false) { - // simplify support contours if arc fitting is disabled + if (SQUARE_SUPPORT) { + // simplify support contours ExPolygons base_areas_simplified; - for (auto& area : base_areas) { - area.simplify(scale_(line_width / 2), &base_areas_simplified, SimplifyMethodDP); - } + for (auto &area : base_areas) { area.simplify(scale_(line_width / 2), &base_areas_simplified, SimplifyMethodDP); } base_areas = std::move(base_areas_simplified); } -#endif //Subtract support floors. We can only compute floor_areas here instead of with roof_areas, // or we'll get much wider floor than necessary. if (bottom_interface_layers + bottom_gap_layers > 0) @@ -2073,15 +2073,13 @@ void TreeSupport::draw_circles(const std::vector>& contact_no }), expoly->holes.end()); } -#ifdef SUPPORT_TREE_DEBUG_TO_SVG - draw_contours_and_nodes_to_svg(layer_nr, base_areas, roof_areas, roof_1st_layer, {}, {}, "circles", { "base","roof","roof1st" }); -#endif + } }); #if 1 // move the holes to contour so they can be well supported - + if (!has_infill) { // check if poly's contour intersects with expoly's contour auto intersects_contour = [](Polygon poly, ExPolygon expoly, Point &pt_on_poly, Point &pt_on_expoly, Point &pt_far_on_poly, float dist_thresh = 0.01) { float min_dist = std::numeric_limits::max(); @@ -2099,18 +2097,15 @@ void TreeSupport::draw_circles(const std::vector>& contact_no max_dist = dist2; pt_far_on_poly = from; } - if (dist2 < dist_thresh) { - return true; - } + if (dist2 < dist_thresh) { return true; } } } return false; }; - std::map holeDepth; - std::map holeDiretions; - std::map holeFarPoints; - for (int layer_nr = m_object->layer_count()-1; layer_nr >0; layer_nr--) { + // polygon pointer: depth, direction, farPoint + std::map> holePropagationInfos; + for (int layer_nr = m_object->layer_count() - 1; layer_nr > 0; layer_nr--) { if (print->canceled()) break; m_object->print()->set_status(66, (boost::format(_L("Support: fix holes at layer %d")) % layer_nr).str()); @@ -2127,47 +2122,88 @@ void TreeSupport::draw_circles(const std::vector>& contact_no for (layer_nr_lower; layer_nr_lower >= 0; layer_nr_lower--) { if (!m_object->get_tree_support_layer(layer_nr_lower + m_raft_layers)->area_groups.empty()) break; } - auto & area_groups_lower = m_object->get_tree_support_layer(layer_nr_lower + m_raft_layers)->area_groups; + auto &area_groups_lower = m_object->get_tree_support_layer(layer_nr_lower + m_raft_layers)->area_groups; - for (const auto& area_group:ts_layer->area_groups){ - if (area_group.second == 1 || area_group.second == 2) continue; - const auto base_area = area_group.first; - for (const auto &hole : base_area->holes) { + for (const auto &area_group : ts_layer->area_groups) { + if (area_group.second != TreeSupportLayer::BaseType) continue; + const auto area = area_group.first; + for (const auto &hole : area->holes) { // auto hole_bbox = get_extents(hole).polygon(); - for (auto & area_group_lower: area_groups_lower) { - if (area_group.second == 1 || area_group.second == 2) continue; + for (auto &area_group_lower : area_groups_lower) { + if (area_group.second != TreeSupportLayer::BaseType) continue; auto &base_area_lower = *area_group_lower.first; Point pt_on_poly, pt_on_expoly, pt_far_on_poly; // if a hole doesn't intersect with lower layer's contours, add a hole to lower layer and move it slightly to the contour if (base_area_lower.contour.contains(hole.points.front()) && !intersects_contour(hole, base_area_lower, pt_on_poly, pt_on_expoly, pt_far_on_poly)) { Polygon hole_lower = hole; - Point direction = normal(pt_on_expoly - pt_on_poly, line_width_scaled/2); + Point direction = normal(pt_on_expoly - pt_on_poly, line_width_scaled / 2); hole_lower.translate(direction); // note to expand a hole, we need to do negative offset auto hole_expanded = offset(hole_lower, -line_width_scaled / 4, ClipperLib::JoinType::jtSquare); if (!hole_expanded.empty()) { base_area_lower.holes.push_back(std::move(hole_expanded[0])); - holeDepth.insert({&base_area_lower.holes.back(), 15}); - holeDiretions.insert({&base_area_lower.holes.back(), direction}); - holeFarPoints.insert({&base_area_lower.holes.back(), pt_far_on_poly}); + holePropagationInfos.insert({&base_area_lower.holes.back(), {25, direction, pt_far_on_poly}}); } break; - } else if (holeDepth.find(&hole) != holeDepth.end() && holeDepth[&hole] > 0 && base_area_lower.contour.contains(holeFarPoints[&hole])) { + } else if (holePropagationInfos.find(&hole) != holePropagationInfos.end() && std::get<0>(holePropagationInfos[&hole]) > 0 && + base_area_lower.contour.contains(std::get<2>(holePropagationInfos[&hole]))) { Polygon hole_lower = hole; - hole_lower.translate(holeDiretions[&hole]); - Point farPoint = holeFarPoints[&hole] + holeDiretions[&hole]; - { - base_area_lower.holes.push_back(std::move(hole_lower)); - holeDepth.insert({&base_area_lower.holes.back(), holeDepth[&hole]-1}); - holeDiretions.insert({&base_area_lower.holes.back(), holeDiretions[&hole]}); - holeFarPoints.insert({&base_area_lower.holes.back(), farPoint}); + auto && direction = std::get<1>(holePropagationInfos[&hole]); + hole_lower.translate(direction); + // note to shrink a hole, we need to do positive offset + auto hole_expanded = offset(hole_lower, line_width_scaled / 2, ClipperLib::JoinType::jtSquare); + Point farPoint = std::get<2>(holePropagationInfos[&hole]) + direction * 2; + if (!hole_expanded.empty()) { + base_area_lower.holes.push_back(std::move(hole_expanded[0])); + holePropagationInfos.insert({&base_area_lower.holes.back(), {std::get<0>(holePropagationInfos[&hole]) - 1, direction, farPoint}}); } break; } } + { + // if roof1 interface is inside a hole, need to expand the interface + for (auto &roof1 : ts_layer->roof_1st_layer) { + //if (hole.contains(roof1.contour.points.front()) && hole.contains(roof1.contour.bounding_box().center())) + bool is_inside_hole = std::all_of(roof1.contour.points.begin(), roof1.contour.points.end(), [&hole](Point &pt) { return hole.contains(pt); }); + if (is_inside_hole) { + Polygon hole_reoriented = hole; + if (roof1.contour.is_counter_clockwise()) + hole_reoriented.make_counter_clockwise(); + else if (roof1.contour.is_clockwise()) + hole_reoriented.make_clockwise(); + auto tmp = union_({roof1.contour}, {hole_reoriented}); + if (!tmp.empty()) roof1.contour = tmp[0]; + + // make sure 1) roof1 and object 2) roof1 and roof, won't intersect + // Note: We can't replace roof1 directly, as we have recorded its address. + // So instead we need to replace its members one by one. + auto tmp1 = diff_ex(roof1, m_ts_data->get_collision((layer_nr == 0 && has_brim) ? config.brim_object_gap : m_ts_data->m_xy_distance, layer_nr)); + tmp1 = diff_ex(tmp1, ts_layer->roof_areas); + if (!tmp1.empty()) { + roof1.contour = std::move(tmp1[0].contour); + roof1.holes = std::move(tmp1[0].holes); + } + break; + } + } + } } } } + } +#endif + +#ifdef SUPPORT_TREE_DEBUG_TO_SVG + for (int layer_nr = m_object->layer_count() - 1; layer_nr > 0; layer_nr--) { + TreeSupportLayer* ts_layer = m_object->get_tree_support_layer(layer_nr + m_raft_layers); + ExPolygons& base_areas = ts_layer->base_areas; + ExPolygons& roof_areas = ts_layer->roof_areas; + ExPolygons& roof_1st_layer = ts_layer->roof_1st_layer; + ExPolygons& floor_areas = ts_layer->floor_areas; + if (base_areas.empty() && roof_areas.empty() && roof_1st_layer.empty()) continue; + char fname[10]; sprintf(fname, "%d_%.2f", layer_nr, ts_layer->print_z); + draw_contours_and_nodes_to_svg(-1, base_areas, roof_areas, roof_1st_layer, {}, {}, get_svg_filename(fname, "circles"), {"base", "roof", "roof1st"}); + } #endif TreeSupportLayerPtrs& ts_layers = m_object->tree_support_layers(); @@ -2257,6 +2293,7 @@ void TreeSupport::drop_nodes(std::vector>& contact_nodes) next_node->distance_to_top++; next_node->support_roof_layers_below--; next_node->print_z -= m_object->get_layer(layer_nr)->height; + next_node->to_buildplate = !is_inside_ex(m_ts_data->m_layer_outlines[layer_nr], next_node->position); contact_nodes[layer_nr - 1].emplace_back(next_node); } } @@ -2290,10 +2327,6 @@ void TreeSupport::drop_nodes(std::vector>& contact_nodes) for (Node* p_node : layer_contact_nodes) { const Node& node = *p_node; - if (node.type == ePolygon) { - // polygon node do not merge or move - continue; - } if (support_on_buildplate_only && !node.to_buildplate) //Can't rest on model and unable to reach the build plate. Then we must drop the node and leave parts unsupported. { @@ -2305,6 +2338,10 @@ void TreeSupport::drop_nodes(std::vector>& contact_nodes) nodes_per_part[0][node.position] = p_node; continue; } + if (node.type == ePolygon) { + // polygon node do not merge or move + continue; + } /* Find which part this node is located in and group the nodes in * the same part together. Since nodes have a radius and the * avoidance areas are offset by that radius, the set of parts may @@ -2720,7 +2757,7 @@ void TreeSupport::generate_contact_points(std::vectorthick_bridges) { z_distance_top += m_object->layers()[0]->regions()[0]->region().bridging_height_avg(m_object->print()->config()) - layer_height; } const size_t z_distance_top_layers = round_up_divide(scale_(z_distance_top), scale_(layer_height)) + 1; //Support must always be 1 layer below overhang. @@ -2729,17 +2766,20 @@ void TreeSupport::generate_contact_points(std::vectorlayers().size() <= z_distance_top_layers + 1) return; + m_highest_overhang_layer = 0; + int nonempty_layers = 0; + std::vector all_nodes; for (size_t layer_nr = 1; layer_nr < m_object->layers().size() - z_distance_top_layers; layer_nr++) { if (m_object->print()->canceled()) break; - - const ExPolygons &overhang = m_object->get_tree_support_layer(layer_nr + m_raft_layers + z_distance_top_layers)->overhang_areas; + auto ts_layer = m_object->get_tree_support_layer(layer_nr + m_raft_layers + z_distance_top_layers); + const ExPolygons &overhang = ts_layer->overhang_areas; + auto & curr_nodes = contact_nodes[layer_nr]; if (overhang.empty()) continue; @@ -2757,7 +2797,7 @@ void TreeSupport::generate_contact_points(std::vectortype = ePolygon; contact_node->overhang = &overhang_part; - contact_nodes[layer_nr].emplace_back(contact_node); + curr_nodes.emplace_back(contact_node); continue; } @@ -2783,7 +2823,7 @@ void TreeSupport::generate_contact_points(std::vectoroverhang_types[&overhang_part] == TreeSupportLayer::Detected) + candidates = {bbox.min, bounding_box_middle(bbox), bbox.max}; + else + candidates = {bounding_box_middle(bbox)}; + for (Point candidate : candidates) { if (!overhang_part.contains(candidate)) move_inside_expoly(overhang_part, candidate); constexpr size_t distance_to_top = 0; constexpr bool to_buildplate = true; Node * contact_node = new Node(candidate, distance_to_top, layer_nr % 2, support_roof_layers, to_buildplate, Node::NO_PARENT, print_z, height); - contact_nodes[layer_nr].emplace_back(contact_node); + curr_nodes.emplace_back(contact_node); } } - - // add points at corners - auto& points = overhang_part.contour.points; - for (int i=0;i -0.7) { - Node* contact_node = new Node(pt, 0, layer_nr % 2, support_roof_layers, true, Node::NO_PARENT, print_z, height); - contact_nodes[layer_nr].emplace_back(contact_node); + if (ts_layer->overhang_types[&overhang_part] == TreeSupportLayer::Detected) { + // add points at corners + auto &points = overhang_part.contour.points; + for (int i = 0; i < points.size(); i++) { + auto pt = points[i]; + auto v1 = (pt - points[(i - 1 + points.size()) % points.size()]).normalized(); + auto v2 = (pt - points[(i + 1) % points.size()]).normalized(); + if (v1.dot(v2) > -0.7) { + Node *contact_node = new Node(pt, 0, layer_nr % 2, support_roof_layers, true, Node::NO_PARENT, print_z, height); + curr_nodes.emplace_back(contact_node); + } + } + } else if(ts_layer->overhang_types[&overhang_part] == TreeSupportLayer::Enforced){ + // remove close points in Enforcers + auto above_nodes = contact_nodes[layer_nr - 1]; + if (!curr_nodes.empty() && !above_nodes.empty()) { + for (auto it = curr_nodes.begin(); it != curr_nodes.end();) { + bool is_duplicate = false; + Slic3r::Vec3f curr_pt((*it)->position(0), (*it)->position(1), scale_((*it)->print_z)); + for (auto &pt : all_nodes) { + auto dif = curr_pt - pt; + if (dif.norm() < scale_(2)) { + delete (*it); + it = curr_nodes.erase(it); + is_duplicate = true; + break; + } + } + if (!is_duplicate) it++; + } } } - - } - + if (!curr_nodes.empty()) nonempty_layers++; + for (auto node : curr_nodes) { all_nodes.emplace_back(node->position(0), node->position(1), scale_(node->print_z)); } #ifdef SUPPORT_TREE_DEBUG_TO_SVG draw_contours_and_nodes_to_svg(layer_nr, overhang, m_ts_data->m_layer_outlines_below[layer_nr], {}, contact_nodes[layer_nr], {}, "init_contact_points", { "overhang","outlines","" }); #endif } + int nNodes = all_nodes.size(); + avg_node_per_layer = nodes_angle = 0; + if (nNodes > 0) { + avg_node_per_layer = nNodes / nonempty_layers; + // get orientation of nodes by line fitting + // line: y=kx+b, where + // k=tan(nodes_angle)=(n\sum{xy}-\sum{x}\sum{y})/(n\sum{x^2}-\sum{x}^2) + float mx = 0, my = 0, mxy = 0, mx2 = 0; + for (auto &pt : all_nodes) { + float x = unscale_(pt(0)); + float y = unscale_(pt(1)); + mx += x; + my += y; + mxy += x * y; + mx2 += x * x; + } + nodes_angle = atan2(nNodes * mxy - mx * my, nNodes * mx2 - SQ(mx)); + + BOOST_LOG_TRIVIAL(info) << "avg_node_per_layer=" << avg_node_per_layer << ", nodes_angle=" << nodes_angle; + } } void TreeSupport::insert_dropped_node(std::vector& nodes_layer, Node* p_node) diff --git a/src/libslic3r/TreeSupport.hpp b/src/libslic3r/TreeSupport.hpp index 4e13bac667..8bcce8a857 100644 --- a/src/libslic3r/TreeSupport.hpp +++ b/src/libslic3r/TreeSupport.hpp @@ -340,9 +340,8 @@ public: bool with_sheath; }; - float total_overhang_area; - float max_overhang_area; - size_t total_overhang_layer_cnt; + int avg_node_per_layer = 0; + float nodes_angle = 0; bool has_sharp_tail; private: /*! diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp index c89656472a..e732cc177f 100644 --- a/src/libslic3r/TriangleMesh.cpp +++ b/src/libslic3r/TriangleMesh.cpp @@ -497,15 +497,10 @@ BoundingBoxf3 TriangleMesh::transformed_bounding_box(const Transform3d& trafod, TriangleMesh TriangleMesh::convex_hull_3d() const { - // BBS: don't compute convex hull for objects like a single sheet - if (this->m_stats.volume>0.001) { - TriangleMesh mesh(its_convex_hull(this->its)); - // Quite often qhull produces non-manifold mesh. - // assert(mesh.stats().manifold()); - return mesh; - } - else - return TriangleMesh(); + TriangleMesh mesh(its_convex_hull(this->its)); + // Quite often qhull produces non-manifold mesh. + // assert(mesh.stats().manifold()); + return mesh; } std::vector TriangleMesh::slice(const std::vector &z) const diff --git a/src/libslic3r/VariableWidth.cpp b/src/libslic3r/VariableWidth.cpp index b2938cfd10..1f879468b3 100644 --- a/src/libslic3r/VariableWidth.cpp +++ b/src/libslic3r/VariableWidth.cpp @@ -84,6 +84,124 @@ static ExtrusionPaths thick_polyline_to_extrusion_paths(const ThickPolyline& thi return paths; } +//BBS: new function to filter width to avoid too fragmented segments +static ExtrusionPaths thick_polyline_to_extrusion_paths_2(const ThickPolyline& thick_polyline, ExtrusionRole role, const Flow& flow, const float tolerance) +{ + ExtrusionPaths paths; + ExtrusionPath path(role); + ThickLines lines = thick_polyline.thicklines(); + + size_t start_index = 0; + double max_width, min_width; + + for (int i = 0; i < (int)lines.size(); ++i) { + const ThickLine& line = lines[i]; + + if (i == 0) { + max_width = line.a_width; + min_width = line.a_width; + } + + const coordf_t line_len = line.length(); + if (line_len < SCALED_EPSILON) continue; + + double thickness_delta = std::max(fabs(max_width - line.b_width), fabs(min_width - line.b_width)); + //BBS: has large difference in width + if (thickness_delta > tolerance) { + //BBS: 1 generate path from start_index to i(not included) + if (start_index != i){ + path = ExtrusionPath(role); + double length = lines[start_index].length(); + double sum = lines[start_index].length() * lines[start_index].a_width; + path.polyline.append(lines[start_index].a); + for (int idx = start_index + 1; idx < i; idx++) { + length += lines[idx].length(); + sum += lines[idx].length() * lines[idx].a_width; + path.polyline.append(lines[idx].a); + } + path.polyline.append(lines[i].a); + if (length > SCALED_EPSILON) { + double w = sum / length; + Flow new_flow = flow.with_width(unscale(w) + flow.height() * float(1. - 0.25 * PI)); + path.mm3_per_mm = new_flow.mm3_per_mm(); + path.width = new_flow.width(); + path.height = new_flow.height(); + paths.emplace_back(std::move(path)); + } + } + + start_index = i; + max_width = line.a_width; + min_width = line.a_width; + + //BBS: 2 handle the i-th segment + thickness_delta = fabs(line.a_width - line.b_width); + if (thickness_delta > tolerance){ + const unsigned int segments = (unsigned int)ceil(thickness_delta / tolerance); + const coordf_t seg_len = line_len / segments; + Points pp; + std::vector width; + { + pp.push_back(line.a); + width.push_back(line.a_width); + for (size_t j = 1; j < segments; ++j) { + pp.push_back((line.a.cast() + (line.b - line.a).cast().normalized() * (j * seg_len)).cast()); + + coordf_t w = line.a_width + (j * seg_len) * (line.b_width - line.a_width) / line_len; + width.push_back(w); + width.push_back(w); + } + pp.push_back(line.b); + width.push_back(line.b_width); + + assert(pp.size() == segments + 1u); + assert(width.size() == segments * 2); + } + + // delete this line and insert new ones + lines.erase(lines.begin() + i); + for (size_t j = 0; j < segments; ++j) { + ThickLine new_line(pp[j], pp[j + 1]); + new_line.a_width = width[2 * j]; + new_line.b_width = width[2 * j + 1]; + lines.insert(lines.begin() + i + j, new_line); + } + --i; + continue; + } + } + //BBS: just update the max and min width and continue + else { + max_width = std::max(max_width, std::max(line.a_width, line.b_width)); + min_width = std::min(min_width, std::min(line.a_width, line.b_width)); + } + } + //BBS: handle the remaining segment + size_t final_size = lines.size(); + if (start_index < final_size) { + path = ExtrusionPath(role); + double length = lines[start_index].length(); + double sum = lines[start_index].length() * lines[start_index].a_width; + path.polyline.append(lines[start_index].a); + for (int idx = start_index + 1; idx < final_size; idx++) { + length += lines[idx].length(); + sum += lines[idx].length() * lines[idx].a_width; + path.polyline.append(lines[idx].a); + } + path.polyline.append(lines[final_size - 1].b); + if (length > SCALED_EPSILON) { + double w = sum / length; + Flow new_flow = flow.with_width(unscale(w) + flow.height() * float(1. - 0.25 * PI)); + path.mm3_per_mm = new_flow.mm3_per_mm(); + path.width = new_flow.width(); + path.height = new_flow.height(); + paths.emplace_back(std::move(path)); + } + } + + return paths; +} + void variable_width(const ThickPolylines& polylines, ExtrusionRole role, const Flow& flow, std::vector& out) { // This value determines granularity of adaptive width, as G-code does not allow @@ -91,7 +209,7 @@ void variable_width(const ThickPolylines& polylines, ExtrusionRole role, const F // of segments, and any pruning shall be performed before we apply this tolerance. const float tolerance = float(scale_(0.05)); for (const ThickPolyline& p : polylines) { - ExtrusionPaths paths = thick_polyline_to_extrusion_paths(p, role, flow, tolerance); + ExtrusionPaths paths = thick_polyline_to_extrusion_paths_2(p, role, flow, tolerance); // Append paths to collection. if (!paths.empty()) { if (paths.front().first_point() == paths.back().last_point()) diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h index cc8ae15ce9..63b0422907 100644 --- a/src/libslic3r/libslic3r.h +++ b/src/libslic3r/libslic3r.h @@ -84,7 +84,6 @@ static constexpr bool RELATIVE_E_AXIS = 1; #endif /* UNUSED */ //BBS: some global const config which user can not change, but developer can -static constexpr bool g_config_thick_bridges = true; static constexpr bool g_config_support_sharp_tails = true; static constexpr bool g_config_remove_small_overhangs = true; static constexpr float g_config_tree_support_collision_resolution = 0.2; diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index 903b39740f..67b873cc46 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -11,6 +11,10 @@ #include "Time.hpp" #include "libslic3r.h" +#ifdef __APPLE__ +#include "MacUtils.hpp" +#endif + #ifdef WIN32 #include #include @@ -292,12 +296,21 @@ namespace keywords = boost::log::keywords; namespace attrs = boost::log::attributes; void set_log_path_and_level(const std::string& file, unsigned int level) { +#ifdef __APPLE__ + //currently on old macos, the boost::log::add_file_log will crash + //TODO: need to be fixed + if (!is_macos_support_boost_add_file_log()) { + return; + } +#endif + //BBS log file at C:\\Users\\[yourname]\\AppData\\Roaming\\BambuStudio\\log\\[log_filename].log auto log_folder = boost::filesystem::path(g_data_dir) / "log"; if (!boost::filesystem::exists(log_folder)) { boost::filesystem::create_directory(log_folder); } auto full_path = (log_folder / file).make_preferred(); + g_log_sink = boost::log::add_file_log( keywords::file_name = full_path.string() + ".%N", keywords::rotation_size = 100 * 1024 * 1024, @@ -309,6 +322,7 @@ void set_log_path_and_level(const std::string& file, unsigned int level) << ":" << expr::smessage ) ); + logging::add_common_attributes(); set_logging_level(level); diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index f85f51c934..358557ccb6 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -221,8 +221,8 @@ set(SLIC3R_GUI_SOURCES GUI/Monitor.hpp GUI/WebViewDialog.cpp GUI/WebViewDialog.hpp - GUI/WebDailytipDialog.hpp - GUI/WebDailytipDialog.cpp + GUI/WebDownPluginDlg.hpp + GUI/WebDownPluginDlg.cpp GUI/WebGuideDialog.hpp GUI/WebGuideDialog.cpp GUI/WebUserLoginDialog.cpp @@ -268,12 +268,16 @@ set(SLIC3R_GUI_SOURCES GUI/ConfigWizard_private.hpp GUI/MsgDialog.cpp GUI/MsgDialog.hpp + GUI/DownloadProgressDialog.hpp + GUI/DownloadProgressDialog.cpp GUI/UpdateDialogs.cpp GUI/UpdateDialogs.hpp GUI/Jobs/Job.hpp GUI/Jobs/Job.cpp GUI/Jobs/PlaterJob.hpp GUI/Jobs/PlaterJob.cpp + GUI/Jobs/UpgradeNetworkJob.hpp + GUI/Jobs/UpgradeNetworkJob.cpp GUI/Jobs/ArrangeJob.hpp GUI/Jobs/ArrangeJob.cpp GUI/Jobs/OrientJob.hpp diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index 3d35e554c6..e6f63fc55c 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -4,9 +4,14 @@ #include "I18N.hpp" namespace Slic3r { namespace GUI { +static bool show_flag; -AMSMaterialsSetting::AMSMaterialsSetting(wxWindow *parent, wxWindowID id): wxPopupTransientWindow(parent, id) -{ +#ifdef __APPLE__ +#define COMBOBOX_FILAMENT (m_comboBox_filament_mac) +#else +#define COMBOBOX_FILAMENT (m_comboBox_filament) +#endif +AMSMaterialsSetting::AMSMaterialsSetting(wxWindow *parent, wxWindowID id) : wxPopupTransientWindow(parent, wxPU_CONTAINS_CONTROLS) { create(); } @@ -28,9 +33,13 @@ void AMSMaterialsSetting::create() m_sizer_filament->Add(0, 0, 0, wxEXPAND, 0); +#ifdef __APPLE__ + m_comboBox_filament_mac = new wxComboBox(m_panel_body, wxID_ANY, wxEmptyString, wxDefaultPosition, AMS_MATERIALS_SETTING_COMBOX_WIDTH, 0, nullptr, wxCB_READONLY); +#else m_comboBox_filament = new ::ComboBox(m_panel_body, wxID_ANY, wxEmptyString, wxDefaultPosition, AMS_MATERIALS_SETTING_COMBOX_WIDTH, 0, nullptr, wxCB_READONLY); - m_sizer_filament->Add(m_comboBox_filament, 0, wxALIGN_CENTER, 0); +#endif + m_sizer_filament->Add(COMBOBOX_FILAMENT, 1, wxALIGN_CENTER, 0); wxBoxSizer *m_sizer_colour = new wxBoxSizer(wxHORIZONTAL); m_title_colour = new wxStaticText(m_panel_body, wxID_ANY, _L("Colour"), wxDefaultPosition, wxSize(AMS_MATERIALS_SETTING_LABEL_WIDTH, -1), 0); @@ -77,18 +86,18 @@ void AMSMaterialsSetting::create() wxBoxSizer *sizer_other = new wxBoxSizer(wxVERTICAL); wxBoxSizer *sizer_tempinput = new wxBoxSizer(wxHORIZONTAL); - - m_input_nozzle_max = new ::TextInput(m_panel_body, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, AMS_MATERIALS_SETTING_INPUT_SIZE, - wxTE_CENTRE | wxTE_PROCESS_ENTER); + m_input_nozzle_max = new ::TextInput(m_panel_body, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, AMS_MATERIALS_SETTING_INPUT_SIZE, wxTE_CENTRE | wxTE_PROCESS_ENTER); + m_input_nozzle_min = new ::TextInput(m_panel_body, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, AMS_MATERIALS_SETTING_INPUT_SIZE, wxTE_CENTRE | wxTE_PROCESS_ENTER); + m_input_nozzle_max->Enable(false); + m_input_nozzle_min->Enable(false); + m_input_nozzle_max->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); m_input_nozzle_max->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20))); - auto bitmap_max_degree = new wxStaticBitmap(m_panel_body, -1, create_scaled_bitmap("degree", nullptr, 16), wxDefaultPosition, wxDefaultSize); - - m_input_nozzle_min = new ::TextInput(m_panel_body, wxEmptyString, wxEmptyString, wxEmptyString, wxDefaultPosition, AMS_MATERIALS_SETTING_INPUT_SIZE, - wxTE_CENTRE | wxTE_PROCESS_ENTER); - m_input_nozzle_min->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20))); m_input_nozzle_min->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); + m_input_nozzle_min->GetTextCtrl()->SetSize(wxSize(-1, FromDIP(20))); + + auto bitmap_max_degree = new wxStaticBitmap(m_panel_body, -1, create_scaled_bitmap("degree", nullptr, 16), wxDefaultPosition, wxDefaultSize); auto bitmap_min_degree = new wxStaticBitmap(m_panel_body, -1, create_scaled_bitmap("degree", nullptr, 16), wxDefaultPosition, wxDefaultSize); sizer_tempinput->Add(m_input_nozzle_max, 1, wxALIGN_CENTER, 0); @@ -125,7 +134,7 @@ void AMSMaterialsSetting::create() warning_text->SetMinSize(wxSize(AMS_MATERIALS_SETTING_BODY_WIDTH, -1)); warning_text->Hide(); - m_input_nozzle_min->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [this](wxFocusEvent &e) { + m_input_nozzle_min->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [this](wxFocusEvent &e) { warning_text->Hide(); Layout(); Fit(); @@ -135,22 +144,22 @@ void AMSMaterialsSetting::create() input_min_finish(); e.Skip(); }); - m_input_nozzle_min->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent &e) { + m_input_nozzle_min->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent &e) { input_min_finish(); e.Skip(); }); - m_input_nozzle_max->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [this](wxFocusEvent& e) { + m_input_nozzle_max->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [this](wxFocusEvent &e) { warning_text->Hide(); Layout(); Fit(); e.Skip(); }); - m_input_nozzle_max->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent& e) { + m_input_nozzle_max->GetTextCtrl()->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent &e) { input_max_finish(); e.Skip(); }); - m_input_nozzle_max->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& e) { + m_input_nozzle_max->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent &e) { input_max_finish(); e.Skip(); }); @@ -170,13 +179,6 @@ void AMSMaterialsSetting::create() m_button_confirm->Bind(wxEVT_LEFT_DOWN, &AMSMaterialsSetting::on_select_ok, this); m_sizer_button->Add(m_button_confirm, 0, wxALIGN_CENTER, 0); - - - StateColor btn_bg_white(std::pair(wxColour(206, 206, 206), StateColor::Pressed), - std::pair(wxColour(238, 238, 238), StateColor::Hovered), - std::pair(*wxWHITE, StateColor::Normal)); - StateColor btn_bd_white(std::pair(*wxWHITE, StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); - m_sizer_body->Add(m_sizer_filament, 0, wxEXPAND, 0); m_sizer_body->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(16)); m_sizer_body->Add(m_sizer_colour, 0, wxEXPAND, 0); @@ -200,7 +202,7 @@ void AMSMaterialsSetting::create() this->Centre(wxBOTH); Bind(wxEVT_PAINT, &AMSMaterialsSetting::paintEvent, this); - m_comboBox_filament->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(AMSMaterialsSetting::on_select_filament), NULL, this); + COMBOBOX_FILAMENT->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(AMSMaterialsSetting::on_select_filament), NULL, this); } void AMSMaterialsSetting::paintEvent(wxPaintEvent &evt) @@ -214,13 +216,13 @@ void AMSMaterialsSetting::paintEvent(wxPaintEvent &evt) AMSMaterialsSetting::~AMSMaterialsSetting() { - m_comboBox_filament->Disconnect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(AMSMaterialsSetting::on_select_filament), NULL, this); + COMBOBOX_FILAMENT->Disconnect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(AMSMaterialsSetting::on_select_filament), NULL, this); } void AMSMaterialsSetting::input_min_finish() { - if (m_input_nozzle_min->GetTextCtrl()->GetValue().empty())return; + if (m_input_nozzle_min->GetTextCtrl()->GetValue().empty()) return; auto val = std::atoi(m_input_nozzle_min->GetTextCtrl()->GetValue().c_str()); @@ -235,7 +237,7 @@ void AMSMaterialsSetting::input_min_finish() void AMSMaterialsSetting::input_max_finish() { - if (m_input_nozzle_max->GetTextCtrl()->GetValue().empty())return; + if (m_input_nozzle_max->GetTextCtrl()->GetValue().empty()) return; auto val = std::atoi(m_input_nozzle_max->GetTextCtrl()->GetValue().c_str()); @@ -279,8 +281,8 @@ void AMSMaterialsSetting::enable_confirm_button(bool en) void AMSMaterialsSetting::on_select_ok(wxMouseEvent &event) { - wxString nozzle_temp_min = m_input_nozzle_min->GetTextCtrl()->GetValue(); - auto filament = m_comboBox_filament->GetValue(); + wxString nozzle_temp_min = m_input_nozzle_min->GetTextCtrl()->GetValue(); + auto filament = COMBOBOX_FILAMENT->GetValue(); wxString nozzle_temp_max = m_input_nozzle_max->GetTextCtrl()->GetValue(); @@ -295,7 +297,7 @@ void AMSMaterialsSetting::on_select_ok(wxMouseEvent &event) PresetBundle *preset_bundle = wxGetApp().preset_bundle; if (preset_bundle) { for (auto it = preset_bundle->filaments.begin(); it != preset_bundle->filaments.end(); it++) { - if (it->alias.compare(m_comboBox_filament->GetValue().ToStdString()) == 0) { + if (it->alias.compare(COMBOBOX_FILAMENT->GetValue().ToStdString()) == 0) { ams_filament_id = it->filament_id; } } @@ -313,19 +315,12 @@ void AMSMaterialsSetting::on_select_ok(wxMouseEvent &event) void AMSMaterialsSetting::set_color(wxColour color) { - m_clrData = new wxColourData(); m_clrData->SetColour(color); } -static bool show_flag; -void AMSMaterialsSetting::on_clr_picker(wxCommandEvent & event) { - +void AMSMaterialsSetting::on_clr_picker(wxCommandEvent & event) +{ auto clr_dialog = new wxColourDialog(this, m_clrData); - - clr_dialog->Bind(wxEVT_ACTIVATE, [this](wxActivateEvent &e) { - int a ; - }); - show_flag = true; if (clr_dialog->ShowModal() == wxID_OK) { m_clrData = &(clr_dialog->GetColourData()); @@ -338,12 +333,14 @@ void AMSMaterialsSetting::Dismiss() if (show_flag) { show_flag = false; - } - else + } else { - wxPopupTransientWindow::Dismiss(); +#ifdef __APPLE__ + +#else + wxPopupTransientWindow::Dismiss(); +#endif } - } bool AMSMaterialsSetting::Show(bool show) @@ -360,12 +357,14 @@ void AMSMaterialsSetting::Popup(bool show, bool third, wxString filament, wxColo { if (!m_is_third) { m_panel_SN->Show(); - m_comboBox_filament->SetValue(filament); + COMBOBOX_FILAMENT->SetValue(filament); m_sn_number->SetLabelText(sn); m_input_nozzle_min->GetTextCtrl()->SetValue(tep); m_clrData->SetColour(colour); - m_comboBox_filament->Disable(); + COMBOBOX_FILAMENT->Disable(); + m_input_nozzle_min->Disable(); + wxPopupTransientWindow::Popup(); Layout(); return; @@ -438,13 +437,13 @@ void AMSMaterialsSetting::Popup(bool show, bool third, wxString filament, wxColo } } } - m_comboBox_filament->Set(filament_items); + COMBOBOX_FILAMENT->Set(filament_items); if (selection_idx >= 0 && selection_idx < filament_items.size()) { - m_comboBox_filament->SetSelection(selection_idx); + COMBOBOX_FILAMENT->SetSelection(selection_idx); post_select_event(); } else { - m_comboBox_filament->SetSelection(selection_idx); + COMBOBOX_FILAMENT->SetSelection(selection_idx); post_select_event(); } } @@ -453,8 +452,8 @@ void AMSMaterialsSetting::Popup(bool show, bool third, wxString filament, wxColo void AMSMaterialsSetting::post_select_event() { wxCommandEvent event(wxEVT_COMBOBOX); - event.SetEventObject(m_comboBox_filament); - wxPostEvent(m_comboBox_filament, event); + event.SetEventObject(COMBOBOX_FILAMENT); + wxPostEvent(COMBOBOX_FILAMENT, event); } void AMSMaterialsSetting::on_select_filament(wxCommandEvent &evt) @@ -464,7 +463,7 @@ void AMSMaterialsSetting::on_select_filament(wxCommandEvent &evt) if (preset_bundle) { for (auto it = preset_bundle->filaments.begin(); it != preset_bundle->filaments.end(); it++) { auto a = it->alias; - if (it->alias.compare(m_comboBox_filament->GetValue().ToStdString()) == 0) { + if (it->alias.compare(COMBOBOX_FILAMENT->GetValue().ToStdString()) == 0) { // ) if nozzle_temperature_range is found ConfigOption* opt_min = it->config.option("nozzle_temperature_range_low"); if (opt_min) { @@ -498,10 +497,24 @@ void AMSMaterialsSetting::on_select_filament(wxCommandEvent &evt) } } if (m_input_nozzle_min->GetTextCtrl()->GetValue().IsEmpty()) { - m_input_nozzle_min->GetTextCtrl()->SetValue("220"); + m_input_nozzle_min->GetTextCtrl()->SetValue("220"); } if (m_input_nozzle_max->GetTextCtrl()->GetValue().IsEmpty()) { - m_input_nozzle_max->GetTextCtrl()->SetValue("220"); + m_input_nozzle_max->GetTextCtrl()->SetValue("220"); + } +} + +bool AMSMaterialsSetting::ProcessLeftDown(wxMouseEvent &evt) +{ + wxPoint mouse_pos = ClientToScreen(evt.GetPosition()); + wxPoint top_left = this->ClientToScreen(wxPoint(0, 0)); + wxPoint range = wxPoint(this->GetRect().width, this->GetRect().height); + wxPoint bottom_right = top_left + range; + if (mouse_pos.x > top_left.x && mouse_pos.y > top_left.y && mouse_pos.x < bottom_right.x && mouse_pos.y < bottom_right.y) { + return true; + } else { + wxPopupTransientWindow::Dismiss(); + return false; } } diff --git a/src/slic3r/GUI/AMSMaterialsSetting.hpp b/src/slic3r/GUI/AMSMaterialsSetting.hpp index 3df767b479..7fd7b5dbeb 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.hpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.hpp @@ -39,13 +39,13 @@ public: void input_max_finish(); void update(); void enable_confirm_button(bool en); - void on_select_cancel(wxMouseEvent &event); void Dismiss() override; bool Show(bool show) override; void Popup(bool show, bool third = true, wxString filament = wxEmptyString, wxColour colour = *wxWHITE, wxString sn = wxEmptyString, wxString tep = wxEmptyString); void post_select_event(); void on_select_ok(wxMouseEvent &event); + void set_color(wxColour color); void on_clr_picker(wxCommandEvent &event); @@ -67,6 +67,8 @@ protected: //void on_dpi_changed(const wxRect &suggested_rect) override; void on_select_filament(wxCommandEvent& evt); + bool ProcessLeftDown(wxMouseEvent &evt); + protected: StateColor m_btn_bg_green; wxPanel * m_panel_SN; @@ -82,6 +84,9 @@ protected: TextInput * m_input_nozzle_min; TextInput* m_input_nozzle_max; Button * m_button_confirm; +#ifdef __APPLE__ + wxComboBox *m_comboBox_filament_mac; +#endif wxColourData * m_clrData; }; diff --git a/src/slic3r/GUI/AboutDialog.cpp b/src/slic3r/GUI/AboutDialog.cpp index ca2ed5b585..74b2d74ae7 100644 --- a/src/slic3r/GUI/AboutDialog.cpp +++ b/src/slic3r/GUI/AboutDialog.cpp @@ -80,7 +80,7 @@ CopyrightsDialog::CopyrightsDialog() SetSizer(sizer); sizer->SetSizeHints(this); - + CenterOnParent(); } void CopyrightsDialog::fill_entries() @@ -88,6 +88,7 @@ void CopyrightsDialog::fill_entries() m_entries = { { "Admesh", "", "https://admesh.readthedocs.io/" }, { "Anti-Grain Geometry", "", "http://antigrain.com" }, + { "ArcWelderLib", "", "https://plugins.octoprint.org/plugins/arc_welder" }, { "Boost", "", "http://www.boost.org" }, { "Cereal", "", "http://uscilab.github.io/cereal" }, { "CGAL", "", "https://www.cgal.org" }, @@ -115,6 +116,7 @@ void CopyrightsDialog::fill_entries() { "Real-Time DXT1/DXT5 C compression library", "", "https://github.com/Cyan4973/RygsDXTc" }, { "SemVer", "", "https://semver.org" }, { "Shinyprofiler", "", "https://code.google.com/p/shinyprofiler" }, + { "SuperSlicer", "", "https://github.com/supermerill/SuperSlicer" }, { "TBB", "", "https://www.intel.cn/content/www/cn/zh/developer/tools/oneapi/onetbb.html" }, { "wxWidgets", "", "https://www.wxwidgets.org" }, { "zlib", "", "http://zlib.net" }, @@ -219,7 +221,7 @@ AboutDialog::AboutDialog() std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % resources_dir()).str(); SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); - wxPanel *m_panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(430), FromDIP(237)), wxTAB_TRAVERSAL); + wxPanel *m_panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(560), FromDIP(237)), wxTAB_TRAVERSAL); wxBoxSizer *panel_versizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer *vesizer = new wxBoxSizer(wxVERTICAL); @@ -233,7 +235,7 @@ AboutDialog::AboutDialog() main_sizer->Add(ver_sizer, 0, wxEXPAND | wxALL, 0); // logo - m_logo_bitmap = ScalableBitmap(this, "BambuStudio_about", 240); + m_logo_bitmap = ScalableBitmap(this, "BambuStudio_about", 250); m_logo = new wxStaticBitmap(this, wxID_ANY, m_logo_bitmap.bmp(), wxDefaultPosition,wxDefaultSize, 0); m_logo->SetSizer(vesizer); @@ -250,20 +252,70 @@ AboutDialog::AboutDialog() #else version_font.SetPointSize(11); #endif - version_font.SetPointSize(12); + version_font.SetPointSize(FromDIP(16)); version->SetFont(version_font); - version->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); + version->SetForegroundColour(wxColour(255, 255, 255)); version->SetBackgroundColour(wxColour(0, 174, 66)); vesizer->Add(version, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, FromDIP(5)); vesizer->Add(0, 0, 1, wxEXPAND, FromDIP(5)); } - wxStaticText *html_text = new wxStaticText(this, wxID_ANY, "Copyright(C) 2021-2022 Bambu Lab", wxDefaultPosition, wxDefaultSize); - ver_sizer->Add(0, 0, 0, wxTOP, FromDIP(38)); - html_text->SetForegroundColour(wxColour(107, 107, 107)); - ver_sizer->Add(html_text, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, 0); + wxBoxSizer *text_sizer_horiz = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer *text_sizer = new wxBoxSizer(wxVERTICAL); + text_sizer_horiz->Add( 0, 0, 0, wxLEFT, FromDIP(23)); + + std::vector text_list; + text_list.push_back(_L("Bambu Studio is based on PrusaSlicer by PrusaResearch and SuperSlicer by Merill(supermerill).")); + text_list.push_back(_L("PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci.")); + text_list.push_back(_L("Slic3r was created by Alessandro Ranellucci with the help of many other contributors.")); + text_list.push_back(_L("Bambu Studio also referenced some ideas from Cura by Ultimaker.")); + text_list.push_back(_L("There many parts of the software that come from community contributions, so we're unable to list them one-by-one, and instead, they'll be attributed in the corresponding code comments.")); + + text_sizer->Add( 0, 0, 0, wxTOP, FromDIP(33)); + bool is_zh = wxGetApp().app_config->get("language") == "zh_CN"; + for (int i = 0; i < text_list.size(); i++) + { + auto staticText = new wxStaticText( this, wxID_ANY, wxEmptyString,wxDefaultPosition,wxSize(FromDIP(520), -1), wxALIGN_LEFT ); + staticText->SetForegroundColour(wxColour(107, 107, 107)); + staticText->SetMinSize(wxSize(FromDIP(520), -1)); + staticText->SetFont(Label::Body_12); + if (is_zh) { + wxString find_txt = ""; + wxString count_txt = ""; + for (auto o = 0; o < text_list[i].length(); o++) { + auto size = staticText->GetTextExtent(count_txt); + if (size.x < FromDIP(506)) { + find_txt += text_list[i][o]; + count_txt += text_list[i][o]; + } else { + find_txt += std::string("\n") + text_list[i][o]; + count_txt = text_list[i][o]; + } + } + staticText->SetLabel(find_txt); + } else { + staticText->SetLabel(text_list[i]); + staticText->Wrap(FromDIP(520)); + } + + text_sizer->Add( staticText, 0, wxUP | wxDOWN, FromDIP(3)); + } + + text_sizer_horiz->Add(text_sizer, 1, wxALL,0); + ver_sizer->Add(text_sizer_horiz, 0, wxALL,0); + ver_sizer->Add( 0, 0, 0, wxTOP, FromDIP(43)); + + wxBoxSizer *copyright_ver_sizer = new wxBoxSizer(wxVERTICAL); + wxBoxSizer *copyright_hor_sizer = new wxBoxSizer(wxHORIZONTAL); + + copyright_hor_sizer->Add(copyright_ver_sizer, 0, wxALL,5); + copyright_hor_sizer->Add( 0, 0, 0, wxLEFT, FromDIP(120)); + + wxStaticText *html_text = new wxStaticText(this, wxID_ANY, "Copyright(C) 2021-2022 Bambu Lab", wxDefaultPosition, wxDefaultSize); + html_text->SetForegroundColour(wxColour(107, 107, 107)); + + copyright_ver_sizer->Add(html_text, 0, wxALL , 0); - // text m_html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_NEVER /*NEVER*/); { wxFont font = get_default_font(this); @@ -276,12 +328,12 @@ AboutDialog::AboutDialog() (boost::format( "" "" - "

www.bambulab.com

" + "

www.bambulab.com

" "" "") ).str()); m_html->SetPage(text); - ver_sizer->Add(m_html, 0, wxEXPAND, 0); + copyright_ver_sizer->Add(m_html, 0, wxEXPAND, 0); m_html->Bind(wxEVT_HTML_LINK_CLICKED, &AboutDialog::onLinkClicked, this); } //Add "Portions copyright" button @@ -298,14 +350,21 @@ AboutDialog::AboutDialog() button_portions->SetCornerRadius(FromDIP(12)); button_portions->SetMinSize(wxSize(FromDIP(120), FromDIP(24))); - ver_sizer->Add( 0, 0, 0, wxTOP, FromDIP(22)); - ver_sizer->Add(button_portions, 0, wxALIGN_CENTER_HORIZONTAL|wxALL,0); - ver_sizer->Add( 0, 0, 0, wxTOP, FromDIP(38)); + wxBoxSizer *copyright_button_ver = new wxBoxSizer(wxVERTICAL); + copyright_button_ver->Add( 0, 0, 0, wxTOP, FromDIP(10)); + copyright_button_ver->Add(button_portions, 0, wxALL,0); + + copyright_hor_sizer->Add(copyright_button_ver, 0, wxALL,0); + copyright_hor_sizer->Add( 0, 0, 0, wxRIGHT, FromDIP(13)); + + ver_sizer->Add(copyright_hor_sizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL,0); + ver_sizer->Add( 0, 0, 0, wxTOP, FromDIP(30)); button_portions->Bind(wxEVT_BUTTON, &AboutDialog::onCopyrightBtn, this); - m_panel->Layout(); SetSizer(main_sizer); - main_sizer->SetSizeHints(this); + Layout(); + Fit(); + CenterOnParent(); } void AboutDialog::on_dpi_changed(const wxRect &suggested_rect) diff --git a/src/slic3r/GUI/AmsMappingPopup.cpp b/src/slic3r/GUI/AmsMappingPopup.cpp index 3d5b75b757..94f33fdf99 100644 --- a/src/slic3r/GUI/AmsMappingPopup.cpp +++ b/src/slic3r/GUI/AmsMappingPopup.cpp @@ -48,11 +48,12 @@ wxDEFINE_EVENT(EVT_SET_FINISH_MAPPING, wxCommandEvent); void MaterialItem::msw_rescale() {} -void MaterialItem::set_ams_info(wxColour col, wxString txt) +void MaterialItem::set_ams_info(wxColour col, wxString txt) { - m_ams_coloul = col; - m_ams_name = txt; - Refresh(); + auto need_refresh = false; + if (m_ams_coloul != col) { m_ams_coloul = col; need_refresh = true;} + if (m_ams_name != txt) {m_ams_name = txt;need_refresh = true;} + if (need_refresh) { Refresh();} } void MaterialItem::on_selected() @@ -74,17 +75,22 @@ void MaterialItem::on_warning() void MaterialItem::on_normal() { - m_selected = false; - m_warning = false; - Refresh(); + if (m_selected || m_warning) { + m_selected = false; + m_warning = false; + Refresh(); + } } - void MaterialItem::paintEvent(wxPaintEvent &evt) { wxPaintDC dc(this); render(dc); + + //PrepareDC(buffdc); + //PrepareDC(dc); + } void MaterialItem::render(wxDC &dc) @@ -107,29 +113,33 @@ void MaterialItem::render(wxDC &dc) doRender(dc); #endif - //materials name - dc.SetFont(::Label::Body_13); + // materials name + dc.SetFont(::Label::Body_13); - auto material_name_colour = m_material_coloul.GetLuminance() < 0.5 ? *wxWHITE : wxColour(0x26,0x2E,0x30); - dc.SetTextForeground(material_name_colour); + auto material_name_colour = m_material_coloul.GetLuminance() < 0.5 ? *wxWHITE : wxColour(0x26, 0x2E, 0x30); + dc.SetTextForeground(material_name_colour); - auto material_txt_size = dc.GetTextExtent(m_material_name); - dc.DrawText(m_material_name, wxPoint((MATERIAL_ITEM_SIZE.x - material_txt_size.x) / 2, FromDIP(3))); + if (dc.GetTextExtent(m_material_name).x > GetSize().x - 10) { + dc.SetFont(::Label::Body_10); - //mapping num - dc.SetFont(::Label::Body_10); - dc.SetTextForeground(m_ams_coloul.GetLuminance() < 0.5 ? *wxWHITE : wxColour(0x26,0x2E,0x30)); + } + auto material_txt_size = dc.GetTextExtent(m_material_name); + dc.DrawText(m_material_name, wxPoint((MATERIAL_ITEM_SIZE.x - material_txt_size.x) / 2, (FromDIP(22) - material_txt_size.y) / 2)); - wxString mapping_txt = wxEmptyString; - if (m_ams_name.empty()) { - mapping_txt = "-"; - }else{ - mapping_txt = m_ams_name; - } - - auto mapping_txt_size = dc.GetTextExtent(mapping_txt); - dc.DrawText(mapping_txt, wxPoint((MATERIAL_ITEM_SIZE.x - mapping_txt_size.x) / 2, FromDIP(2) + material_txt_size.y )); + // mapping num + dc.SetFont(::Label::Body_10); + dc.SetTextForeground(m_ams_coloul.GetLuminance() < 0.5 ? *wxWHITE : wxColour(0x26, 0x2E, 0x30)); + + wxString mapping_txt = wxEmptyString; + if (m_ams_name.empty()) { + mapping_txt = "-"; + } else { + mapping_txt = m_ams_name; + } + + auto mapping_txt_size = dc.GetTextExtent(mapping_txt); + dc.DrawText(mapping_txt, wxPoint((MATERIAL_ITEM_SIZE.x - mapping_txt_size.x) / 2, FromDIP(20) + (FromDIP(14) - mapping_txt_size.y) / 2)); } void MaterialItem::doRender(wxDC &dc) @@ -137,36 +147,33 @@ void MaterialItem::doRender(wxDC &dc) //top dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxBrush(m_material_coloul)); - dc.DrawRoundedRectangle(FromDIP(3), FromDIP(3), MATERIAL_ITEM_SIZE.x - FromDIP(6), MATERIAL_ITEM_SIZE.y / 2, 5); + dc.DrawRoundedRectangle(FromDIP(1), FromDIP(1), MATERIAL_ITEM_REAL_SIZE.x, FromDIP(18), 5); //bottom dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxBrush(wxColour(m_ams_coloul))); - dc.DrawRoundedRectangle(FromDIP(3), MATERIAL_ITEM_SIZE.y / 2 - FromDIP(2), MATERIAL_ITEM_SIZE.x - FromDIP(6), MATERIAL_ITEM_SIZE.y / 2, 5); + dc.DrawRoundedRectangle(FromDIP(1), FromDIP(18), MATERIAL_ITEM_REAL_SIZE.x, FromDIP(16), 5); - //middle + ////middle dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxBrush(m_material_coloul)); - dc.DrawRectangle(FromDIP(3), FromDIP(10), MATERIAL_ITEM_SIZE.x - FromDIP(6), FromDIP(8)); + dc.DrawRectangle(FromDIP(1), FromDIP(11), MATERIAL_ITEM_REAL_SIZE.x, FromDIP(8)); - //border - if (m_material_coloul == *wxWHITE) { + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(wxBrush(m_ams_coloul)); + dc.DrawRectangle(FromDIP(1), FromDIP(18), MATERIAL_ITEM_REAL_SIZE.x, FromDIP(8)); + + ////border + if (m_material_coloul == *wxWHITE || m_ams_coloul == *wxWHITE) { dc.SetPen(wxColour(0xAC, 0xAC, 0xAC)); dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.DrawRoundedRectangle(3, 3, MATERIAL_ITEM_SIZE.x -6, MATERIAL_ITEM_SIZE.y - 6, 5); + dc.DrawRoundedRectangle(0, 0, MATERIAL_ITEM_SIZE.x, MATERIAL_ITEM_SIZE.y, 5); } - if (m_selected) { dc.SetPen(wxColour(0x00, 0xAE, 0x42)); dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.DrawRoundedRectangle(1, 1, MATERIAL_ITEM_SIZE.x - 2, MATERIAL_ITEM_SIZE.y - 2, 5); - } - - if (m_warning) { - dc.SetPen(wxColour(0xFF, 0x6F, 0x00)); - dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.DrawRoundedRectangle(1, 1, MATERIAL_ITEM_SIZE.x - 2, MATERIAL_ITEM_SIZE.y - 2, 5); + dc.DrawRoundedRectangle(0, 0, MATERIAL_ITEM_SIZE.x, MATERIAL_ITEM_SIZE.y, 5); } } @@ -186,10 +193,6 @@ void MaterialItem::doRender(wxDC &dc) Layout(); } -void AmsMapingPopup::Popup(wxWindow *focus /*= NULL*/) -{ - wxPopupTransientWindow::Popup(); -} void AmsMapingPopup::update_materials_list(std::vector list) { @@ -210,6 +213,11 @@ bool AmsMapingPopup::is_match_material(int id, std::string material) void AmsMapingPopup::update_ams_data(std::map amsList) { + if (m_amsmapping_sizer_list.size() > 0) { + for (wxBoxSizer *bz : m_amsmapping_sizer_list) { bz->Clear(true); } + m_amsmapping_sizer_list.clear(); + } + std::map::iterator ams_iter; BOOST_LOG_TRIVIAL(trace) << "ams_mapping total count " << amsList.size(); @@ -229,8 +237,6 @@ void AmsMapingPopup::update_ams_data(std::map amsList) td.id = ams_indx * AMS_TOTAL_COUNT + atoi(tray_data->id.c_str()); - BOOST_LOG_TRIVIAL(trace) << "ams_mapping ams data ==type==" << tray_data->type << "==colour=="<color << "==trayid=="<id.c_str() << "==ftrayid=="<is_exists) { td.type = EMPTY; } else { @@ -254,9 +260,7 @@ void AmsMapingPopup::update_ams_data(std::map amsList) void AmsMapingPopup::add_ams_mapping(std::vector tray_data) { - wxBoxSizer *sizer_mapping_list = new wxBoxSizer(wxHORIZONTAL); - - + auto sizer_mapping_list = new wxBoxSizer(wxHORIZONTAL); for (auto i = 0; i < tray_data.size(); i++) { wxBoxSizer *sizer_mapping_item = new wxBoxSizer(wxVERTICAL); @@ -299,7 +303,7 @@ void AmsMapingPopup::add_ams_mapping(std::vector tray_data) if (!is_match_material(tray_data[i].id, tray_data[i].name)) return; wxCommandEvent event(EVT_SET_FINISH_MAPPING); event.SetInt(tray_data[i].id); - wxString param = wxString::Format("%d|%d|%d|%02d", tray_data[i].colour.Red(), tray_data[i].colour.Green(), tray_data[i].colour.Blue(), tray_data[i].id + 1); + wxString param = wxString::Format("%d|%d|%d|%02d|%d", tray_data[i].colour.Red(), tray_data[i].colour.Green(), tray_data[i].colour.Blue(), tray_data[i].id + 1, m_current_filament_id); event.SetString(param); event.SetEventObject(this->GetParent()); wxPostEvent(this->GetParent(), event); @@ -317,7 +321,7 @@ void AmsMapingPopup::add_ams_mapping(std::vector tray_data) m_filament_name->Bind(wxEVT_BUTTON, [this, tray_data, i](wxCommandEvent &e) { wxCommandEvent event(EVT_SET_FINISH_MAPPING); event.SetInt(tray_data[i].id); - wxString param = wxString::Format("%d|%d|%d|%02d", 0x6B, 0x6B, 0x6B, tray_data[i].id + 1); + wxString param = wxString::Format("%d|%d|%d|%02d|%d", 0x6B, 0x6B, 0x6B, tray_data[i].id + 1, m_current_filament_id); event.SetString(param); event.SetEventObject(this->GetParent()); wxPostEvent(this->GetParent(), event); @@ -334,7 +338,7 @@ void AmsMapingPopup::add_ams_mapping(std::vector tray_data) m_filament_name->Bind(wxEVT_BUTTON, [this, tray_data, i](wxCommandEvent &e) { wxCommandEvent event(EVT_SET_FINISH_MAPPING); event.SetInt(tray_data[i].id); - wxString param = wxString::Format("%d|%d|%d|%02d", 0x6B, 0x6B, 0x6B, tray_data[i].id + 1); + wxString param = wxString::Format("%d|%d|%d|%02d|%d", 0x6B, 0x6B, 0x6B, tray_data[i].id + 1, m_current_filament_id); event.SetString(param); event.SetEventObject(this->GetParent()); wxPostEvent(this->GetParent(), event); @@ -342,17 +346,17 @@ void AmsMapingPopup::add_ams_mapping(std::vector tray_data) }); } - sizer_mapping_item->Add(number, 0, wxALIGN_CENTER_HORIZONTAL, 0); sizer_mapping_item->Add(m_filament_name, 0, wxALIGN_CENTER_HORIZONTAL, 0); sizer_mapping_list->Add(sizer_mapping_item, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, FromDIP(5)); + m_amsmapping_sizer_list.push_back(sizer_mapping_list); } m_sizer_main->Add(sizer_mapping_list, 0, wxALIGN_CENTER_HORIZONTAL, 0); } void AmsMapingPopup::OnDismiss() { - delete this; + } bool AmsMapingPopup::ProcessLeftDown(wxMouseEvent &event) diff --git a/src/slic3r/GUI/AmsMappingPopup.hpp b/src/slic3r/GUI/AmsMappingPopup.hpp index b0cc6aeb58..2acc95af0e 100644 --- a/src/slic3r/GUI/AmsMappingPopup.hpp +++ b/src/slic3r/GUI/AmsMappingPopup.hpp @@ -39,7 +39,8 @@ namespace Slic3r { namespace GUI { -#define MATERIAL_ITEM_SIZE wxSize(FromDIP(42), FromDIP(31)) +#define MATERIAL_ITEM_SIZE wxSize(FromDIP(64), FromDIP(34)) +#define MATERIAL_ITEM_REAL_SIZE wxSize(FromDIP(62), FromDIP(32)) #define AMS_TOTAL_COUNT 4 enum TrayType { @@ -92,14 +93,18 @@ public: ~AmsMapingPopup() {}; std::vector m_materials_list; - std::string m_tag_material; - wxBoxSizer *m_sizer_main; + std::vector m_amsmapping_sizer_list; + + int m_current_filament_id; + std::string m_tag_material; + wxBoxSizer *m_sizer_main{nullptr}; - virtual void Popup(wxWindow *focus = NULL) wxOVERRIDE; void update_materials_list(std::vector list); void set_tag_texture(std::string texture); void update_ams_data(std::map amsList); void add_ams_mapping(std::vector tray_data); + void set_current_filament_id(int id){m_current_filament_id = id;}; + int get_current_filament_id(){return m_current_filament_id;}; bool is_match_material(int id, std::string material); virtual void OnDismiss() wxOVERRIDE; virtual bool ProcessLeftDown(wxMouseEvent &event) wxOVERRIDE; diff --git a/src/slic3r/GUI/Auxiliary.cpp b/src/slic3r/GUI/Auxiliary.cpp index 0eaee57e6a..2a31af74b5 100644 --- a/src/slic3r/GUI/Auxiliary.cpp +++ b/src/slic3r/GUI/Auxiliary.cpp @@ -501,7 +501,7 @@ AuFolderPanel::AuFolderPanel(wxWindow *parent, AuxiliaryFolderType type, wxWindo m_button_add = new Button(m_scrolledWindow, _L("Add"), "auxiliary_add_file", 12, 12); m_button_add->SetBackgroundColor(btn_bg_white); m_button_add->SetBorderColor(btn_bd_white); - m_button_add->SetMinSize(wxSize(FromDIP(80), FromDIP(24))); + m_button_add->SetMinSize(wxSize(-1, FromDIP(24))); m_button_add->SetCornerRadius(12); m_button_add->SetFont(Label::Body_14); // m_button_add->Bind(wxEVT_LEFT_UP, &AuxiliaryPanel::on_add, this); @@ -563,7 +563,7 @@ void AuFolderPanel::update(std::vector paths) void AuFolderPanel::msw_rescale() { - m_button_add->SetMinSize(wxSize(FromDIP(80), FromDIP(24))); + m_button_add->SetMinSize(wxSize(-1, FromDIP(24))); for (auto i = 0; i < m_aufiles_list.GetCount(); i++) { AuFiles *aufile = m_aufiles_list[i]; aufile->file->msw_rescale(); @@ -707,21 +707,14 @@ void AuxiliaryPanel::init_tabpanel() m_tabpanel->SetBackgroundColour(*wxWHITE); m_tabpanel->Bind(wxEVT_BOOKCTRL_PAGE_CHANGED, [this](wxBookCtrlEvent &e) { ; }); -#if !BBL_RELEASE_TO_PUBLIC m_designer_panel = new DesignerPanel(m_tabpanel, AuxiliaryFolderType::DESIGNER); -#endif - m_pictures_panel = new AuFolderPanel(m_tabpanel, AuxiliaryFolderType::MODEL_PICTURE); m_bill_of_materials_panel = new AuFolderPanel(m_tabpanel, AuxiliaryFolderType::BILL_OF_MATERIALS); m_assembly_panel = new AuFolderPanel(m_tabpanel, AuxiliaryFolderType::ASSEMBLY_GUIDE); m_others_panel = new AuFolderPanel(m_tabpanel, AuxiliaryFolderType::OTHERS); -#if !BBL_RELEASE_TO_PUBLIC m_tabpanel->AddPage(m_designer_panel, _L("Basic Info"), "", true); m_tabpanel->AddPage(m_pictures_panel, _L("Pictures"), "", false); -#else - m_tabpanel->AddPage(m_pictures_panel, _L("Pictures"), "", true); -#endif m_tabpanel->AddPage(m_bill_of_materials_panel, _L("Bill of Materials"), "", false); m_tabpanel->AddPage(m_assembly_panel, _L("Assembly Guide"), "", false); m_tabpanel->AddPage(m_others_panel, _L("Others"), "", false); @@ -743,9 +736,7 @@ void AuxiliaryPanel::msw_rescale() { m_bill_of_materials_panel->msw_rescale(); m_assembly_panel->msw_rescale(); m_others_panel->msw_rescale(); -#if !BBL_RELEASE_TO_PUBLIC m_designer_panel->msw_rescale(); -#endif } void AuxiliaryPanel::on_size(wxSizeEvent &event) @@ -897,9 +888,7 @@ void AuxiliaryPanel::Reload(wxString aux_path) fs::create_directory(folder_path.ToStdWstring()); } update_all_panel(); - #if !BBL_RELEASE_TO_PUBLIC m_designer_panel->update_info(); - #endif return; } @@ -947,9 +936,7 @@ void AuxiliaryPanel::Reload(wxString aux_path) update_all_panel(); update_all_cover(); - #if !BBL_RELEASE_TO_PUBLIC m_designer_panel->update_info(); - #endif } void AuxiliaryPanel::update_all_panel() diff --git a/src/slic3r/GUI/BBLStatusBarBind.cpp b/src/slic3r/GUI/BBLStatusBarBind.cpp index 936ab46f05..346dd0543e 100644 --- a/src/slic3r/GUI/BBLStatusBarBind.cpp +++ b/src/slic3r/GUI/BBLStatusBarBind.cpp @@ -77,28 +77,13 @@ void BBLStatusBarBind::set_progress(int val) if(val < 0) return; - bool need_layout = false; - //add the logic for arrange/orient jobs, which don't call stop_busy - if(val == m_prog->GetRange()) { - m_prog->SetValue(0); - set_percent_text("0%"); - //m_sizer->Hide(m_prog); - need_layout = true; - } - else - { - if (!m_sizer->IsShown(m_prog)) { - m_sizer->Show(m_prog); - m_sizer->Show(m_cancelbutton); - need_layout = true; - } - m_prog->SetValue(val); - set_percent_text(wxString::Format("%d%%", val)); - } - - if (need_layout) { - m_sizer->Layout(); + if (!m_sizer->IsShown(m_prog)) { + m_sizer->Show(m_prog); + m_sizer->Show(m_cancelbutton); } + m_prog->SetValue(val); + set_percent_text(wxString::Format("%d%%", val)); + m_sizer->Layout(); } int BBLStatusBarBind::get_range() const diff --git a/src/slic3r/GUI/BBLStatusBarSend.cpp b/src/slic3r/GUI/BBLStatusBarSend.cpp index 09aaacf9a8..f73c1c540d 100644 --- a/src/slic3r/GUI/BBLStatusBarSend.cpp +++ b/src/slic3r/GUI/BBLStatusBarSend.cpp @@ -26,19 +26,19 @@ BBLStatusBarSend::BBLStatusBarSend(wxWindow *parent, int id) wxBoxSizer *m_sizer_body = new wxBoxSizer(wxVERTICAL); wxBoxSizer *m_sizer_bottom = new wxBoxSizer(wxHORIZONTAL); - m_status_text = new wxStaticText(m_self, wxID_ANY, L(""), wxDefaultPosition, wxDefaultSize, 0); + m_status_text = new wxStaticText(m_self, wxID_ANY, L(""), wxDefaultPosition, wxSize(m_self->FromDIP(280), -1), 0); m_status_text->SetForegroundColour(wxColour(107, 107, 107)); m_status_text->SetFont(::Label::Body_13); - m_status_text->Wrap(-1); - m_sizer_body->Add(m_status_text, 0, 0, 0); + m_status_text->Wrap(m_self->FromDIP(280)); + m_prog = new wxGauge(m_self, wxID_ANY, 100, wxDefaultPosition, wxSize(-1, m_self->FromDIP(6)), wxGA_HORIZONTAL); m_prog->SetValue(0); - block_left = new wxWindow(m_prog, wxID_ANY, wxPoint(0, 0), wxSize(2, m_prog->GetSize().GetHeight() * 2)); - block_left->SetBackgroundColour(wxColour(255, 255, 255)); - block_right = new wxWindow(m_prog, wxID_ANY, wxPoint(m_prog->GetSize().GetWidth() - 2, 0), wxSize(2, m_prog->GetSize().GetHeight() * 2)); - block_right->SetBackgroundColour(wxColour(255, 255, 255)); + /* block_left = new wxWindow(m_prog, wxID_ANY, wxPoint(0, 0), wxSize(2, m_prog->GetSize().GetHeight() * 2)); + block_left->SetBackgroundColour(wxColour(255, 255, 255)); + block_right = new wxWindow(m_prog, wxID_ANY, wxPoint(m_prog->GetSize().GetWidth() - 2, 0), wxSize(2, m_prog->GetSize().GetHeight() * 2)); + block_right->SetBackgroundColour(wxColour(255, 255, 255));*/ m_sizer_bottom->Add(m_prog, 1, wxALIGN_CENTER, 0); @@ -47,9 +47,10 @@ BBLStatusBarSend::BBLStatusBarSend(wxWindow *parent, int id) m_cancelbutton->SetTextColor(wxColour(107, 107, 107)); m_cancelbutton->SetBackgroundColor(wxColour(255, 255, 255)); m_cancelbutton->SetCornerRadius(12); - m_cancelbutton->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { + m_cancelbutton->Bind(wxEVT_BUTTON, + [this](wxCommandEvent &evt) { m_was_cancelled = true; - if (m_cancel_cb_fina) + if (m_cancel_cb_fina) m_cancel_cb_fina(); }); @@ -60,7 +61,9 @@ BBLStatusBarSend::BBLStatusBarSend(wxWindow *parent, int id) m_sizer_bottom->Add(m_stext_percent, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, 10); m_sizer_bottom->Add(m_cancelbutton, 0, wxALIGN_CENTER, 0); - m_sizer_body->Add(0, 0, 0, wxTOP, 5); + + m_sizer_body->Add(m_status_text, 0, 0, 0); + m_sizer_body->Add(0, 0, 0, wxTOP, 1); m_sizer_body->Add(m_sizer_bottom, 1, wxEXPAND, 0); m_sizer->Add(m_sizer_body, 1, wxALIGN_CENTER, 0); @@ -73,8 +76,8 @@ BBLStatusBarSend::BBLStatusBarSend(wxWindow *parent, int id) void BBLStatusBarSend::set_prog_block() { - block_left->SetPosition(wxPoint(0, 0)); - block_right->SetPosition(wxPoint(m_prog->GetSize().GetWidth() - 2, 0)); + //block_left->SetPosition(wxPoint(0, 0)); + //block_right->SetPosition(wxPoint(m_prog->GetSize().GetWidth() - 2, 0)); } int BBLStatusBarSend::get_progress() const @@ -84,33 +87,19 @@ int BBLStatusBarSend::get_progress() const void BBLStatusBarSend::set_progress(int val) { - set_prog_block(); + //set_prog_block(); if(val < 0) return; - bool need_layout = false; //add the logic for arrange/orient jobs, which don't call stop_busy - if(val == m_prog->GetRange()) { - m_prog->SetValue(0); - set_percent_text("0%"); - m_sizer->Hide(m_prog); - need_layout = true; - } - else - { - if (!m_sizer->IsShown(m_prog)) { - m_sizer->Show(m_prog); - m_sizer->Show(m_cancelbutton); - need_layout = true; - } - m_prog->SetValue(val); - set_percent_text(wxString::Format("%d%%", val)); - } - - if (need_layout) { - m_sizer->Layout(); + if (!m_sizer->IsShown(m_prog)) { + m_sizer->Show(m_prog); + m_sizer->Show(m_cancelbutton); } + m_prog->SetValue(val); + set_percent_text(wxString::Format("%d%%", val)); + m_sizer->Layout(); } int BBLStatusBarSend::get_range() const @@ -185,6 +174,9 @@ void BBLStatusBarSend::set_status_text(const wxString& txt) //auto txtss = "The printing project is being uploaded... 25%%"; //m_status_text->SetLabelText(txtss); m_status_text->SetLabelText(txt); + m_status_text->SetSize(wxSize(m_self->FromDIP(280), -1)); + m_status_text->SetMaxSize(wxSize(m_self->FromDIP(280), -1)); + m_status_text->Wrap(m_self->FromDIP(280)); } void BBLStatusBarSend::set_percent_text(const wxString &txt) @@ -203,7 +195,7 @@ void BBLStatusBarSend::set_status_text(const char *txt) } void BBLStatusBarSend::msw_rescale() { - set_prog_block(); + //set_prog_block(); m_cancelbutton->SetMinSize(wxSize(m_self->FromDIP(56), m_self->FromDIP(24))); } @@ -230,6 +222,7 @@ void BBLStatusBarSend::reset() set_status_text(""); m_was_cancelled = false; set_progress(0); + set_percent_text(wxString::Format("%d%%", 0)); } @@ -250,4 +243,9 @@ void BBLStatusBarSend::hide_cancel_button() m_sizer->Layout(); } +void BBLStatusBarSend::change_button_label(wxString name) +{ + m_cancelbutton->SetLabel(name); +} + } diff --git a/src/slic3r/GUI/BBLStatusBarSend.hpp b/src/slic3r/GUI/BBLStatusBarSend.hpp index 2151a0e57d..e938308fcd 100644 --- a/src/slic3r/GUI/BBLStatusBarSend.hpp +++ b/src/slic3r/GUI/BBLStatusBarSend.hpp @@ -73,6 +73,7 @@ public: // Temporary methods to satisfy Perl side void show_cancel_button(); void hide_cancel_button(); + void change_button_label(wxString name); private: bool m_busy = false; diff --git a/src/slic3r/GUI/BBLTopbar.cpp b/src/slic3r/GUI/BBLTopbar.cpp index 71b7b8ceca..b5d142154a 100644 --- a/src/slic3r/GUI/BBLTopbar.cpp +++ b/src/slic3r/GUI/BBLTopbar.cpp @@ -11,6 +11,7 @@ #include "PartPlate.hpp" #define TOPBAR_ICON_SIZE 18 +#define TOPBAR_TITLE_WIDTH 300 using namespace Slic3r; @@ -243,7 +244,7 @@ void BBLTopbar::Init(wxFrame* parent) this->AddSpacer(FromDIP(10)); this->AddStretchSpacer(1); - m_title_item = this->AddLabel(ID_TITLE, "", FromDIP(300)); + m_title_item = this->AddLabel(ID_TITLE, "", FromDIP(TOPBAR_TITLE_WIDTH)); m_title_item->SetAlignment(wxCENTER); this->AddSpacer(FromDIP(10)); @@ -402,6 +403,9 @@ wxMenu* BBLTopbar::GetTopMenu() void BBLTopbar::SetTitle(wxString title) { + wxGCDC dc(this); + title = wxControl::Ellipsize(title, dc, wxELLIPSIZE_END, FromDIP(TOPBAR_TITLE_WIDTH)); + m_title_item->SetLabel(title); m_title_item->SetAlignment(wxALIGN_CENTRE_HORIZONTAL); this->Refresh(); diff --git a/src/slic3r/GUI/BindDialog.cpp b/src/slic3r/GUI/BindDialog.cpp index dd3161f13d..b47a7a013b 100644 --- a/src/slic3r/GUI/BindDialog.cpp +++ b/src/slic3r/GUI/BindDialog.cpp @@ -436,17 +436,23 @@ void UnBindMachineDilaog::on_unbind_printer(wxCommandEvent &event) if (result == 0) { DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) return; - dev->update_user_machine_list_info(); + // clean local machine access code info + MachineObject* obj = dev->get_local_machine(m_machine_info->dev_id); + if (obj) { + obj->set_access_code(""); + } + dev->erase_user_machine(m_machine_info->dev_id); m_status_text->SetLabelText(_L("Log out successful.")); m_button_cancel->SetLabel(_L("Close")); m_button_unbind->Hide(); + EndModal(wxID_OK); } else { m_status_text->SetLabelText(_L("Failed to log out.")); + EndModal(wxID_CANCEL); return; } - EndModal(wxID_OK); } void UnBindMachineDilaog::on_dpi_changed(const wxRect &suggested_rect) diff --git a/src/slic3r/GUI/Calibration.cpp b/src/slic3r/GUI/Calibration.cpp index 981c281fd5..0be5afc22f 100644 --- a/src/slic3r/GUI/Calibration.cpp +++ b/src/slic3r/GUI/Calibration.cpp @@ -97,13 +97,23 @@ CalibrationDialog::CalibrationDialog(Plater *plater) auto staticline = new ::StaticLine(cali_right_panel); staticline->SetLineColour(wxColour(0x00, 0xAE, 0x42)); - - m_calibration_flow = new StepIndicator(cali_right_panel, wxID_ANY); + auto calibration_panel = new wxPanel(cali_right_panel); + calibration_panel->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8)); + auto calibration_sizer = new wxBoxSizer(wxVERTICAL); + calibration_panel->SetMinSize(wxSize(FromDIP(170), FromDIP(160))); + calibration_panel->SetSize(wxSize(FromDIP(170), FromDIP(160))); + + m_calibration_flow = new StepIndicator(calibration_panel, wxID_ANY); StateColor bg_color(std::pair(wxColour(248, 248, 248), StateColor::Normal)); m_calibration_flow->SetBackgroundColor(bg_color); m_calibration_flow->SetFont(Label::Body_12); + m_calibration_flow->SetMinSize(wxSize(FromDIP(170), FromDIP(160))); m_calibration_flow->SetSize(wxSize(FromDIP(170), FromDIP(160))); + + calibration_panel->SetSizer(calibration_sizer); + calibration_panel->Layout(); + calibration_sizer->Add(m_calibration_flow, 0, wxALIGN_CENTER_HORIZONTAL | wxEXPAND, 0); StateColor btn_bg_green(std::pair(AMS_CONTROL_DISABLE_COLOUR, StateColor::Disabled), std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); @@ -119,10 +129,10 @@ CalibrationDialog::CalibrationDialog(Plater *plater) cali_right_sizer_v->Add(cali_text_right_top, 0, wxALIGN_CENTER, 0); cali_right_sizer_v->Add(0, 0, 0, wxTOP, FromDIP(7)); cali_right_sizer_v->Add(staticline, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(10)); - cali_right_sizer_v->Add(0, 0, 0, wxTOP, FromDIP(9)); - cali_right_sizer_v->Add(m_calibration_flow, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(6)); - cali_right_sizer_v->Add(0, 0, 0, wxTOP, FromDIP(10)); - cali_right_sizer_v->Add(m_calibration_btn, 0, wxALIGN_CENTER, 0); + cali_right_sizer_v->Add(0, 0, 0, wxTOP, FromDIP(3)); + cali_right_sizer_v->Add(calibration_panel, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT, FromDIP(6)); + cali_right_sizer_v->Add(0, 0, 1, wxEXPAND, 5); + cali_right_sizer_v->Add(m_calibration_btn, 0, wxALIGN_CENTER_HORIZONTAL, 0); cali_right_sizer_h->Add(cali_right_sizer_v, 0, wxALIGN_CENTER, 0); cali_right_panel->SetSizer(cali_right_sizer_h); @@ -137,7 +147,6 @@ CalibrationDialog::CalibrationDialog(Plater *plater) SetSizer(m_sizer_main); Layout(); Fit(); - Centre(wxBOTH); Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent &evt) { Hide(); }); @@ -151,29 +160,41 @@ void CalibrationDialog::on_dpi_changed(const wxRect &suggested_rect) {} void CalibrationDialog::update_cali(MachineObject *obj) { if (!obj) return; - - // in printing - if (obj->is_in_printing()) { - m_calibration_flow->DeleteAllItems(); - m_calibration_btn->Disable(); - return; - } else { - m_calibration_btn->Enable(); - if (!obj->is_in_calibration()) { - m_calibration_flow->DeleteAllItems(); - m_calibration_btn->SetLabel(_L("Start Calibration")); + if (obj->is_in_calibration() || obj->is_calibration_done()) { + if (obj->is_calibration_done()) { + m_calibration_btn->Enable(); + m_calibration_btn->SetLabel(_L("Completed")); } else { + // RUNNING && IDLE m_calibration_btn->Disable(); m_calibration_btn->SetLabel(_L("Calibrating")); - - if (is_stage_list_info_changed(obj)) { - // change items if stage_list_info changed - m_calibration_flow->DeleteAllItems(); - for (int i = 0; i < obj->stage_list_info.size(); i++) { m_calibration_flow->AppendItem(get_stage_string(obj->stage_list_info[i])); } - } - int index = obj->get_curr_stage_idx(); - m_calibration_flow->SelectItem(index); } + auto size = wxSize(-1, obj->stage_list_info.size() * FromDIP(44)); + if (m_calibration_flow->GetSize().y != size.y) { + m_calibration_flow->SetSize(size); + m_calibration_flow->SetMinSize(size); + m_calibration_flow->SetMaxSize(size); + Layout(); + } + if (is_stage_list_info_changed(obj)) { + // change items if stage_list_info changed + m_calibration_flow->DeleteAllItems(); + for (int i = 0; i < obj->stage_list_info.size(); i++) { + m_calibration_flow->AppendItem(get_stage_string(obj->stage_list_info[i])); + } + } + int index = obj->get_curr_stage_idx(); + m_calibration_flow->SelectItem(index); + } else { + // IDLE + if (obj->is_in_printing()) { + m_calibration_btn->Disable(); + } + else { + m_calibration_btn->Enable(); + } + m_calibration_flow->DeleteAllItems(); + m_calibration_btn->SetLabel(_L("Start Calibration")); } } @@ -193,11 +214,23 @@ bool CalibrationDialog::is_stage_list_info_changed(MachineObject *obj) void CalibrationDialog::on_start_calibration(wxMouseEvent &event) { if (m_obj) { - BOOST_LOG_TRIVIAL(trace) << "on_start_calibration"; - m_obj->command_start_calibration(); + if (m_obj->is_calibration_done()) { + m_obj->calibration_done = false; + EndModal(wxID_CANCEL); + Close(); + } else { + BOOST_LOG_TRIVIAL(info) << "on_start_calibration"; + m_obj->command_start_calibration(); + } } } void CalibrationDialog::update_machine_obj(MachineObject *obj) { m_obj = obj; } +bool CalibrationDialog::Show(bool show) +{ + if (show) { CentreOnParent(); } + return DPIDialog::Show(show); +} + }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Calibration.hpp b/src/slic3r/GUI/Calibration.hpp index a4a7a697b6..84ff0f2f93 100644 --- a/src/slic3r/GUI/Calibration.hpp +++ b/src/slic3r/GUI/Calibration.hpp @@ -50,6 +50,7 @@ public: bool is_stage_list_info_changed(MachineObject *obj); void on_start_calibration(wxMouseEvent &event); void update_machine_obj(MachineObject *obj); + bool Show(bool show) override; }; }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/CameraPopup.cpp b/src/slic3r/GUI/CameraPopup.cpp index 6702477064..954b149235 100644 --- a/src/slic3r/GUI/CameraPopup.cpp +++ b/src/slic3r/GUI/CameraPopup.cpp @@ -3,6 +3,10 @@ #include "I18N.hpp" #include "Widgets/Label.hpp" #include "libslic3r/Utils.hpp" +#include "BitmapCache.hpp" +#include +#include +#include namespace Slic3r { namespace GUI { @@ -128,5 +132,94 @@ void CameraPopup::OnMouse(wxMouseEvent &event) } +CameraItem::CameraItem(wxWindow *parent,std::string off_normal, std::string on_normal, std::string off_hover, std::string on_hover) + : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) +{ +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ + + m_bitmap_on_normal = create_scaled_bitmap(on_normal, nullptr, 20); + m_bitmap_off_normal = create_scaled_bitmap(off_normal, nullptr, 20); + m_bitmap_on_hover = create_scaled_bitmap(on_hover, nullptr, 20); + m_bitmap_off_hover = create_scaled_bitmap(off_hover, nullptr, 20); + + SetSize(wxSize(FromDIP(20), FromDIP(20))); + SetMinSize(wxSize(FromDIP(20), FromDIP(20))); + SetMaxSize(wxSize(FromDIP(20), FromDIP(20))); + Bind(wxEVT_PAINT, &CameraItem::paintEvent, this); + Bind(wxEVT_ENTER_WINDOW, &CameraItem::on_enter_win, this); + Bind(wxEVT_LEAVE_WINDOW, &CameraItem::on_level_win, this); +} + +CameraItem::~CameraItem() {} + +void CameraItem::msw_rescale() {} + +void CameraItem::set_switch(bool is_on) +{ + m_on = is_on; + Refresh(); +} + +void CameraItem::on_enter_win(wxMouseEvent &evt) +{ + m_hover = true; + Refresh(); +} + +void CameraItem::on_level_win(wxMouseEvent &evt) +{ + m_hover = false; + Refresh(); +} + +void CameraItem::paintEvent(wxPaintEvent &evt) +{ + wxPaintDC dc(this); + render(dc); + + // PrepareDC(buffdc); + // PrepareDC(dc); +} + +void CameraItem::render(wxDC &dc) +{ +#ifdef __WXMSW__ + wxSize size = GetSize(); + wxMemoryDC memdc; + wxBitmap bmp(size.x, size.y); + memdc.SelectObject(bmp); + memdc.Blit({0, 0}, size, &dc, {0, 0}); + + { + wxGCDC dc2(memdc); + doRender(dc2); + } + + memdc.SelectObject(wxNullBitmap); + dc.DrawBitmap(bmp, 0, 0); +#else + doRender(dc); +#endif +} + +void CameraItem::doRender(wxDC &dc) +{ + if (m_on) { + if (m_hover) { + dc.DrawBitmap(m_bitmap_on_hover, wxPoint((GetSize().x - m_bitmap_on_hover.GetSize().x) / 2, (GetSize().y - m_bitmap_on_hover.GetSize().y) / 2)); + } else { + dc.DrawBitmap(m_bitmap_on_normal, wxPoint((GetSize().x - m_bitmap_on_normal.GetSize().x) / 2, (GetSize().y - m_bitmap_on_normal.GetSize().y) / 2)); + } + + } else { + if (m_hover) { + dc.DrawBitmap(m_bitmap_off_hover, wxPoint((GetSize().x - m_bitmap_off_hover.GetSize().x) / 2, (GetSize().y - m_bitmap_off_hover.GetSize().y) / 2)); + } else { + dc.DrawBitmap(m_bitmap_off_normal, wxPoint((GetSize().x - m_bitmap_off_normal.GetSize().x) / 2, (GetSize().y - m_bitmap_off_normal.GetSize().y) / 2)); + } + } +} } } \ No newline at end of file diff --git a/src/slic3r/GUI/CameraPopup.hpp b/src/slic3r/GUI/CameraPopup.hpp index b72a1dc2a4..b2adc7a0aa 100644 --- a/src/slic3r/GUI/CameraPopup.hpp +++ b/src/slic3r/GUI/CameraPopup.hpp @@ -5,6 +5,11 @@ #include "DeviceManager.hpp" #include "GUI.hpp" #include +#include +#include +#include +#include +#include #include "Widgets/SwitchButton.hpp" namespace Slic3r { @@ -44,6 +49,31 @@ private: wxDECLARE_EVENT_TABLE(); }; + +class CameraItem : public wxPanel +{ +public: + CameraItem(wxWindow *parent, std::string off_normal, std::string on_normal, std::string off_hover, std::string on_hover); + ~CameraItem(); + + MachineObject *m_obj{nullptr}; + bool m_on{false}; + bool m_hover{false}; + wxBitmap m_bitmap_on_normal; + wxBitmap m_bitmap_on_hover; + wxBitmap m_bitmap_off_normal; + wxBitmap m_bitmap_off_hover; + + void msw_rescale(); + void set_switch(bool is_on); + bool get_switch_status() { return m_on; }; + void on_enter_win(wxMouseEvent &evt); + void on_level_win(wxMouseEvent &evt); + void paintEvent(wxPaintEvent &evt); + void render(wxDC &dc); + void doRender(wxDC &dc); +}; + } } #endif diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 312f58a073..f88d514661 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -519,7 +519,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co for (auto el : { "support_style", "support_base_pattern", "support_base_pattern_spacing", "support_angle", "support_interface_pattern", "support_interface_top_layers", "support_interface_bottom_layers", - "bridge_no_support","max_bridge_length" "support_top_z_distance", + "bridge_no_support", "thick_bridges", "max_bridge_length", "support_top_z_distance", //BBS: add more support params to dependent of enable_support "support_type","support_on_build_plate_only", "support_object_xy_distance", "independent_support_layer_height"}) @@ -537,6 +537,10 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co toggle_line("tree_support_branch_angle", support_is_tree); toggle_line("tree_support_wall_count", support_is_tree); toggle_line("tree_support_with_infill", support_is_tree); + toggle_line("max_bridge_length", support_is_tree); + + // tree support use max_bridge_length instead of bridge_no_support + toggle_line("bridge_no_support", !support_is_tree); for (auto el : { "support_interface_spacing", "support_interface_filament", "support_interface_loop_pattern", "support_bottom_interface_spacing" }) diff --git a/src/slic3r/GUI/ConnectPrinter.cpp b/src/slic3r/GUI/ConnectPrinter.cpp index 7939c454e3..0e06b6ed35 100644 --- a/src/slic3r/GUI/ConnectPrinter.cpp +++ b/src/slic3r/GUI/ConnectPrinter.cpp @@ -96,7 +96,7 @@ ConnectPrinterDialog::ConnectPrinterDialog(wxWindow *parent, wxWindowID id, cons this->SetSizer(main_sizer); this->Layout(); this->Fit(); - this->Centre(wxBOTH); + CentreOnParent(); m_textCtrl_code->Bind(wxEVT_TEXT, &ConnectPrinterDialog::on_input_enter, this); m_button_confirm->Bind(wxEVT_BUTTON, &ConnectPrinterDialog::on_button_confirm, this); diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index b84a12a71b..ff2d74f0eb 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -8,8 +8,9 @@ #include "libslic3r/PlaceholderParser.hpp" #include "libslic3r/Print.hpp" #include "libslic3r/PrintConfig.hpp" +#include "MsgDialog.hpp" #include "Plater.hpp" - +#include "GUI_App.hpp" #include "nlohmann/json.hpp" #include #include @@ -24,7 +25,6 @@ using namespace nlohmann; namespace pt = boost::property_tree; - const int PRINTING_STAGE_COUNT = 20; std::string PRINTING_STAGE_STR[PRINTING_STAGE_COUNT] = { "printing", @@ -455,6 +455,16 @@ void MachineObject::_parse_ams_status(int ams_status) BOOST_LOG_TRIVIAL(trace) << "ams_debug: main = " << ams_status_main_int << ", sub = " << ams_status_sub; } +bool MachineObject::is_U0_firmware() +{ + auto ota_ver_it = module_vers.find("ota"); + if (ota_ver_it != module_vers.end()) { + if (ota_ver_it->second.sw_ver.compare("00.01.04.00") < 0) + return true; + } + return false; +} + bool MachineObject::is_support_ams_mapping() { AppConfig* config = Slic3r::GUI::wxGetApp().app_config; @@ -590,7 +600,6 @@ int MachineObject::ams_filament_mapping(std::vector filaments, std // tray_index : tray_color std::map tray_filaments; - for (auto ams = amsList.begin(); ams != amsList.end(); ams++) { for (auto tray = ams->second->trayList.begin(); tray != ams->second->trayList.end(); tray++) { int ams_id = atoi(ams->first.c_str()); @@ -634,45 +643,48 @@ int MachineObject::ams_filament_mapping(std::vector filaments, std // is_support_ams_mapping if (!is_support_ams_mapping()) { + BOOST_LOG_TRIVIAL(info) << "ams_mapping: do not support, use order mapping"; for (int i = 0; i < filaments.size(); i++) { FilamentInfo info; - if (i < tray_info_list.size()) { - info.id = filaments[i].id; - info.tray_id = filaments[i].id; - info.color = tray_info_list[i].color; - info.type = tray_info_list[i].type; - } else { - info.id = filaments[i].id; - info.tray_id = -1; - } + info.id = filaments[i].id; + info.tray_id = -1; result.push_back(info); } return 0; } - // calc distance map - struct DisValue { - int tray_id; - float distance; - bool is_same_color = true; - bool is_type_match = true; - }; + char buffer[256]; std::vector> distance_map; + + // print title + ::sprintf(buffer, "F(id)"); + std::string line = std::string(buffer); + for (auto tray = tray_filaments.begin(); tray != tray_filaments.end(); tray++) { + ::sprintf(buffer, " AMS%02d", tray->second.id+1); + line += std::string(buffer); + } + BOOST_LOG_TRIVIAL(info) << "ams_mapping_distance:" << line; + for (int i = 0; i < filaments.size(); i++) { std::vector rol; + ::sprintf(buffer, "F(%02d)", filaments[i].id+1); + line = std::string(buffer); for (auto tray = tray_filaments.begin(); tray != tray_filaments.end(); tray++) { DisValue val; - val.tray_id = tray->first; + val.tray_id = tray->second.id; wxColour c = wxColour(filaments[i].color); val.distance = calc_color_distance(c, AmsTray::decode_color(tray->second.color)); - //val.is_same_color = val.distance < MAPPING_COLOR_THRESHOLD; if (filaments[i].type != tray->second.type) { + val.distance = 999999; val.is_type_match = false; } else { val.is_type_match = true; } + ::sprintf(buffer, " %6.0f", val.distance); + line += std::string(buffer); rol.push_back(val); } + BOOST_LOG_TRIVIAL(info) << "ams_mapping_distance:" << line; distance_map.push_back(rol); } @@ -683,6 +695,7 @@ int MachineObject::ams_filament_mapping(std::vector filaments, std info.tray_id = -1; result.push_back(info); } + std::set picked_src; std::set picked_tar; for (int k = 0; k < distance_map.size(); k++) { @@ -693,8 +706,9 @@ int MachineObject::ams_filament_mapping(std::vector filaments, std if (picked_src.find(i) != picked_src.end()) continue; for (int j = 0; j < distance_map[i].size(); j++) { - if (picked_tar.find(j) == picked_tar.end() - && distance_map[i][j].is_same_color + if (picked_tar.find(j) != picked_tar.end()) + continue; + if (distance_map[i][j].is_same_color && distance_map[i][j].is_type_match) { if (min_val > distance_map[i][j].distance) { min_val = distance_map[i][j].distance; @@ -707,25 +721,31 @@ int MachineObject::ams_filament_mapping(std::vector filaments, std if (picked_src_idx >= 0 && picked_tar_idx >= 0) { auto tray = tray_filaments.find(distance_map[k][picked_tar_idx].tray_id); if (tray != tray_filaments.end()) { - result[picked_src_idx].tray_id = tray->first; - result[picked_src_idx].color = tray->second.color; - result[picked_src_idx].type = tray->second.type; - BOOST_LOG_TRIVIAL(trace) << "tray_id = " << tray->first << ", distance = " << distance_map[k][picked_tar_idx].distance; + result[picked_src_idx].tray_id = tray->first; + result[picked_src_idx].color = tray->second.color; + result[picked_src_idx].type = tray->second.type; + result[picked_src_idx].distance = tray->second.distance; } else { FilamentInfo info; info.tray_id = -1; } - picked_tar.insert(picked_tar_idx); + ::sprintf(buffer, "ams_mapping, picked F(%02d) AMS(%02d), distance=%6.0f", picked_src_idx+1, picked_tar_idx+1, + distance_map[picked_src_idx][picked_tar_idx].distance); + BOOST_LOG_TRIVIAL(info) << std::string(buffer); picked_src.insert(picked_src_idx); + picked_tar.insert(picked_tar_idx); } } + std::vector cache_map_result = result; + //check ams mapping result if (is_valid_mapping_result(result)) { return 0; } + reset_mapping_result(result); try { // try to use ordering ams mapping bool order_mapping_result = true; @@ -749,15 +769,23 @@ int MachineObject::ams_filament_mapping(std::vector filaments, std } //check order mapping result - if (!is_valid_mapping_result(result)) { - reset_mapping_result(result); - return -1; + if (is_valid_mapping_result(result)) { + return 0; } } catch(...) { reset_mapping_result(result); return -1; } + // try to match some color + reset_mapping_result(result); + result = cache_map_result; + for (auto it = result.begin(); it != result.end(); it++) { + if (it->distance >= 6000) { + it->tray_id = -1; + } + } + return 0; } @@ -778,6 +806,7 @@ void MachineObject::reset_mapping_result(std::vector& result) { for (int i = 0; i < result.size(); i++) { result[i].tray_id = -1; + result[i].distance = 99999; } } @@ -904,7 +933,7 @@ std::map MachineObject::get_ams_version() bool MachineObject::is_system_printing() { - if (is_in_calibration()) + if (is_in_calibration() && is_in_printing_status(print_status)) return true; //FIXME //if (print_type == "system" && is_in_printing_status(print_status)) @@ -936,10 +965,40 @@ bool MachineObject::is_in_calibration() if (boost::contains(m_gcode_file, "auto_cali_for_user.gcode") && stage_curr != 0) { return true; + } else { + // reset + if (stage_curr != 0) { + calibration_done = false; + } } return false; } +bool MachineObject::is_calibration_done() +{ + return calibration_done; +} + +bool MachineObject::is_calibration_running() +{ + if (is_in_calibration() && is_in_printing_status(print_status)) + return true; + return false; +} + +void MachineObject::parse_state_changed_event() +{ + // parse calibration done + if (last_mc_print_stage != mc_print_stage) { + if (mc_print_stage == 1 && boost::contains(m_gcode_file, "auto_cali_for_user.gcode")) { + calibration_done = true; + } else { + calibration_done = false; + } + } + last_mc_print_stage = mc_print_stage; +} + PrintingSpeedLevel MachineObject::_parse_printing_speed_lvl(int lvl) { if (lvl < (int)SPEED_LEVEL_COUNT) @@ -950,7 +1009,10 @@ PrintingSpeedLevel MachineObject::_parse_printing_speed_lvl(int lvl) bool MachineObject::is_sdcard_printing() { - if (can_abort() && obj_subtask_id.compare("0") == 0 && profile_id_ == "0" && project_id_ == "0") + if (can_abort() + && (obj_subtask_id.compare("0") == 0 || obj_subtask_id.empty()) + && (profile_id_ == "0" || profile_id_.empty()) + && (project_id_ == "0" || project_id_.empty())) return true; else return false; @@ -961,6 +1023,16 @@ bool MachineObject::has_sdcard() return camera_has_sdcard; } +bool MachineObject::has_timelapse() +{ + return camera_timelapse; +} + +bool MachineObject::has_recording() +{ + return camera_recording; +} + int MachineObject::command_get_version() { json j; @@ -974,10 +1046,10 @@ int MachineObject::command_request_push_all() auto curr_time = std::chrono::system_clock::now(); auto diff = std::chrono::duration_cast(curr_time - last_request_push); if (diff.count() < REQUEST_PUSH_MIN_TIME) { - BOOST_LOG_TRIVIAL(trace) << "command_request_push_all: send request too fast"; + BOOST_LOG_TRIVIAL(trace) << "static: command_request_push_all: send request too fast, dev_id=" << dev_id; return -1; } else { - BOOST_LOG_TRIVIAL(trace) << "command_request_push_all"; + BOOST_LOG_TRIVIAL(trace) << "static: command_request_push_all, dev_id=" << dev_id; last_request_push = std::chrono::system_clock::now(); } json j; @@ -1365,6 +1437,11 @@ bool MachineObject::is_in_printing() return false; } +bool MachineObject::is_in_prepare() +{ + return print_status == "PREPARE"; +} + bool MachineObject::is_printing_finished() { if (print_status.compare("FINISH") == 0 @@ -1388,8 +1465,10 @@ void MachineObject::reset() camera_recording = false; camera_timelapse = false; printing_speed_mag = 100; + gcode_file_prepare_percent = 0; iot_print_status = ""; print_status = ""; + last_mc_print_stage = -1; subtask_ = nullptr; @@ -1444,6 +1523,11 @@ bool MachineObject::is_connected() return true; } +bool MachineObject::is_connecting() +{ + return is_connected() && m_push_count == 0; +} + void MachineObject::set_online_state(bool on_off) { m_is_online = on_off; @@ -1508,9 +1592,10 @@ int MachineObject::parse_json(std::string payload) if (j_pre.contains("print")) { if (j_pre["print"].contains("command")) { if (j_pre["print"]["command"].get() == "push_status") { - m_push_count++; if (j_pre["print"].contains("msg")) { if (j_pre["print"]["msg"].get() == 0) { //all message + BOOST_LOG_TRIVIAL(trace) << "static: get push_all msg, dev_id=" << dev_id; + m_push_count++; print_json.diff2all_base_reset(j_pre); } else if (j_pre["print"]["msg"].get() == 1) { //diff message if (print_json.diff2all(j_pre, j) == 0) { @@ -1544,11 +1629,14 @@ int MachineObject::parse_json(std::string payload) json jj = j["print"]; if (jj.contains("command")) { if (jj["command"].get() == "push_status") { + m_push_count++; last_push_time = std::chrono::system_clock::now(); #pragma region printing + // U0 firmware if (jj.contains("print_type")) { print_type = jj["print_type"].get(); } + if (jj.contains("mc_remaining_time")) { if (jj["mc_remaining_time"].is_string()) mc_left_time = stoi(j["print"]["mc_remaining_time"].get()) * 60; @@ -1603,8 +1691,15 @@ int MachineObject::parse_json(std::string payload) if (jj.contains("gcode_file")) this->m_gcode_file = jj["gcode_file"].get(); - - if (jj.contains("project_id") + if (jj.contains("gcode_file_prepare_percent")) { + std::string percent_str = jj["gcode_file_prepare_percent"].get(); + if (!percent_str.empty()) { + try{ + this->gcode_file_prepare_percent = atoi(percent_str.c_str()); + } catch(...) {} + } + } + if (jj.contains("project_id") && jj.contains("profile_id") && jj.contains("subtask_id") ){ @@ -1633,11 +1728,11 @@ int MachineObject::parse_json(std::string payload) curr_task->task_progress = mc_print_percent; curr_task->printing_status = print_status; curr_task->task_id = jj["subtask_id"].get(); - + } } #pragma endregion - + #pragma region status /* temperature */ if (jj.contains("bed_temper")) { @@ -1755,14 +1850,14 @@ int MachineObject::parse_json(std::string payload) camera_has_sdcard = jj["sdcard"].get(); } else { //do not check sdcard if no sdcard field - camera_has_sdcard = true; + camera_has_sdcard = false; } } catch (...) { ; } #pragma endregion - + #pragma region upgrade try { if (jj.contains("upgrade_state")) { @@ -1788,9 +1883,15 @@ int MachineObject::parse_json(std::string payload) upgrade_force_upgrade = jj["upgrade_state"]["force_upgrade"].get(); if (jj["upgrade_state"].contains("err_code")) upgrade_err_code = jj["upgrade_state"]["err_code"].get(); - if (jj["upgrade_state"].contains("dis_state")) + if (jj["upgrade_state"].contains("dis_state")) { + if (upgrade_display_state != jj["upgrade_state"]["dis_state"].get() + && jj["upgrade_state"]["dis_state"].get() == 3) { + GUI::wxGetApp().CallAfter([this] { + this->command_get_version(); + }); + } upgrade_display_state = jj["upgrade_state"]["dis_state"].get(); - else { + } else { //BBS compatibility with old version if (upgrade_status == "DOWNLOADING" || upgrade_status == "FLASHING" @@ -1847,7 +1948,7 @@ int MachineObject::parse_json(std::string payload) catch (...) { ; } -#pragma endregion +#pragma endregion #pragma region hms // parse hms msg @@ -1977,9 +2078,17 @@ int MachineObject::parse_json(std::string payload) curr_tray = tray_iter->second; } if (!curr_tray) continue; + + if (curr_tray->hold_count > 0) { + curr_tray->hold_count--; + continue; + } + curr_tray->id = (*tray_it)["id"].get(); if (tray_it->contains("tag_uid")) curr_tray->tag_uid = (*tray_it)["tag_uid"].get(); + else + curr_tray->tag_uid = "0"; if (tray_it->contains("tray_info_idx") && tray_it->contains("tray_type")) { curr_tray->setting_id = (*tray_it)["tray_info_idx"].get(); std::string type = (*tray_it)["tray_type"].get(); @@ -1990,32 +2099,59 @@ int MachineObject::parse_json(std::string payload) } else { curr_tray->type = type; } + } else { + curr_tray->setting_id = ""; + curr_tray->type = ""; } if (tray_it->contains("tray_sub_brands")) curr_tray->sub_brands = (*tray_it)["tray_sub_brands"].get(); + else + curr_tray->sub_brands = ""; if (tray_it->contains("tray_weight")) curr_tray->weight = (*tray_it)["tray_weight"].get(); + else + curr_tray->weight = ""; if (tray_it->contains("tray_diameter")) curr_tray->diameter = (*tray_it)["tray_diameter"].get(); + else + curr_tray->diameter = ""; if (tray_it->contains("tray_temp")) curr_tray->temp = (*tray_it)["tray_temp"].get(); + else + curr_tray->temp = ""; if (tray_it->contains("tray_time")) curr_tray->time = (*tray_it)["tray_time"].get(); + else + curr_tray->time = ""; if (tray_it->contains("bed_temp_type")) curr_tray->bed_temp_type = (*tray_it)["bed_temp_type"].get(); + else + curr_tray->bed_temp_type = ""; if (tray_it->contains("bed_temp")) curr_tray->bed_temp = (*tray_it)["bed_temp"].get(); + else + curr_tray->bed_temp = ""; if (tray_it->contains("nozzle_temp_max")) curr_tray->nozzle_temp_max = (*tray_it)["nozzle_temp_max"].get(); + else + curr_tray->nozzle_temp_max = ""; if (tray_it->contains("nozzle_temp_min")) curr_tray->nozzle_temp_min = (*tray_it)["nozzle_temp_min"].get(); + else + curr_tray->nozzle_temp_min = ""; if (tray_it->contains("xcam_info")) curr_tray->xcam_info = (*tray_it)["xcam_info"].get(); + else + curr_tray->xcam_info = ""; if (tray_it->contains("tray_uuid")) curr_tray->uuid = (*tray_it)["tray_uuid"].get(); + else + curr_tray->uuid = "0"; if (tray_it->contains("tray_color")) { auto color = (*tray_it)["tray_color"].get(); curr_tray->update_color_from_str(color); + } else { + curr_tray->color = ""; } try { if (!ams_id.empty() && !curr_tray->id.empty()) { @@ -2051,12 +2187,20 @@ int MachineObject::parse_json(std::string payload) } #pragma endregion - - } else if (jj["command"].get() == "gcode_line") { //ack of gcode_line + BOOST_LOG_TRIVIAL(debug) << "parse_json, ack of gcode_line = " << j.dump(4); } else if (jj["command"].get() == "project_file") { //ack of project file + BOOST_LOG_TRIVIAL(debug) << "parse_json, ack of project_file = " << j.dump(4); + std::string result; + if (jj.contains("result")) { + result = jj["result"].get(); + if (result == "FAIL") { + wxString text = _L("Failed to start printing job"); + GUI::wxGetApp().show_dialog(text); + } + } } else if (jj["command"].get() == "ams_filament_setting") { if (jj["ams_id"].is_number()) { int ams_id = jj["ams_id"].get(); @@ -2071,6 +2215,8 @@ int MachineObject::parse_json(std::string payload) tray_it->second->type = jj["tray_type"].get(); tray_it->second->color = jj["tray_color"].get(); tray_it->second->setting_id = jj["tray_info_idx"].get(); + // delay update + tray_it->second->set_hold_count(); } else { BOOST_LOG_TRIVIAL(warning) << "ams_filament_setting, can not find in trayList, tray_id=" << tray_id; } @@ -2133,6 +2279,8 @@ int MachineObject::parse_json(std::string payload) } } catch (...) {} + + parse_state_changed_event(); } catch (...) { BOOST_LOG_TRIVIAL(trace) << "parse_json failed! dev_id=" << this->dev_id <<", payload = " << payload; @@ -2339,6 +2487,10 @@ DeviceManager::~DeviceManager() userMachineList.clear(); } +void DeviceManager::set_agent(NetworkAgent* agent) +{ + m_agent = agent; +} void DeviceManager::on_machine_alive(std::string json_str) { @@ -2376,7 +2528,12 @@ void DeviceManager::on_machine_alive(std::string json_str) obj->wifi_signal = printer_signal; obj->dev_connection_type = connect_type; obj->bind_state = bind_state; - BOOST_LOG_TRIVIAL(info) << "SsdpDiscovery:: Update Machine Info, printer_sn = " << dev_id << ", signal = " << printer_signal; + + // U0 firmware + if (obj->dev_connection_type.empty() && obj->bind_state.empty()) + obj->bind_state = "free"; + + BOOST_LOG_TRIVIAL(debug) << "SsdpDiscovery:: Update Machine Info, printer_sn = " << dev_id << ", signal = " << printer_signal; obj->last_alive = Slic3r::Utils::get_current_time_utc(); obj->m_is_online = true; } @@ -2396,7 +2553,7 @@ void DeviceManager::on_machine_alive(std::string json_str) localMachineList.insert(std::make_pair(dev_id, obj)); - BOOST_LOG_TRIVIAL(info) << "SsdpDiscovery::New Machine, ip = " << dev_ip << ", printer_name= " << dev_name << ", printer_type = " << printer_type_str << ", signal = " << printer_signal; + BOOST_LOG_TRIVIAL(debug) << "SsdpDiscovery::New Machine, ip = " << dev_ip << ", printer_name= " << dev_name << ", printer_type = " << printer_type_str << ", signal = " << printer_signal; } } catch (...) { @@ -2480,6 +2637,11 @@ MachineObject* DeviceManager::get_local_machine(std::string dev_id) return it->second; } +void DeviceManager::erase_user_machine(std::string dev_id) +{ + userMachineList.erase(dev_id); +} + MachineObject* DeviceManager::get_user_machine(std::string dev_id) { if (!Slic3r::GUI::wxGetApp().is_user_login()) @@ -2522,7 +2684,7 @@ void DeviceManager::clean_user_info() bool DeviceManager::set_selected_machine(std::string dev_id) { - BOOST_LOG_TRIVIAL(trace) << "set_selected_machine=" << dev_id; + BOOST_LOG_TRIVIAL(info) << "set_selected_machine=" << dev_id; auto my_machine_list = get_my_machine_list(); auto it = my_machine_list.find(dev_id); if (it != my_machine_list.end()) { @@ -2534,7 +2696,7 @@ bool DeviceManager::set_selected_machine(std::string dev_id) if (m_agent) { if (it->second->connection_type() != "lan" || it->second->connection_type().empty()) { if (m_agent->get_user_selected_machine() != dev_id) { - BOOST_LOG_TRIVIAL(trace) << "set_selected_machine: same dev_id = " << dev_id; + BOOST_LOG_TRIVIAL(info) << "static: set_selected_machine: same dev_id = " << dev_id; m_agent->set_user_selected_machine(dev_id); it->second->reset(); } else { @@ -2680,7 +2842,7 @@ void DeviceManager::update_user_machine_list_info() { if (!m_agent) return; - BOOST_LOG_TRIVIAL(trace) << "update_user_machine_list_info"; + BOOST_LOG_TRIVIAL(debug) << "update_user_machine_list_info"; unsigned int http_code; std::string body; int result = m_agent->get_user_print_info(&http_code, &body); diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 4db1ec004b..8e9dcb0c59 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -13,9 +13,9 @@ #define USE_LOCAL_SOCKET_BIND 0 -#define DISCONNECT_TIMEOUT 10000.f // milliseconds +#define DISCONNECT_TIMEOUT 30000.f // milliseconds #define PUSHINFO_TIMEOUT 15000.f // milliseconds -#define REQUEST_PUSH_MIN_TIME 3000.f // milliseconds +#define REQUEST_PUSH_MIN_TIME 15000.f // milliseconds #define FILAMENT_MAX_TEMP 300 #define FILAMENT_DEF_TEMP 220 @@ -153,11 +153,13 @@ public: wxColour wx_color; bool is_bbl; bool is_exists = false; + int hold_count = 0; AmsRoadPosition road_position; AmsStep step_state; AmsRfidState rfid_state; + void set_hold_count() { hold_count = 3; } void update_color_from_str(std::string color); wxColour get_color(); @@ -244,7 +246,13 @@ public: #define UpgradeFlashFailed -3 #define UpgradePrinting -4 - +// calc distance map +struct DisValue { + int tray_id; + float distance; + bool is_same_color = true; + bool is_type_match = true; +}; class MachineObject { @@ -347,6 +355,7 @@ public: // parse amsStatusMain and ams_status_sub void _parse_ams_status(int ams_status); bool has_ams() { return ams_exist_bits != 0; } + bool is_U0_firmware(); bool is_support_ams_mapping(); bool is_only_support_cloud_print(); static bool is_support_ams_mapping_version(std::string module, std::string version); @@ -415,16 +424,22 @@ public: int mc_print_line_number; int mc_print_percent; /* left print progess in percent */ int mc_left_time; /* left time in seconds */ + int last_mc_print_stage; bool is_system_printing(); std::vector stage_list_info; int stage_curr = 0; int m_push_count = 0; + bool calibration_done { false }; wxString get_curr_stage(); // return curr stage index of stage list int get_curr_stage_idx(); bool is_in_calibration(); + bool is_calibration_running(); + bool is_calibration_done(); + + void parse_state_changed_event(); /* printing status */ std::string print_status; /* enum string: FINISH, RUNNING, PAUSE, INIT, FAILED */ @@ -455,11 +470,14 @@ public: BBLSliceInfo* slice_info {nullptr}; int plate_index { -1 }; std::string m_gcode_file; + int gcode_file_prepare_percent = 0; BBLSubTask* subtask_; std::string obj_subtask_id; // subtask_id == 0 for sdcard std::string subtask_name; bool is_sdcard_printing(); bool has_sdcard(); + bool has_timelapse(); + bool has_recording(); MachineObject(NetworkAgent* agent, std::string name, std::string id, std::string ip); @@ -517,6 +535,7 @@ public: bool can_pause(); bool can_abort(); bool is_in_printing(); + bool is_in_prepare(); bool is_printing_finished(); void reset_update_time(); void reset(); @@ -525,6 +544,7 @@ public: void set_print_state(std::string status); bool is_connected(); + bool is_connecting(); void set_online_state(bool on_off); bool is_online() { return m_is_online; } bool is_info_ready(); @@ -554,6 +574,7 @@ private: public: DeviceManager(NetworkAgent* agent = nullptr); ~DeviceManager(); + void set_agent(NetworkAgent* agent); std::mutex listMutex; std::string selected_machine; /* dev_id */ @@ -566,6 +587,7 @@ public: MachineObject* get_local_machine(std::string dev_id); MachineObject* get_user_machine(std::string dev_id); MachineObject* get_my_machine(std::string dev_id); + void erase_user_machine(std::string dev_id); void clean_user_info(); bool set_selected_machine(std::string dev_id); @@ -588,8 +610,6 @@ public: // get alive machine std::map get_local_machine_list(); void load_last_machine(); - - void check_alive(); }; } // namespace Slic3r diff --git a/src/slic3r/GUI/DownloadProgressDialog.cpp b/src/slic3r/GUI/DownloadProgressDialog.cpp new file mode 100644 index 0000000000..2e7bbcef75 --- /dev/null +++ b/src/slic3r/GUI/DownloadProgressDialog.cpp @@ -0,0 +1,100 @@ +#include "DownloadProgressDialog.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "libslic3r/libslic3r.h" +#include "libslic3r/Utils.hpp" +#include "GUI.hpp" +#include "I18N.hpp" +//#include "ConfigWizard.hpp" +#include "wxExtensions.hpp" +#include "slic3r/GUI/MainFrame.hpp" +#include "GUI_App.hpp" + +#define DESIGN_INPUT_SIZE wxSize(FromDIP(100), -1) + +namespace Slic3r { +namespace GUI { + + + +DownloadProgressDialog::DownloadProgressDialog(wxString title) + : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) +{ + std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % resources_dir()).str(); + SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); + + SetBackgroundColour(*wxWHITE); + wxBoxSizer *m_sizer_main = new wxBoxSizer(wxVERTICAL); + auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1)); + m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); + m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0); + m_status_bar = std::make_shared(this); + m_panel_download = m_status_bar->get_panel(); + m_panel_download->SetSize(wxSize(FromDIP(340), -1)); + m_panel_download->SetMinSize(wxSize(FromDIP(340), -1)); + m_panel_download->SetMaxSize(wxSize(FromDIP(340), -1)); + m_sizer_main->Add(m_panel_download, 0, wxALIGN_CENTER_VERTICAL|wxALL, FromDIP(20)); + m_sizer_main->Add(0, 0, 1, wxBOTTOM, 10); + + SetSizer(m_sizer_main); + Layout(); + Fit(); + CentreOnParent(); +} + +bool DownloadProgressDialog::Show(bool show) +{ + if (show) { + m_upgrade_job = std::make_shared(m_status_bar); + m_upgrade_job->set_event_handle(this); + m_status_bar->set_progress(0); + Bind(EVT_UPGRADE_NETWORK_SUCCESS, [this](wxCommandEvent& evt) { + m_status_bar->change_button_label(_L("Finish")); + wxGetApp().restart_networking(); + m_status_bar->set_cancel_callback_fina( + [this]() { + this->Close(); + } + ); + }); + + Bind(EVT_UPGRADE_NETWORK_FAILED, [this](wxCommandEvent& evt) { + m_status_bar->change_button_label(_L("Close")); + m_status_bar->set_progress(0); + m_status_bar->set_cancel_callback_fina( + [this]() { + this->Close(); + } + ); + }); + + m_status_bar->set_cancel_callback_fina([this]() { + if (m_upgrade_job) { + m_upgrade_job->cancel(); + //EndModal(wxID_CLOSE); + } + + }); + m_upgrade_job->start(); + } + return DPIDialog::Show(show); +} + + DownloadProgressDialog::~DownloadProgressDialog() {} + +void DownloadProgressDialog::on_dpi_changed(const wxRect &suggested_rect) {} + +void DownloadProgressDialog::update_release_note(std::string release_note, std::string version) {} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/DownloadProgressDialog.hpp b/src/slic3r/GUI/DownloadProgressDialog.hpp new file mode 100644 index 0000000000..fcb44a208d --- /dev/null +++ b/src/slic3r/GUI/DownloadProgressDialog.hpp @@ -0,0 +1,55 @@ +#ifndef slic3r_DownloadProgressDialog_hpp_ +#define slic3r_DownloadProgressDialog_hpp_ + +#include +#include + +#include "GUI_Utils.hpp" +#include +#include +#include +#include +#include +#include +#include +#include "Widgets/Button.hpp" +#include "BBLStatusBar.hpp" +#include "BBLStatusBarSend.hpp" +#include "Jobs/UpgradeNetworkJob.hpp" + +class wxBoxSizer; +class wxCheckBox; +class wxStaticBitmap; + +#define MSG_DIALOG_BUTTON_SIZE wxSize(FromDIP(58), FromDIP(24)) +#define MSG_DIALOG_MIDDLE_BUTTON_SIZE wxSize(FromDIP(76), FromDIP(24)) +#define MSG_DIALOG_LONG_BUTTON_SIZE wxSize(FromDIP(90), FromDIP(24)) + + +namespace Slic3r { +namespace GUI { + +class DownloadProgressDialog : public DPIDialog +{ +protected: + bool Show(bool show) override; + +public: + DownloadProgressDialog(wxString title); + ~DownloadProgressDialog(); + + void on_dpi_changed(const wxRect &suggested_rect) override; + void update_release_note(std::string release_note, std::string version); + + std::shared_ptr m_status_bar; + std::shared_ptr m_upgrade_job; + wxPanel * m_panel_download; + + +}; + + +} +} + +#endif diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index c1a33e850a..3a2ec4531e 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -4988,7 +4988,8 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv ::sprintf(buf, imperial_units ? "%.2f in" : "%.2f m", ps.total_used_filament / /*1000*/koef); imgui.text(buf); ImGui::SameLine(); - ::sprintf(buf, " %.2f g", ps.total_weight); + double unit_conver = imperial_units ? GizmoObjectManipulation::oz_to_g : 1; + ::sprintf(buf, imperial_units ?" %.2f oz":" %.2f g", ps.total_weight / unit_conver); imgui.text(buf); auto role_time = [time_mode](ExtrusionRole role) { diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 17dbeb6ed2..4391c8d968 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1349,7 +1349,12 @@ void GLCanvas3D::render(bool only_init) right_margin = SLIDER_RIGHT_MARGIN; bottom_margin = SLIDER_BOTTOM_MARGIN; } - wxGetApp().plater()->get_notification_manager()->render_notifications(*this, get_overlay_window_width(), bottom_margin, right_margin); + #if ENABLE_RETINA_GL + float sc = m_retina_helper->get_scale_factor(); + wxGetApp().plater()->get_notification_manager()->render_notifications(*this, get_overlay_window_width(), bottom_margin * sc, right_margin); + #else + wxGetApp().plater()->get_notification_manager()->render_notifications(*this, get_overlay_window_width(), bottom_margin, right_margin); + #endif } wxGetApp().imgui()->render(); @@ -3038,6 +3043,14 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // Grab keyboard focus for input in gizmo dialogs. m_canvas->SetFocus(); + if (evt.LeftDown()) { + // Clear hover state in main toolbar + wxMouseEvent evt2 = evt; + evt2.SetEventType(wxEVT_MOTION); + evt2.SetLeftDown(false); + m_main_toolbar.on_mouse(evt2, *this); + } + if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) mouse_up_cleanup(); @@ -6397,34 +6410,25 @@ void GLCanvas3D::_render_paint_toolbar() const } } - #ifdef __APPLE__ - std::string item_text = (boost::format("%1% %2%") % (11) % filament_types[0]).str(); - const ImVec2 label_size = ImGui::CalcTextSize(item_text.c_str(), NULL, true); - int button_size = label_size.x + item_spacing; - #else - int button_size = GLToolbar::Default_Icons_Size * wxGetApp().toolbar_icon_scale() + item_spacing; - #endif + float button_size = GLToolbar::Default_Icons_Size * f_scale * wxGetApp().toolbar_icon_scale() + item_spacing; imgui.set_next_window_pos(0.5f * (canvas_w + (button_size + item_spacing) * extruder_num), button_size + item_spacing * 2, ImGuiCond_Always, 1.0f, 1.0f); imgui.begin(_L("Paint Toolbar"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar); bool disabled = !wxGetApp().plater()->can_fillcolor(); unsigned char rgb[3]; + float max_text = 0; for (int i = 0; i < extruder_num; i++) { - if (i > 0) { - if (filament_types.size() <= i) continue; - std::string item_text = (boost::format("%1% %2%") % (i + 1) % filament_types[i]).str(); - const ImVec2 label_size = ImGui::CalcTextSize(item_text.c_str(), NULL, true); - #ifdef __WINDOWS__ - if (i > 8) - ImGui::SameLine(0.5 * item_spacing + (button_size - label_size.x) / 2 + (button_size + item_spacing) * i); - else - ImGui::SameLine((button_size - label_size.x) / 2 + (button_size + item_spacing) * i); - #else - ImGui::SameLine(); - #endif - } - //ImGui::SameLine(); + std::string item_text = (boost::format("%1%%2%") % (i + 1) % filament_types[i]).str(); + ImVec2 label_size = ImGui::CalcTextSize(item_text.c_str(), NULL, true); + if (label_size.x > button_size) + label_size.x = button_size * 0.6; + max_text = std::max(max_text,label_size.x); + } + for (int i = 0; i < extruder_num; i++) { + if (filament_types.size() <= i) continue; + + ImGui::SameLine(item_spacing / 2 + (button_size - max_text) / 2 + (button_size + item_spacing) * i); ImGui::PushID(i); Slic3r::GUI::BitmapCache::parse_color(colors[i], rgb); ImGui::PushStyleColor(ImGuiCol_Button, ImColor(rgb[0], rgb[1], rgb[2]).Value); @@ -6450,21 +6454,78 @@ void GLCanvas3D::_render_paint_toolbar() const ImGui::PopItemFlag(); ImGui::PopID(); } - for (int i = 0; i < extruder_num; i++){ if (filament_types.size() <= i) continue; //TODO use filament type from filament management, current use PLA by default - std::string item_text = (boost::format("%1% %2%") % (i + 1) % filament_types[i]).str(); + std::string item_text = (boost::format("%1%%2%") % (i + 1) % filament_types[i]).str(); const ImVec2 label_size = ImGui::CalcTextSize(item_text.c_str(), NULL, true); - ImGui::SameLine(item_spacing + (button_size - label_size.x) / 2 + (button_size + item_spacing) * i); + int len = strlen(filament_types[i].c_str()); + ImGui::SameLine(item_spacing / 2 + (button_size - max_text) / 2 + (button_size + item_spacing) * i); + + int count = 0; + if (label_size.x > button_size) + { + for (int j = 0; j < filament_types[i].size(); j++) + { + if(std::isalpha(filament_types[i][j])) + count++; + else + break; + } + } + + if (i > 8) + { + if (label_size.x > button_size) + { + if(count * ImGui::GetFontSize() > button_size){ + if ((len - (count + 1)) <= 3) + item_text = "\t" + std::to_string(i + 1) + "\n" + filament_types[i].substr(0, count) + "\n" + "\t" + filament_types[i].substr(count, len); + else + item_text = "\t" + std::to_string(i + 1) + "\n" + filament_types[i].substr(0, count + 1) + "\n"+ filament_types[i].substr(count + 1, len); + } else { + if (count <= 4) + item_text = "\t" + std::to_string(i + 1) + "\n" + " " + filament_types[i].substr(0, count + 1) + "\n" + filament_types[i].substr(count + 1, len); + else + item_text = "\t" + std::to_string(i + 1) + "\n" + filament_types[i].substr(0, count + 1) + "\n" + filament_types[i].substr(count + 1, len); + } + } + else + { + item_text = (boost::format("\t%1%\n %2%") % (i + 1) % filament_types[i]).str(); + } + } + else + { + if (label_size.x > button_size) + { + if(count * ImGui::GetFontSize() > button_size){ + if ((len - (count + 1)) <= 3) + item_text = "\t " + std::to_string(i + 1) + "\n" + filament_types[i].substr(0, count) + "\n" + "\t" + filament_types[i].substr(count, len); + else + item_text = "\t " + std::to_string(i + 1) + "\n" + filament_types[i].substr(0, count + 1) + "\n"+ filament_types[i].substr(count + 1, len); + } else { + if (count <= 4) + item_text = "\t " + std::to_string(i + 1) + "\n" + " " + filament_types[i].substr(0, count + 1) + "\n" + filament_types[i].substr(count + 1, len); + else + item_text = "\t " + std::to_string(i + 1) + "\n" + filament_types[i].substr(0, count + 1) + "\n" + filament_types[i].substr(count + 1, len); + } + } + else + { + item_text = (boost::format("\t %1%\n\t%2%") % (i + 1) % filament_types[i]).str(); + } + } Slic3r::GUI::BitmapCache::parse_color(colors[i], rgb); float gray = 0.299 * rgb[0] + 0.587 * rgb[1] + 0.114 * rgb[2]; - if (gray < 80) - ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 1.0f), item_text.c_str()); - else - ImGui::TextColored(ImVec4(0.0f, 0.0f, 0.0f, 1.0f), item_text.c_str()); + + if (gray < 80){ + ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 1.0f), item_text.c_str()); + } else{ + ImGui::TextColored(ImVec4(0.0f, 0.0f, 0.0f, 1.0f), item_text.c_str()); + } } ImGui::AlignTextToFramePadding(); imgui.end(); @@ -7468,8 +7529,8 @@ void GLCanvas3D::_set_warning_notification(EWarning warning, bool state) case EWarning::SlaSupportsOutside: text = ("SLA supports outside the print area were detected."); error = ErrorType::PLATER_ERROR; break; case EWarning::SomethingNotShown: text = _u8L("Only the object being edit is visible."); break; case EWarning::ObjectClashed: - text = _u8L("An object is layed over the boundary of plate.\n" - "Please solve the problem by moving it totally inside or outside plate."); + text = _u8L("An object is laid over the boundary of plate or exceeds the height limit.\n" + "Please solve the problem by moving it totally on or off the plate, and confirming that the height is within the build volume."); error = ErrorType::PLATER_ERROR; break; } diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index bc8b8160bd..2a887424ce 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -299,10 +299,12 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector(argv), wxEXEC_ASYNC, nullptr); +#elif __APPLE__ + const char *argv[] = {"open", path.data(), nullptr}; + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); +#else + const char *argv[] = {"xdg-open", path.data(), nullptr}; + + // Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, + // because they may mess up the environment expected by the file manager. + // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. + if (wxGetEnv("APPIMAGE", nullptr)) { + // We're running from AppImage + wxEnvVariableHashMap env_vars; + wxGetEnvMap(&env_vars); + + env_vars.erase("APPIMAGE"); + env_vars.erase("APPDIR"); + env_vars.erase("LD_LIBRARY_PATH"); + env_vars.erase("LD_PRELOAD"); + env_vars.erase("UNION_PRELOAD"); + + wxExecuteEnv exec_env; + exec_env.env = std::move(env_vars); + + wxString owd; + if (wxGetEnv("OWD", &owd)) { + // This is the original work directory from which the AppImage image was run, + // set it as CWD for the child process: + exec_env.cwd = std::move(owd); + } + + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, &exec_env); + } else { + // Looks like we're NOT running from AppImage, we'll make no changes to the environment. + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, nullptr); + } +#endif +} + + } } diff --git a/src/slic3r/GUI/GUI.hpp b/src/slic3r/GUI/GUI.hpp index 1617dd7db5..765406583f 100644 --- a/src/slic3r/GUI/GUI.hpp +++ b/src/slic3r/GUI/GUI.hpp @@ -82,7 +82,8 @@ extern void about(); extern void login(); // Ask the destop to open the datadir using the default file explorer. extern void desktop_open_datadir_folder(); - +// Ask the destop to open one folder +extern void desktop_open_any_folder(const std::string path); } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 143334d777..5cd33df767 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -45,6 +45,8 @@ #include "libslic3r/I18N.hpp" #include "libslic3r/PresetBundle.hpp" #include "libslic3r/Thread.hpp" +#include "libslic3r/miniz_extension.hpp" +#include "libslic3r/Utils.hpp" #include "GUI.hpp" #include "GUI_Utils.hpp" @@ -72,6 +74,7 @@ #include "SendSystemInfoDialog.hpp" #include "ParamsDialog.hpp" #include "KBShortcutsDialog.hpp" +#include "DownloadProgressDialog.hpp" #include "BitmapCache.hpp" #include "Notebook.hpp" @@ -79,9 +82,10 @@ #include "Widgets/ProgressDialog.hpp" //BBS: DailyTip and UserGuide Dialog -#include "WebDailytipDialog.hpp" +#include "WebDownPluginDlg.hpp" #include "WebGuideDialog.hpp" #include "WebUserLoginDialog.hpp" +#include "ReleaseNote.hpp" //#ifdef WIN32 //#include "BaseException.h" @@ -663,49 +667,6 @@ bool static check_old_linux_datadir(const wxString& app_name) { } #endif - -#ifdef _WIN32 -static bool run_updater_win() -{ - // find updater exe - boost::filesystem::path path_updater = boost::dll::program_location().parent_path() / "prusaslicer-updater.exe"; - if (boost::filesystem::exists(path_updater)) { - // Using quoted string as mentioned in CreateProcessW docs, silent execution parameter. - std::wstring wcmd = L"\"" + path_updater.wstring() + L"\" /silent"; - - // additional information - STARTUPINFOW si; - PROCESS_INFORMATION pi; - - // set the size of the structures - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - ZeroMemory(&pi, sizeof(pi)); - - // start the program up - if (CreateProcessW(NULL, // the path - wcmd.data(), // Command line - NULL, // Process handle not inheritable - NULL, // Thread handle not inheritable - FALSE, // Set handle inheritance to FALSE - 0, // No creation flags - NULL, // Use parent's environment block - NULL, // Use parent's starting directory - &si, // Pointer to STARTUPINFO structure - &pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses) - )) { - // Close process and thread handles. - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - return true; - } else { - BOOST_LOG_TRIVIAL(error) << "Failed to start prusaslicer-updater.exe with command " << wcmd; - } - } - return false; -} -#endif //_WIN32 - struct FileWildcards { std::string_view title; std::vector file_extensions; @@ -1061,6 +1022,18 @@ void GUI_App::post_init() plater_->get_notification_manager()->push_hint_notification(true); #endif + if (m_networking_need_update) { + //updating networking + int ret = updating_bambu_networking(); + if (!ret) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__<<":networking plugin updated successfully"; + //restart_networking(); + } + else { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__<<":networking plugin updated failed"; + } + } + // The extra CallAfter() is needed because of Mac, where this is the only way // to popup a modal dialog on start without screwing combo boxes. // This is ugly but I honestly found no better way to do it. @@ -1072,29 +1045,35 @@ void GUI_App::post_init() CallAfter([this] { bool cw_showed = this->config_wizard_startup(); - this->preset_updater->sync(preset_bundle); - if (! cw_showed) { - // The CallAfter is needed as well, without it, GL extensions did not show. - // Also, we only want to show this when the wizard does not, so the new user - // sees something else than "we want something" on the first start. - show_send_system_info_dialog_if_needed(); - } - #ifdef _WIN32 - // Run external updater on Windows if version check is enabled. - if (this->preset_updater->version_check_enabled() && ! run_updater_win()) - // "prusaslicer-updater.exe" was not started, run our own update check. - #endif // _WIN32 - this->preset_updater->slic3r_update_notify(); + std::string http_url = get_http_url(app_config->get_country_code()); + this->preset_updater->sync(http_url, preset_bundle); //BBS: check new version this->check_new_version(); }); } - if(m_agent) { + if(!m_networking_need_update && m_agent) { + m_agent->set_on_ssdp_msg_fn( + [this](std::string json_str) { + GUI::wxGetApp().CallAfter([this, json_str] { + if (m_is_closing) { + return; + } + if (m_device_manager) { + m_device_manager->on_machine_alive(json_str); + } + }); + } + ); m_agent->start_discovery(true, false); } + //update the plugin tips + CallAfter([this] { + mainframe->refresh_plugin_tips(); + }); + BOOST_LOG_TRIVIAL(info) << "finished post_init"; //BBS: remove the single instance currently /*#ifdef _WIN32 @@ -1103,6 +1082,10 @@ void GUI_App::post_init() #endif //WIN32*/ } +wxDEFINE_EVENT(EVT_ENTER_FORCE_UPGRADE, wxCommandEvent); +wxDEFINE_EVENT(EVT_SHOW_NO_NEW_VERSION, wxCommandEvent); +wxDEFINE_EVENT(EVT_SHOW_DIALOG, wxCommandEvent); + IMPLEMENT_APP(GUI_App) //BBS: remove GCodeViewer as seperate APP logic @@ -1116,27 +1099,291 @@ GUI_App::GUI_App() //, m_removable_drive_manager(std::make_unique()) //, m_other_instance_message_handler(std::make_unique()) { - int load_agent_dll = Slic3r::NetworkAgent::initialize_network_module(); - if (!load_agent_dll) - m_agent = new Slic3r::NetworkAgent(); - - m_device_manager = new Slic3r::DeviceManager(m_agent); - - init_networking_callbacks(); - //app config initializes early becasuse it is used in instance checking in BambuStudio.cpp - this->init_app_config(); + this->init_app_config(); - //BBS - this->init_http_extra_header(); - - Bind(EVT_HTTP_ERROR, &GUI_App::on_http_error, this); - Bind(EVT_USER_LOGIN, &GUI_App::on_user_login, this); + reset_to_active(); } -void GUI_App::init_networking_callbacks() + +std::string GUI_App::get_http_url(std::string country_code) { - if (m_agent) { + std::string url; + if (country_code == "US") { + url = "https://api.bambulab.com/"; + } + else if (country_code == "CN") { + url = "https://api.bambulab.cn/"; + } + else if (country_code == "ENV_CN_DEV") { + url = "https://api-dev.bambu-lab.com/"; + } + else if (country_code == "ENV_CN_QA") { + url = "https://api-qa.bambu-lab.com/"; + } + else if (country_code == "ENV_CN_PRE") { + url = "https://api-pre.bambu-lab.com/"; + } + else { + url = "https://api.bambulab.com/"; + } + + url += "v1/iot-service/api/slicer/resource"; + return url; +} + +std::string GUI_App::get_plugin_url(std::string country_code) +{ + std::string url = get_http_url(country_code); + + std::string curr_version = SLIC3R_VERSION; + std::string using_version = curr_version.substr(0, 9) + "00"; + url += (boost::format("?slicer/plugins/cloud=%1%") % using_version).str(); + //url += (boost::format("?slicer/plugins/cloud=%1%") % "01.01.00.00").str(); + return url; +} + +static std::string decode(std::string const& extra, std::string const& path = {}) { + char const* p = extra.data(); + char const* e = p + extra.length(); + while (p + 4 < e) { + boost::uint16_t len = ((boost::uint16_t)p[2]) | ((boost::uint16_t)p[3] << 8); + if (p[0] == '\x75' && p[1] == '\x70' && len >= 5 && p + 4 + len < e && p[4] == '\x01') { + return std::string(p + 9, p + 4 + len); + } + else { + p += 4 + len; + } + } + return Slic3r::decode_path(path.c_str()); +} + +int GUI_App::download_plugin(InstallProgressFn pro_fn, WasCancelledFn cancel_fn) +{ + int result = 0; + // get country_code + AppConfig* app_config = wxGetApp().app_config; + if (!app_config) + return -1; + + BOOST_LOG_TRIVIAL(info) << "[download_plugin]: enter"; + m_networking_cancel_update = false; + // get temp path + fs::path target_file_path = (fs::temp_directory_path() / "network_plugin.zip"); + fs::path tmp_path = target_file_path; + tmp_path += format(".%1%%2%", get_current_pid(), ".tmp"); + + // get_url + std::string url = get_plugin_url(app_config->get_country_code()); + std::string download_url; + Slic3r::Http http_url = Slic3r::Http::get(url); + BOOST_LOG_TRIVIAL(info) << "[download_plugin]: check the plugin from " << url; + http_url.on_complete( + [&download_url](std::string body, unsigned status) { + try { + json j = json::parse(body); + std::string message = j["message"].get(); + + if (message == "success") { + json resource = j.at("resources"); + if (resource.is_array()) { + for (auto iter = resource.begin(); iter != resource.end(); iter++) { + Semver version; + std::string url; + std::string type; + std::string vendor; + std::string description; + for (auto sub_iter = iter.value().begin(); sub_iter != iter.value().end(); sub_iter++) { + if (boost::iequals(sub_iter.key(), "type")) { + type = sub_iter.value(); + BOOST_LOG_TRIVIAL(info) << "[BBL Updater]: get version of settings's type, " << sub_iter.value(); + } + else if (boost::iequals(sub_iter.key(), "version")) { + version = *(Semver::parse(sub_iter.value())); + } + else if (boost::iequals(sub_iter.key(), "description")) { + description = sub_iter.value(); + } + else if (boost::iequals(sub_iter.key(), "url")) { + url = sub_iter.value(); + } + } + BOOST_LOG_TRIVIAL(info) << "[download_plugin]: get type " << type << ", version " << version.to_string() << ", url " << url; + download_url = url; + } + } + } + else { + BOOST_LOG_TRIVIAL(info) << "[download_plugin]: get version of plugin failed, body=" << body; + } + } + catch (...) { + BOOST_LOG_TRIVIAL(error) << "[download_plugin]: catch unknown exception"; + ; + } + }).on_error( + [&result](std::string body, std::string error, unsigned int status) { + BOOST_LOG_TRIVIAL(error) << "" << body; + result = -1; + }).perform_sync(); + + bool cancel = false; + if (result < 0) { + if (pro_fn) pro_fn(InstallStatusDownloadFailed, 0, cancel); + return result; + } + + + if (download_url.empty()) { + BOOST_LOG_TRIVIAL(info) << "[download_plugin]: no availaible plugin found for this app version: " << SLIC3R_VERSION; + if (pro_fn) pro_fn(InstallStatusDownloadFailed, 0, cancel); + return -1; + } + else if (pro_fn) { + pro_fn(InstallStatusNormal, 5, cancel); + } + + if (m_networking_cancel_update || cancel) { + BOOST_LOG_TRIVIAL(info) << boost::format("download_plugin: %1%, cancelled by user") % __LINE__; + return -1; + } + BOOST_LOG_TRIVIAL(info) << "download_plugin, get_url = " << download_url; + + // download + Slic3r::Http http = Slic3r::Http::get(download_url); + int reported_percent = 0; + http.on_progress( + [this, &pro_fn, cancel_fn, &result, &reported_percent](Slic3r::Http::Progress progress, bool& cancel) { + int percent = 0; + if (progress.dltotal != 0) + percent = progress.dlnow * 50 / progress.dltotal; + bool was_cancel = false; + if (pro_fn && ((percent - reported_percent) >= 10)) { + pro_fn(InstallStatusNormal, percent, was_cancel); + reported_percent = percent; + } + cancel = m_networking_cancel_update || was_cancel; + if (cancel_fn) + if (cancel_fn()) + cancel = true; + + if (cancel) + result = -1; + }) + .on_complete([&pro_fn, tmp_path, target_file_path](std::string body, unsigned status) { + BOOST_LOG_TRIVIAL(info) << "download_plugin, completed"; + bool cancel = false; + int percent = 0; + fs::fstream file(tmp_path, std::ios::out | std::ios::binary | std::ios::trunc); + file.write(body.c_str(), body.size()); + file.close(); + fs::rename(tmp_path, target_file_path); + if (pro_fn) pro_fn(InstallStatusDownloadCompleted, 80, cancel); + }) + .on_error([&pro_fn, &result](std::string body, std::string error, unsigned int status) { + bool cancel = false; + if (pro_fn) pro_fn(InstallStatusDownloadFailed, 0, cancel); + result = -1; + }); + http.perform_sync(); + return result; +} + +int GUI_App::install_plugin(InstallProgressFn pro_fn, WasCancelledFn cancel_fn) +{ + bool cancel = false; + std::string target_file_path = (fs::temp_directory_path() / "network_plugin.zip").string(); + // get plugin folder + auto plugin_folder = boost::filesystem::path(wxStandardPaths::Get().GetUserDataDir().ToUTF8().data()) / "plugins"; + if (!boost::filesystem::exists(plugin_folder)) { + boost::filesystem::create_directory(plugin_folder); + } + + if (m_networking_cancel_update) { + BOOST_LOG_TRIVIAL(info) << boost::format("install_plugin: %1%, cancelled by user")%__LINE__; + return -1; + } + if (pro_fn) { + pro_fn(InstallStatusNormal, 50, cancel); + } + // unzip + mz_zip_archive archive; + mz_zip_zero_struct(&archive); + if (!open_zip_reader(&archive, target_file_path)) { + if (pro_fn) pro_fn(InstallStatusDownloadFailed, 0, cancel); + return InstallStatusUnzipFailed; + } + + mz_uint num_entries = mz_zip_reader_get_num_files(&archive); + mz_zip_archive_file_stat stat; + for (mz_uint i = 0; i < num_entries; i++) { + if (m_networking_cancel_update || cancel) { + BOOST_LOG_TRIVIAL(info) << boost::format("install_plugin: %1%, cancelled by user")%__LINE__; + return -1; + } + if (mz_zip_reader_file_stat(&archive, i, &stat)) { + if (stat.m_uncomp_size > 0) { + std::string dest_file; + if (stat.m_is_utf8) { + dest_file = stat.m_filename; + } + else { + std::string extra(1024, 0); + size_t n = mz_zip_reader_get_extra(&archive, stat.m_file_index, extra.data(), extra.size()); + dest_file = decode(extra.substr(0, n), stat.m_filename); + } + auto dest_file_path = boost::filesystem::path(dest_file); + dest_file = dest_file_path.filename().string(); + auto dest_path = boost::filesystem::path(plugin_folder.string() + "/" + dest_file); + std::string dest_zip_file = encode_path(dest_path.string().c_str()); + try { + if (fs::exists(dest_path)) + fs::remove(dest_path); + mz_bool res = mz_zip_reader_extract_to_file(&archive, stat.m_file_index, dest_zip_file.c_str(), 0); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", extract %1% from plugin zip %2%\n") % dest_file % stat.m_filename; + if (res == 0) { + mz_zip_error zip_error = mz_zip_get_last_error(&archive); + BOOST_LOG_TRIVIAL(error) << "[install_plugin]Archive read error:" << mz_zip_get_error_string(zip_error) << std::endl; + close_zip_reader(&archive); + if (pro_fn) { + pro_fn(InstallStatusUnzipFailed, 0, cancel); + } + return InstallStatusUnzipFailed; + } + else { + if (pro_fn) { + pro_fn(InstallStatusNormal, 50 + i/num_entries, cancel); + } + } + } + catch (const std::exception& e) + { + // ensure the zip archive is closed and rethrow the exception + close_zip_reader(&archive); + BOOST_LOG_TRIVIAL(error) << "[install_plugin]Archive read exception:"<set_str("app", "installed_networking", "1"); + return 0; +} + +void GUI_App::restart_networking() +{ + BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< boost::format("enter, mainframe %1%")%mainframe; + on_init_network(); + if(m_agent) { + init_networking_callbacks(); m_agent->set_on_ssdp_msg_fn( [this](std::string json_str) { GUI::wxGetApp().CallAfter([this, json_str] { @@ -1149,7 +1396,56 @@ void GUI_App::init_networking_callbacks() }); } ); + m_agent->start_discovery(true, false); + if (mainframe) + mainframe->refresh_plugin_tips(); + if (plater_) + plater_->get_notification_manager()->bbl_close_plugin_install_notification(); + } + BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< boost::format("exit, m_agent=%1%")%m_agent; +} +int GUI_App::updating_bambu_networking() +{ + DownloadProgressDialog dlg(_L("Downloading Bambu Network plug-in")); + dlg.ShowModal(); + return 0; +} + +bool GUI_App::check_networking_version() +{ + std::string network_ver = Slic3r::NetworkAgent::get_version(); + if (!network_ver.empty()) { + BOOST_LOG_TRIVIAL(info) << "get_network_agent_version=" << network_ver; + } + std::string studio_ver = SLIC3R_VERSION; + if (network_ver.length() >= 8) { + if (network_ver.substr(0,8) == studio_ver.substr(0,8)) { + m_networking_compatible = true; + return true; + } + } + + m_networking_compatible = false; + return false; +} + +bool GUI_App::is_compatibility_version() +{ + BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< boost::format(": m_networking_compatible=%1%")%m_networking_compatible; + return m_networking_compatible; +} + +void GUI_App::cancel_networking_install() +{ + m_networking_cancel_update = true; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< boost::format(": plugin install cancelled!"); +} + +void GUI_App::init_networking_callbacks() +{ + BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< boost::format(": enter, m_agent=%1%")%m_agent; + if (m_agent) { //set callbacks m_agent->set_on_user_login_fn([this](int online_login, bool login) { GUI::wxGetApp().request_user_login(online_login); @@ -1160,6 +1456,7 @@ void GUI_App::init_networking_callbacks() if (m_is_closing) { return; } + BOOST_LOG_TRIVIAL(trace) << "static: server connected"; m_agent->set_user_selected_machine(m_agent->get_user_selected_machine()); }); }); @@ -1170,7 +1467,7 @@ void GUI_App::init_networking_callbacks() return; } /* request_pushing */ - MachineObject* obj = m_device_manager->get_user_machine(dev_id); + MachineObject* obj = m_device_manager->get_my_machine(dev_id); if (obj) { obj->command_request_push_all(); obj->command_get_version(); @@ -1185,6 +1482,35 @@ void GUI_App::init_networking_callbacks() } ); + m_agent->set_on_local_connect_fn( + [this](int state, std::string dev_id, std::string msg) { + CallAfter([this, state, dev_id, msg] { + if (m_is_closing) { + return; + } + /* request_pushing */ + MachineObject* obj = m_device_manager->get_my_machine(dev_id); + if (obj) { + if (obj->is_lan_mode_printer()) { + if (state == ConnectStatus::ConnectStatusOk) { + obj->command_request_push_all(); + obj->command_get_version(); + } else if (state == ConnectStatus::ConnectStatusFailed || ConnectStatus::ConnectStatusLost) { + obj->set_access_code(""); + wxString text = wxString::Format(_L("Connect %s[SN:%s] failed!"), from_u8(obj->dev_name), obj->dev_id); + MessageDialog msg_dlg(nullptr, text, "", wxAPPLY | wxOK); + if (msg_dlg.ShowModal() == wxOK) { + return; + } + } else { + BOOST_LOG_TRIVIAL(info) << "set_on_local_connect_fn: state = " << state; + } + } + } + }); + } + ); + m_agent->set_on_http_error_fn([this](unsigned int status, std::string body) { this->handle_http_error(status, body); }); @@ -1202,7 +1528,7 @@ void GUI_App::init_networking_callbacks() GUI::wxGetApp().sidebar().load_ams_list(obj->amsList); } } - }); + }); }; m_agent->set_on_message_fn(message_arrive_fn); @@ -1213,7 +1539,11 @@ void GUI_App::init_networking_callbacks() return; } - MachineObject* obj = m_device_manager->get_local_machine(dev_id); + MachineObject* obj = m_device_manager->get_my_machine(dev_id); + if (!obj) { + obj = m_device_manager->get_local_machine(dev_id); + } + if (obj) { obj->parse_json(msg); @@ -1226,26 +1556,8 @@ void GUI_App::init_networking_callbacks() }); }; m_agent->set_on_local_message_fn(lan_message_arrive_fn); - - - m_agent->set_on_local_connect_fn( - [this](int state, std::string dev_id, std::string msg) { - CallAfter([this, state, dev_id, msg] { - if (m_is_closing) { - return; - } - /* request_pushing */ - MachineObject* obj = m_device_manager->get_my_machine(dev_id); - if (obj) { - if (obj->is_lan_mode_printer()) { - obj->command_request_push_all(); - obj->command_get_version(); - } - } - }); - } - ); } + BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< boost::format(": exit, m_agent=%1%")%m_agent; } GUI_App::~GUI_App() @@ -1321,14 +1633,6 @@ void GUI_App::init_app_config() if (!boost::filesystem::exists(data_dir_path)) boost::filesystem::create_directory(data_dir_path); set_data_dir(data_dir); - - //BBS set config dir - if (m_agent) { - m_agent->set_config_dir(data_dir); - } - //BBS set cert dir - if (m_agent) - m_agent->set_cert_file(resources_dir() + "/cert", "slicer_base64.cer"); #else // Since version 2.3, config dir on Linux is in ${XDG_CONFIG_HOME}. // https://github.com/prusa3d/PrusaSlicer/issues/2911 @@ -1374,8 +1678,7 @@ void GUI_App::copy_older_config() preset_bundle->copy_files(m_older_data_dir_path); } -//BBS -void GUI_App::init_http_extra_header() +std::map GUI_App::get_extra_header() { std::map extra_headers; extra_headers.insert(std::make_pair("X-BBL-Client-Type", "slicer")); @@ -1391,8 +1694,16 @@ void GUI_App::init_http_extra_header() wxGetOsVersion(&major, &minor, µ); std::string os_version = (boost::format("%1%.%2%.%3%") % major % minor % micro).str(); extra_headers.insert(std::make_pair("X-BBL-OS-Version", os_version)); - extra_headers.insert(std::make_pair("X-BBL-Device-ID", app_config->get("slicer_uuid"))); + if (app_config) + extra_headers.insert(std::make_pair("X-BBL-Device-ID", app_config->get("slicer_uuid"))); extra_headers.insert(std::make_pair("X-BBL-Language", convert_studio_language_to_api(app_config->get("language")))); + return extra_headers; +} + +//BBS +void GUI_App::init_http_extra_header() +{ + std::map extra_headers = get_extra_header(); if (m_agent) m_agent->set_extra_http_header(extra_headers); @@ -1449,6 +1760,9 @@ bool GUI_App::on_init_inner() CBaseException::set_log_folder(data_dir()); #endif + std::map extra_headers = get_extra_header(); + Slic3r::Http::set_extra_headers(extra_headers); + // Verify resources path const wxString resources_dir = from_u8(Slic3r::resources_dir()); wxCHECK_MSG(wxDirExists(resources_dir), false, @@ -1565,16 +1879,19 @@ bool GUI_App::on_init_inner() if (this->plater_ != nullptr) { // this->plater_->get_notification_manager()->push_notification(NotificationType::NewAppAvailable); //BBS show msg box to download new version - wxString tips = wxString::Format(_L("Click to download new version in default browser: %s"), version_info.version_str); + /* wxString tips = wxString::Format(_L("Click to download new version in default browser: %s"), version_info.version_str); DownloadDialog dialog(this->mainframe, tips, _L("New version of Bambu Studio"), false, wxCENTER | wxICON_INFORMATION); - wxString extmsg = wxString::FromUTF8(version_info.description); - dialog.SetExtendedMessage(extmsg); + dialog.SetExtendedMessage(extmsg);*/ + + UpdateVersionDialog dialog(this->mainframe); + wxString extmsg = wxString::FromUTF8(version_info.description); + dialog.update_version_info(extmsg, version_info.version_str); switch (dialog.ShowModal()) { case wxID_YES: @@ -1613,6 +1930,22 @@ bool GUI_App::on_init_inner() wxGetApp().mainframe->Close(true); } }); + + Bind(EVT_SHOW_NO_NEW_VERSION, [this](const wxCommandEvent& evt) { + wxString msg = _L("This is the newest version."); + InfoDialog dlg(nullptr, _L("Info"), msg); + dlg.ShowModal(); + }); + + Bind(EVT_SHOW_DIALOG, [this](const wxCommandEvent& evt) { + /*wxString msg = evt.GetString(); + InfoDialog dlg(this->mainframe, _L("Info"), msg); + dlg.ShowModal();*/ + + wxString text = evt.GetString(); + Slic3r::GUI::MessageDialog msg_dlg(this->mainframe, text, "", wxAPPLY | wxOK); + msg_dlg.ShowModal(); + }); } else { #ifdef __WXMSW__ @@ -1624,11 +1957,7 @@ bool GUI_App::on_init_inner() // Suppress the '- default -' presets. preset_bundle->set_default_suppressed(true); - if (m_agent) { - std::string country_code = app_config->get_country_code(); - m_agent->set_country_code(country_code); - m_agent->start(); - } + on_init_network(); //BBS if load user preset failed //if (loaded_preset_result != 0) { @@ -1642,7 +1971,10 @@ bool GUI_App::on_init_inner() show_error(nullptr, ex.what()); } //} - // + + + + if (app_config->get("sync_user_preset") == "true") { //BBS loading user preset BOOST_LOG_TRIVIAL(info) << "Loading user presets..."; @@ -1725,8 +2057,26 @@ bool GUI_App::on_init_inner() // other_instance_message_handler()->bring_instance_forward(); //#endif //__APPLE__ + Bind(EVT_HTTP_ERROR, &GUI_App::on_http_error, this); + Bind(EVT_USER_LOGIN, &GUI_App::on_user_login, this); + Bind(wxEVT_IDLE, [this](wxIdleEvent& event) { + bool curr_studio_active = this->is_studio_active(); + if (m_studio_active != curr_studio_active) { + if (curr_studio_active) { + BOOST_LOG_TRIVIAL(info) << "studio is active, start to subscribe"; + if (m_agent) + m_agent->start_subscribe("app"); + } else { + BOOST_LOG_TRIVIAL(info) << "studio is inactive, stop to subscribe"; + if (m_agent) + m_agent->stop_subscribe("app"); + } + m_studio_active = curr_studio_active; + } + + if (! plater_) return; @@ -1763,6 +2113,72 @@ bool GUI_App::on_init_inner() return true; } +bool GUI_App::on_init_network() +{ + int load_agent_dll = Slic3r::NetworkAgent::initialize_network_module(); + bool create_network_agent = false; + if (!load_agent_dll) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": on_init_network, load dll ok"; + if (check_networking_version()) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": on_init_network, compatibility version"; + create_network_agent = true; + } else { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": on_init_network, version dismatch, need upload network module"; + if (app_config->get("installed_networking") == "1") { + m_networking_need_update = true; + } + } + } else { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": on_init_network, load dll failed"; + if (app_config->get("installed_networking") == "1") { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": on_init_network, need upload network module"; + m_networking_need_update = true; + } + } + + if (create_network_agent) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", create network agent..."); + m_agent = new Slic3r::NetworkAgent(); + + if (!m_device_manager) + m_device_manager = new Slic3r::DeviceManager(m_agent); + else + m_device_manager->set_agent(m_agent); + std::string data_dir = wxStandardPaths::Get().GetUserDataDir().ToUTF8().data(); + + //BBS set config dir + if (m_agent) { + m_agent->set_config_dir(data_dir); + } + //BBS set cert dir + if (m_agent) + m_agent->set_cert_file(resources_dir() + "/cert", "slicer_base64.cer"); + + //BBS start http log + if (m_agent) { + m_agent->init_log(); + } + + init_http_extra_header(); + + if (m_agent) { + init_networking_callbacks(); + std::string country_code = app_config->get_country_code(); + m_agent->set_country_code(country_code); + m_agent->start(); + } + } + else { + int result = Slic3r::NetworkAgent::unload_network_module(); + BOOST_LOG_TRIVIAL(info) << "on_init_network, unload_network_module, result = " << result; + + if (!m_device_manager) + m_device_manager = new Slic3r::DeviceManager(); + } + + return true; +} + unsigned GUI_App::get_colour_approx_luma(const wxColour &colour) { double r = colour.Red(); @@ -2140,18 +2556,15 @@ void GUI_App::ShowUserGuide() { } } -void GUI_App::ShowDailyTip() { - // BBS: Dialy Tip Dialog +void GUI_App::ShowDownNetPluginDlg() { try { - DailytipFrame TipDlg(this); - //if (TipDlg.IsWhetherShow()) - TipDlg.ShowModal(); + DownloadProgressDialog dlg(_L("Downloading Bambu Network plug-in")); + dlg.ShowModal(); } catch (std::exception &e) { - // wxMessageBox(e.what(), "", MB_OK); + ; } } - void GUI_App::ShowUserLogin() { // BBS: User Login Dialog @@ -2395,6 +2808,7 @@ void GUI_App::request_user_logout() { if (m_agent) { m_agent->user_logout(); + m_agent->set_user_selected_machine(""); /* delete old user settings */ m_device_manager->clean_user_info(); GUI::wxGetApp().remove_user_presets(); @@ -2503,6 +2917,9 @@ std::string GUI_App::handle_web_request(std::string cmd) } } } + else if (command_str.compare("begin_network_plugin_download") == 0) { + CallAfter([this] { wxGetApp().ShowDownNetPluginDlg(); }); + } } } catch (...) { @@ -2584,34 +3001,44 @@ void GUI_App::handle_http_error(unsigned int status, std::string body) void GUI_App::on_http_error(wxCommandEvent &evt) { int status = evt.GetInt(); + + int code = 0; + std::string error; + wxString result; + if (status >= 400 && status < 500) { + try { + json j = json::parse(evt.GetString()); + if (j.contains("code")) { + if (!j["code"].is_null()) + code = j["code"].get(); + } + if (j.contains("error")) + if (!j["error"].is_null()) + error = j["error"].get(); + } + catch (...) {} + } + + // Version limit + if (code == HttpErrorVersionLimited) { + MessageDialog msg_dlg(nullptr, _L("The version of Bambu studio is too low and needs to be updated to the latest version before it can be used normally"), "", wxAPPLY | wxOK); + if (msg_dlg.ShowModal() == wxOK) { + return; + } + } + + // request login if (status == 401) { if (m_agent) { if (m_agent->is_user_login()) { this->request_user_logout(); - wxString msg = wxString::Format(_L("Login information expired. Please login again.")); - wxMessageBox(msg); - } - } - } else if (status == 403) { - ; - } else if (status == 422) { - ; - } else if (status == 424) { - try { - json j = json::parse(evt.GetString()); - if (j.contains("code") && j.contains("error")) { - int code = j["code"].get(); - std::string error = j["IOT_ERROR_VERSION_LIMITED"].get(); - if (code == 15) { - MessageDialog msg_dlg(nullptr, _L("The version of Bambu studio is too low and needs to be updated to the latest version before it can be used normally"), "", wxAPPLY | wxOK); - if (msg_dlg.ShowModal() == wxOK) { - return; - } + MessageDialog msg_dlg(nullptr, _L("Login information expired. Please login again."), "", wxAPPLY | wxOK); + if (msg_dlg.ShowModal() == wxOK) { + return; } } - } catch (...) { - ; } + return; } } @@ -2629,18 +3056,36 @@ void GUI_App::on_user_login(wxCommandEvent &evt) DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) return; dev->update_user_machine_list_info(); + dev->set_selected_machine(m_agent->get_user_selected_machine()); GUI::wxGetApp().preset_bundle->update_user_presets_directory(user_id); if (online_login) GUI::wxGetApp().mainframe->show_sync_dialog(); } +bool GUI_App::is_studio_active() +{ + auto curr_time = std::chrono::system_clock::now(); + auto diff = std::chrono::duration_cast(curr_time - last_active_point); + if (diff.count() < STUDIO_INACTIVE_TIMEOUT) { + return true; + } + return false; +} + +void GUI_App::reset_to_active() +{ + last_active_point = std::chrono::system_clock::now(); +} + void GUI_App::check_update(bool show_tips) { if (version_info.version_str.empty()) return; if (version_info.url.empty()) return; - if (version_info.compare(SLIC3R_VERSION) > 0) { + auto curr_version = Semver::parse(SLIC3R_VERSION); + auto remote_version = Semver::parse(version_info.version_str); + if (curr_version && remote_version && (*remote_version > *curr_version)) { if (version_info.force_upgrade) { wxGetApp().app_config->set_bool("force_upgrade", version_info.force_upgrade); wxGetApp().app_config->set("upgrade", "force_upgrade", true); @@ -2661,8 +3106,6 @@ void GUI_App::check_update(bool show_tips) void GUI_App::check_new_version(bool show_tips) { - if (!m_agent) return; - std::string platform = "windows"; #ifdef __WINDOWS__ @@ -2679,7 +3122,7 @@ void GUI_App::check_new_version(bool show_tips) % VersionInfo::convert_full_version("0.0.0.1") ).str(); - std::string url = m_agent->get_studio_info_url() + query_params; + std::string url = get_http_url(app_config->get_country_code()) + query_params; Slic3r::Http http = Slic3r::Http::get(url); http.header("accept", "application/json") @@ -2717,8 +3160,9 @@ void GUI_App::check_new_version(bool show_tips) } }) .on_error([this](std::string body, std::string error, unsigned int status) { - BOOST_LOG_TRIVIAL(error) << "check new version" << body; - }).perform(); + handle_http_error(status, body); + BOOST_LOG_TRIVIAL(error) << "check new version error" << body; + }).perform(); } @@ -2738,9 +3182,15 @@ void GUI_App::enter_force_upgrade() void GUI_App::no_new_version() { - wxString msg = _L("This is the newest version."); - InfoDialog dlg(nullptr, _L("Info"), msg); - dlg.ShowModal(); + wxCommandEvent* evt = new wxCommandEvent(EVT_SHOW_NO_NEW_VERSION); + GUI::wxGetApp().QueueEvent(evt); +} + +void GUI_App::show_dialog(wxString msg) +{ + wxCommandEvent* evt = new wxCommandEvent(EVT_SHOW_DIALOG); + evt->SetString(msg); + GUI::wxGetApp().QueueEvent(evt); } void GUI_App::reload_settings() @@ -2864,6 +3314,8 @@ void GUI_App::sync_preset(Preset* preset) void GUI_App::start_sync_user_preset(bool with_progress_dlg) { + if (!m_agent) return; + // has already start sync if (enable_sync) return; @@ -2873,6 +3325,7 @@ void GUI_App::start_sync_user_preset(bool with_progress_dlg) std::string version = preset_bundle->get_vendor_profile_version(PresetBundle::BBL_BUNDLE).to_string(); if (with_progress_dlg) { ProgressDialog dlg(_L("Loading"), "", 100, this->mainframe, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT); + dlg.Update(0, _L("Loading user preset")); m_agent->get_setting_list(version, [this, &dlg](int percent){ dlg.Update(percent, _L("Loading user preset")); diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 73b307b153..4aeea2e0c6 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -11,6 +11,7 @@ #include "slic3r/GUI/DeviceManager.hpp" #include "slic3r/Utils/NetworkAgent.hpp" #include "slic3r/GUI/WebViewDialog.hpp" +#include "slic3r/GUI/Jobs/UpgradeNetworkJob.hpp" #include #include @@ -22,7 +23,8 @@ #include #include -#define BBL_HAS_FIRST_PAGE 1 +#define BBL_HAS_FIRST_PAGE 1 +#define STUDIO_INACTIVE_TIMEOUT 15*60*1000 class wxMenuItem; class wxMenuBar; @@ -104,6 +106,7 @@ enum CameraMenuIDs { wxID_CAMERA_COUNT, }; + class Tab; class ConfigWizard; @@ -186,6 +189,7 @@ public: class GUI_App : public wxApp { public: + //BBS: remove GCodeViewer as seperate APP logic enum class EAppMode : unsigned char { @@ -241,9 +245,13 @@ private: //BBS bool m_is_closing {false}; - Slic3r::DeviceManager* m_device_manager; + Slic3r::DeviceManager* m_device_manager { nullptr }; NetworkAgent* m_agent { nullptr }; std::vector need_delete_presets; // store setting ids of preset + bool m_networking_compatible { false }; + bool m_networking_need_update { false }; + bool m_networking_cancel_update { false }; + std::shared_ptr m_upgrade_network_job; VersionInfo version_info; @@ -335,7 +343,7 @@ public: void load_gcode(wxWindow* parent, wxString& input_file) const; void ShowUserGuide(); - void ShowDailyTip(); + void ShowDownNetPluginDlg(); void ShowUserLogin(); void ShowOnlyFilament(); //BBS @@ -358,11 +366,18 @@ public: void on_http_error(wxCommandEvent &evt); void on_user_login(wxCommandEvent &evt); + // BBS + bool is_studio_active(); + void reset_to_active(); + bool m_studio_active = true; + std::chrono::system_clock::time_point last_active_point; + void check_update(bool show_tips); void check_new_version(bool show_tips = false); void request_new_version(); void enter_force_upgrade(); void no_new_version(); + void show_dialog(wxString msg); void reload_settings(); void remove_user_presets(); void sync_preset(Preset* preset); @@ -484,12 +499,23 @@ public: void associate_files(std::wstring extend); void disassociate_files(std::wstring extend); #endif // __WXMSW__ + std::string get_plugin_url(std::string country_code); + int download_plugin(InstallProgressFn pro_fn = nullptr, WasCancelledFn cancel_fn = nullptr); + int install_plugin(InstallProgressFn pro_fn = nullptr, WasCancelledFn cancel_fn = nullptr); + std::string get_http_url(std::string country_code); + bool is_compatibility_version(); + bool check_networking_version(); + void cancel_networking_install(); + void restart_networking(); private: + int updating_bambu_networking(); bool on_init_inner(); + bool on_init_network(); void init_networking_callbacks(); void init_app_config(); //BBS set extra header for http request + std::map get_extra_header(); void init_http_extra_header(); bool check_older_app_config(Semver current_version, bool backup); void copy_older_config(); diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index 782ce4a40d..d31132266f 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -464,7 +464,8 @@ wxMenu* MenuFactory::append_submenu_add_generic(wxMenu* menu, ModelVolumeType ty auto item = L("Timelapse Wipe Tower"); type = ModelVolumeType::TIMELAPSE_WIPE_TOWER; append_menu_item(sub_menu, wxID_ANY, _(item), "", - [type, item](wxCommandEvent&) { obj_list()->load_generic_subobject(item, type); }, "", menu); + [type, item](wxCommandEvent &) { obj_list()->load_generic_subobject(item, type); }, "", menu, + []() { return plater()->can_add_timelapse_wt(); }, m_parent); } return sub_menu; diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 90df98cf44..15367a2fbd 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -264,6 +264,8 @@ ObjectList::ObjectList(wxWindow* parent) : // which seems to be working as of now. this->CallAfter([this](){ ensure_current_item_visible(); }); #else + update_name_column_width(); + ensure_current_item_visible(); #endif e.Skip(); @@ -768,17 +770,21 @@ void ObjectList::update_filament_colors() void ObjectList::update_name_column_width() const { - auto em = em_unit(const_cast(this)); - int extra_width = 0; + wxSize client_size = this->GetClientSize(); + bool p_vbar = this->GetParent()->HasScrollbar(wxVERTICAL); + bool p_hbar = this->GetParent()->HasScrollbar(wxHORIZONTAL); + auto em = em_unit(const_cast(this)); + // BBS: walkaround for wxDataViewCtrl::HasScrollbar() does not return correct status + int others_width = 0; for (int cn = colName; cn < colCount; cn++) { if (cn != colName) { - if (GetColumn(cn)->IsHidden()) - extra_width += m_columns_width[cn]; + if (!GetColumn(cn)->IsHidden()) + others_width += m_columns_width[cn]; } } - GetColumn(colName)->SetWidth((m_columns_width[colName] + extra_width) * em); + GetColumn(colName)->SetWidth(client_size.x - (others_width)*em); } void ObjectList::set_filament_column_hidden(const bool hide) const @@ -1145,6 +1151,8 @@ void ObjectList::list_manipulation(const wxPoint& mouse_pos, bool evt_context_me GLGizmosManager& gizmos_mgr = wxGetApp().plater()->get_view3D_canvas3D()->get_gizmos_manager(); if (gizmos_mgr.get_current_type() != GLGizmosManager::EType::FdmSupports) gizmos_mgr.open_gizmo(GLGizmosManager::EType::FdmSupports); + else + gizmos_mgr.reset_all_states(); } } else if (col_num == colColorPaint) { @@ -1153,6 +1161,8 @@ void ObjectList::list_manipulation(const wxPoint& mouse_pos, bool evt_context_me GLGizmosManager& gizmos_mgr = wxGetApp().plater()->get_view3D_canvas3D()->get_gizmos_manager(); if (gizmos_mgr.get_current_type() != GLGizmosManager::EType::MmuSegmentation) gizmos_mgr.open_gizmo(GLGizmosManager::EType::MmuSegmentation); + else + gizmos_mgr.reset_all_states(); } } else if (col_num == colEditing) { @@ -2028,13 +2038,16 @@ void ObjectList::load_mesh_object(const TriangleMesh &mesh, const wxString &name new_object->translate(-bb.center()); if (is_timelapse_wt) { - new_object->instances[0]->set_offset( Vec3d(80.0, 230.0, -new_object->origin_translation.z()) ); new_object->is_timelapse_wipe_tower = true; auto curr_plate = wxGetApp().plater()->get_partplate_list().get_curr_plate(); int highest_extruder = 0; double max_height = curr_plate->estimate_timelapse_wipe_tower_height(&highest_extruder); new_object->scale(1, 1, max_height / new_object->bounding_box().size()[2]); + // move to garbage bin of curr plate + auto offset = curr_plate->get_origin() + Vec3d(80.0, 230.0, -new_object->origin_translation.z()); + new_object->instances[0]->set_offset(offset); + new_object->config.set_key_value("sparse_infill_density", new ConfigOptionPercent(0)); new_object->config.set_key_value("top_shell_layers", new ConfigOptionInt(0)); new_object->config.set("extruder", highest_extruder); @@ -2237,14 +2250,15 @@ bool ObjectList::del_subobject_from_object(const int obj_idx, const int idx, con // update extruder color in ObjectList wxDataViewItem obj_item = m_objects_model->GetItemById(obj_idx); - // BBS -#if 0 if (obj_item) { // BBS + if (last_volume->config.has("extruder")) { + int extruder_id = last_volume->config.opt_int("extruder"); + object->config.set("extruder", extruder_id); + } wxString extruder = object->config.has("extruder") ? wxString::Format("%d", object->config.extruder()) : _devL("1"); m_objects_model->SetExtruder(extruder, obj_item); } -#endif // add settings to the object, if it has them add_settings_item(obj_item, &object->config.get()); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index d0b25551e0..5708e7f6ca 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -246,7 +246,7 @@ void GLGizmoBase::GizmoImguiEnd() m_imgui->end(); } -void GLGizmoBase::GizmoImguiSetNextWIndowPos(float x, float y, int flag, float pivot_x, float pivot_y) +void GLGizmoBase::GizmoImguiSetNextWIndowPos(float &x, float y, int flag, float pivot_x, float pivot_y) { if (abs(last_input_window_width) > 0.01f) { if (x + last_input_window_width > m_parent.get_canvas_size().get_width()) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 87a625b15a..5e8b1cef5d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -206,7 +206,7 @@ protected: bool GizmoImguiBegin(const std::string& name, int flags); void GizmoImguiEnd(); - void GizmoImguiSetNextWIndowPos(float x, float y, int flag, float pivot_x = 0.0f, float pivot_y = 0.0f); + void GizmoImguiSetNextWIndowPos(float &x, float y, int flag, float pivot_x = 0.0f, float pivot_y = 0.0f); // Returns the picking color for the given id, based on the BASE_ID constant // No check is made for clashing with other picking color (i.e. GLVolumes) std::array picking_color_component(unsigned int id) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp index 12aa853b46..5b0697593a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -88,7 +88,7 @@ bool GLGizmoFdmSupports::on_init() m_desc["remove"] = _L("Erase painting"); m_desc["remove_all"] = _L("Erase all painting"); m_desc["highlight_by_angle"] = _L("Highlight overhang areas") + ": "; - m_desc["fragment_filter"] = _L("Fragment filter"); + m_desc["fragment_filter"] = _L("Gap fill"); m_desc["perform_filter"] = _L("Perform"); m_desc["fragment_area"] = _L("Fragment area"); m_desc["brush_size"] = _L("Set pen size"); @@ -246,7 +246,7 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l ImGui::AlignTextToFramePadding(); m_imgui->text(m_desc.at("tool_type")); std::array tool_icons = { ImGui::CircleButtonIcon, ImGui::SphereButtonIcon, ImGui::FillButtonIcon, ImGui::FragmentFilterIcon }; - std::array tool_tips = { _L("Circle"), _L("Sphere"), _L("Fill"), _L("Fragment Filter") }; + std::array tool_tips = { _L("Circle"), _L("Sphere"), _L("Fill"), _L("Gap Fill") }; for (int i = 0; i < tool_icons.size(); i++) { std::string str_label = std::string("##"); std::wstring btn_name = tool_icons[i] + boost::nowide::widen(str_label); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index d7b9b544fe..0464ceb09c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -337,12 +337,12 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott GizmoImguiBegin(get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar); // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that: - const float clipping_slider_left = m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x + m_imgui->scaled(1.5f); + const float clipping_slider_left = m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x + m_imgui->scaled(1.f); const float cursor_slider_left = m_imgui->calc_text_size(m_desc.at("cursor_size")).x + m_imgui->scaled(1.f); const float smart_fill_slider_left = m_imgui->calc_text_size(m_desc.at("smart_fill_angle")).x + m_imgui->scaled(1.5f); const float edge_detect_slider_left = m_imgui->calc_text_size(m_desc.at("edge_detection")).x + m_imgui->scaled(1.f); - const float fragment_area_slider_left = m_imgui->calc_text_size(m_desc.at("fragment_area")).x + m_imgui->scaled(1.f); - const float height_range_slider_left = m_imgui->calc_text_size(m_desc.at("height_range")).x + m_imgui->scaled(1.f); + const float fragment_area_slider_left = m_imgui->calc_text_size(m_desc.at("fragment_area")).x + m_imgui->scaled(1.5f); + const float height_range_slider_left = m_imgui->calc_text_size(m_desc.at("height_range")).x + m_imgui->scaled(1.5f); const float remove_btn_width = m_imgui->calc_text_size(m_desc.at("remove_all")).x + m_imgui->scaled(1.f); const float filter_btn_width = m_imgui->calc_text_size(m_desc.at("perform_filter")).x + m_imgui->scaled(1.f); @@ -359,6 +359,8 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott total_text_max += caption_max + m_imgui->scaled(1.f); caption_max += m_imgui->scaled(1.f); + const float circle_max_width = std::max(clipping_slider_left,cursor_slider_left); + const float height_max_width = std::max(clipping_slider_left,height_range_slider_left); const float sliders_left_width = std::max(smart_fill_slider_left, std::max(cursor_slider_left, std::max(edge_detect_slider_left, std::max(fragment_area_slider_left, std::max(height_range_slider_left, clipping_slider_left))))); @@ -404,7 +406,15 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott // draw filament background ImGuiColorEditFlags flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip; if (m_selected_extruder_idx != extruder_idx) flags |= ImGuiColorEditFlags_NoBorder; - bool color_picked = ImGui::ColorButton(color_label.c_str(), color_vec, flags, button_size); + #ifdef __APPLE__ + ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0.4f, 0.4f, 0.4f, 1.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); + bool color_picked = ImGui::ColorButton(color_label.c_str(), color_vec, flags, button_size); + ImGui::PopStyleVar(1); + ImGui::PopStyleColor(1); + #else + bool color_picked = ImGui::ColorButton(color_label.c_str(), color_vec, flags, button_size); + #endif color_button_high = ImGui::GetCursorPos().y - color_button - 2.0; if (color_picked) { m_selected_extruder_idx = extruder_idx; } @@ -425,7 +435,7 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott m_imgui->text(m_desc.at("tool_type")); std::array tool_icons = { ImGui::CircleButtonIcon,ImGui::SphereButtonIcon, ImGui::TriangleButtonIcon, ImGui::HeightRangeIcon, ImGui::FillButtonIcon, ImGui::FragmentFilterIcon }; - std::array tool_tips = { _L("Circle"), _L("Sphere"), _L("Triangle"), _L("Height Range"), _L("Fill"), _L("Fragment Filter") }; + std::array tool_tips = { _L("Circle"), _L("Sphere"), _L("Triangle"), _L("Height Range"), _L("Fill"), _L("Gap Fill") }; for (int i = 0; i < tool_icons.size(); i++) { std::string str_label = std::string("##"); std::wstring btn_name = tool_icons[i] + boost::nowide::widen(str_label); @@ -460,33 +470,54 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott if (m_current_tool != old_tool) this->tool_changed(old_tool, m_current_tool); - if (m_current_tool == ImGui::CircleButtonIcon) { - m_cursor_type = TriangleSelector::CursorType::CIRCLE; + if (m_current_tool == ImGui::CircleButtonIcon || m_current_tool == ImGui::SphereButtonIcon) { + if (m_current_tool == ImGui::CircleButtonIcon) + m_cursor_type = TriangleSelector::CursorType::CIRCLE; + else + m_cursor_type = TriangleSelector::CursorType::SPHERE; m_tool_type = ToolType::BRUSH; ImGui::AlignTextToFramePadding(); m_imgui->text(m_desc.at("cursor_size")); - ImGui::SameLine(sliders_left_width); - ImGui::PushItemWidth(window_width - sliders_left_width - slider_width_times * slider_icon_width); + ImGui::SameLine(circle_max_width); + ImGui::PushItemWidth(window_width - circle_max_width - slider_width_times * slider_icon_width); m_imgui->bbl_slider_float_style("##cursor_radius", &m_cursor_radius, CursorRadiusMin, CursorRadiusMax, "%.2f", 1.0f, true); ImGui::SameLine(window_width - slider_icon_width); ImGui::PushItemWidth(1.5 * slider_icon_width); ImGui::BBLDragFloat("##cursor_radius_input", &m_cursor_radius, 0.05f, 0.0f, 0.0f, "%.2f"); - } else if (m_current_tool == ImGui::SphereButtonIcon){ - m_cursor_type = TriangleSelector::CursorType::SPHERE; - m_tool_type = ToolType::BRUSH; + + ImGui::Separator(); ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc.at("cursor_size")); - ImGui::SameLine(sliders_left_width); - ImGui::PushItemWidth(window_width - sliders_left_width - slider_width_times * slider_icon_width); - m_imgui->bbl_slider_float_style("##cursor_radius", &m_cursor_radius, CursorRadiusMin, CursorRadiusMax, "%.2f", 1.0f, true); + m_imgui->text(m_desc.at("clipping_of_view")); + + auto clp_dist = float(m_c->object_clipper()->get_position()); + ImGui::SameLine(circle_max_width); + ImGui::PushItemWidth(window_width - circle_max_width - slider_width_times * slider_icon_width); + bool slider_clp_dist = m_imgui->bbl_slider_float_style("##clp_dist", &clp_dist, 0.f, 1.f, "%.2f", 1.0f, true); ImGui::SameLine(window_width - slider_icon_width); ImGui::PushItemWidth(1.5 * slider_icon_width); - ImGui::BBLDragFloat("##cursor_radius_input", &m_cursor_radius, 0.05f, 0.0f, 0.0f, "%.2f"); + bool b_clp_dist_input = ImGui::BBLDragFloat("##clp_dist_input", &clp_dist, 0.05f, 0.0f, 0.0f, "%.2f"); + + if (slider_clp_dist || b_clp_dist_input) { m_c->object_clipper()->set_position(clp_dist, true); } + } else if (m_current_tool == ImGui::TriangleButtonIcon) { m_cursor_type = TriangleSelector::CursorType::POINTER; m_tool_type = ToolType::BRUSH; + + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("clipping_of_view")); + + auto clp_dist = float(m_c->object_clipper()->get_position()); + ImGui::SameLine(clipping_slider_left); + ImGui::PushItemWidth(window_width - clipping_slider_left - slider_width_times * slider_icon_width); + bool slider_clp_dist = m_imgui->bbl_slider_float_style("##clp_dist", &clp_dist, 0.f, 1.f, "%.2f", 1.0f, true); + ImGui::SameLine(window_width - slider_icon_width); + ImGui::PushItemWidth(1.5 * slider_icon_width); + bool b_clp_dist_input = ImGui::BBLDragFloat("##clp_dist_input", &clp_dist, 0.05f, 0.0f, 0.0f, "%.2f"); + + if (slider_clp_dist || b_clp_dist_input) { m_c->object_clipper()->set_position(clp_dist, true); } + } else if (m_current_tool == ImGui::FillButtonIcon) { m_cursor_type = TriangleSelector::CursorType::POINTER; m_imgui->bbl_checkbox(m_desc["edge_detection"], m_detect_geometry_edge); @@ -511,34 +542,6 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott // set to negative value to disable edge detection m_smart_fill_angle = -1.f; } - } else if (m_current_tool == ImGui::HeightRangeIcon) { - m_tool_type = ToolType::BRUSH; - m_cursor_type = TriangleSelector::CursorType::HEIGHT_RANGE; - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc["height_range"] + ":"); - ImGui::SameLine(sliders_left_width); - ImGui::PushItemWidth(window_width - sliders_left_width - slider_width_times * slider_icon_width); - std::string format_str = std::string("%.2f") + I18N::translate_utf8("mm", "Heigh range," "Facet in [cursor z, cursor z + height] will be selected."); - m_imgui->bbl_slider_float_style("##cursor_height", &m_cursor_height, CursorHeightMin, CursorHeightMax, format_str.data(), 1.0f, true); - ImGui::SameLine(window_width - slider_icon_width); - ImGui::PushItemWidth(1.5 * slider_icon_width); - ImGui::BBLDragFloat("##cursor_height_input", &m_cursor_height, 0.05f, 0.0f, 0.0f, "%.2f"); - } - else if (m_current_tool == ImGui::FragmentFilterIcon) { - m_tool_type = ToolType::FRAGMENT_FILTER; - m_cursor_type = TriangleSelector::CursorType::POINTER; - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc["fragment_area"] + ":"); - ImGui::SameLine(sliders_left_width); - ImGui::PushItemWidth(window_width - sliders_left_width - slider_width_times * slider_icon_width); - std::string format_str = std::string("%.2f") + I18N::translate_utf8("", "Triangle patch area threshold,""triangle patch will be merged to neighbor if its area is less than threshold"); - m_imgui->bbl_slider_float_style("##fragment_area", &TriangleSelectorPatch::fragment_area, TriangleSelectorPatch::FragmentAreaMin, TriangleSelectorPatch::FragmentAreaMax, format_str.data(), 1.0f, true); - ImGui::SameLine(window_width - slider_icon_width); - ImGui::PushItemWidth(1.5 * slider_icon_width); - ImGui::BBLDragFloat("##fragment_area_input", &TriangleSelectorPatch::fragment_area, 0.05f, 0.0f, 0.0f, "%.2f"); - } - - if (m_current_tool != ImGui::FragmentFilterIcon) { ImGui::Separator(); ImGui::AlignTextToFramePadding(); @@ -552,8 +555,49 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott ImGui::PushItemWidth(1.5 * slider_icon_width); bool b_clp_dist_input = ImGui::BBLDragFloat("##clp_dist_input", &clp_dist, 0.05f, 0.0f, 0.0f, "%.2f"); + if (slider_clp_dist || b_clp_dist_input) { m_c->object_clipper()->set_position(clp_dist, true);} + + } else if (m_current_tool == ImGui::HeightRangeIcon) { + m_tool_type = ToolType::BRUSH; + m_cursor_type = TriangleSelector::CursorType::HEIGHT_RANGE; + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc["height_range"] + ":"); + ImGui::SameLine(height_max_width); + ImGui::PushItemWidth(window_width - height_max_width - slider_width_times * slider_icon_width); + std::string format_str = std::string("%.2f") + I18N::translate_utf8("mm", "Heigh range," "Facet in [cursor z, cursor z + height] will be selected."); + m_imgui->bbl_slider_float_style("##cursor_height", &m_cursor_height, CursorHeightMin, CursorHeightMax, format_str.data(), 1.0f, true); + ImGui::SameLine(window_width - slider_icon_width); + ImGui::PushItemWidth(1.5 * slider_icon_width); + ImGui::BBLDragFloat("##cursor_height_input", &m_cursor_height, 0.05f, 0.0f, 0.0f, "%.2f"); + + ImGui::Separator(); + + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("clipping_of_view")); + + auto clp_dist = float(m_c->object_clipper()->get_position()); + ImGui::SameLine(height_max_width); + ImGui::PushItemWidth(window_width - height_max_width - slider_width_times * slider_icon_width); + bool slider_clp_dist = m_imgui->bbl_slider_float_style("##clp_dist", &clp_dist, 0.f, 1.f, "%.2f", 1.0f, true); + ImGui::SameLine(window_width - slider_icon_width); + ImGui::PushItemWidth(1.5 * slider_icon_width); + bool b_clp_dist_input = ImGui::BBLDragFloat("##clp_dist_input", &clp_dist, 0.05f, 0.0f, 0.0f, "%.2f"); + if (slider_clp_dist || b_clp_dist_input) { m_c->object_clipper()->set_position(clp_dist, true); } } + else if (m_current_tool == ImGui::FragmentFilterIcon) { + m_tool_type = ToolType::FRAGMENT_FILTER; + m_cursor_type = TriangleSelector::CursorType::POINTER; + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc["fragment_area"] + ":"); + ImGui::SameLine(fragment_area_slider_left); + ImGui::PushItemWidth(window_width - fragment_area_slider_left - slider_width_times * slider_icon_width); + std::string format_str = std::string("%.2f") + I18N::translate_utf8("", "Triangle patch area threshold,""triangle patch will be merged to neighbor if its area is less than threshold"); + m_imgui->bbl_slider_float_style("##fragment_area", &TriangleSelectorPatch::fragment_area, TriangleSelectorPatch::FragmentAreaMin, TriangleSelectorPatch::FragmentAreaMax, format_str.data(), 1.0f, true); + ImGui::SameLine(window_width - slider_icon_width); + ImGui::PushItemWidth(1.5 * slider_icon_width); + ImGui::BBLDragFloat("##fragment_area_input", &TriangleSelectorPatch::fragment_area, 0.05f, 0.0f, 0.0f, "%.2f"); + } ImGui::Separator(); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(6.0f, 10.0f)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 764183cd76..7f33b1dece 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -85,7 +85,7 @@ size_t GLGizmosManager::get_gizmo_idx_from_mouse(const Vec2d& mouse_pos) const //if ((border <= (float)mouse_pos(0) && ((float)mouse_pos(0) <= border + icons_size))) { if (((top_y + border) <= (float)mouse_pos(1)) && ((float)mouse_pos(1) <= (top_y + border + icons_size))) { // which icon is it on? - size_t from_left = (size_t)((float)mouse_pos(0) - top_x) / stride_x; + int from_left = (float) mouse_pos(0) - top_x < 0 ? -1 : (int) ((float) mouse_pos(0) - top_x) / stride_x; if (from_left < 0) return Undefined; // is it really on the icon or already past the border? diff --git a/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.cpp b/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.cpp index f7f302f2b1..5b7dbe2f49 100644 --- a/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.cpp +++ b/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.cpp @@ -18,6 +18,9 @@ #include +#define MAX_NUM 9999.99 +#define MAX_SIZE "9999.99" + namespace Slic3r { namespace GUI @@ -25,6 +28,8 @@ namespace GUI const double GizmoObjectManipulation::in_to_mm = 25.4; const double GizmoObjectManipulation::mm_to_in = 0.0393700787; +const double GizmoObjectManipulation::oz_to_g = 28.34952; +const double GizmoObjectManipulation::g_to_oz = 0.035274; // Helper function to be used by drop to bed button. Returns lowest point of this // volume in world coordinate system. @@ -576,9 +581,10 @@ void GizmoObjectManipulation::do_render_move_window(ImGuiWrapper *imgui_wrapper, else original_position = this->m_new_position; Vec3d display_position = m_buffered_position; + // Rotation Vec3d rotation = this->m_buffered_rotation; - float unit_size = max_unit_size(2, display_position, display_position, "move") + space_size;; + float unit_size = imgui_wrapper->calc_text_size(MAX_SIZE).x + space_size; int index = 1; int index_unit = 1; @@ -611,6 +617,12 @@ void GizmoObjectManipulation::do_render_move_window(ImGuiWrapper *imgui_wrapper, ImGui::BBLInputDouble(label_values[0][2], &display_position[2], 0.0f, 0.0f, "%.2f"); ImGui::SameLine(caption_max + (++index_unit) * unit_size + (++index) * space_size); imgui_wrapper->text(this->m_new_unit_string); + + for (int i = 0;i MAX_NUM)display_position[i] = MAX_NUM; + } + m_buffered_position = display_position; update(current_active_id, "position", original_position, m_buffered_position); // the init position values are not zero, won't add reset button @@ -671,7 +683,7 @@ void GizmoObjectManipulation::do_render_rotate_window(ImGuiWrapper *imgui_wrappe }; float space_size = imgui_wrapper->get_style_scaling() * 8; - float position_size = imgui_wrapper->calc_text_size(_L("Position")).x + space_size; + float position_size = imgui_wrapper->calc_text_size(_L("Rotation")).x + space_size; float World_size = imgui_wrapper->calc_text_size(_L("World coordinates")).x + space_size; float caption_max = std::max(position_size, World_size) + 2 * space_size; float end_text_size = imgui_wrapper->calc_text_size(this->m_new_unit_string).x; @@ -685,7 +697,8 @@ void GizmoObjectManipulation::do_render_rotate_window(ImGuiWrapper *imgui_wrappe Vec3d display_position = m_buffered_position; // Rotation Vec3d rotation = this->m_buffered_rotation; - float unit_size = max_unit_size(2, rotation, rotation, "rotate") + space_size * 2; + + float unit_size = imgui_wrapper->calc_text_size(MAX_SIZE).x + space_size; int index = 1; int index_unit = 1; @@ -792,7 +805,9 @@ void GizmoObjectManipulation::do_render_scale_input_window(ImGuiWrapper* imgui_w }; float space_size = imgui_wrapper->get_style_scaling() * 8; - float caption_max = imgui_wrapper->calc_text_size(_L("Position:")).x + space_size; + float scale_size = imgui_wrapper->calc_text_size(_L("Scale")).x + space_size; + float size_len = imgui_wrapper->calc_text_size(_L("Size")).x + space_size; + float caption_max = std::max(scale_size, size_len) + 2 * space_size; float end_text_size = imgui_wrapper->calc_text_size(this->m_new_unit_string).x; ImGui::AlignTextToFramePadding(); unsigned int current_active_id = ImGui::GetActiveID(); @@ -802,12 +817,12 @@ void GizmoObjectManipulation::do_render_scale_input_window(ImGuiWrapper* imgui_w Vec3d display_position = m_buffered_position; - float unit_size = max_unit_size(2, scale, display_size, "scale") + space_size; + float unit_size = imgui_wrapper->calc_text_size(MAX_SIZE).x + space_size; bool imperial_units = this->m_imperial_units; int index = 2; int index_unit = 1; - + ImGui::PushItemWidth(caption_max); ImGui::Dummy(ImVec2(caption_max, -1)); //imgui_wrapper->text(_L(" ")); @@ -839,8 +854,6 @@ void GizmoObjectManipulation::do_render_scale_input_window(ImGuiWrapper* imgui_w ImGui::BBLInputDouble(label_scale_values[0][2], &scale[2], 0.0f, 0.0f, "%.2f"); ImGui::SameLine(caption_max + (++index_unit) *unit_size + (++index) * space_size); imgui_wrapper->text(_L("%")); - m_buffered_scale = scale; - if (m_show_clear_scale) { ImGui::SameLine(caption_max + 3 * unit_size + 4 * space_size + end_text_size); @@ -851,7 +864,6 @@ void GizmoObjectManipulation::do_render_scale_input_window(ImGuiWrapper* imgui_w ImGui::InvisibleButton("", ImVec2(ImGui::GetFontSize(), ImGui::GetFontSize())); } - //Size Vec3d original_size; if (this->m_imperial_units) @@ -875,6 +887,12 @@ void GizmoObjectManipulation::do_render_scale_input_window(ImGuiWrapper* imgui_w ImGui::BBLInputDouble(label_scale_values[1][2], &display_size[2], 0.0f, 0.0f, "%.2f"); ImGui::SameLine(caption_max + (++index_unit) *unit_size + (++index) * space_size); imgui_wrapper->text(this->m_new_unit_string); + + for (int i = 0;i MAX_NUM || scale[i]> MAX_NUM)display_size[i] = MAX_NUM; + } + m_buffered_scale = scale; m_buffered_size = display_size; int size_sel = update(current_active_id, "size", original_size, m_buffered_size); ImGui::PopStyleVar(1); diff --git a/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp b/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp index 6a295f1a66..39ceee5dbf 100644 --- a/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp +++ b/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp @@ -19,6 +19,8 @@ class GizmoObjectManipulation public: static const double in_to_mm; static const double mm_to_in; + static const double g_to_oz; + static const double oz_to_g; struct Cache { diff --git a/src/slic3r/GUI/IMSlider.cpp b/src/slic3r/GUI/IMSlider.cpp index 7a89e13639..44376d35f4 100644 --- a/src/slic3r/GUI/IMSlider.cpp +++ b/src/slic3r/GUI/IMSlider.cpp @@ -451,6 +451,8 @@ bool IMSlider::init_texture() result &= IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/one_layer_off.svg", 28, 28, m_one_layer_off_id); result &= IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/one_layer_off_hover.svg", 28, 28, m_one_layer_off_hover_id); result &= IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/one_layer_arrow.svg", 28, 28, m_one_layer_arrow_id); + result &= IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/im_gcode_pause.svg", 14, 14, m_pause_icon_id); + result &= IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/im_slider_delete.svg", 14, 14, m_delete_icon_id); } return result; @@ -859,11 +861,13 @@ void IMSlider::draw_ticks(const ImRect& slideable_region) { if (m_ticks.empty()) return; + ImGuiContext &context = *GImGui; + ImVec2 tick_box = ImVec2(46.0f, 16.0f) * m_scale; ImVec2 tick_offset = ImVec2(19.0f, 11.0f) * m_scale; float tick_width = 1.0f * m_scale; ImVec2 icon_offset = ImVec2(13.0f, 7.0f) * m_scale; - ImVec2 icon_size = ImVec2(16.0f, 16.0f) * m_scale; + ImVec2 icon_size = ImVec2(14.0f, 14.0f) * m_scale; const ImU32 tick_clr = IM_COL32(144, 144, 144, 255); const ImU32 tick_hover_box_clr = IM_COL32(219, 253, 231, 255); @@ -876,12 +880,10 @@ void IMSlider::draw_ticks(const ImRect& slideable_region) { return get_pos_from_value(v_min, v_max, tick, slideable_region); }; - - float tick_pos; std::set::const_iterator tick_it = m_ticks.ticks.begin(); while (tick_it != m_ticks.ticks.end()) { - tick_pos = get_tick_pos(tick_it->tick); + float tick_pos = get_tick_pos(tick_it->tick); //draw tick hover box when hovered ImRect tick_hover_box = ImRect(slideable_region.GetCenter().x - tick_box.x / 2, tick_pos - tick_box.y / 2, slideable_region.GetCenter().x + tick_box.x / 2, @@ -890,8 +892,10 @@ void IMSlider::draw_ticks(const ImRect& slideable_region) { if (ImGui::IsMouseHoveringRect(tick_hover_box.Min, tick_hover_box.Max)) { ImGui::RenderFrame(tick_hover_box.Min, tick_hover_box.Max, tick_hover_box_clr, false); - m_tick_value = tick_it->tick; - m_tick_rect = ImVec4(tick_hover_box.Min.x, tick_hover_box.Min.y, tick_hover_box.Max.x, tick_hover_box.Max.y); + if (context.IO.MouseClicked[0]) { + m_tick_value = tick_it->tick; + m_tick_rect = ImVec4(tick_hover_box.Min.x, tick_hover_box.Min.y, tick_hover_box.Max.x, tick_hover_box.Max.y); + } } ++tick_it; } @@ -899,7 +903,7 @@ void IMSlider::draw_ticks(const ImRect& slideable_region) { tick_it = m_ticks.ticks.begin(); while (tick_it != m_ticks.ticks.end()) { - tick_pos = get_tick_pos(tick_it->tick); + float tick_pos = get_tick_pos(tick_it->tick); //draw ticks ImRect tick_left = ImRect(slideable_region.GetCenter().x - tick_offset.x, tick_pos - tick_width, slideable_region.GetCenter().x - tick_offset.y, tick_pos); @@ -908,17 +912,36 @@ void IMSlider::draw_ticks(const ImRect& slideable_region) { ImGui::RenderFrame(tick_right.Min, tick_right.Max, tick_clr, false); //draw pause icon - ImGui::PushID(tick_it->tick); - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); if (tick_it->type == PausePrint) { - std::wstring pause_icon_name = ImGui::GcodePauseIcon + boost::nowide::widen(std::string("")); - button_with_pos(into_u8(pause_icon_name).c_str(), icon_size, ImVec2(slideable_region.GetCenter().x + icon_offset.x, tick_pos - icon_offset.y)); + ImTextureID pause_icon_id = m_pause_icon_id; + ImVec2 icon_pos = ImVec2(slideable_region.GetCenter().x + icon_offset.x, tick_pos - icon_offset.y); + button_with_pos(pause_icon_id, icon_size, icon_pos); + if (ImGui::IsMouseHoveringRect(icon_pos, icon_pos + icon_size)) { + if(context.IO.MouseClicked[0]) + int a = 0; + } } - ImGui::PopStyleColor(1); - ImGui::PopID(); - ++tick_it; } + + tick_it = GetSelection() == ssHigher ? m_ticks.ticks.find(TickCode{this->GetHigherValue()}) : + GetSelection() == ssLower ? m_ticks.ticks.find(TickCode{this->GetLowerValue()}) : + m_ticks.ticks.end(); + if (tick_it != m_ticks.ticks.end()) { + // draw delete icon + ImTextureID delete_icon_id = m_delete_icon_id; + ImVec2 icon_pos = ImVec2(slideable_region.GetCenter().x + icon_offset.x, get_tick_pos(tick_it->tick) - icon_offset.y); + button_with_pos(m_delete_icon_id, icon_size, icon_pos); + if (ImGui::IsMouseHoveringRect(icon_pos, icon_pos + icon_size)) { + if (context.IO.MouseClicked[0]) { + // delete tick + Type type = tick_it->type; + m_ticks.ticks.erase(tick_it); + post_ticks_changed_event(type); + } + } + } + } bool IMSlider::vertical_slider(const char* str_id, int* higher_value, int* lower_value, std::string& higher_label, std::string& lower_label,int v_min, int v_max, const ImVec2& pos,const ImVec2& size, SelectedSlider& selection, bool one_layer_flag, float scale) @@ -989,8 +1012,7 @@ bool IMSlider::vertical_slider(const char* str_id, int* higher_value, int* lower ImRect one_handle = ImRect(higher_handle.Min - ImVec2(one_handle_offset, 0), higher_handle.Max - ImVec2(one_handle_offset, 0)); - static bool become_del_handle = false; - static bool pressed_in_del = false; + //static bool become_del_handle = false; bool value_changed = false; if (!one_layer_flag) { @@ -999,14 +1021,10 @@ bool IMSlider::vertical_slider(const char* str_id, int* higher_value, int* lower if (ImGui::ItemHoverable(higher_handle, id) && context.IO.MouseClicked[0]) { selection = ssHigher; h_selected = true; - m_tick_value = -1; - m_tick_rect = ImVec4(); } if (ImGui::ItemHoverable(lower_handle, id) && context.IO.MouseClicked[0]) { selection = ssLower; h_selected = false; - m_tick_value = -1; - m_tick_rect = ImVec4(); } // update handle position and value @@ -1015,31 +1033,11 @@ bool IMSlider::vertical_slider(const char* str_id, int* higher_value, int* lower value_changed = slider_behavior(id, higher_slideable_region, v_min, v_max, higher_value, &higher_handle, ImGuiSliderFlags_Vertical, m_tick_value, m_tick_rect); - - auto it = m_ticks.ticks.find(TickCode{ *higher_value }); - if (it != m_ticks.ticks.end() && check_ticks_changed_event(it->type)) - { - become_del_handle = true; - } - else { - become_del_handle = false; - pressed_in_del = false; - } } if (!h_selected) { value_changed = slider_behavior(id, lower_slideable_region, v_min, v_max, lower_value, &lower_handle, ImGuiSliderFlags_Vertical, m_tick_value, m_tick_rect); - - auto it = m_ticks.ticks.find(TickCode{ *lower_value }); - if (it != m_ticks.ticks.end() && check_ticks_changed_event(it->type)) - { - become_del_handle = true; - } - else { - become_del_handle = false; - pressed_in_del = false; - } } ImVec2 higher_handle_center = higher_handle.GetCenter(); @@ -1095,37 +1093,6 @@ bool IMSlider::vertical_slider(const char* str_id, int* higher_value, int* lower window->DrawList->AddLine(lower_handle_center + ImVec2(0.0f, -line_offset), lower_handle_center + ImVec2(0.0f, line_offset), white_bg, line_width); } - if (become_del_handle) { - - if (context.IO.MouseDown[0] && - (ImGui::ItemHoverable(h_selected ? higher_handle : lower_handle, id))) - { - pressed_in_del = true; - } - if (pressed_in_del && context.IO.MouseReleased[0] && ImGui::ItemHoverable(h_selected ? higher_handle : lower_handle, id)) { - pressed_in_del = false; - //delete tick - auto it = m_ticks.ticks.find(TickCode{ h_selected ? *higher_value : *lower_value }); - if (it != m_ticks.ticks.end() && check_ticks_changed_event(it->type)) - { - Type type = it->type; - m_ticks.ticks.erase(it); - post_ticks_changed_event(type); - m_tick_value = -1; - m_tick_rect = ImVec4(); - } - } - - if (h_selected) { - window->DrawList->AddCircleFilled(higher_handle_center, handle_radius - handle_border, delete_btn_clr); - window->DrawList->AddLine(higher_handle_center + ImVec2(-line_offset, 0.0f), higher_handle_center + ImVec2(line_offset, 0.0f), white_bg, line_width); - } - if (!h_selected) { - window->DrawList->AddCircleFilled(lower_handle_center, handle_radius - handle_border, delete_btn_clr); - window->DrawList->AddLine(lower_handle_center + ImVec2(-line_offset, 0.0f), lower_handle_center + ImVec2(line_offset, 0.0f), white_bg, line_width); - } - } - // draw higher label auto text_utf8 = into_u8(higher_label); text_content_size = ImGui::CalcTextSize(text_utf8.c_str()); @@ -1157,15 +1124,7 @@ bool IMSlider::vertical_slider(const char* str_id, int* higher_value, int* lower value_changed = slider_behavior(id, one_slideable_region, v_min, v_max, higher_value, &one_handle, ImGuiSliderFlags_Vertical, m_tick_value, m_tick_rect); - auto it = m_ticks.ticks.find(TickCode{ *higher_value }); - if (it != m_ticks.ticks.end() && check_ticks_changed_event(it->type)) - { - become_del_handle = true; - } - else { - become_del_handle = false; - pressed_in_del; - } + ImVec2 handle_center = one_handle.GetCenter(); // judge whether to open menu @@ -1190,28 +1149,6 @@ bool IMSlider::vertical_slider(const char* str_id, int* higher_value, int* lower window->DrawList->AddCircleFilled(handle_center, handle_radius - handle_border, handle_clr); window->DrawList->AddLine(handle_center + ImVec2(-line_offset, 0.0f), handle_center + ImVec2(line_offset, 0.0f), white_bg, line_width); window->DrawList->AddLine(handle_center + ImVec2(0.0f, -line_offset), handle_center + ImVec2(0.0f, line_offset), white_bg, line_width); - if (become_del_handle) { - if (context.IO.MouseDown[0] && - (ImGui::ItemHoverable(one_handle, id))) - { - pressed_in_del = true; - } - if (pressed_in_del && context.IO.MouseReleased[0] && ImGui::ItemHoverable(one_handle, id)) { - pressed_in_del = false; - //delete tick - auto it = m_ticks.ticks.find(TickCode{ *higher_value }); - if (it != m_ticks.ticks.end() && check_ticks_changed_event(it->type)) - { - Type type = it->type; - m_ticks.ticks.erase(it); - post_ticks_changed_event(type); - m_tick_value = -1; - m_tick_rect = ImVec4(); - } - } - window->DrawList->AddCircleFilled(handle_center, handle_radius - handle_border, delete_btn_clr); - window->DrawList->AddLine(handle_center + ImVec2(-line_offset, 0.0f), handle_center + ImVec2(line_offset, 0.0f), white_bg, line_width); - } // draw label auto text_utf8 = into_u8(higher_label); @@ -1222,6 +1159,7 @@ bool IMSlider::vertical_slider(const char* str_id, int* higher_value, int* lower ImGui::RenderFrame(text_rect.Min, text_rect.Max, white_bg, false, rounding); ImGui::RenderText(text_start + text_padding, higher_label.c_str()); } + return value_changed; } @@ -1294,6 +1232,7 @@ bool IMSlider::render(int canvas_width, int canvas_height) ImGui::PopStyleVar(3); ImGui::PopStyleColor(2); + return result; } diff --git a/src/slic3r/GUI/IMSlider.hpp b/src/slic3r/GUI/IMSlider.hpp index 9389f2ff6c..5967bcd875 100644 --- a/src/slic3r/GUI/IMSlider.hpp +++ b/src/slic3r/GUI/IMSlider.hpp @@ -343,6 +343,8 @@ private: void *m_one_layer_arrow_id; void *m_one_layer_off_id; void *m_one_layer_off_hover_id; + void *m_pause_icon_id; + void *m_delete_icon_id; DrawMode m_draw_mode = dmRegular; Mode m_mode = SingleExtruder; diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index c338fcbf93..18a784b938 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -64,8 +64,7 @@ static const std::map font_icons = { {ImGui::FragmentFilterIcon , "fragment_filter" }, {ImGui::FoldButtonIcon , "im_fold" }, {ImGui::UnfoldButtonIcon , "im_unfold" }, - {ImGui::GcodePauseIcon , "im_gcode_pause" }, - {ImGui::SphereButtonIcon , "toolbar_modifier_sphere" }, + {ImGui::SphereButtonIcon , "toolbar_modifier_sphere" }, }; static const std::map font_icons_large = { @@ -257,30 +256,37 @@ bool slider_behavior(ImGuiID id, const ImRect& region, const ImS32 v_min, const return value_changed; } -bool button_with_pos(const char* label, const ImVec2& size, const ImVec2& pos, ImGuiButtonFlags flags/* = 0*/) { +bool button_with_pos(ImTextureID user_texture_id, const ImVec2 &size, const ImVec2 &pos, const ImVec2 &uv0, const ImVec2 &uv1, int frame_padding, const ImVec4 &bg_col, const ImVec4 &tint_col, const ImVec2 &margin) +{ - ImGuiWindow* window = ImGui::GetCurrentWindow(); - if (window->SkipItems) - return false; + ImGuiContext &g = *GImGui; + ImGuiWindow * window = g.CurrentWindow; + if (window->SkipItems) return false; - ImGuiContext& g = *GImGui; - const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(label); - const ImVec2 label_size = ImGui::CalcTextSize(label, NULL, true); + // Default to using texture ID as ID. User can still push string/integer prefixes. + ImGui::PushID((void *) (intptr_t) user_texture_id); + const ImGuiID id = window->GetID("#image"); + ImGui::PopID(); - const ImRect bb(pos, pos + size); + const ImVec2 padding = (frame_padding >= 0) ? ImVec2((float) frame_padding, (float) frame_padding) : g.Style.FramePadding; + + const ImRect bb(pos, pos + size + padding * 2 + margin * 2); bool hovered, held; - bool pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held, flags); + bool pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held); // Render const ImU32 col = ImGui::GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); ImGui::RenderNavHighlight(bb, id); - ImGui::RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding); - if (g.LogEnabled) - ImGui::LogSetNextTextDecoration("[", "]"); - ImGui::RenderTextClipped(bb.Min + style.FramePadding, bb.Max - style.FramePadding, label, NULL, &label_size, style.ButtonTextAlign, &bb); + const float border_size = g.Style.FrameBorderSize; + if (border_size > 0.0f) { + window->DrawList->AddRect(bb.Min + ImVec2(1, 1), bb.Max + ImVec2(1, 1), col, g.Style.FrameRounding, 0, border_size); + window->DrawList->AddRect(bb.Min, bb.Max, col, g.Style.FrameRounding, 0, border_size); + } + + if (bg_col.w > 0.0f) window->DrawList->AddRectFilled(bb.Min + padding, bb.Max - padding, ImGui::GetColorU32(bg_col)); + window->DrawList->AddImage(user_texture_id, bb.Min + padding + margin, bb.Max - padding - margin, uv0, uv1, ImGui::GetColorU32(tint_col)); return pressed; } diff --git a/src/slic3r/GUI/ImGuiWrapper.hpp b/src/slic3r/GUI/ImGuiWrapper.hpp index 51de3372b0..db57b95cb7 100644 --- a/src/slic3r/GUI/ImGuiWrapper.hpp +++ b/src/slic3r/GUI/ImGuiWrapper.hpp @@ -28,7 +28,15 @@ namespace GUI { bool get_data_from_svg(const std::string &filename, unsigned int max_size_px, ThumbnailData &thumbnail_data); bool slider_behavior(ImGuiID id, const ImRect& region, const ImS32 v_min, const ImS32 v_max, ImS32* out_value, ImRect* out_handle, ImGuiSliderFlags flags = 0, const int fixed_value = -1, const ImVec4& fixed_rect = ImVec4()); -bool button_with_pos(const char* label, const ImVec2& size, const ImVec2& pos, ImGuiButtonFlags flags = 0); +bool button_with_pos(ImTextureID user_texture_id, + const ImVec2 &size, + const ImVec2 &pos, + const ImVec2 &uv0 = ImVec2(0, 0), + const ImVec2 &uv1 = ImVec2(1, 1), + int frame_padding = -1, + const ImVec4 &bg_col = ImVec4(0, 0, 0, 0), + const ImVec4 &tint_col = ImVec4(1, 1, 1, 1), + const ImVec2 &margin = ImVec2(0, 0)); bool menu_item_with_icon(const char* label, const char* shortcut, ImU32 icon_color, bool selected, bool enabled = true); diff --git a/src/slic3r/GUI/Jobs/BindJob.cpp b/src/slic3r/GUI/Jobs/BindJob.cpp index bb25185ba2..74d8ecf19a 100644 --- a/src/slic3r/GUI/Jobs/BindJob.cpp +++ b/src/slic3r/GUI/Jobs/BindJob.cpp @@ -99,9 +99,11 @@ void BindJob::process() } else if (stage == BBL::BindJobStage::LoginStageFinished) { curr_percent = 100; msg = _L("Logging in"); + } else { + msg = _L("Logging in"); } if (code != 0) { - msg = login_failed_str + wxString::Format("(code=%d,info=%s)", code, info); + msg = _L("Login failed") + wxString::Format("(code=%d,info=%s)", code, info); } update_status(curr_percent, msg); } diff --git a/src/slic3r/GUI/Jobs/PrintJob.cpp b/src/slic3r/GUI/Jobs/PrintJob.cpp index de64b119a0..7c3229fa21 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.cpp +++ b/src/slic3r/GUI/Jobs/PrintJob.cpp @@ -51,6 +51,49 @@ void PrintJob::on_success(std::function success) m_success_fun = success; } +wxString PrintJob::get_http_error_msg(unsigned int status, std::string body) +{ + int code = 0; + std::string error; + std::string message; + wxString result; + if (status >= 400 && status < 500) + try { + json j = json::parse(body); + if (j.contains("code")) { + if (!j["code"].is_null()) + code = j["code"].get(); + } + if (j.contains("error")) { + if (!j["error"].is_null()) + error = j["error"].get(); + } + if (j.contains("message")) { + if (!j["message"].is_null()) + message = j["message"].get(); + } + switch (status) { + ; + } + } + catch (...) { + ; + } + else if (status == 503) { + return _L("Service Unavailable"); + } + else { + wxString unkown_text = _L("Unkown Error."); + unkown_text += wxString::Format("status=%u, body=%s", status, body); + return unkown_text; + } + + BOOST_LOG_TRIVIAL(error) << "http_error: status=" << status << ", code=" << code << ", error=" << error; + + result = wxString::Format("code=%u, error=%s", code, from_u8(error)); + return result; +} + void PrintJob::process() { /* display info */ @@ -114,8 +157,10 @@ void PrintJob::process() params.dev_ip = m_dev_ip; params.username = "bblp"; params.password = m_access_code; + wxString error_text; + wxString msg_text; - auto update_fn = [this, &msg, &curr_percent](int stage, int code, std::string info) { + auto update_fn = [this, &msg, &curr_percent, &error_text](int stage, int code, std::string info) { if (stage == BBL::SendingPrintJobStage::PrintingStageCreate) { if (this->connection_type == "lan") { msg = _L("Sending print job over LAN"); @@ -157,7 +202,7 @@ void PrintJob::process() } else if (stage == BBL::SendingPrintJobStage::PrintingStageFinished) { curr_percent = 100; - msg = wxString::Format(_L("Successfully sent.Will automatically jump to the device page in %s s"), info); + msg = wxString::Format(_L("Successfully sent. Will automatically jump to the device page in %s s"), info); } else { if (this->connection_type == "lan") { msg = _L("Sending print job over LAN"); @@ -165,6 +210,10 @@ void PrintJob::process() msg = _L("Sending print job through cloud service"); } } + if (code != 0) { + error_text = this->get_http_error_msg(code, info); + msg += wxString::Format("[%s]", error_text); + } this->update_status(curr_percent, msg); }; @@ -193,19 +242,6 @@ void PrintJob::process() BOOST_LOG_TRIVIAL(info) << "print_job: send with cloud"; this->update_status(curr_percent, _L("Sending print job through cloud service")); result = m_agent->start_print(params, update_fn, cancel_fn); - if (result < 0) { - if (!params.password.empty() && !params.dev_ip.empty()) { - //try to send with local only - if (this->has_sdcard) { - this->update_status(curr_percent, _L("Sending print job over LAN")); - result = m_agent->start_local_print(params, update_fn, cancel_fn); - } else { - this->update_status(curr_percent, _L("Failed to connect to the cloud server connection. Please insert an SD card and resend the print job, which will transfer the print file via LAN. ")); - BOOST_LOG_TRIVIAL(error) << "print_job: failed, need sdcard"; - return; - } - } - } } } else { if (this->has_sdcard) { @@ -224,26 +260,29 @@ void PrintJob::process() if (result < 0) { if (result == BAMBU_NETWORK_ERR_FTP_LOGIN_DENIED) { - update_status(curr_percent, upload_failed_str); + msg_text = upload_failed_str; } if (result == BAMBU_NETWORK_ERR_FILE_NOT_EXIST) { - update_status(curr_percent, file_is_not_exists_str); + msg_text = file_is_not_exists_str; } else if (result == BAMBU_NETWORK_ERR_FILE_OVER_SIZE) { - update_status(curr_percent, file_over_size_str); + msg_text = file_over_size_str; } else if (result == BAMBU_NETWORK_ERR_CHECK_MD5_FAILED) { - update_status(curr_percent, failed_in_cloud_service_str); + msg_text = failed_in_cloud_service_str; } else if (result == BAMBU_NETWORK_ERR_INVALID_PARAMS) { - update_status(curr_percent, upload_failed_str); + msg_text = upload_failed_str; } else if (result == BAMBU_NETWORK_ERR_CANCELED) { - update_status(curr_percent, print_canceled_str); + msg_text = print_canceled_str; } else if (result == BAMBU_NETWORK_ERR_TIMEOUT) { - update_status(curr_percent, timeout_to_upload_str); + msg_text = timeout_to_upload_str; } else if (result == BAMBU_NETWORK_ERR_INVALID_RESULT) { - update_status(curr_percent, upload_failed_str); + msg_text = upload_failed_str; } else if (result == BAMBU_NETWORK_ERR_FTP_UPLOAD_FAILED) { - update_status(curr_percent, upload_failed_str); + msg_text = upload_failed_str; } else { update_status(curr_percent, failed_in_cloud_service_str); } + if (!error_text.IsEmpty()) + msg_text += wxString::Format("[%s]", error_text); + update_status(curr_percent, msg_text); BOOST_LOG_TRIVIAL(error) << "print_job: failed, result = " << result; } else { BOOST_LOG_TRIVIAL(error) << "print_job: send ok."; diff --git a/src/slic3r/GUI/Jobs/PrintJob.hpp b/src/slic3r/GUI/Jobs/PrintJob.hpp index eb3a673481..dae9d1ea50 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.hpp +++ b/src/slic3r/GUI/Jobs/PrintJob.hpp @@ -70,6 +70,7 @@ public: void set_print_job_finished_event(int event_id) { m_print_job_completed_id = event_id; } void on_success(std::function success); + wxString get_http_error_msg(unsigned int status, std::string body); void process() override; void finalize() override; }; diff --git a/src/slic3r/GUI/Jobs/UpgradeNetworkJob.cpp b/src/slic3r/GUI/Jobs/UpgradeNetworkJob.cpp new file mode 100644 index 0000000000..3aa9a1b058 --- /dev/null +++ b/src/slic3r/GUI/Jobs/UpgradeNetworkJob.cpp @@ -0,0 +1,136 @@ +#include "UpgradeNetworkJob.hpp" + +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/Utils/Http.hpp" + +namespace Slic3r { +namespace GUI { + +wxDEFINE_EVENT(EVT_UPGRADE_UPDATE_MESSAGE, wxCommandEvent); +wxDEFINE_EVENT(EVT_UPGRADE_NETWORK_SUCCESS, wxCommandEvent); +wxDEFINE_EVENT(EVT_UPGRADE_NETWORK_FAILED, wxCommandEvent); + + +UpgradeNetworkJob::UpgradeNetworkJob(std::shared_ptr pri) + : Job{std::move(pri)} +{ + ; +} + +void UpgradeNetworkJob::on_exception(const std::exception_ptr &eptr) +{ + try { + if (eptr) + std::rethrow_exception(eptr); + } catch (std::exception &e) { + UpgradeNetworkJob::on_exception(eptr); + } +} + +void UpgradeNetworkJob::on_success(std::function success) +{ + m_success_fun = success; +} + +void UpgradeNetworkJob::update_status(int st, const wxString &msg) +{ + GUI::Job::update_status(st, msg); + wxCommandEvent event(EVT_UPGRADE_UPDATE_MESSAGE); + event.SetString(msg); + event.SetEventObject(m_event_handle); + wxPostEvent(m_event_handle, event); +} + +void UpgradeNetworkJob::process() +{ + // downloading + int result = 0; + + AppConfig* app_config = wxGetApp().app_config; + if (!app_config) + return; + + BOOST_LOG_TRIVIAL(info) << "[download_plugin]: enter"; + + // get temp path + fs::path target_file_path = (fs::temp_directory_path() / "network_plugin.zip"); + fs::path tmp_path = target_file_path; + auto path_str = tmp_path.string() + wxString::Format(".%d%s", get_current_pid(), ".tmp").ToStdString(); + tmp_path = fs::path(path_str); + + auto cancel_fn = [this]() { + return was_canceled(); + }; + int curr_percent = 0; + result = wxGetApp().download_plugin( + [this, &curr_percent](int state, int percent, bool &cancel) { + if (state == InstallStatusNormal) { + update_status(percent, _L("Downloading")); + } else if (state == InstallStatusDownloadFailed) { + update_status(percent, _L("Download failed")); + } else { + update_status(percent, _L("Downloading")); + } + curr_percent = percent; + }, cancel_fn); + + if (was_canceled()) { + update_status(0, _L("Cancelled")); + wxCommandEvent event(wxEVT_CLOSE_WINDOW); + event.SetEventObject(m_event_handle); + wxPostEvent(m_event_handle, event); + return; + } + + if (result < 0) { + update_status(curr_percent, _L("Download failed")); + wxCommandEvent event(EVT_UPGRADE_NETWORK_FAILED); + event.SetEventObject(m_event_handle); + wxPostEvent(m_event_handle, event); + return; + } + + result = wxGetApp().install_plugin([this](int state, int percent, bool&cancel) { + if (state == InstallStatusInstallCompleted) { + update_status(percent, _L("Finish")); + } else { + update_status(percent, _L("Installing")); + } + }, cancel_fn); + + if (was_canceled()) { + update_status(0, _L("Cancelled")); + wxCommandEvent event(wxEVT_CLOSE_WINDOW); + event.SetEventObject(m_event_handle); + wxPostEvent(m_event_handle, event); + return; + } + + if (result != 0) { + update_status(curr_percent, _L("Install failed")); + wxCommandEvent event(EVT_UPGRADE_NETWORK_FAILED); + event.SetEventObject(m_event_handle); + wxPostEvent(m_event_handle, event); + return; + } + + wxCommandEvent event(EVT_UPGRADE_NETWORK_SUCCESS); + event.SetEventObject(m_event_handle); + wxPostEvent(m_event_handle, event); + return; +} + +void UpgradeNetworkJob::finalize() +{ + if (was_canceled()) return; + + Job::finalize(); +} + +void UpgradeNetworkJob::set_event_handle(wxWindow *hanle) +{ + m_event_handle = hanle; +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/UpgradeNetworkJob.hpp b/src/slic3r/GUI/Jobs/UpgradeNetworkJob.hpp new file mode 100644 index 0000000000..54c3c14c44 --- /dev/null +++ b/src/slic3r/GUI/Jobs/UpgradeNetworkJob.hpp @@ -0,0 +1,56 @@ +#ifndef __UpgradeNetworkJob_HPP__ +#define __UpgradeNetworkJob_HPP__ + +#include +#include "Job.hpp" + +namespace fs = boost::filesystem; + +namespace Slic3r { +namespace GUI { + +enum PluginInstallStatus { + InstallStatusNormal = 0, + InstallStatusDownloadFailed = 1, + InstallStatusDownloadCompleted = 2, + InstallStatusUnzipFailed = 3, + InstallStatusInstallCompleted = 4, +}; + +typedef std::function InstallProgressFn; + +class UpgradeNetworkJob : public Job +{ + wxWindow * m_event_handle{nullptr}; + std::function m_success_fun{nullptr}; + bool m_job_finished{ false }; + int m_print_job_completed_id = 0; + + InstallProgressFn pro_fn { nullptr }; + +protected: + void on_exception(const std::exception_ptr &) override; +public: + UpgradeNetworkJob(std::shared_ptr pri); + + int status_range() const override + { + return 100; + } + + bool is_finished() { return m_job_finished; } + + void on_success(std::function success); + void update_status(int st, const wxString &msg); + void process() override; + void finalize() override; + void set_event_handle(wxWindow* hanle); +}; + +wxDECLARE_EVENT(EVT_UPGRADE_UPDATE_MESSAGE, wxCommandEvent); +wxDECLARE_EVENT(EVT_UPGRADE_NETWORK_SUCCESS, wxCommandEvent); +wxDECLARE_EVENT(EVT_UPGRADE_NETWORK_FAILED, wxCommandEvent); + +}} // namespace Slic3r::GUI + +#endif // ARRANGEJOB_HPP diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index fd89775139..2daa173458 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -157,7 +157,7 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, BORDERLESS_FRAME_ #ifdef __WXOSX__ set_miniaturizable(GetHandle()); #endif - + //reset developer_mode to false and user_mode to comAdvanced wxGetApp().app_config->set_bool("developer_mode", false); if (wxGetApp().app_config->get("user_mode") == "develop") { @@ -178,17 +178,17 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, BORDERLESS_FRAME_ // Fonts were created by the DPIFrame constructor for the monitor, on which the window opened. wxGetApp().update_fonts(this); - #ifdef __WINDOWS__ - m_topbar = new BBLTopbar(this); - #else +#ifdef __WINDOWS__ + m_topbar = new BBLTopbar(this); +#else auto panel_topbar = new wxPanel(this, wxID_ANY); panel_topbar->SetBackgroundColour(wxColour(38, 46, 48)); auto sizer_tobar = new wxBoxSizer(wxVERTICAL); - m_topbar = new BBLTopbar(panel_topbar, this); + m_topbar = new BBLTopbar(this); sizer_tobar->Add(m_topbar, 0, wxEXPAND); panel_topbar->SetSizer(sizer_tobar); panel_topbar->Layout(); - #endif +#endif @@ -326,11 +326,11 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, BORDERLESS_FRAME_ // initialize layout m_main_sizer = new wxBoxSizer(wxVERTICAL); wxSizer* sizer = new wxBoxSizer(wxVERTICAL); - #ifdef __WINDOWS__ +#ifdef __WINDOWS__ sizer->Add(m_topbar, 0, wxEXPAND); - #else +#else sizer->Add(panel_topbar, 0, wxEXPAND); - #endif // __WINDOWS__ +#endif // __WINDOWS__ sizer->Add(m_main_sizer, 1, wxEXPAND); @@ -357,14 +357,10 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, BORDERLESS_FRAME_ Fit(); const wxSize min_size = wxGetApp().get_min_size(); //wxSize(76*wxGetApp().em_unit(), 49*wxGetApp().em_unit()); -#ifdef __APPLE__ - // Using SetMinSize() on Mac messes up the window position in some cases - // cf. https://groups.google.com/forum/#!topic/wx-users/yUKPBBfXWO0 - SetSize(min_size/*wxSize(760, 490)*/); -#else + SetMinSize(min_size/*wxSize(760, 490)*/); SetSize(wxSize(FromDIP(1200), FromDIP(800))); -#endif + Layout(); update_title(); @@ -747,6 +743,29 @@ void MainFrame::init_tabpanel() m_tabpanel->Hide(); m_settings_dialog.set_tabpanel(m_tabpanel); + m_tabpanel->Bind(wxEVT_NOTEBOOK_PAGE_CHANGING, [this](wxBookCtrlEvent& e) { + int old_sel = e.GetOldSelection(); + int new_sel = e.GetSelection(); + if (new_sel == tpMonitor) { + if (!wxGetApp().getAgent()) { + e.Veto(); + BOOST_LOG_TRIVIAL(info) << boost::format("skipped tab switch from %1% to %2%, lack of network plugins")%old_sel %new_sel; + if (m_plater) { + wxCommandEvent *evt = new wxCommandEvent(EVT_INSTALL_PLUGIN_HINT); + wxQueueEvent(m_plater, evt); + } + } + } + else if (new_sel == tp3DEditor) { + if (m_plater && (m_plater->only_gcode_mode() || (m_plater->using_exported_file()))) { + e.Veto(); + BOOST_LOG_TRIVIAL(info) << boost::format("skipped tab switch from %1% to %2% in preview mode")%old_sel %new_sel; + wxCommandEvent *evt = new wxCommandEvent(EVT_PREVIEW_ONLY_MODE_HINT); + wxQueueEvent(m_plater, evt); + } + } + }); + #ifdef __WXMSW__ m_tabpanel->Bind(wxEVT_BOOKCTRL_PAGE_CHANGED, [this](wxBookCtrlEvent& e) { #else @@ -758,12 +777,11 @@ void MainFrame::init_tabpanel() //wxString page_text = m_tabpanel->GetPageText(sel); m_last_selected_tab = m_tabpanel->GetSelection(); if (panel == m_plater) { - if (m_with_3dEditor && (sel == tp3DEditor)) { + if (sel == tp3DEditor) { wxPostEvent(m_plater, SimpleEvent(EVT_GLVIEWTOOLBAR_3D)); m_param_panel->OnActivate(); } - else if ((m_with_3dEditor&&(sel == tpPreview)) - || (!m_with_3dEditor&&(sel == tp3DEditor))){ + else if (sel == tpPreview) { wxPostEvent(m_plater, SimpleEvent(EVT_GLVIEWTOOLBAR_PREVIEW)); m_param_panel->OnActivate(); } @@ -774,7 +792,7 @@ void MainFrame::init_tabpanel() //monitor } - if (m_with_3dEditor && (sel == tp3DEditor)) { + if (sel == tp3DEditor) { m_topbar->EnableUndoRedoItems(); } else { @@ -1659,10 +1677,13 @@ void MainFrame::init_menubar_as_editor() append_menu_item(export_menu, wxID_ANY, _L("Export all objects as STL") + dots, _L("Export all objects as STL"), [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(); }, "menu_export_stl", nullptr, [this](){return can_export_model(); }, this); - // BBS export Gcode - wxMenuItem* item_export_gcode = append_menu_item(export_menu, wxID_ANY, _L("Export Sliced File") + dots/* + "\tCtrl+G"*/, _L("Export current Sliced file"), + // BBS export .gcode.3mf + append_menu_item(export_menu, wxID_ANY, _L("Export Sliced File") + dots/* + "\tCtrl+G"*/, _L("Export current Sliced file"), [this](wxCommandEvent&) { if (m_plater) wxPostEvent(m_plater, SimpleEvent(EVT_GLTOOLBAR_EXPORT_SLICED_FILE)); }, "menu_export_sliced_file", nullptr, [this](){return can_export_gcode(); }, this); + 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(false); }, "menu_export_gcode", nullptr, + [this]() {return can_export_gcode(); }, this); append_submenu(fileMenu, export_menu, wxID_ANY, _L("Export"), ""); @@ -1775,20 +1796,20 @@ void MainFrame::init_menubar_as_editor() append_menu_item(editMenu, wxID_ANY, _L("Deselect all") + "\tEsc", _L("Deselects all objects"), [this](wxCommandEvent&) { m_plater->deselect_all(); }, "", nullptr, [this](){return can_deselect(); }, this); - editMenu->AppendSeparator(); - append_menu_check_item(editMenu, wxID_ANY, _L("Show Model Mesh(TODO)"), - _L("Display triangles of models"), [this](wxCommandEvent& evt) { - wxGetApp().app_config->set_bool("show_model_mesh", evt.GetInt() == 1); - }, nullptr, [this]() {return can_select(); }, [this]() { return wxGetApp().app_config->get("show_model_mesh").compare("true") == 0; }, this); - append_menu_check_item(editMenu, wxID_ANY, _L("Show Model Shadow(TODO)"), _L("Display shadow of objects"), - [this](wxCommandEvent& evt) { - wxGetApp().app_config->set_bool("show_model_shadow", evt.GetInt() == 1); - }, nullptr, [this]() {return can_select(); }, [this]() { return wxGetApp().app_config->get("show_model_shadow").compare("true") == 0; }, this); - editMenu->AppendSeparator(); - append_menu_check_item(editMenu, wxID_ANY, _L("Show Printable Box(TODO)"), _L("Display printable box"), - [this](wxCommandEvent& evt) { - wxGetApp().app_config->set_bool("show_printable_box", evt.GetInt() == 1); - }, nullptr, [this]() {return can_select(); }, [this]() { return wxGetApp().app_config->get("show_printable_box").compare("true") == 0; }, this); + //editMenu->AppendSeparator(); + //append_menu_check_item(editMenu, wxID_ANY, _L("Show Model Mesh(TODO)"), + // _L("Display triangles of models"), [this](wxCommandEvent& evt) { + // wxGetApp().app_config->set_bool("show_model_mesh", evt.GetInt() == 1); + // }, nullptr, [this]() {return can_select(); }, [this]() { return wxGetApp().app_config->get("show_model_mesh").compare("true") == 0; }, this); + //append_menu_check_item(editMenu, wxID_ANY, _L("Show Model Shadow(TODO)"), _L("Display shadow of objects"), + // [this](wxCommandEvent& evt) { + // wxGetApp().app_config->set_bool("show_model_shadow", evt.GetInt() == 1); + // }, nullptr, [this]() {return can_select(); }, [this]() { return wxGetApp().app_config->get("show_model_shadow").compare("true") == 0; }, this); + //editMenu->AppendSeparator(); + //append_menu_check_item(editMenu, wxID_ANY, _L("Show Printable Box(TODO)"), _L("Display printable box"), + // [this](wxCommandEvent& evt) { + // wxGetApp().app_config->set_bool("show_printable_box", evt.GetInt() == 1); + // }, nullptr, [this]() {return can_select(); }, [this]() { return wxGetApp().app_config->get("show_printable_box").compare("true") == 0; }, this); } // BBS @@ -2221,7 +2242,7 @@ void MainFrame::select_tab(wxPanel* panel) //BBS void MainFrame::jump_to_monitor(std::string dev_id) { - m_tabpanel->SetSelection(m_with_3dEditor? tpMonitor:(tpMonitor-1)); + m_tabpanel->SetSelection(tpMonitor); ((MonitorPanel*)m_monitor)->select_machine(dev_id); } @@ -2260,42 +2281,10 @@ void MainFrame::select_tab(size_t tab/* = size_t(-1)*/) select(false); } -void MainFrame::enable_tab(size_t tab, bool enabled) -{ - if (tab != tp3DEditor) - //currently only support 3dEditor - return; - - if ((enabled && m_with_3dEditor) || (!enabled && !m_with_3dEditor)) - //already done - return; - - Freeze(); - if (enabled) { - int sel = m_tabpanel->GetSelection(); - m_tabpanel->InsertPage(tab, m_plater, _L("Prepare"), std::string("tab_3d_active"), std::string("tab_3d_active")); - if (sel >= tab) - m_tabpanel->SetSelection(sel + 1); - } - else { - int sel = m_tabpanel->GetSelection(); - m_tabpanel->RemovePage(tab); - if (sel >= tab) - m_tabpanel->SetSelection(sel - 1); - } - m_with_3dEditor = enabled; - m_plater->Show(); - m_tabpanel->Show(); - Thaw(); -} - void MainFrame::request_select_tab(TabPosition pos) { - int position = pos; - if ((!m_with_3dEditor)&&(pos >= tpPreview)) - position = (int)pos -1; wxCommandEvent* evt = new wxCommandEvent(EVT_SELECT_TAB); - evt->SetInt(position); + evt->SetInt(pos); wxQueueEvent(this, evt); } @@ -2474,6 +2463,12 @@ void MainFrame::load_url(wxString url) wxQueueEvent(this, evt); } +void MainFrame::refresh_plugin_tips() +{ + if (m_webview != nullptr) + m_webview->ShowNetpluginTip(); +} + void MainFrame::RunScript(wxString js) { if (m_webview != nullptr) @@ -2525,7 +2520,7 @@ void MainFrame::on_select_default_preset(SimpleEvent& evt) { MessageDialog dialog(this, _L("Do you want to synchronize your personal data from Bambu Cloud? \n" - "Contains the following information:\n" + "It contains the following information:\n" "1. The Process presets\n" "2. The Filament presets\n" "3. The Printer presets\n"), diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 251bc65d55..d011edfabe 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -83,7 +83,6 @@ protected: class MainFrame : public DPIFrame { bool m_loaded {false}; - bool m_with_3dEditor { true }; wxString m_qs_last_input_file = wxEmptyString; wxString m_qs_last_output_file = wxEmptyString; @@ -278,7 +277,6 @@ public: // Select tab in m_tabpanel // When tab == -1, will be selected last selected tab //BBS: GUI refactor - void enable_tab(size_t tab, bool enabled = true); void select_tab(wxPanel* panel); void select_tab(size_t tab = size_t(-1)); void request_select_tab(TabPosition pos); @@ -301,6 +299,7 @@ public: //BBS void load_url(wxString url); + void refresh_plugin_tips(); void RunScript(wxString js); // BBS. Replace title bar and menu bar with top bar. diff --git a/src/slic3r/GUI/MarkdownTip.cpp b/src/slic3r/GUI/MarkdownTip.cpp index eb359471d4..7c387cc78e 100644 --- a/src/slic3r/GUI/MarkdownTip.cpp +++ b/src/slic3r/GUI/MarkdownTip.cpp @@ -108,19 +108,23 @@ bool MarkdownTip::ShowTip(wxPoint pos, std::string const &tip, std::string const return false; if (pos.x) { _hide = true; + BOOST_LOG_TRIVIAL(info) << "MarkdownTip::ShowTip: hide soon on empty tip."; this->Hide(); } else if (!_hide) { _hide = true; + BOOST_LOG_TRIVIAL(info) << "MarkdownTip::ShowTip: start hide timer (300)..."; _timer->StartOnce(300); } return false; } - if (_lastTip != tip) { + bool tipChanged = _lastTip != tip; + if (tipChanged) { auto content = LoadTip(tip, tooltip); if (content.empty()) { _hide = true; this->Hide(); + BOOST_LOG_TRIVIAL(info) << "MarkdownTip::ShowTip: hide soon on empty content."; return false; } auto script = "window.showMarkdown('" + url_encode(content) + "', true);"; @@ -140,8 +144,11 @@ bool MarkdownTip::ShowTip(wxPoint pos, std::string const &tip, std::string const if (pos.y + this->GetSize().y > size.y) pos.y = size.y - this->GetSize().y; this->SetPosition(pos); - _hide = false; - _timer->StartOnce(500); + if (tipChanged || _hide) { + _hide = false; + BOOST_LOG_TRIVIAL(info) << "MarkdownTip::ShowTip: start show timer (500)..."; + _timer->StartOnce(500); + } } return true; } @@ -264,11 +271,14 @@ void MarkdownTip::OnTimer(wxTimerEvent& event) if (_hide) { wxPoint pos = ScreenToClient(wxGetMousePosition()); if (GetClientRect().Contains(pos)) { + BOOST_LOG_TRIVIAL(info) << "MarkdownTip::OnTimer: restart hide timer..."; _timer->StartOnce(); return; } + BOOST_LOG_TRIVIAL(info) << "MarkdownTip::OnTimer: hide."; this->Hide(); } else { + BOOST_LOG_TRIVIAL(info) << "MarkdownTip::OnTimer: show."; this->Show(); } } diff --git a/src/slic3r/GUI/MediaFilePanel.cpp b/src/slic3r/GUI/MediaFilePanel.cpp index c9a78b1c7c..0f2fa8d2f4 100644 --- a/src/slic3r/GUI/MediaFilePanel.cpp +++ b/src/slic3r/GUI/MediaFilePanel.cpp @@ -163,7 +163,7 @@ void MediaFilePanel::SetMachineObject(MachineObject* obj) auto fs = m_image_grid->GetFileSystem(); if (fs) { m_image_grid->SetFileSystem(nullptr); - fs->Unbind(EVT_MODE_CHANGED, &MediaFilePanel::fileChanged, this); + fs->Unbind(EVT_MODE_CHANGED, &MediaFilePanel::modeChanged, this); fs->Stop(true); } if (m_machine.empty()) { @@ -171,7 +171,7 @@ void MediaFilePanel::SetMachineObject(MachineObject* obj) } else { boost::shared_ptr fs(new PrinterFileSystem); m_image_grid->SetFileSystem(fs); - fs->Bind(EVT_MODE_CHANGED, &MediaFilePanel::fileChanged, this); + fs->Bind(EVT_MODE_CHANGED, &MediaFilePanel::modeChanged, this); fs->Bind(EVT_STATUS_CHANGED, [this, wfs = boost::weak_ptr(fs)](auto &e) { boost::shared_ptr fs(wfs.lock()); if (m_image_grid->GetFileSystem() != fs) // canceled @@ -183,6 +183,7 @@ void MediaFilePanel::SetMachineObject(MachineObject* obj) case PrinterFileSystem::Connecting: icon = m_bmp_loading.bmp(); msg = _L("Connecting..."); break; case PrinterFileSystem::Failed: icon = m_bmp_failed.bmp(); msg = _L("Connect failed [%d]!"); break; case PrinterFileSystem::ListSyncing: icon = m_bmp_loading.bmp(); msg = _L("Loading file list..."); break; + case PrinterFileSystem::ListReady: icon = m_bmp_empty.bmp(); msg = _L("No files"); break; } if (fs->GetCount() == 0) m_image_grid->SetStatus(icon, msg); @@ -192,7 +193,7 @@ void MediaFilePanel::SetMachineObject(MachineObject* obj) if (IsShown()) fs->Start(); } wxCommandEvent e(EVT_MODE_CHANGED); - fileChanged(e); + modeChanged(e); } void MediaFilePanel::Rescale() @@ -218,12 +219,10 @@ void MediaFilePanel::Rescale() m_image_grid->Rescale(); } -void MediaFilePanel::fileChanged(wxCommandEvent& e1) +void MediaFilePanel::modeChanged(wxCommandEvent& e1) { e1.Skip(); auto fs = m_image_grid->GetFileSystem(); - if (fs) - m_image_grid->SetStatus(m_bmp_empty.bmp(), fs->GetCount() ? L"" : _L("No files")); auto mode = fs ? fs->GetGroupMode() : 0; if (m_last_mode == mode) return; @@ -247,7 +246,7 @@ void MediaFilePanel::fetchUrl(boost::weak_ptr wfs) BOOST_LOG_TRIVIAL(info) << "MediaFilePanel::fetchUrl: camera_url: " << url; CallAfter([this, url, wfs] { boost::shared_ptr fs(wfs.lock()); - if (fs != m_image_grid->GetFileSystem()) return; + if (!fs || fs != m_image_grid->GetFileSystem()) return; fs->SetUrl(url); }); }); diff --git a/src/slic3r/GUI/MediaFilePanel.h b/src/slic3r/GUI/MediaFilePanel.h index 0ec3dfa97d..5c3045c539 100644 --- a/src/slic3r/GUI/MediaFilePanel.h +++ b/src/slic3r/GUI/MediaFilePanel.h @@ -38,7 +38,7 @@ public: void Rescale(); private: - void fileChanged(wxCommandEvent & e); + void modeChanged(wxCommandEvent & e); void fetchUrl(boost::weak_ptr fs); diff --git a/src/slic3r/GUI/MediaPlayCtrl.cpp b/src/slic3r/GUI/MediaPlayCtrl.cpp index 7f40ea113c..7f0625fc2d 100644 --- a/src/slic3r/GUI/MediaPlayCtrl.cpp +++ b/src/slic3r/GUI/MediaPlayCtrl.cpp @@ -111,7 +111,7 @@ void MediaPlayCtrl::Stop() m_media_ctrl->InvalidateBestSize(); m_button_play->SetIcon("media_play"); boost::unique_lock lock(m_mutex); - m_tasks.push_back(""); + m_tasks.push_back(""); m_cond.notify_all(); } m_last_state = MEDIASTATE_IDLE; @@ -132,6 +132,11 @@ void MediaPlayCtrl::SetStatus(wxString const& msg2) { auto msg = wxString::Format(msg2, m_failed_code); BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl::SetStatus: " << msg.ToUTF8().data(); +#ifdef __WXMSW__ + OutputDebugStringA("MediaPlayCtrl::SetStatus: "); + OutputDebugStringA(msg.ToUTF8().data()); + OutputDebugStringA("\n"); +#endif // __WXMSW__ m_label_status->SetLabel(msg); //m_label_status->SetForegroundColour(!msg.EndsWith("!") ? 0x42AE00 : 0x3B65E9); Layout(); @@ -147,11 +152,17 @@ void MediaPlayCtrl::media_proc() wxString url = m_tasks.front(); lock.unlock(); if (url.IsEmpty()) { + break; + } + else if (url == "") { m_media_ctrl->Stop(); } else if (url == "") { break; } + else if (url == "") { + m_media_ctrl->Play(); + } else { BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl: start load"; m_media_ctrl->Load(wxURI(url)); @@ -193,10 +204,11 @@ void MediaPlayCtrl::onStateChanged(wxMediaEvent& event) BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl::onStateChanged: size: " << size.x << "x" << size.y; m_failed_code = m_media_ctrl->GetLastError(); if (size.GetWidth() > 1000) { - m_media_ctrl->Play(); SetStatus(_L("Playing...")); m_failed_retry = 0; - m_last_state = m_media_ctrl->GetState(); + boost::unique_lock lock(m_mutex); + m_tasks.push_back(""); + m_cond.notify_all(); } else if (event.GetId()) { Stop(); diff --git a/src/slic3r/GUI/Monitor.cpp b/src/slic3r/GUI/Monitor.cpp index 05b0c5c6fb..bf6a44d230 100644 --- a/src/slic3r/GUI/Monitor.cpp +++ b/src/slic3r/GUI/Monitor.cpp @@ -335,7 +335,7 @@ void MonitorPanel::on_size(wxSizeEvent &event) // update wifi signal image int wifi_signal_val = 0; - if (!obj->is_connected()) { + if (!obj->is_connected() || obj->is_connecting()) { m_side_tools->set_current_printer_signal(WifiSignal::NONE); } else { if (!obj->wifi_signal.empty() && boost::ends_with(obj->wifi_signal, "dBm")) { @@ -381,6 +381,7 @@ void MonitorPanel::update_all() } if (obj) { + wxGetApp().reset_to_active(); if (obj->connection_type() != last_conn_type) { last_conn_type = obj->connection_type(); } @@ -404,7 +405,10 @@ void MonitorPanel::update_all() return; } - if (!obj->is_connected()) { + if (obj->is_connecting()) { + show_status(MONITOR_CONNECTING); + return; + } else if (!obj->is_connected()) { int server_status = 0; // only disconnected server in cloud mode if (obj->connection_type() != "lan") { @@ -413,7 +417,6 @@ void MonitorPanel::update_all() } } show_status((int) MONITOR_DISCONNECTED + server_status); - m_status_info_panel->show_unload_ctrl(); return; } @@ -457,15 +460,9 @@ bool MonitorPanel::Show(bool show) obj->reset_update_time(); } } - - if (m_agent) - m_agent->start_subscribe("monitor"); - } - else { + } else { m_refresh_timer->Stop(); m_status_info_panel->m_media_play_ctrl->SetMachineObject(nullptr); - if (m_agent) - m_agent->stop_subscribe("monitor"); } return wxPanel::Show(show); } @@ -503,8 +500,15 @@ void MonitorPanel::show_status(int status) else m_connection_info->SetLabel(_L("Failed to connect to the printer")); m_connection_info->Show(); - }else if ((status & (int) MonitorStatus::MONITOR_NORMAL) != 0) { + m_connection_info->SetBackgroundColor(wxColour(255, 111, 0)); + m_connection_info->SetBorderColor(wxColour(255, 111, 0)); + } else if ((status & (int) MonitorStatus::MONITOR_NORMAL) != 0) { m_connection_info->Hide(); + } else if ((status & (int) MonitorStatus::MONITOR_CONNECTING) != 0) { + m_connection_info->SetLabel(_L("Connecting...")); + m_connection_info->SetBackgroundColor(wxColour(0, 174, 66)); + m_connection_info->SetBorderColor(wxColour(0, 174, 66)); + m_connection_info->Show(); } Freeze(); @@ -515,11 +519,14 @@ void MonitorPanel::show_status(int status) m_status_info_panel->show_status(status); m_tabpanel->Refresh(); m_tabpanel->Layout(); - } else if (((status & (int)MonitorStatus::MONITOR_NORMAL) != 0) || - ((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0) || - ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0) + } else if (((status & (int)MonitorStatus::MONITOR_NORMAL) != 0) + || ((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0) + || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0) + || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0) ) { - if (((status & (int) MonitorStatus::MONITOR_DISCONNECTED) != 0) || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0)) { + if (((status & (int) MonitorStatus::MONITOR_DISCONNECTED) != 0) + || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0) + || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0)) { m_side_tools->set_current_printer_signal(WifiSignal::NONE); set_default(); } diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index 3532986359..f38225ada9 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -390,5 +390,4 @@ void DownloadDialog::SetExtendedMessage(const wxString &extendedMessage) Fit(); } -} -} +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/MsgDialog.hpp b/src/slic3r/GUI/MsgDialog.hpp index 4d0afbc6be..2ebc8f6771 100644 --- a/src/slic3r/GUI/MsgDialog.hpp +++ b/src/slic3r/GUI/MsgDialog.hpp @@ -13,6 +13,8 @@ #include #include #include "Widgets/Button.hpp" +#include "BBLStatusBar.hpp" +#include "BBLStatusBarSend.hpp" class wxBoxSizer; class wxCheckBox; @@ -364,7 +366,6 @@ private: wxString msg; }; - } } diff --git a/src/slic3r/GUI/Notebook.cpp b/src/slic3r/GUI/Notebook.cpp index 3e3aab0027..717fdae55f 100644 --- a/src/slic3r/GUI/Notebook.cpp +++ b/src/slic3r/GUI/Notebook.cpp @@ -185,7 +185,8 @@ bool ButtonsListCtrl::InsertPage(size_t n, const wxString &text, bool bSelect /* btn->Bind(wxEVT_BUTTON, [this, btn](wxCommandEvent& event) { if (auto it = std::find(m_pageButtons.begin(), m_pageButtons.end(), btn); it != m_pageButtons.end()) { auto sel = it - m_pageButtons.begin(); - SetSelection(sel); + //do it later + //SetSelection(sel); wxCommandEvent evt = wxCommandEvent(wxCUSTOMEVT_NOTEBOOK_SEL_CHANGED); evt.SetId(sel); @@ -205,7 +206,11 @@ void ButtonsListCtrl::RemovePage(size_t n) Button* btn = m_pageButtons[n]; m_pageButtons.erase(m_pageButtons.begin() + n); m_buttons_sizer->Remove(n); +#if __WXOSX__ + RemoveChild(btn); +#else btn->Reparent(nullptr); +#endif btn->Destroy(); m_sizer->Layout(); } diff --git a/src/slic3r/GUI/Notebook.hpp b/src/slic3r/GUI/Notebook.hpp index 8d3befb725..acf1510565 100644 --- a/src/slic3r/GUI/Notebook.hpp +++ b/src/slic3r/GUI/Notebook.hpp @@ -85,7 +85,7 @@ public: SetSizer(mainSizer); this->Bind(wxCUSTOMEVT_NOTEBOOK_SEL_CHANGED, [this](wxCommandEvent& evt) - { + { if (int page_idx = evt.GetId(); page_idx >= 0) SetSelection(page_idx); }); @@ -183,8 +183,14 @@ public: virtual int SetSelection(size_t n) override { - GetBtnsListCtrl()->SetSelection(n); int ret = DoSetSelection(n, SetSelection_SendEvent); + int new_sel = GetSelection(); + //check the new_sel firstly + if (new_sel != n) { + //not allowed, skip it + return ret; + } + GetBtnsListCtrl()->SetSelection(n); // check that only the selected page is visible and others are hidden: for (size_t page = 0; page < m_pages.size(); page++) { diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index a1624c3e6f..22ab4f64f4 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -2050,7 +2050,7 @@ size_t NotificationManager::get_notification_count() const void NotificationManager::bbl_show_plateinfo_notification(const std::string &text) { - NotificationData data{NotificationType::BBLPlateInfo, NotificationLevel::PrintInfoNotificationLevel, 86400 * 10, text}; + NotificationData data{NotificationType::BBLPlateInfo, NotificationLevel::PrintInfoNotificationLevel, BBL_NOTICE_MAX_INTERVAL, text}; for (std::unique_ptr ¬ification : m_pop_notifications) { if (notification->get_type() == NotificationType::BBLPlateInfo) { @@ -2072,6 +2072,30 @@ void NotificationManager::bbl_close_plateinfo_notification() } } +void NotificationManager::bbl_show_preview_only_notification(const std::string &text) +{ + NotificationData data{NotificationType::BBLPreviewOnlyMode, NotificationLevel::WarningNotificationLevel, 0, text}; + + for (std::unique_ptr ¬ification : m_pop_notifications) { + if (notification->get_type() == NotificationType::BBLPreviewOnlyMode) { + notification->reinit(); + notification->update(data); + return; + } + } + + auto notification = std::make_unique(data, m_id_provider, m_evt_handler); + push_notification_data(std::move(notification), 0); +} + +void NotificationManager::bbl_close_preview_only_notification() +{ + for (std::unique_ptr ¬ification : m_pop_notifications) + if (notification->get_type() == NotificationType::BBLPreviewOnlyMode) { + notification->close(); + } +} + void NotificationManager::bbl_show_objectsinfo_notification(const std::string &text, bool is_warning, bool is_hidden) { std::string hyper_text; @@ -2084,7 +2108,7 @@ void NotificationManager::bbl_show_objectsinfo_notification(const std::string &t }; hyper_text = _u8L(" (Repair)"); } - NotificationData data{NotificationType::BBLObjectInfo, NotificationLevel::PrintInfoNotificationLevel, 86400 * 10, text, hyper_text, callback}; + NotificationData data{NotificationType::BBLObjectInfo, NotificationLevel::PrintInfoNotificationLevel, BBL_NOTICE_MAX_INTERVAL, text, hyper_text, callback}; if (is_warning) data.use_warn_color = true; @@ -2113,7 +2137,7 @@ void NotificationManager::bbl_close_objectsinfo_notification() void NotificationManager::bbl_show_seqprintinfo_notification(const std::string &text) { - NotificationData data{NotificationType::BBLSeqPrintInfo, NotificationLevel::PrintInfoNotificationLevel, 86400 * 10, text}; + NotificationData data{NotificationType::BBLSeqPrintInfo, NotificationLevel::PrintInfoNotificationLevel, BBL_NOTICE_MAX_INTERVAL, text}; for (std::unique_ptr ¬ification : m_pop_notifications) { if (notification->get_type() == NotificationType::BBLSeqPrintInfo) { @@ -2134,6 +2158,36 @@ void NotificationManager::bbl_close_seqprintinfo_notification() if (notification->get_type() == NotificationType::BBLSeqPrintInfo) { notification->close(); } } +void NotificationManager::bbl_show_plugin_install_notification(const std::string &text) +{ + std::string hyper_text; + auto callback = [](wxEvtHandler *) { + wxCommandEvent *evt = new wxCommandEvent(EVT_INSTALL_PLUGIN_NETWORKING); + wxQueueEvent(wxGetApp().plater(), evt); + return false; + }; + hyper_text = _u8L(" Click here to install it."); + NotificationData data{NotificationType::BBLPluginInstallHint, NotificationLevel::WarningNotificationLevel, 0, text, hyper_text, callback}; + + for (std::unique_ptr ¬ification : m_pop_notifications) { + if (notification->get_type() == NotificationType::BBLPluginInstallHint) { + notification->reinit(); + notification->update(data); + return; + } + } + + auto notification = std::make_unique(data, m_id_provider, m_evt_handler); + notification->set_Multiline(true); + push_notification_data(std::move(notification), 0); +} + +void NotificationManager::bbl_close_plugin_install_notification() +{ + for (std::unique_ptr ¬ification : m_pop_notifications) + if (notification->get_type() == NotificationType::BBLPluginInstallHint) { notification->close(); } +} + void NotificationManager::bbl_show_slice_emptylayer_notification(const std::string &text, bool bOverride) { NotificationData data{NotificationType::BBLSliceEmptyLayer, NotificationLevel::WarningNotificationLevel, 0, _u8L("WARNING:") + "\n" + text}; @@ -2225,7 +2279,7 @@ void NotificationManager::bbl_show_sole_text_notification(NotificationType sType default: nlevel = NotificationLevel::PrintInfoNotificationLevel; - if (autohide == false) nHideTime = 86400 * 10; + if (autohide == false) nHideTime = BBL_NOTICE_MAX_INTERVAL; break; } diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 04a5172277..d758dbe061 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -37,6 +37,8 @@ enum class InfoItemType; #define BBL_NOTICE_PLATEINFO_OBJID 1024+1 #define BBL_NOTICE_OBJECTS_OBJID 1024+2 +#define BBL_NOTICE_MAX_INTERVAL 86400 * 10 + enum class NotificationType { CustomNotification, @@ -131,6 +133,9 @@ enum class NotificationType BBLGcodeOverlap, //BBL: sequence print info BBLSeqPrintInfo, + //BBL: plugin install hint + BBLPluginInstallHint, + BBLPreviewOnlyMode, }; class NotificationManager @@ -270,6 +275,14 @@ public: void bbl_show_plateinfo_notification(const std::string &text); void bbl_close_plateinfo_notification(); + //BBS--preview only mode + void bbl_show_preview_only_notification(const std::string &text); + void bbl_close_preview_only_notification(); + + //BBS--PluginInstallHint + void bbl_show_plugin_install_notification(const std::string &text); + void bbl_close_plugin_install_notification(); + //BBS--Objects Info void bbl_show_objectsinfo_notification(const std::string &text, bool is_warning, bool is_hidden); void bbl_close_objectsinfo_notification(); @@ -791,7 +804,7 @@ private: // non-static so its not loaded too early. If static, the translations wont load correctly. const std::vector basic_notifications = { NotificationData{NotificationType::Mouse3dDisconnected, NotificationLevel::RegularNotificationLevel, 10, _u8L("3D Mouse disconnected.")}, - NotificationData{NotificationType::PresetUpdateAvailable, NotificationLevel::ImportantNotificationLevel, 20, _u8L("Configuration can update now."), _u8L("Detail."), + NotificationData{NotificationType::PresetUpdateAvailable, NotificationLevel::ImportantNotificationLevel, BBL_NOTICE_MAX_INTERVAL, _u8L("Configuration can update now."), _u8L("Detail."), [](wxEvtHandler* evnthndlr) { if (evnthndlr != nullptr) wxPostEvent(evnthndlr, PresetUpdateAvailableClickedEvent(EVT_PRESET_UPDATE_AVAILABLE_CLICKED)); diff --git a/src/slic3r/GUI/OG_CustomCtrl.cpp b/src/slic3r/GUI/OG_CustomCtrl.cpp index 891d77785f..5d03efe4ce 100644 --- a/src/slic3r/GUI/OG_CustomCtrl.cpp +++ b/src/slic3r/GUI/OG_CustomCtrl.cpp @@ -123,35 +123,6 @@ int OG_CustomCtrl::get_height(const Line& line) return 0; } -static wxSize split_lines(wxDC &dc, int width, const wxString &text, wxString &multiline_text) -{ - if (width > 0 && dc.GetTextExtent(text).x > width) { - multiline_text = text; - size_t start = 0; - while (true) { - size_t idx = size_t(-1); - for (size_t i = start; i < multiline_text.Len(); i++) { - if (multiline_text[i] == ' ') { - if (dc.GetTextExtent(multiline_text.SubString(start, i)).x < width) - idx = i; - else { - if (idx == size_t(-1)) - idx = i; - break; - } - } - } - if (idx == size_t(-1)) - break; - multiline_text[idx] = '\n'; - start = idx + 1; - if (dc.GetTextExtent(multiline_text.Mid(start)).x < width) - break; - } - } - return dc.GetMultiLineTextExtent(multiline_text.IsEmpty() ? text : multiline_text); -} - wxPoint OG_CustomCtrl::get_pos(const Line& line, Field* field_in/* = nullptr*/) { // BBS: new layout @@ -178,7 +149,7 @@ wxPoint OG_CustomCtrl::get_pos(const Line& line, Field* field_in/* = nullptr*/) wxClientDC dc(this); dc.SetFont(m_font); wxString multiline_text; - auto size = split_lines(dc, label_width, label, multiline_text); + auto size = Label::split_lines(dc, label_width, label, multiline_text); if (label_width > 0) size.x = label_width; h_pos += size.x + m_h_gap; if (ctrl_line.height < size.y) @@ -915,7 +886,7 @@ void OG_CustomCtrl::CtrlLine::render(wxDC& dc, wxCoord h_pos, wxCoord v_pos) wxCoord OG_CustomCtrl::CtrlLine::draw_text(wxDC& dc, wxPoint pos, const wxString& text, const wxColour* color, int width, bool is_main/* = false*/) { wxString multiline_text; - auto size = split_lines(dc, width, text, multiline_text); + auto size = Label::split_lines(dc, width, text, multiline_text); if (!text.IsEmpty()) { const wxString& out_text = multiline_text.IsEmpty() ? text : multiline_text; diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp index c0b1a6f65b..ec88373248 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.cpp +++ b/src/slic3r/GUI/ObjectDataViewModel.cpp @@ -1938,9 +1938,13 @@ wxDataViewItem ObjectDataViewModel::GetObjectItem(const ModelObject* mo) const wxDataViewItem ObjectDataViewModel::GetVolumeItem(const wxDataViewItem& parent, int vol_idx) const { ObjectDataViewModelNode* obj_node = (ObjectDataViewModelNode*)parent.GetID(); - for (auto child : obj_node->GetChildren()) { - if (child->GetType() == itVolume && child->GetIdx() == vol_idx) - return wxDataViewItem(child); + + // BBS + if (obj_node != nullptr) { + for (auto child : obj_node->GetChildren()) { + if (child->GetType() == itVolume && child->GetIdx() == vol_idx) + return wxDataViewItem(child); + } } return wxDataViewItem(nullptr); diff --git a/src/slic3r/GUI/ParamsPanel.cpp b/src/slic3r/GUI/ParamsPanel.cpp index 4043335d26..679efeb092 100644 --- a/src/slic3r/GUI/ParamsPanel.cpp +++ b/src/slic3r/GUI/ParamsPanel.cpp @@ -21,7 +21,7 @@ namespace Slic3r { namespace GUI { - + TipsDialog::TipsDialog(wxWindow *parent, const wxString &title) : DPIDialog(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) { @@ -230,16 +230,17 @@ ParamsPanel::ParamsPanel( wxWindow* parent, wxWindowID id, const wxPoint& pos, c //m_search_btn = new ScalableButton(m_top_panel, wxID_ANY, "search", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true); //m_search_btn->SetToolTip(format_wxstr(_L("Search in settings [%1%]"), "Ctrl+F")); //m_search_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { wxGetApp().plater()->search(false); }); -#if !BBL_RELEASE_TO_PUBLIC + m_compare_btn = new ScalableButton(m_top_panel, wxID_ANY, "compare", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true); m_compare_btn->SetToolTip(_L("Compare presets")); m_compare_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { wxGetApp().mainframe->diff_dialog.show(); })); -#endif +#if !BBL_RELEASE_TO_PUBLIC m_setting_btn = new ScalableButton(m_top_panel, wxID_ANY, "table", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true); m_setting_btn->SetToolTip(_L("View all object's settings")); m_setting_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { wxGetApp().plater()->PopupObjectTable(-1, -1, {0, 0}); }); +#endif - m_highlighter.set_timer_owner(this, 0); + m_highlighter.set_timer_owner(this, 0); this->Bind(wxEVT_TIMER, [this](wxTimerEvent &) { m_highlighter.blink(); @@ -332,12 +333,13 @@ void ParamsPanel::create_layout() m_mode_sizer->Add( m_title_view, 0, wxALIGN_CENTER ); m_mode_sizer->AddSpacer(FromDIP(9)); m_mode_sizer->Add( m_mode_view, 0, wxALIGN_CENTER ); - m_mode_sizer->AddSpacer(FromDIP(16)); - m_mode_sizer->Add( m_setting_btn, 0, wxALIGN_CENTER ); #if !BBL_RELEASE_TO_PUBLIC m_mode_sizer->AddSpacer(FromDIP(16)); - m_mode_sizer->Add( m_compare_btn, 0, wxALIGN_CENTER ); + m_mode_sizer->Add( m_setting_btn, 0, wxALIGN_CENTER ); #endif + m_mode_sizer->AddSpacer(FromDIP(16)); + m_mode_sizer->Add( m_compare_btn, 0, wxALIGN_CENTER ); + m_mode_sizer->AddSpacer(FromDIP(8)); //m_mode_sizer->Add( m_search_btn, 0, wxALIGN_CENTER ); //m_mode_sizer->AddSpacer(16); @@ -590,7 +592,9 @@ void ParamsPanel::update_mode() void ParamsPanel::msw_rescale() { if (m_process_icon) m_process_icon->msw_rescale(); +#if !BBL_RELEASE_TO_PUBLIC if (m_setting_btn) m_setting_btn->msw_rescale(); +#endif if (m_search_btn) m_search_btn->msw_rescale(); if (m_compare_btn) m_compare_btn->msw_rescale(); m_left_sizer->SetMinSize(wxSize(40 * em_unit(this), -1)); diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index 80ecb467b3..f90b07ca47 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -1017,6 +1017,15 @@ void PartPlate::release_opengl_resource() std::vector PartPlate::get_extruders() const { std::vector plate_extruders; + // if gcode.3mf file + if (m_model->objects.empty()) { + for (int i = 0; i < slice_filaments_info.size(); i++) { + plate_extruders.push_back(slice_filaments_info[i].id + 1); + } + return plate_extruders; + } + + // if 3mf file const DynamicPrintConfig& glb_config = wxGetApp().preset_bundle->prints.get_edited_preset().config; int glb_support_intf_extr = glb_config.opt_int("support_interface_filament"); int glb_support_extr = glb_config.opt_int("support_filament"); @@ -1626,6 +1635,33 @@ void PartPlate::move_instances_to(PartPlate& left_plate, PartPlate& right_plate, return; } +//can add timelapse object +bool PartPlate::can_add_timelapse_object() +{ + bool result = true; + + if (obj_to_instance_set.size() == 0) + return false; + + for (std::set>::iterator it = obj_to_instance_set.begin(); it != obj_to_instance_set.end(); ++it) + { + int obj_id = it->first; + + if (obj_id >= m_model->objects.size()) + continue; + + ModelObject* object = m_model->objects[obj_id]; + + if (object->is_timelapse_wipe_tower) + { + result = false; + break; + } + } + + return result; +} + void PartPlate::generate_logo_polygon(ExPolygon &logo_polygon) { if (m_shape.size() == 4) @@ -2109,9 +2145,9 @@ int PartPlate::load_pattern_thumbnail_data(std::string filename) if (result) { cali_thumbnail_data.set(img.GetWidth(), img.GetHeight()); for (int i = 0; i < img.GetWidth() * img.GetHeight(); i++) { - memcpy(&thumbnail_data.pixels[4 * i], (unsigned char*)(img.GetData() + 3 * i), 3); + memcpy(&cali_thumbnail_data.pixels[4 * i], (unsigned char*)(img.GetData() + 3 * i), 3); if (img.HasAlpha()) { - thumbnail_data.pixels[4 * i + 3] = *(unsigned char*)(img.GetAlpha() + i); + cali_thumbnail_data.pixels[4 * i + 3] = *(unsigned char*)(img.GetAlpha() + i); } } } @@ -2121,6 +2157,24 @@ int PartPlate::load_pattern_thumbnail_data(std::string filename) return 0; } +//load pattern box data from file +int PartPlate::load_pattern_box_data(std::string filename) +{ + try { + nlohmann::json j; + boost::nowide::ifstream ifs(filename); + ifs >> j; + + PlateBBoxData bbox_data; + bbox_data.from_json(j); + cali_bboxes_data = bbox_data; + return 0; + } + catch(std::exception &ex) { + BOOST_LOG_TRIVIAL(trace) << boost::format("catch an exception %1%")%ex.what(); + return -1; + } +} void PartPlate::print() const { @@ -4009,6 +4063,11 @@ int PartPlateList::store_to_3mf_structure(PlateDataPtrs& plate_data_list, bool w if (m_plate_list[i]->get_slice_result() && m_plate_list[i]->is_slice_result_valid()) { // BBS only include current palte_idx if (plate_idx == i || plate_idx == -1) { + //load calibration thumbnail + if (m_plate_list[i]->cali_thumbnail_data.is_valid()) + plate_data_item->pattern_file = "valid_pattern"; + if (m_plate_list[i]->cali_bboxes_data.is_valid()) + plate_data_item->pattern_bbox_file = "valid_pattern_bbox"; plate_data_item->gcode_file = m_plate_list[i]->m_gcode_result->filename; plate_data_item->is_sliced_valid = true; plate_data_item->gcode_prediction = std::to_string( @@ -4018,7 +4077,10 @@ int PartPlateList::store_to_3mf_structure(PlateDataPtrs& plate_data_list, bool w m_plate_list[i]->get_print((PrintBase **) &print, nullptr, nullptr); if (print) { const PrintStatistics &ps = print->print_statistics(); - if (ps.total_weight != 0.0) { plate_data_item->gcode_weight = wxString::Format("%.2f", ps.total_weight).ToStdString(); } + if (ps.total_weight != 0.0) { + CNumericLocalesSetter locales_setter; + plate_data_item->gcode_weight =wxString::Format("%.2f", ps.total_weight).ToStdString(); + } } else { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format("print is null!"); } @@ -4072,21 +4134,29 @@ int PartPlateList::load_from_3mf_structure(PlateDataPtrs& plate_data_list) gcode_result->print_statistics.modes[static_cast(PrintEstimatedStatistics::ETimeMode::Normal)].time = atoi(plate_data_list[i]->gcode_prediction.c_str()); ps.total_weight = atof(plate_data_list[i]->gcode_weight.c_str()); ps.total_used_filament = 0.f; - for (auto filament_item: plate_data_list[i]->slice_flaments_info) + for (auto filament_item: plate_data_list[i]->slice_filaments_info) { ps.total_used_filament += filament_item.used_m; } ps.total_used_filament *= 1000; //koef gcode_result->toolpath_outside = plate_data_list[i]->toolpath_outside; + m_plate_list[index]->slice_filaments_info = plate_data_list[i]->slice_filaments_info; if (!plate_data_list[i]->thumbnail_file.empty()) { if (boost::filesystem::exists(plate_data_list[i]->thumbnail_file)) { m_plate_list[index]->load_thumbnail_data(plate_data_list[i]->thumbnail_file); } } + if (!plate_data_list[i]->pattern_file.empty()) { if (boost::filesystem::exists(plate_data_list[i]->pattern_file)) { - m_plate_list[index]->load_pattern_thumbnail_data(plate_data_list[i]->pattern_file); + //no need to load pattern data currently + //m_plate_list[index]->load_pattern_thumbnail_data(plate_data_list[i]->pattern_file); + } + } + if (!plate_data_list[i]->pattern_bbox_file.empty()) { + if (boost::filesystem::exists(plate_data_list[i]->pattern_bbox_file)) { + m_plate_list[index]->load_pattern_box_data(plate_data_list[i]->pattern_bbox_file); } } diff --git a/src/slic3r/GUI/PartPlate.hpp b/src/slic3r/GUI/PartPlate.hpp index e0a2617406..7bcaa06759 100644 --- a/src/slic3r/GUI/PartPlate.hpp +++ b/src/slic3r/GUI/PartPlate.hpp @@ -96,6 +96,7 @@ private: Print *m_print; //Print reference, not own it, no need to serialize GCodeProcessorResult *m_gcode_result; + std::vector slice_filaments_info; int m_print_index; std::string m_tmp_gcode_path; //use a temp path to store the gcode @@ -207,6 +208,7 @@ public: static const int plate_thumbnail_height = 512; ThumbnailData cali_thumbnail_data; + PlateBBoxData cali_bboxes_data; //set the plate's index void set_index(int index); @@ -277,6 +279,9 @@ public: //move instances to left or right PartPlate void move_instances_to(PartPlate& left_plate, PartPlate& right_plate, BoundingBoxf3* bounding_box = nullptr); + //can add timelapse object + bool can_add_timelapse_object(); + /*rendering related functions*/ const Pointfs& get_shape() const { return m_shape; } bool set_shape(const Pointfs& shape, const Pointfs& exclude_areas, Vec2d position, float height_to_lid, float height_to_rod); @@ -361,6 +366,8 @@ public: int load_thumbnail_data(std::string filename); //load pattern thumbnail data from file int load_pattern_thumbnail_data(std::string filename); + //load pattern box data from file + int load_pattern_box_data(std::string filename); void print() const; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 5dd39f2c3f..38b75637fc 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -152,6 +152,9 @@ wxDEFINE_EVENT(EVT_PRINT_FINISHED, wxCommandEvent); //BBS: repair model wxDEFINE_EVENT(EVT_REPAIR_MODEL, wxCommandEvent); wxDEFINE_EVENT(EVT_FILAMENT_COLOR_CHANGED, wxCommandEvent); +wxDEFINE_EVENT(EVT_INSTALL_PLUGIN_NETWORKING, wxCommandEvent); +wxDEFINE_EVENT(EVT_INSTALL_PLUGIN_HINT, wxCommandEvent); +wxDEFINE_EVENT(EVT_PREVIEW_ONLY_MODE_HINT, wxCommandEvent); @@ -301,7 +304,6 @@ struct Sidebar::priv wxPanel* m_panel_printer_content = nullptr; ObjectList *m_object_list{ nullptr }; - wxPanel *m_object_panel; AuxiliaryDialog *m_auxiliary_dialog{ nullptr }; ObjectSettings *object_settings{ nullptr }; @@ -335,10 +337,6 @@ Sidebar::priv::~priv() #if 0 delete frequently_changed_parameters; #endif - - // BBS - if (m_object_panel != nullptr) - delete m_object_panel; } void Sidebar::priv::show_preset_comboboxes() @@ -415,6 +413,8 @@ Sidebar::Sidebar(Plater *parent) // As a result we can see the empty block at the bottom of the sidebar // But if we set this value to 5, layout will be better p->scrolled->SetScrollRate(0, 5); + p->scrolled->SetBackgroundColour(*wxWHITE); + SetFont(wxGetApp().normal_font()); #ifndef __APPLE__ @@ -437,11 +437,8 @@ Sidebar::Sidebar(Plater *parent) wxColour active_text = wxColour(0, 0, 0); wxColour static_line_col = wxColour(166, 169, 170); - bool is_msw = false; #ifdef __WINDOWS__ p->scrolled->SetDoubleBuffered(true); - - is_msw = true; #endif //__WINDOWS__ // add printer @@ -450,7 +447,7 @@ Sidebar::Sidebar(Plater *parent) // 1.1 create title bar resources p->m_panel_printer_title = new StaticBox(p->scrolled, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL | wxBORDER_NONE); p->m_panel_printer_title->SetBackgroundColor(title_bg); - p->m_panel_printer_title->SetBackgroundColor(0xF1F1F1); + p->m_panel_printer_title->SetBackgroundColor2(0xF1F1F1); p->m_printer_icon = new ScalableButton(p->m_panel_printer_title, wxID_ANY, "printer"); p->m_text_printer_settings = new wxStaticText(p->m_panel_printer_title, wxID_ANY, _L("Printer"), wxDefaultPosition, wxDefaultSize, 0); @@ -521,7 +518,6 @@ Sidebar::Sidebar(Plater *parent) bed_type_title->Wrap(-1); bed_type_title->SetFont(Label::Body_14); m_bed_type_list = new ComboBox(p->m_panel_printer_content, wxID_ANY, wxString(""), wxDefaultPosition, {-1, FromDIP(30)}, 0, nullptr, wxCB_READONLY); - DynamicPrintConfig& config = wxGetApp().preset_bundle->project_config; const ConfigOptionDef* bed_type_def = print_config_def.get("curr_bed_type"); if (bed_type_def && bed_type_def->enum_keys_map) { for (auto item : *bed_type_def->enum_keys_map) @@ -542,7 +538,7 @@ Sidebar::Sidebar(Plater *parent) // add filament title p->m_panel_filament_title = new StaticBox(p->scrolled, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL | wxBORDER_NONE); p->m_panel_filament_title->SetBackgroundColor(title_bg); - p->m_panel_filament_title->SetBackgroundColor(0xF1F1F1); + p->m_panel_filament_title->SetBackgroundColor2(0xF1F1F1); wxBoxSizer* bSizer39; bSizer39 = new wxBoxSizer( wxHORIZONTAL ); @@ -577,16 +573,23 @@ Sidebar::Sidebar(Plater *parent) auto& printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; const std::vector& init_matrix = (project_config.option("flush_volumes_matrix"))->values; const std::vector& init_extruders = (project_config.option("flush_volumes_vector"))->values; + ConfigOption* extra_flush_volume_opt = printer_config.option("nozzle_volume"); + int extra_flush_volume = extra_flush_volume_opt ? (int)extra_flush_volume_opt->getFloat() : 0; + ConfigOption* flush_multi_opt = project_config.option("flush_multiplier"); + float flush_multiplier = flush_multi_opt ? flush_multi_opt->getFloat() : 1.f; const std::vector extruder_colours = wxGetApp().plater()->get_extruder_colors_from_plater_config(); - WipingDialog dlg(parent, cast(init_matrix), cast(init_extruders), extruder_colours); + WipingDialog dlg(parent, cast(init_matrix), cast(init_extruders), extruder_colours, extra_flush_volume, flush_multiplier); if (dlg.ShowModal() == wxID_OK) { std::vector matrix = dlg.get_matrix(); std::vector extruders = dlg.get_extruders(); (project_config.option("flush_volumes_matrix"))->values = std::vector(matrix.begin(), matrix.end()); (project_config.option("flush_volumes_vector"))->values = std::vector(extruders.begin(), extruders.end()); +#if !BBL_RELEASE_TO_PUBLIC + (project_config.option("flush_multiplier"))->set(new ConfigOptionFloat(dlg.get_flush_multiplier())); +#endif wxGetApp().plater()->update_project_dirty_from_presets(); wxPostEvent(parent, SimpleEvent(EVT_SCHEDULE_BACKGROUND_PROCESS, parent)); @@ -599,8 +602,8 @@ Sidebar::Sidebar(Plater *parent) ScalableButton* add_btn = new ScalableButton(p->m_panel_filament_title, wxID_ANY, "add_filament"); add_btn->Bind(wxEVT_BUTTON, [this, scrolled_sizer](wxCommandEvent& e){ - // BBS: limit filament choices to 4 - if (p->combos_filament.size() >= 4) + // BBS: limit filament choices to 16 + if (p->combos_filament.size() >= 16) return; int filament_count = p->combos_filament.size() + 1; @@ -717,14 +720,10 @@ Sidebar::Sidebar(Plater *parent) //add project content p->sizer_params = new wxBoxSizer(wxVERTICAL); - p->m_object_panel = new wxPanel(p->scrolled); - p->m_object_list = new ObjectList(p->m_object_panel); - wxBoxSizer* object_sizer = new wxBoxSizer(wxVERTICAL); - object_sizer->Add(p->m_object_list, 1, wxEXPAND); - p->m_object_panel->SetSizer(object_sizer); - p->sizer_params->Add(p->m_object_panel, 1, wxEXPAND | wxTOP, 0); + p->m_object_list = new ObjectList(p->scrolled); + p->sizer_params->Add(p->m_object_list, 1, wxEXPAND | wxTOP, 0); scrolled_sizer->Add(p->sizer_params, 3, wxEXPAND | wxLEFT, 0); - p->m_object_panel->Hide(); + p->m_object_list->Hide(); p->m_auxiliary_dialog = new AuxiliaryDialog(this); @@ -1329,7 +1328,7 @@ void Sidebar::update_ui_from_settings() bool Sidebar::show_object_list(bool show) const { - if (!p->m_object_panel->Show(show)) + if (!p->m_object_list->Show(show)) return false; p->scrolled->Layout(); return true; @@ -1770,6 +1769,9 @@ struct Plater::priv //BBS: add model repair void on_repair_model(wxCommandEvent &event); void on_filament_color_changed(wxCommandEvent &event); + void show_install_plugin_hint(wxCommandEvent &event); + void install_network_plugin(wxCommandEvent &event); + void show_preview_only_hint(wxCommandEvent &event); //BBS: add part plate related logic void on_plate_right_click(RBtnPlateEvent&); void on_plate_selected(SimpleEvent&); @@ -1801,6 +1803,7 @@ struct Plater::priv // Sets m_bed.m_polygon to limit the object placement. //BBS: add bed exclude area void set_bed_shape(const Pointfs& shape, const Pointfs& exclude_areas, const double printable_height, const std::string& custom_texture, const std::string& custom_model, bool force_as_custom = false); + bool can_add_timelapse_wt() const; bool can_delete() const; bool can_delete_all() const; @@ -1963,6 +1966,9 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) this->q->Bind(EVT_PUBLISH, &priv::on_action_publish, this); this->q->Bind(EVT_REPAIR_MODEL, &priv::on_repair_model, this); this->q->Bind(EVT_FILAMENT_COLOR_CHANGED, &priv::on_filament_color_changed, this); + this->q->Bind(EVT_INSTALL_PLUGIN_NETWORKING, &priv::install_network_plugin, this); + this->q->Bind(EVT_INSTALL_PLUGIN_HINT, &priv::show_install_plugin_hint, this); + this->q->Bind(EVT_PREVIEW_ONLY_MODE_HINT, &priv::show_preview_only_hint, this); view3D = new View3D(q, bed, &model, config, &background_process); //BBS: use partplater's gcode @@ -2987,6 +2993,7 @@ std::vector Plater::priv::load_files(const std::vector& input_ tolal_model_count += model_idx; + if (one_by_one) { // BBS: add load_old_project logic if (type_3mf && !is_project_file && !load_old_project) @@ -3061,8 +3068,6 @@ std::vector Plater::priv::load_files(const std::vector& input_ //set to 3d tab q->select_view_3D("Preview"); wxGetApp().mainframe->select_tab(MainFrame::tpPreview); - wxTheApp->CallAfter([]() { wxGetApp().mainframe->enable_tab(MainFrame::tp3DEditor, false);}); - notification_manager->bbl_show_plateinfo_notification(into_u8(_L("Preview only mode:\nThe loaded file contains gcode only."))); } else { //set to 3d tab @@ -3112,7 +3117,7 @@ std::vector Plater::priv::load_files(const std::vector& input_ obj_idxs, model.objects, *notification_manager); - if (tolal_model_count <= 0) { + if (tolal_model_count <= 0 && !q->m_exported_file) { dlg.Hide(); MessageDialog msg(wxGetApp().mainframe, _L("The file does not contain any geometry data."), _L("Warning"), wxYES | wxICON_WARNING); if (msg.ShowModal() == wxID_YES) {} @@ -4865,6 +4870,7 @@ void Plater::priv::on_export_began(wxCommandEvent& evt) void Plater::priv::on_export_finished(wxCommandEvent& evt) { +#if 0 //BBS: also export 3mf to the same directory for debugging std::string gcode_path_str(evt.GetString().ToUTF8().data()); fs::path gcode_path(gcode_path_str); @@ -4872,6 +4878,7 @@ void Plater::priv::on_export_finished(wxCommandEvent& evt) if (q) { q->export_3mf(gcode_path.replace_extension(".3mf"), SaveStrategy::Silence); // BBS: silence } +#endif } void Plater::priv::on_slicing_began() @@ -5329,6 +5336,22 @@ void Plater::priv::on_filament_color_changed(wxCommandEvent &event) q->get_preview_canvas3D()->update_plate_thumbnails(); } +void Plater::priv::install_network_plugin(wxCommandEvent &event) +{ + wxGetApp().ShowDownNetPluginDlg(); + return; +} + +void Plater::priv::show_install_plugin_hint(wxCommandEvent &event) +{ + notification_manager->bbl_show_plugin_install_notification(into_u8(_L("Network Plug-in is not detected. Network related features are unavailable."))); +} + +void Plater::priv::show_preview_only_hint(wxCommandEvent &event) +{ + notification_manager->bbl_show_preview_only_notification(into_u8(_L("Preview only mode:\nThe loaded file contains gcode only, Can not enter the Prepare page"))); +} + void Plater::priv::on_right_click(RBtnEvent& evt) { int obj_idx = get_selected_object_idx(); @@ -5871,6 +5894,16 @@ void Plater::priv::set_bed_shape(const Pointfs& shape, const Pointfs& exclude_ar } } +bool Plater::priv::can_add_timelapse_wt() const { + const DynamicPrintConfig &dconfig = wxGetApp().preset_bundle->prints.get_edited_preset().config; + const ConfigOption* option = dconfig.option("timelapse_no_toolhead"); + bool timelapse_enabled = option?option->getBool():false; + + PartPlate* curr_plate = q->get_partplate_list().get_curr_plate(); + + return timelapse_enabled && curr_plate->can_add_timelapse_object(); +} + bool Plater::priv::can_delete() const { return !get_selection().is_empty() && !get_selection().is_wipe_tower(); @@ -6387,8 +6420,8 @@ int Plater::new_project(bool skip_confirm, bool silent) m_only_gcode = false; m_exported_file = false; - wxGetApp().mainframe->enable_tab(MainFrame::tp3DEditor); get_notification_manager()->bbl_close_plateinfo_notification(); + get_notification_manager()->bbl_close_preview_only_notification(); if (!silent) wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); @@ -6455,10 +6488,8 @@ void Plater::load_project(wxString const& filename2, m_only_gcode = false; m_exported_file = false; - wxGetApp().mainframe->enable_tab(MainFrame::tp3DEditor); get_notification_manager()->bbl_close_plateinfo_notification(); - - wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); + get_notification_manager()->bbl_close_preview_only_notification(); auto path = into_path(filename); @@ -6494,7 +6525,9 @@ void Plater::load_project(wxString const& filename2, if (!m_exported_file) { p->select_view("topfront"); p->camera.requires_zoom_to_plate = REQUIRES_ZOOM_TO_ALL_PLATE; + wxGetApp().mainframe->select_tab(MainFrame::tp3DEditor); } + if (previous_gcode) collapse_sidebar(false); @@ -6663,8 +6696,7 @@ void Plater::load_gcode(const wxString& filename) wxGetApp().mainframe->select_tab(MainFrame::tpPreview); p->set_current_panel(p->preview, true); p->get_current_canvas3D()->render(); - wxTheApp->CallAfter([]() { wxGetApp().mainframe->enable_tab(MainFrame::tp3DEditor, false);}); - p->notification_manager->bbl_show_plateinfo_notification(into_u8(_L("Preview only mode for gcode file."))); + //p->notification_manager->bbl_show_plateinfo_notification(into_u8(_L("Preview only mode for gcode file."))); current_print.apply(this->model(), wxGetApp().preset_bundle->full_config()); @@ -8083,8 +8115,10 @@ int Plater::export_3mf(const boost::filesystem::path& output_path, SaveStrategy } thumbnails.push_back(thumbnail_data); - calibration_thumbnails.push_back(new ThumbnailData()); - plate_bboxes.push_back(new PlateBBoxData()); + ThumbnailData* calibration_data = &p->partplate_list.get_plate(i)->cali_thumbnail_data; + calibration_thumbnails.push_back(calibration_data); + PlateBBoxData* plate_bbox_data = &p->partplate_list.get_plate(i)->cali_bboxes_data; + plate_bboxes.push_back(plate_bbox_data); } if (p->partplate_list.get_curr_plate()->is_slice_result_valid()) { @@ -8096,7 +8130,11 @@ int Plater::export_3mf(const boost::filesystem::path& output_path, SaveStrategy const int thumbnail_width = 2560; const int thumbnail_height = 2560; p->generate_calibration_thumbnail(*calibration_data, thumbnail_width, thumbnail_height, calibration_params); - *plate_bboxes[index] = p->generate_first_layer_bbox(); + if (using_exported_file()) { + //do nothing + } + else + *plate_bboxes[index] = p->generate_first_layer_bbox(); } } @@ -8128,7 +8166,7 @@ int Plater::export_3mf(const boost::filesystem::path& output_path, SaveStrategy for (int i = 0; i < plate_data_list.size(); i++) { PlateData *plate_data = plate_data_list[i]; - for (auto it = plate_data->slice_flaments_info.begin(); it != plate_data->slice_flaments_info.end(); it++) { + for (auto it = plate_data->slice_filaments_info.begin(); it != plate_data->slice_filaments_info.end(); it++) { it->type = cfg.get_filament_type(it->id); it->color = filament_color ? filament_color->get_at(it->id) : "#FFFFFF"; // save filament info used in curr plate @@ -8192,11 +8230,10 @@ int Plater::export_3mf(const boost::filesystem::path& output_path, SaveStrategy for (unsigned int i = 0; i < calibration_thumbnails.size(); i++) { - delete calibration_thumbnails[i]; + //release the data here, as it will always be generated when export + calibration_thumbnails[i]->reset(); } - for (int i = 0; i < plate_bboxes.size(); i++) - delete plate_bboxes[i]; - thumbnails.clear(); + return 0; } @@ -8428,7 +8465,7 @@ int Plater::send_gcode(int plate_idx, Export3mfProgressFn proFn) #if !BBL_RELEASE_TO_PUBLIC //only save model in QA environment std::string sel = get_app_config()->get("iot_environment"); - if (sel == ENV_QAT_HOST) + if (sel == ENV_PRE_HOST) strategy = SaveStrategy::Silence | SaveStrategy::SplitModel | SaveStrategy::WithGcode; #endif @@ -9764,6 +9801,7 @@ void Plater::show_status_message(std::string s) BOOST_LOG_TRIVIAL(trace) << "show_status_message:" << s; } +bool Plater::can_add_timelapse_wt() const { return p->can_add_timelapse_wt(); } // BBS bool Plater::can_delete() const { return p->can_delete(); } bool Plater::can_delete_all() const { return p->can_delete_all(); } bool Plater::can_add_model() const { return !is_background_process_slicing(); } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 5b489f1e7b..95d3f635b4 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -82,6 +82,9 @@ wxDECLARE_EVENT(EVT_SLICING_UPDATE, Slic3r::SlicingStatusEvent); wxDECLARE_EVENT(EVT_PUBLISH, wxCommandEvent); wxDECLARE_EVENT(EVT_REPAIR_MODEL, wxCommandEvent); wxDECLARE_EVENT(EVT_FILAMENT_COLOR_CHANGED, wxCommandEvent); +wxDECLARE_EVENT(EVT_INSTALL_PLUGIN_NETWORKING, wxCommandEvent); +wxDECLARE_EVENT(EVT_INSTALL_PLUGIN_HINT, wxCommandEvent); +wxDECLARE_EVENT(EVT_PREVIEW_ONLY_MODE_HINT, wxCommandEvent); const wxString DEFAULT_PROJECT_NAME = "Untitled"; @@ -418,6 +421,7 @@ public: //BBS: void fill_color(int extruder_id); + bool can_add_timelapse_wt() const; bool can_delete() const; bool can_delete_all() const; diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 1037562646..f6846263f5 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -33,7 +33,7 @@ wxBoxSizer *PreferencesDialog::create_item_title(wxString title, wxWindow *paren m_title->SetForegroundColour(DESIGN_GRAY800_COLOR); m_title->SetFont(::Label::Head_13); m_title->Wrap(-1); - m_title->SetToolTip(tooltip); + //m_title->SetToolTip(tooltip); auto m_line = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); m_line->SetBackgroundColour(DESIGN_GRAY400_COLOR); @@ -244,12 +244,12 @@ wxBoxSizer *PreferencesDialog::create_item_region_combobox(wxString title, wxWin return; } else { NetworkAgent *agent = wxGetApp().getAgent(); + wxGetApp().request_user_logout(); AppConfig * config = GUI::wxGetApp().app_config; if (agent) { agent->set_country_code(area); - config->set("region", region.ToStdString()); } - wxGetApp().request_user_logout(); + config->set("region", region.ToStdString()); EndModal(wxID_CANCEL); } @@ -472,7 +472,7 @@ wxBoxSizer *PreferencesDialog::create_item_checkbox(wxString title, wxWindow *pa if (param == "sync_user_preset") { bool sync = app_config->get("sync_user_preset") == "true" ? true : false; if (sync) { - wxGetApp().start_sync_user_preset(); + wxGetApp().start_sync_user_preset(true); } else { wxGetApp().stop_sync_user_preset(); } @@ -870,7 +870,7 @@ wxBoxSizer* PreferencesDialog::create_debug_page() wxGetApp().request_user_logout(); agent->set_country_code(country_code); } - wxMessageBox(_L("Swith cloud environment, Please login again!")); + wxMessageBox(_L("Switch cloud environment, Please login again!")); } // bbs backup diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index de2ba859b0..dcf71dcd51 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -233,6 +233,9 @@ int PresetComboBox::update_ams_color() new_cfg.set_key_value("filament_colour", colors); cfg->apply(new_cfg); wxGetApp().plater()->on_config_change(new_cfg); + //trigger the filament color changed + wxCommandEvent *evt = new wxCommandEvent(EVT_FILAMENT_COLOR_CHANGED); + wxQueueEvent(wxGetApp().plater(), evt); return idx; } @@ -381,7 +384,7 @@ void PresetComboBox::add_ams_filaments(std::string selected, bool alias_name) for (auto &f : m_preset_bundle->filament_ams_list) { std::string setting_id = f.opt_string("filament_settings_id", 0u); auto iter = std::find_if(filaments.begin(), filaments.end(), - [&setting_id](auto &f) { return f.is_compatible && f.filament_id == setting_id; }); + [&setting_id](auto &f) { return f.is_compatible && f.is_system && f.filament_id == setting_id; }); if (iter == filaments.end()) continue; const_cast(*iter).is_visible = true; diff --git a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp index d5320beaaa..621c614565 100644 --- a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp +++ b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp @@ -1,6 +1,8 @@ #include "PrinterFileSystem.h" #include "libslic3r/Utils.hpp" +#include "../../Utils/NetworkAgent.hpp" + #include #include @@ -39,8 +41,7 @@ PrinterFileSystem::PrinterFileSystem() } PrinterFileSystem::~PrinterFileSystem() -{ -} +{ m_recv_thread.detach(); } void PrinterFileSystem::SetFileType(FileType type) { @@ -50,6 +51,8 @@ void PrinterFileSystem::SetFileType(FileType type) m_file_list.swap(m_file_list2); m_lock_start = m_lock_end = 0; SendChangedEvent(EVT_FILE_CHANGED); + m_status = Status::ListSyncing; + SendChangedEvent(EVT_STATUS_CHANGED, m_status); ListAllFiles(); } @@ -110,6 +113,7 @@ void PrinterFileSystem::ListAllFiles() } BuildGroups(); m_status = Status::ListReady; + SendChangedEvent(EVT_STATUS_CHANGED, m_status); SendChangedEvent(EVT_FILE_CHANGED); return 0; }); @@ -271,13 +275,14 @@ void PrinterFileSystem::SetUrl(std::string const &url) void PrinterFileSystem::Stop(bool quit) { boost::unique_lock l(m_mutex); - if (m_stopped) return; - m_stopped = true; if (quit) { m_session.owner = nullptr; // let the thread delete this m_callbacks.push_back([thiz = shared_from_this()](int result, json const &, unsigned char const *) { (void) thiz; }); + } else if (m_stopped) { + return; } + m_stopped = true; m_cond.notify_all(); } @@ -320,7 +325,7 @@ void PrinterFileSystem::DeleteFilesContinue() req["delete"] = arr; m_task_flags |= FF_DELETED; SendRequest( - FILE_DEL, req, nullptr, + FILE_DEL, req, nullptr, [indexes, names, this](int, Void const &) { // TODO: for (size_t i = indexes.size() - 1; i >= 0; --i) @@ -512,14 +517,15 @@ void PrinterFileSystem::FileRemoved(size_t index, std::string const &name) struct CallbackEvent : wxCommandEvent { - CallbackEvent(std::function const &callback) : wxCommandEvent(EVT_FILE_CALLBACK), callback(callback) {} - ~CallbackEvent(){ callback(); } + CallbackEvent(std::function const &callback, boost::weak_ptr owner) : wxCommandEvent(EVT_FILE_CALLBACK), callback(callback), owner(owner) {} + ~CallbackEvent(){ if (!owner.expired()) callback(); } std::function const callback; + boost::weak_ptr owner; }; void PrinterFileSystem::PostCallback(std::function const& callback) { - wxCommandEvent *e = new CallbackEvent(callback); + wxCommandEvent *e = new CallbackEvent(callback, boost::weak_ptr(shared_from_this())); wxQueueEvent(this, e); } @@ -719,7 +725,7 @@ void PrinterFileSystem::Reconnect(boost::unique_lock &l, int resul if (c) c(result, r, nullptr); } m_messages.clear(); - while (true) { + while (true) { while (m_stopped) { if (m_session.owner == nullptr) return; @@ -796,25 +802,22 @@ StaticBambuLib &StaticBambuLib::get() { static StaticBambuLib lib; // first load the library -#if defined(_MSC_VER) || defined(_WIN32) - module = LoadLibrary(L"BambuSource.dll"); -#elif defined(__WXMAC__) - module = dlopen("libBambuSource.dylib", RTLD_LAZY); -#else - module = dlopen("libBambuSource.so", RTLD_LAZY); -#endif + + if (!module) { + module = Slic3r::NetworkAgent::get_bambu_source_entry(); + } if (!module) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ", can not Load Library"; } - + GET_FUNC(Bambu_Open); GET_FUNC(Bambu_StartStream); GET_FUNC(Bambu_SendMessage); GET_FUNC(Bambu_ReadSample); GET_FUNC(Bambu_Close); GET_FUNC(Bambu_FreeLogMsg); - + if (!lib.Bambu_Open) lib.Bambu_Open = Fake_Bambu_Open; return lib; diff --git a/src/slic3r/GUI/Printer/PrinterFileSystem.h b/src/slic3r/GUI/Printer/PrinterFileSystem.h index ad6b827265..31df48994c 100644 --- a/src/slic3r/GUI/Printer/PrinterFileSystem.h +++ b/src/slic3r/GUI/Printer/PrinterFileSystem.h @@ -184,7 +184,7 @@ private: template boost::uint32_t SendRequest(int type, json const& req, Translator const& translator, Callback const& callback) { - auto c = [translator, callback, thiz = shared_from_this()](int result, json const &resp, unsigned char const *data) + auto c = [translator, callback, this](int result, json const &resp, unsigned char const *data) { T t; if (result == 0 || result == CONTINUE) { @@ -196,7 +196,7 @@ private: result = ERROR_JSON; } } - thiz->PostCallback(callback, result, t); + PostCallback(callback, result, t); }; return SendRequest(type, req, c); } @@ -206,7 +206,7 @@ private: template void InstallNotify(int type, Translator const& translator, Applier const& applier) { - auto c = [translator, applier, thiz = shared_from_this()](int result, json const &resp, unsigned char const *data) + auto c = [translator, applier, this](int result, json const &resp, unsigned char const *data) { T t; if (result == 0 || result == CONTINUE) { @@ -219,7 +219,7 @@ private: } } if (result == 0 && applier) { - thiz->PostCallback([applier](int, T const & t) { + PostCallback([applier](int, T const & t) { applier(t); }, 0, t); } @@ -274,9 +274,9 @@ private: std::deque m_callbacks; std::deque m_notifies; bool m_stopped = true; - boost::thread m_recv_thread; boost::mutex m_mutex; boost::condition_variable m_cond; + boost::thread m_recv_thread; Status m_status; int m_last_error = 0; }; diff --git a/src/slic3r/GUI/ReleaseNote.cpp b/src/slic3r/GUI/ReleaseNote.cpp index a666253bc2..e363323bda 100644 --- a/src/slic3r/GUI/ReleaseNote.cpp +++ b/src/slic3r/GUI/ReleaseNote.cpp @@ -56,7 +56,7 @@ ReleaseNoteDialog::ReleaseNoteDialog(Plater *plater /*= nullptr*/) m_sizer_right->Add(0, 0, 1, wxTOP, FromDIP(15)); - m_scrollwindw_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(560), FromDIP(430))); + m_scrollwindw_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(560), FromDIP(430)), wxVSCROLL); m_scrollwindw_release_note->SetScrollRate(5, 5); m_scrollwindw_release_note->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8)); m_scrollwindw_release_note->SetMaxSize(wxSize(FromDIP(560), FromDIP(430))); @@ -84,10 +84,118 @@ void ReleaseNoteDialog::update_release_note(std::string release_note, std::strin m_text_up_info->SetLabel(wxString::Format("version %s update information :", version)); wxBoxSizer * sizer_text_release_note = new wxBoxSizer(wxVERTICAL); auto m_staticText_release_note = new wxStaticText(m_scrollwindw_release_note, wxID_ANY, release_note, wxDefaultPosition, wxDefaultSize, 0); - m_staticText_release_note->Wrap(FromDIP(430)); + m_staticText_release_note->Wrap(FromDIP(530)); sizer_text_release_note->Add(m_staticText_release_note, 0, wxALL, 5); m_scrollwindw_release_note->SetSizer(sizer_text_release_note); m_scrollwindw_release_note->Layout(); - } + + +UpdateVersionDialog::UpdateVersionDialog(wxWindow *parent) + : DPIDialog(parent, wxID_ANY, _L("New version of Bambu Studio"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) +{ + std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % resources_dir()).str(); + SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); + + SetBackgroundColour(*wxWHITE); + wxBoxSizer *m_sizer_main = new wxBoxSizer(wxVERTICAL); + auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1)); + m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); + m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0); + m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(30)); + + wxBoxSizer *m_sizer_body = new wxBoxSizer(wxHORIZONTAL); + + m_sizer_body->Add(0, 0, 0, wxLEFT, FromDIP(38)); + + auto sm = create_scaled_bitmap("BambuStudio", nullptr, 70); + auto brand = new wxStaticBitmap(this, wxID_ANY, sm, wxDefaultPosition, wxSize(FromDIP(70), FromDIP(70))); + + m_sizer_body->Add(brand, 0, wxALL, 0); + + m_sizer_body->Add(0, 0, 0, wxRIGHT, FromDIP(25)); + + wxBoxSizer *m_sizer_right = new wxBoxSizer(wxVERTICAL); + + m_text_up_info = new wxStaticText(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0); + m_text_up_info->SetFont(::Label::Head_14); + m_text_up_info->SetForegroundColour(wxColour(0x26, 0x2E, 0x30)); + m_text_up_info->Wrap(-1); + m_sizer_right->Add(m_text_up_info, 0, 0, 0); + + m_sizer_right->Add(0, 0, 1, wxTOP, FromDIP(15)); + + m_scrollwindw_release_note = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, wxSize(FromDIP(560), FromDIP(430)), wxVSCROLL); + m_scrollwindw_release_note->SetScrollRate(5, 5); + m_scrollwindw_release_note->SetBackgroundColour(wxColour(0xF8, 0xF8, 0xF8)); + m_scrollwindw_release_note->SetMaxSize(wxSize(FromDIP(560), FromDIP(430))); + + auto sizer_button = new wxBoxSizer(wxHORIZONTAL); + + + + StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); + + StateColor btn_bg_white(std::pair(wxColour(206, 206, 206), StateColor::Pressed), std::pair(wxColour(238, 238, 238), StateColor::Hovered), + std::pair(*wxWHITE, StateColor::Normal)); + + auto m_butto_ok = new Button(this, _L("OK")); + m_butto_ok->SetBackgroundColor(btn_bg_green); + m_butto_ok->SetBorderColor(*wxWHITE); + m_butto_ok->SetTextColor(*wxWHITE); + m_butto_ok->SetFont(Label::Body_12); + m_butto_ok->SetSize(wxSize(FromDIP(58), FromDIP(24))); + m_butto_ok->SetMinSize(wxSize(FromDIP(58), FromDIP(24))); + + m_butto_ok->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &e) { + EndModal(wxID_YES); + }); + + auto m_button_cancel = new Button(this, _L("Cancel")); + m_button_cancel->SetBackgroundColor(*wxWHITE); + m_button_cancel->SetBorderColor(wxColour(38, 46, 48)); + m_button_cancel->SetFont(Label::Body_12); + m_button_cancel->SetSize(wxSize(FromDIP(58), FromDIP(24))); + m_button_cancel->SetMinSize(wxSize(FromDIP(58), FromDIP(24))); + + m_button_cancel->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &e) { + EndModal(wxID_NO); + }); + + sizer_button->Add(0, 0, 1, wxEXPAND, 5); + sizer_button->Add(m_butto_ok, 0, wxALL, 5); + sizer_button->Add(m_button_cancel, 0, wxALL, 5); + + m_sizer_right->Add(m_scrollwindw_release_note, 0, wxEXPAND | wxRIGHT, FromDIP(20)); + m_sizer_body->Add(m_sizer_right, 1, wxBOTTOM | wxEXPAND, FromDIP(8)); + m_sizer_main->Add(m_sizer_body, 0, wxEXPAND, 0); + m_sizer_main->Add(sizer_button, 0, wxEXPAND, 0); + m_sizer_main->Add(0, 0, 0, wxBOTTOM, 10); + + SetSizer(m_sizer_main); + Layout(); + m_sizer_main->Fit(this); + + Centre(wxBOTH); +} + +UpdateVersionDialog::~UpdateVersionDialog() {} + + +void UpdateVersionDialog::on_dpi_changed(const wxRect &suggested_rect) { +} + +void UpdateVersionDialog::update_version_info(wxString release_note, wxString version) +{ + m_text_up_info->SetLabel(wxString::Format("Click to download new version in default browser: %s", version)); + wxBoxSizer *sizer_text_release_note = new wxBoxSizer(wxVERTICAL); + auto m_staticText_release_note = new wxStaticText(m_scrollwindw_release_note, wxID_ANY, release_note, wxDefaultPosition, wxDefaultSize, 0); + m_staticText_release_note->Wrap(FromDIP(530)); + sizer_text_release_note->Add(m_staticText_release_note, 0, wxALL, 5); + m_scrollwindw_release_note->SetSizer(sizer_text_release_note); + m_scrollwindw_release_note->Layout(); +} + + }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/ReleaseNote.hpp b/src/slic3r/GUI/ReleaseNote.hpp index 0c450629ad..6dc53abbba 100644 --- a/src/slic3r/GUI/ReleaseNote.hpp +++ b/src/slic3r/GUI/ReleaseNote.hpp @@ -49,6 +49,21 @@ public: wxScrolledWindow *m_scrollwindw_release_note {nullptr}; }; +class UpdateVersionDialog : public DPIDialog +{ +public: + UpdateVersionDialog(wxWindow *parent = nullptr); + ~UpdateVersionDialog(); + + void on_dpi_changed(const wxRect &suggested_rect) override; + void update_version_info(wxString release_note, wxString version); + + wxStaticText * m_text_up_info{nullptr}; + wxScrolledWindow *m_scrollwindw_release_note{nullptr}; + wxBoxSizer * sizer_text_release_note{nullptr}; + wxStaticText * m_staticText_release_note{nullptr}; +}; + }} // namespace Slic3r::GUI #endif diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index bcca7e73b6..c79a958901 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -28,7 +28,11 @@ wxDEFINE_EVENT(EVT_UPDATE_WINDOWS_POSITION, wxCommandEvent); wxDEFINE_EVENT(EVT_FINISHED_UPDATE_MACHINE_LIST, wxCommandEvent); wxDEFINE_EVENT(EVT_UPDATE_USER_MACHINE_LIST, wxCommandEvent); wxDEFINE_EVENT(EVT_PRINT_JOB_CANCEL, wxCommandEvent); +wxDEFINE_EVENT(EVT_BIND_MACHINE, wxCommandEvent); wxDEFINE_EVENT(EVT_UNBIND_MACHINE, wxCommandEvent); +wxDEFINE_EVENT(EVT_DISSMISS_MACHINE_LIST, wxCommandEvent); +wxDEFINE_EVENT(EVT_CONNECT_LAN_PRINT, wxCommandEvent); +wxDEFINE_EVENT(EVT_EDIT_PRINT_NAME, wxCommandEvent); #define INITIAL_NUMBER_OF_MACHINES 0 #define LIST_REFRESH_INTERVAL 200 @@ -110,7 +114,6 @@ MachineObjectPanel::MachineObjectPanel(wxWindow *parent, wxWindowID id, const wx this->Bind(wxEVT_ENTER_WINDOW, &MachineObjectPanel::on_mouse_enter, this); this->Bind(wxEVT_LEAVE_WINDOW, &MachineObjectPanel::on_mouse_leave, this); - this->Bind(wxEVT_LEFT_DOWN, &MachineObjectPanel::on_mouse_left_down, this); this->Bind(wxEVT_LEFT_UP, &MachineObjectPanel::on_mouse_left_up, this); } @@ -229,10 +232,10 @@ void MachineObjectPanel::doRender(wxDC &dc) } } -void MachineObjectPanel::update_machine_info(/*std::string dev_id, wxString dev_name, int progress, wxString owner*/ MachineObject *info) +void MachineObjectPanel::update_machine_info(MachineObject *info, bool is_my_devices) { m_info = info; - // m_info->can_abort() ? set_printer_busy() : set_printer_idle(); + m_is_my_devices = is_my_devices; Refresh(); } @@ -248,75 +251,87 @@ void MachineObjectPanel::on_mouse_leave(wxMouseEvent &evt) Refresh(); } -void MachineObjectPanel::on_mouse_left_down(wxMouseEvent &evt) -{ - auto left = GetSize().x - m_unbind_img.GetSize().x - 6; - auto right = left + m_unbind_img.GetSize().x; - auto top = (GetSize().y - m_unbind_img.GetSize().y) / 2; - auto bottom = (GetSize().y - m_unbind_img.GetSize().y) / 2 + m_unbind_img.GetSize().y; - - if ((evt.GetPosition().x >= left && evt.GetPosition().x <= right) && evt.GetPosition().y >= top && evt.GetPosition().y <= bottom) { - } - - Refresh(); - evt.Skip(); -} - void MachineObjectPanel::on_mouse_left_up(wxMouseEvent &evt) { - if (m_show_edit) { - auto edit_left = GetSize().x - m_unbind_img.GetSize().x - 6 - m_edit_name_img.GetSize().x - 6; - auto edit_right = edit_left + m_edit_name_img.GetSize().x; - auto edit_top = (GetSize().y - m_edit_name_img.GetSize().y) / 2; - auto edit_bottom = (GetSize().y - m_edit_name_img.GetSize().y) / 2 + m_edit_name_img.GetSize().y; - if ((evt.GetPosition().x >= edit_left && evt.GetPosition().x <= edit_right) && evt.GetPosition().y >= edit_top && evt.GetPosition().y <= edit_bottom) { - EditDevNameDialog dlg; - dlg.set_machine_obj(m_info); - dlg.ShowModal(); + if (m_is_my_devices) { + // show edit + if (m_show_edit) { + auto edit_left = GetSize().x - m_unbind_img.GetSize().x - 6 - m_edit_name_img.GetSize().x - 6; + auto edit_right = edit_left + m_edit_name_img.GetSize().x; + auto edit_top = (GetSize().y - m_edit_name_img.GetSize().y) / 2; + auto edit_bottom = (GetSize().y - m_edit_name_img.GetSize().y) / 2 + m_edit_name_img.GetSize().y; + if ((evt.GetPosition().x >= edit_left && evt.GetPosition().x <= edit_right) && evt.GetPosition().y >= edit_top && evt.GetPosition().y <= edit_bottom) { + wxCommandEvent event(EVT_EDIT_PRINT_NAME); + event.SetEventObject(this); + wxPostEvent(this, event); + return; + } + } + if (m_show_bind) { + auto left = GetSize().x - m_unbind_img.GetSize().x - 6; + auto right = left + m_unbind_img.GetSize().x; + auto top = (GetSize().y - m_unbind_img.GetSize().y) / 2; + auto bottom = (GetSize().y - m_unbind_img.GetSize().y) / 2 + m_unbind_img.GetSize().y; + + if ((evt.GetPosition().x >= left && evt.GetPosition().x <= right) && evt.GetPosition().y >= top && evt.GetPosition().y <= bottom) { + wxCommandEvent event(EVT_UNBIND_MACHINE, GetId()); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); + } else { + wxGetApp().mainframe->jump_to_monitor(m_info->dev_id); + //wxGetApp().mainframe->SetFocus(); + wxCommandEvent event(EVT_DISSMISS_MACHINE_LIST); + event.SetEventObject(this->GetParent()); + wxPostEvent(this->GetParent(), event); + } return; } - } - - if (m_show_bind) { - auto left = GetSize().x - m_unbind_img.GetSize().x - 6; - auto right = left + m_unbind_img.GetSize().x; - auto top = (GetSize().y - m_unbind_img.GetSize().y) / 2; - auto bottom = (GetSize().y - m_unbind_img.GetSize().y) / 2 + m_unbind_img.GetSize().y; - - if ((evt.GetPosition().x >= left && evt.GetPosition().x <= right) && evt.GetPosition().y >= top && evt.GetPosition().y <= bottom) { - wxCommandEvent event(EVT_UNBIND_MACHINE, GetId()); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); + if (m_info->is_lan_mode_printer()) { + if (m_info->has_access_right() && m_info->is_avaliable()) { + wxGetApp().mainframe->jump_to_monitor(m_info->dev_id); + } else { + wxCommandEvent event(EVT_CONNECT_LAN_PRINT); + event.SetEventObject(this); + wxPostEvent(this, event); + } } else { wxGetApp().mainframe->jump_to_monitor(m_info->dev_id); - wxGetApp().mainframe->SetFocus(); } - return; + } else { + if (m_info->is_lan_mode_printer()) { + wxCommandEvent event(EVT_CONNECT_LAN_PRINT); + event.SetEventObject(this); + wxPostEvent(this, event); + } else { + wxCommandEvent event(EVT_BIND_MACHINE); + event.SetEventObject(this); + wxPostEvent(this, event); + } } + } -wxIMPLEMENT_CLASS(SelectMachinePopup, wxPopupTransientWindow); - -wxBEGIN_EVENT_TABLE(SelectMachinePopup, wxPopupTransientWindow) EVT_MOUSE_EVENTS(SelectMachinePopup::OnMouse) EVT_SIZE(SelectMachinePopup::OnSize) - EVT_SET_FOCUS(SelectMachinePopup::OnSetFocus) EVT_KILL_FOCUS(SelectMachinePopup::OnKillFocus) wxEND_EVENT_TABLE() - - SelectMachinePopup::SelectMachinePopup(wxWindow *parent) +SelectMachinePopup::SelectMachinePopup(wxWindow *parent) : wxPopupTransientWindow(parent, wxBORDER_NONE | wxPU_CONTAINS_CONTROLS), m_dismiss(false) { #ifdef __WINDOWS__ SetDoubleBuffered(true); #endif //__WINDOWS__ + + SetSize(SELECT_MACHINE_POPUP_SIZE); + SetMinSize(SELECT_MACHINE_POPUP_SIZE); + SetMaxSize(SELECT_MACHINE_POPUP_SIZE); + Freeze(); wxBoxSizer *m_sizer_main = new wxBoxSizer(wxVERTICAL); SetBackgroundColour(SELECT_MACHINE_GREY400); - m_panel_body = new wxPanel(this, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_POPUP_SIZE, wxTAB_TRAVERSAL); - m_panel_body->SetBackgroundColour(*wxWHITE); - wxBoxSizer *m_sizer_body = new wxBoxSizer(wxVERTICAL); - m_scrolledWindow = new wxScrolledWindow(m_panel_body, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_LIST_SIZE, wxHSCROLL | wxVSCROLL); + m_scrolledWindow = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_LIST_SIZE, wxHSCROLL | wxVSCROLL); + m_scrolledWindow->SetBackgroundColour(*wxWHITE); + m_scrolledWindow->SetMinSize(SELECT_MACHINE_LIST_SIZE); m_scrolledWindow->SetScrollRate(0, 5); auto m_sizxer_scrolledWindow = new wxBoxSizer(wxVERTICAL); m_scrolledWindow->SetSizer(m_sizxer_scrolledWindow); @@ -328,30 +343,27 @@ wxBEGIN_EVENT_TABLE(SelectMachinePopup, wxPopupTransientWindow) EVT_MOUSE_EVENTS auto other_title = create_title_panel(_L("Other Device")); m_sizer_other_devices = new wxBoxSizer(wxVERTICAL); - m_sizxer_scrolledWindow->Add(own_title, 0, wxEXPAND, 0); + m_sizxer_scrolledWindow->Add(own_title, 0, wxEXPAND | wxLEFT, FromDIP(15)); m_sizxer_scrolledWindow->Add(m_sizer_my_devices, 0, wxEXPAND, 0); - m_sizxer_scrolledWindow->Add(other_title, 0, wxEXPAND, 0); + m_sizxer_scrolledWindow->Add(other_title, 0, wxEXPAND | wxLEFT, FromDIP(15)); m_sizxer_scrolledWindow->Add(m_sizer_other_devices, 0, wxEXPAND, 0); - m_sizer_body->Add(m_scrolledWindow, 1, wxEXPAND | wxALIGN_CENTER_HORIZONTAL | wxALL, 5); - m_panel_body->SetSizer(m_sizer_body); - m_panel_body->Layout(); - m_sizer_main->Add(m_panel_body, 0, wxALL | wxEXPAND, 1); - this->SetSizer(m_sizer_main); - this->Layout(); - m_sizer_main->Fit(this); + m_sizer_main->Add(m_scrolledWindow, 0, wxALL | wxEXPAND, FromDIP(2)); + + SetSizer(m_sizer_main); + Layout(); Thaw(); - //#ifdef __WXMAC__ - // // On Mac, pop up window capture mouse events - // m_scrolledWindow->GetPanel()->Bind(wxEVT_LEFT_UP, &SelectMachinePopup::OnLeftUp, this); - //#endif + #ifdef __APPLE__ + m_scrolledWindow->Bind(wxEVT_LEFT_UP, &SelectMachinePopup::OnLeftUp, this); + #endif // __APPLE__ m_refresh_timer = new wxTimer(); m_refresh_timer->SetOwner(this); Bind(EVT_UPDATE_USER_MACHINE_LIST, &SelectMachinePopup::update_machine_list, this); Bind(wxEVT_TIMER, &SelectMachinePopup::on_timer, this); + Bind(EVT_DISSMISS_MACHINE_LIST, &SelectMachinePopup::on_dissmiss_win, this); } void SelectMachinePopup::Popup(wxWindow *WXUNUSED(focus)) @@ -442,6 +454,7 @@ wxWindow *SelectMachinePopup::create_title_panel(wxString text) void SelectMachinePopup::on_timer(wxTimerEvent &event) { BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup on_timer"; + wxGetApp().reset_to_active(); wxCommandEvent user_event(EVT_UPDATE_USER_MACHINE_LIST); user_event.SetEventObject(this); wxPostEvent(this, user_event); @@ -471,43 +484,21 @@ void SelectMachinePopup::update_other_devices() continue; MachineObjectPanel* op = nullptr; - if (i < m_list_Machine_panel.size()) { - op = m_list_Machine_panel[i]->mPanel; + if (i < m_other_list_machine_panel.size()) { + op = m_other_list_machine_panel[i]->mPanel; + op->Show(); } else { op = new MachineObjectPanel(m_scrolledWindow, wxID_ANY); MachinePanel* mpanel = new MachinePanel(); mpanel->mIndex = wxString::Format("%d", i); mpanel->mPanel = op; - m_list_Machine_panel.push_back(mpanel); + m_other_list_machine_panel.push_back(mpanel); m_sizer_other_devices->Add(op, 0, wxEXPAND, 0); } i++; op->update_machine_info(mobj); - op->Bind(wxEVT_LEFT_DOWN, [this, op, mobj](auto &e){ - int dlg_result = wxID_CANCEL; - if (mobj->is_lan_mode_printer()) { - if (!mobj->has_access_right()) { - ConnectPrinterDialog dlg(this, wxID_ANY, _L("Input access code")); - dlg.set_machine_object(mobj); - dlg_result = dlg.ShowModal(); - } else { - ; - } - } else { - if (wxGetApp().is_user_login()) { - BindMachineDilaog dlg; - dlg.update_machine_info(mobj); - dlg_result = dlg.ShowModal(); - } - } - if (dlg_result == wxID_OK) { - wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); - } - } - ); - if (mobj->is_lan_mode_printer()) { if (mobj->has_access_right()) { op->set_printer_state(PrinterState::IN_LAN); @@ -524,10 +515,28 @@ void SelectMachinePopup::update_other_devices() op->set_printer_state(IDLE); } } + + op->Bind(EVT_CONNECT_LAN_PRINT, [this, mobj](wxCommandEvent &e) { + if (mobj->is_lan_mode_printer()) { + ConnectPrinterDialog dlg(wxGetApp().mainframe, wxID_ANY, _L("Input access code")); + dlg.set_machine_object(mobj); + if (dlg.ShowModal() == wxID_OK) { + wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); + } + } + }); + + op->Bind(EVT_BIND_MACHINE, [this, mobj](wxCommandEvent &e) { + BindMachineDilaog dlg; + dlg.update_machine_info(mobj); + int dlg_result = wxID_CANCEL; + dlg_result = dlg.ShowModal(); + if (dlg_result == wxID_OK) { wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); } + }); } - for (int j = i; j < m_list_Machine_panel.size(); j++) { - m_list_Machine_panel[j]->mPanel->Hide(); + for (int j = i; j < m_other_list_machine_panel.size(); j++) { + m_other_list_machine_panel[j]->mPanel->Hide(); } m_sizer_other_devices->Layout(); m_scrolledWindow->Layout(); @@ -562,8 +571,7 @@ void SelectMachinePopup::update_user_devices() if (i < m_user_list_machine_panel.size()) { op = m_user_list_machine_panel[i]->mPanel; op->Show(); - } - else { + } else { op = new MachineObjectPanel(m_scrolledWindow, wxID_ANY); MachinePanel* mpanel = new MachinePanel(); mpanel->mIndex = wxString::Format("%d", i); @@ -572,7 +580,7 @@ void SelectMachinePopup::update_user_devices() m_sizer_my_devices->Add(op, 0, wxEXPAND, 0); } i++; - op->update_machine_info(mobj); + op->update_machine_info(mobj, true); //set in lan if (mobj->is_lan_mode_printer()) { if (!mobj->is_online()) { @@ -590,8 +598,11 @@ void SelectMachinePopup::update_user_devices() op->set_printer_state(PrinterState::LOCK); } } - op->Bind(EVT_UNBIND_MACHINE, [this, mobj](wxCommandEvent& e) { + op->Bind(EVT_UNBIND_MACHINE, [this, dev, mobj](wxCommandEvent& e) { + dev->set_selected_machine(""); mobj->set_access_code(""); + MessageDialog msg_wingow(nullptr, _L("Log out successful."), "", wxAPPLY | wxOK); + if (msg_wingow.ShowModal() == wxOK) { return; } }); } else { @@ -623,21 +634,21 @@ void SelectMachinePopup::update_user_devices() } } - op->Bind(wxEVT_LEFT_DOWN, [this, op, mobj](auto& e) { + op->Bind(EVT_CONNECT_LAN_PRINT, [this, mobj](wxCommandEvent &e) { if (mobj->is_lan_mode_printer()) { - if (mobj->has_access_right() && mobj->is_avaliable()) { - //Connect printer - mobj->connect(); - } - else { - ConnectPrinterDialog dlg(this, wxID_ANY, _L("Input access code")); - dlg.set_machine_object(mobj); - dlg.ShowModal(); + ConnectPrinterDialog dlg(wxGetApp().mainframe, wxID_ANY, _L("Input access code")); + dlg.set_machine_object(mobj); + if (dlg.ShowModal() == wxID_OK) { + wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); } } - //wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); - } - ); + }); + + op->Bind(EVT_EDIT_PRINT_NAME, [this, mobj](wxCommandEvent &e) { + EditDevNameDialog dlg; + dlg.set_machine_obj(mobj); + dlg.ShowModal(); + }); } for (int j = i; j < m_user_list_machine_panel.size(); j++) { @@ -652,6 +663,11 @@ void SelectMachinePopup::update_user_devices() this->Thaw(); } +void SelectMachinePopup::on_dissmiss_win(wxCommandEvent &event) +{ + Dismiss(); +} + void SelectMachinePopup::update_machine_list(wxCommandEvent &event) { update_user_devices(); @@ -665,18 +681,36 @@ void SelectMachinePopup::start_ssdp(bool start) //if (wxGetApp().getAgent()) { wxGetApp().getAgent()->start_discovery(true, start); } } -void SelectMachinePopup::OnSize(wxSizeEvent &event) { event.Skip(); } - -void SelectMachinePopup::OnSetFocus(wxFocusEvent &event) { event.Skip(); } - -void SelectMachinePopup::OnKillFocus(wxFocusEvent &event) { event.Skip(); } - -void SelectMachinePopup::OnMouse(wxMouseEvent &event) { event.Skip(); } - -void SelectMachinePopup::OnLeftUp(wxMouseEvent &event) +void SelectMachinePopup::OnLeftUp(wxMouseEvent &event) { - this->GetParent()->SetFocus(); - event.Skip(); + auto mouse_pos = ClientToScreen(event.GetPosition()); + auto wxscroll_win_pos = m_scrolledWindow->ClientToScreen(wxPoint(0, 0)); + + if (mouse_pos.x > wxscroll_win_pos.x && mouse_pos.y > wxscroll_win_pos.y && mouse_pos.x < (wxscroll_win_pos.x + m_scrolledWindow->GetSize().x) && + mouse_pos.y < (wxscroll_win_pos.y + m_scrolledWindow->GetSize().y)) { + + for (MachinePanel* p : m_user_list_machine_panel) { + auto p_rect = p->mPanel->ClientToScreen(wxPoint(0, 0)); + if (mouse_pos.x > p_rect.x && mouse_pos.y > p_rect.y && mouse_pos.x < (p_rect.x + p->mPanel->GetSize().x) && mouse_pos.y < (p_rect.y + p->mPanel->GetSize().y)) { + wxMouseEvent event(wxEVT_LEFT_UP); + auto tag_pos = p->mPanel->ScreenToClient(mouse_pos); + event.SetPosition(tag_pos); + event.SetEventObject(p->mPanel); + wxPostEvent(p->mPanel, event); + } + } + + for (MachinePanel* p : m_other_list_machine_panel) { + auto p_rect = p->mPanel->ClientToScreen(wxPoint(0, 0)); + if (mouse_pos.x > p_rect.x && mouse_pos.y > p_rect.y && mouse_pos.x < (p_rect.x + p->mPanel->GetSize().x) && mouse_pos.y < (p_rect.y + p->mPanel->GetSize().y)) { + wxMouseEvent event(wxEVT_LEFT_UP); + auto tag_pos = p->mPanel->ScreenToClient(mouse_pos); + event.SetPosition(tag_pos); + event.SetEventObject(p->mPanel); + wxPostEvent(p->mPanel, event); + } + } + } } static wxString MACHINE_BED_TYPE_STRING[BED_TYPE_COUNT] = { @@ -708,72 +742,10 @@ void SelectMachineDialog::stripWhiteSpace(std::string& str) } } -void SelectMachineDialog::update_info_msg(wxString msg) -{ - if (msg.empty()) { - if (!m_text_load_ams_data->GetLabel().empty()) { - m_text_load_ams_data->SetLabel(wxEmptyString); - m_text_load_ams_data->Hide(); - Layout(); - Fit(); - } - } - else { - auto str_new = msg.ToStdString(); - stripWhiteSpace(str_new); - - auto str_old = m_text_load_ams_data->GetLabel().ToStdString(); - stripWhiteSpace(str_old); - - if (str_new != str_old) { - if (m_text_load_ams_data->GetLabel() != msg) { - m_text_load_ams_data->SetLabel(msg); - m_text_load_ams_data->SetMaxSize(wxSize(FromDIP(400), -1)); - m_text_load_ams_data->SetMinSize(wxSize(FromDIP(400), -1)); - m_text_load_ams_data->Wrap(FromDIP(400)); - m_text_load_ams_data->Show(); - Layout(); - Fit(); - } - } - } -} - -void SelectMachineDialog::update_warn_msg(wxString msg) -{ - if (msg.empty()) { - if (!m_error_load_ams_data->GetLabel().empty()) { - m_error_load_ams_data->SetLabel(wxEmptyString); - m_error_load_ams_data->Hide(); - Layout(); - Fit(); - } - } - else { - auto str_new = msg.ToStdString(); - stripWhiteSpace(str_new); - - auto str_old = m_error_load_ams_data->GetLabel().ToStdString(); - stripWhiteSpace(str_old); - - if (str_new != str_old) { - if (m_error_load_ams_data->GetLabel() != msg) { - m_error_load_ams_data->SetLabel(msg); - m_error_load_ams_data->SetMinSize(wxSize(FromDIP(400), -1)); - m_error_load_ams_data->SetMaxSize(wxSize(FromDIP(400), -1)); - m_error_load_ams_data->Wrap(FromDIP(400)); - m_error_load_ams_data->Show(); - Layout(); - Fit(); - } - } - } -} - SelectMachineDialog::SelectMachineDialog(Plater *plater) : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, _L("Send print job to"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) - , m_plater(plater) - , m_export_3mf_cancel(false) + , m_plater(plater), m_export_3mf_cancel(false) + , m_mapping_popup(AmsMapingPopup(this)) { #ifdef __WINDOWS__ SetDoubleBuffered(true); @@ -800,22 +772,17 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); - m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0); - - m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(22)); - - m_image = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - m_image->SetBackgroundColour(m_colour_def_color); + m_panel_image = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); + m_panel_image->SetBackgroundColour(m_colour_def_color); sizer_thumbnail = new wxBoxSizer(wxVERTICAL); - m_staticbitmap = new wxStaticBitmap(m_image, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize); - sizer_thumbnail->Add(m_staticbitmap, 0, wxEXPAND, 0); - m_image->SetSizer(sizer_thumbnail); - m_image->Layout(); - - m_sizer_main->Add(m_image, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT); - - m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(10)); + m_thumbnailPanel = new ThumbnailPanel(m_panel_image); + m_thumbnailPanel->SetSize(wxSize(FromDIP(256), FromDIP(256))); + m_thumbnailPanel->SetMinSize(wxSize(FromDIP(256), FromDIP(256))); + m_thumbnailPanel->SetMaxSize(wxSize(FromDIP(256), FromDIP(256))); + sizer_thumbnail->Add(m_thumbnailPanel, 0, wxEXPAND, 0); + m_panel_image->SetSizer(sizer_thumbnail); + m_panel_image->Layout(); wxBoxSizer *m_sizer_basic = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *m_sizer_basic_weight = new wxBoxSizer(wxHORIZONTAL); @@ -833,35 +800,16 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_stext_weight = new wxStaticText(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); m_sizer_basic_time->Add(m_stext_weight, 0, wxALL, FromDIP(5)); m_sizer_basic->Add(m_sizer_basic_time, 0, wxALIGN_CENTER, 0); - m_sizer_main->Add(m_sizer_basic, 0, wxALIGN_CENTER, 0); - m_sizer_material = new wxGridSizer(0, 6, 0, 0); - m_sizer_main->Add(m_sizer_material, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(80)); + m_sizer_material = new wxGridSizer(0, 4, 0, 0); - m_text_load_ams_data = new wxStaticText(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL); - m_text_load_ams_data->SetFont(::Label::Body_13); - m_text_load_ams_data->SetForegroundColour(wxColour(0x6B, 0x6B, 0x6B)); + m_statictext_ams_msg = new wxStaticText(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL); + m_statictext_ams_msg->SetFont(::Label::Body_13); + m_statictext_ams_msg->Hide(); - m_error_load_ams_data = new wxStaticText(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL); - m_error_load_ams_data->SetFont(::Label::Body_13); - m_error_load_ams_data->SetForegroundColour(wxColour(0xFF, 0x6F, 0x00)); - - - m_text_load_ams_data->Hide(); - m_error_load_ams_data->Hide(); - - m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(8)); - m_sizer_main->Add(m_text_load_ams_data, 0, wxALIGN_CENTER_HORIZONTAL, 0); - m_sizer_main->Add(m_error_load_ams_data, 0, wxALIGN_CENTER_HORIZONTAL, 0); - m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(8)); - - m__line_materia = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); - m__line_materia->SetForegroundColour(wxColour(238, 238, 238)); - m__line_materia->SetBackgroundColour(wxColour(238, 238, 238)); - - m_sizer_main->Add(m__line_materia, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(30)); - - m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14)); + m_line_materia = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); + m_line_materia->SetForegroundColour(wxColour(238, 238, 238)); + m_line_materia->SetBackgroundColour(wxColour(238, 238, 238)); wxBoxSizer *m_sizer_printer = new wxBoxSizer(wxHORIZONTAL); @@ -874,12 +822,12 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_sizer_printer->Add(m_stext_printer_title, 0, wxALL | wxLEFT, FromDIP(5)); m_sizer_printer->Add(0, 0, 0, wxEXPAND | wxLEFT, FromDIP(12)); - m_comboBox_printer = new ::ComboBox(this, wxID_ANY, L(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY); + m_comboBox_printer = new ::ComboBox(this, wxID_ANY, L(""), wxDefaultPosition, wxSize(FromDIP(250), -1), 0, nullptr, wxCB_READONLY); m_comboBox_printer->Bind(wxEVT_COMBOBOX, &SelectMachineDialog::on_selection_changed, this); m_sizer_printer->Add(m_comboBox_printer, 1, wxEXPAND | wxRIGHT, FromDIP(5)); btn_bg_enable = StateColor(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), - std::pair(wxColour(0, 174, 66), StateColor::Normal)); + std::pair(wxColour(0, 174, 66), StateColor::Normal)); m_button_refresh = new Button(this, _L("Refresh")); m_button_refresh->SetBackgroundColor(btn_bg_enable); @@ -887,117 +835,31 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_button_refresh->SetTextColor(*wxWHITE); m_button_refresh->SetSize(SELECT_MACHINE_DIALOG_BUTTON_SIZE); m_button_refresh->SetMinSize(SELECT_MACHINE_DIALOG_BUTTON_SIZE); - m_button_refresh->SetCornerRadius(FromDIP(12)); + m_button_refresh->SetCornerRadius(FromDIP(10)); m_button_refresh->Bind(wxEVT_BUTTON, &SelectMachineDialog::on_refresh, this); m_sizer_printer->Add(m_button_refresh, 0, wxALL | wxLEFT, FromDIP(5)); - m_sizer_main->Add(m_sizer_printer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(30)); + m_statictext_printer_msg = new wxStaticText(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER_HORIZONTAL); + m_statictext_printer_msg->SetFont(::Label::Body_13); + m_statictext_printer_msg->Hide(); - m_panel_warn = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - wxBoxSizer *m_sizer_warn = new wxBoxSizer(wxHORIZONTAL); + m_sizer_select = new wxGridSizer(1, 2, 0, 0); + select_bed = create_item_checkbox(_L("Bed Leveling"), this, _L("Bed Leveling"), "bed_leveling"); + select_flow = create_item_checkbox(_L("Flow Calibration"), this, _L("Flow Calibration"), "flow_cali"); - m_sizer_warn->Add(0, 0, 1, wxEXPAND, FromDIP(5)); - auto warimg = new wxStaticBitmap(m_panel_warn, wxID_ANY, create_scaled_bitmap("obj_warning", m_panel_warn, 15), wxDefaultPosition, wxSize(FromDIP(15), FromDIP(15)), 0); - m_sizer_warn->Add(warimg, 0, wxEXPAND, 0); - - m_statictext_warn = new wxStaticText(m_panel_warn, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0); - m_statictext_warn->Wrap(-1); - m_statictext_warn->SetFont(::Label::Body_13); - m_statictext_warn->SetForegroundColour(wxColour(255, 111, 0)); - - m_sizer_warn->Add(m_statictext_warn, 0, wxALL | wxEXPAND, FromDIP(5)); - - m_sizer_warn->Add(0, 0, 1, wxEXPAND, FromDIP(5)); - - m_panel_warn->SetSizer(m_sizer_warn); - m_panel_warn->Layout(); - m_sizer_warn->Fit(m_panel_warn); - m_sizer_main->Add(m_panel_warn, 0, wxEXPAND | wxTOP, FromDIP(2)); - - m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14)); - - m_line_bed = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); - m_line_bed->SetForegroundColour(wxColour(238, 238, 238)); - m_line_bed->SetBackgroundColour(wxColour(238, 238, 238)); - - m_sizer_main->Add(m_line_bed, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(30)); - - m_sizer_main->Add(0, 1, 0, wxTOP, FromDIP(14)); - - // BBS hide bed choice - // wxBoxSizer *m_sizer_bed = new wxBoxSizer(wxHORIZONTAL); - // m_staticText_bed_title = new wxStaticText(this, wxID_ANY, L("Bed style"), wxDefaultPosition, wxSize(-1, -1), 0); - // m_staticText_bed_title->SetFont(::Label::Head_14); - // m_staticText_bed_title->Wrap(-1); - // m_staticText_bed_title->SetForegroundColour(m_colour_bold_color); - // m_staticText_bed_title->SetBackgroundColour(m_colour_def_color); - // m_sizer_bed->Add(m_staticText_bed_title, 0, wxALL | wxEXPAND, 5); - // m_sizer_bed->Add(0, 0, 0, wxEXPAND | wxLEFT, 12); - // m_comboBox_bed = new ::ComboBox(this, wxID_ANY, L(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY); - // for (auto i = 0; i < m_bedtype_list.size(); i++) { m_comboBox_bed->Append(m_bedtype_list[i]); } - // m_sizer_bed->Add(m_comboBox_bed, 1, wxEXPAND | wxRIGHT, 30); - // m_sizer_main->Add(m_sizer_bed, 0, wxEXPAND | wxLEFT | wxRIGHT, 30); - - m_sizer_select = new wxGridSizer(2, 2, 0, 0); - - m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(5)); - select_bed = create_item_checkbox(_L("Bed Leveling"), this, _L("Bed Leveling"), "bed_leveling"); - select_flow = create_item_checkbox(_L("Flow Calibration"), this, _L("Flow Calibration"), "flow_cali"); - - //select_vibration = create_item_checkbox(_L("Vibration Calibration"), this, _L("Vibration Calibration"), "vibration_cali"); - //select_layer_inspect = create_item_checkbox(_L("First Layer Inspection"), this, _L("First Layer Inspection"), "layer_inspect"); - - select_bed->Show(false); - select_flow->Show(false); - //select_vibration->Show(false); - //select_layer_inspect->Show(false); - // select_record->Show(false); + select_bed->Show(true); + select_flow->Show(true); m_sizer_select->Add(select_bed); m_sizer_select->Add(select_flow); - //m_sizer_select->Add(select_vibration); - //m_sizer_select->Add(select_layer_inspect); - // m_sizer_select->Add(select_record); - m_sizer_main->Add(m_sizer_select, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(40)); - m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(11)); - - // error msg - m_panel_err = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); - wxBoxSizer *m_sizer_err = new wxBoxSizer(wxHORIZONTAL); - m_sizer_err->Add(0, 0, 0, wxEXPAND, FromDIP(5)); - m_panel_err->Hide(); - - auto errimg = new wxStaticBitmap(m_panel_err, wxID_ANY, create_scaled_bitmap("obj_warning", m_panel_warn, 30), wxDefaultPosition, - wxSize(wxGetApp().em_unit() * 3, wxGetApp().em_unit() * 3), 0); - m_sizer_err->Add(errimg, 0, wxEXPAND, 0); - - m_statictext_err = new wxStaticText(m_panel_err, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0); - m_statictext_err->Wrap(-1); - m_statictext_err->SetForegroundColour(wxColour(255, 111, 0)); - - m_sizer_err->Add(m_statictext_err, 0, wxALL | wxEXPAND, FromDIP(5)); - m_sizer_err->Add(0, 0, 1, wxEXPAND, FromDIP(5)); - - m_panel_err->SetSizer(m_sizer_err); - m_panel_err->Layout(); - m_sizer_err->Fit(m_panel_err); - m_sizer_main->Add(m_panel_err, 0, wxEXPAND | wxLEFT, FromDIP(40)); - - // bottom area - /* m_panel_bottom = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, wxGetApp().em_unit() * 7), wxTAB_TRAVERSAL); - m_panel_bottom->SetMinSize(wxSize(-1, wxGetApp().em_unit() * 7)); - m_panel_bottom->SetMaxSize(wxSize(-1, wxGetApp().em_unit() * 7)); - m_panel_bottom->SetBackgroundColour(m_colour_def_color);*/ // line schedule m_line_schedule = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1)); m_line_schedule->SetBackgroundColour(wxColour(238, 238, 238)); - m_sizer_main->Add(m_line_schedule, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(25)); m_sizer_bottom = new wxBoxSizer(wxVERTICAL); m_simplebook = new wxSimplebook(this, wxID_ANY, wxDefaultPosition, SELECT_MACHINE_DIALOG_SIMBOOK_SIZE, 0); - m_sizer_main->Add(m_simplebook, 0, wxALIGN_CENTER_HORIZONTAL, 0); // perpare mode m_panel_prepare = new wxPanel(m_simplebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); @@ -1014,7 +876,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_button_ensure->SetTextColor(*wxWHITE); m_button_ensure->SetSize(SELECT_MACHINE_DIALOG_BUTTON_SIZE); m_button_ensure->SetMinSize(SELECT_MACHINE_DIALOG_BUTTON_SIZE); - m_button_ensure->SetCornerRadius(FromDIP(12)); + m_button_ensure->SetCornerRadius(FromDIP(10)); m_button_ensure->Bind(wxEVT_BUTTON, &SelectMachineDialog::on_ok, this); m_sizer_pcont->Add(m_button_ensure, 0, wxEXPAND | wxBOTTOM, FromDIP(10)); @@ -1036,7 +898,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) wxBoxSizer *m_sizer_finish_h = new wxBoxSizer(wxHORIZONTAL); auto imgsize = FromDIP(25); - auto completedimg = new wxStaticBitmap(m_panel_finish, wxID_ANY, create_scaled_bitmap("completed", m_panel_warn, 25), wxDefaultPosition, wxSize(imgsize, imgsize), 0); + auto completedimg = new wxStaticBitmap(m_panel_finish, wxID_ANY, create_scaled_bitmap("completed", m_panel_finish, 25), wxDefaultPosition, wxSize(imgsize, imgsize), 0); m_sizer_finish_h->Add(completedimg, 0, wxALIGN_CENTER | wxALL, FromDIP(5)); m_statictext_finish = new wxStaticText(m_panel_finish, wxID_ANY, L("send completed"), wxDefaultPosition, wxDefaultSize, 0); @@ -1053,14 +915,34 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) m_sizer_finish->Fit(m_panel_finish); m_simplebook->AddPage(m_panel_finish, wxEmptyString, false); - m_sizer_main->Add(m_sizer_bottom, 0, wxALIGN_CENTER_HORIZONTAL); - m_sizer_main->Add(0, 0, 0, wxEXPAND|wxTOP, FromDIP(15)); - // bind Bind(EVT_UPDATE_USER_MACHINE_LIST, &SelectMachineDialog::update_printer_combobox, this); Bind(EVT_PRINT_JOB_CANCEL, &SelectMachineDialog::on_print_job_cancel, this); Bind(EVT_SET_FINISH_MAPPING, &SelectMachineDialog::on_set_finish_mapping, this); + m_sizer_main->Add(m_line_top, 0, wxEXPAND, 0); + m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(22)); + m_sizer_main->Add(m_panel_image, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_sizer_main->Add(0, 0, 0, wxTOP, FromDIP(10)); + m_sizer_main->Add(m_sizer_basic, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_sizer_main->Add(m_sizer_material, 0, wxALIGN_CENTER_HORIZONTAL); + m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(8)); + m_sizer_main->Add(m_statictext_ams_msg, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(8)); + m_sizer_main->Add(m_line_materia, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(30)); + m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(14)); + m_sizer_main->Add(m_sizer_printer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(30)); + m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(5)); + m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(8)); + m_sizer_main->Add(m_statictext_printer_msg, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_sizer_main->Add(0, 1, 0, wxTOP, FromDIP(20)); + m_sizer_main->Add(m_sizer_select, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(40)); + m_sizer_main->Add(0, 1, 0, wxTOP, FromDIP(12)); + m_sizer_main->Add(m_line_schedule, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(30)); + m_sizer_main->Add(m_simplebook, 0, wxALIGN_CENTER_HORIZONTAL, 0); + m_sizer_main->Add(m_sizer_bottom, 0, wxALIGN_CENTER_HORIZONTAL); + m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(15)); + SetSizer(m_sizer_main); Layout(); Fit(); @@ -1068,7 +950,7 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) init_bind(); init_timer(); - //CenterOnParent(); + // CenterOnParent(); Centre(wxBOTH); } @@ -1132,28 +1014,80 @@ void SelectMachineDialog::update_select_layout(PRINTER_TYPE type) void SelectMachineDialog::prepare_mode() { - m_panel_warn->Hide(); - m_simplebook->SetSelection(0); - Layout(); - Fit(); + m_status_bar->reset(); + if (m_simplebook->GetSelection() != 0) { + m_simplebook->SetSelection(0); + Layout(); + Fit(); + } } void SelectMachineDialog::sending_mode() { - m_panel_warn->Hide(); - m_simplebook->SetSelection(1); - Layout(); - Fit(); + if (m_simplebook->GetSelection() != 1){ + m_simplebook->SetSelection(1); + Layout(); + Fit(); + } } void SelectMachineDialog::finish_mode() { - m_panel_warn->Hide(); m_simplebook->SetSelection(2); Layout(); Fit(); } + +void SelectMachineDialog::sync_ams_mapping_result(std::vector &result) +{ + for (auto f = result.begin(); f != result.end(); f++) { + BOOST_LOG_TRIVIAL(trace) << "ams_mapping f id = " << f->id << ", tray_id = " << f->tray_id << ", color = " << f->color << ", type = " << f->type; + + MaterialHash::iterator iter = m_materialList.begin(); + while (iter != m_materialList.end()) { + int id = iter->second->id; + Material * item = iter->second; + MaterialItem *m = item->item; + + if (f->id == id) { + wxString ams_id; + wxColour ams_col; + + if (f->tray_id >= 0) { + ams_id = wxString::Format("%02d", f->tray_id + 1); + } else { + ams_id = "-"; + } + + if (!f->color.empty()) { + ams_col = AmsTray::decode_color(f->color); + } else { + // default color + ams_col = wxColour(0x6B, 0x6B, 0x6B); + } + + m->set_ams_info(ams_col, ams_id); + break; + } + iter++; + } + } +} + +void print_ams_mapping_result(std::vector& result) +{ + if (result.empty()) { + BOOST_LOG_TRIVIAL(info) << "print_ams_mapping_result: empty"; + } + + char buffer[256]; + for (int i = 0; i < result.size(); i++) { + ::sprintf(buffer, "print_ams_mapping: F(%02d) -> A(%02d)", result[i].id+1, result[i].tray_id+1); + BOOST_LOG_TRIVIAL(info) << std::string(buffer); + } +} + bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_) { if (!obj_) return false; @@ -1161,40 +1095,17 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_) // try color and type mapping int result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result); if (result == 0) { - for (auto f = m_ams_mapping_result.begin(); f != m_ams_mapping_result.end(); f++) { - BOOST_LOG_TRIVIAL(trace) << "ams_mapping f id = " << f->id << ", tray_id = " << f->tray_id << ", color = " << f->color << ", type = " << f->type; - - MaterialHash::iterator iter = m_materialList.begin(); - while (iter != m_materialList.end()) { - int id = iter->second->id; - Material* item = iter->second; - MaterialItem* m = item->item; - - if (f->id == id) { - wxString ams_id; - wxColour ams_col; - - if (f->tray_id >= 0) { - ams_id = wxString::Format("%02d", f->tray_id + 1); - } else { - ams_id = "-"; - } - - if (!f->color.empty()) { - ams_col = AmsTray::decode_color(f->color); - } else { - // default color - ams_col = wxColour(0x6B, 0x6B, 0x6B); - } - - m->set_ams_info(ams_col, ams_id); - break; - } - iter++; - } + print_ams_mapping_result(m_ams_mapping_result); + std::string ams_array; + get_ams_mapping_result(ams_array); + if (ams_array.empty()) { + reset_ams_material(); + BOOST_LOG_TRIVIAL(info) << "ams_mapping_array=[]"; + } else { + sync_ams_mapping_result(m_ams_mapping_result); + BOOST_LOG_TRIVIAL(info) << "ams_mapping_array=" << ams_array; } } - return obj_->is_valid_mapping_result(m_ams_mapping_result); } @@ -1215,22 +1126,18 @@ bool SelectMachineDialog::get_ams_mapping_result(std::string &mapping_array_str) if (invalid_count == m_ams_mapping_result.size()) { return false; } else { - if (!valid_mapping_result) { - return false; - } else { - json j = json::array(); - for (int i = 0; i < wxGetApp().preset_bundle->filament_presets.size(); i++) { - int tray_id = -1; - for (int k = 0; k < m_ams_mapping_result.size(); k++) { - if (m_ams_mapping_result[k].id == i) { - tray_id = m_ams_mapping_result[k].tray_id; - } + json j = json::array(); + for (int i = 0; i < wxGetApp().preset_bundle->filament_presets.size(); i++) { + int tray_id = -1; + for (int k = 0; k < m_ams_mapping_result.size(); k++) { + if (m_ams_mapping_result[k].id == i) { + tray_id = m_ams_mapping_result[k].tray_id; } - j.push_back(tray_id); } - mapping_array_str = j.dump(); - return true; + j.push_back(tray_id); } + mapping_array_str = j.dump(); + return valid_mapping_result; } return true; } @@ -1240,21 +1147,87 @@ void SelectMachineDialog::prepare(int print_plate_idx) m_print_plate_idx = print_plate_idx; } -void SelectMachineDialog::update_print_status_msg(wxString msg, bool is_warning) +void SelectMachineDialog::update_ams_status_msg(wxString msg, bool is_warning) { - //set style - if (is_warning) { - update_warn_msg(msg); - update_info_msg(wxEmptyString); + auto colour = is_warning ? wxColour(0xFF, 0x6F, 0x00):wxColour(0x6B, 0x6B, 0x6B); + m_statictext_ams_msg->SetForegroundColour(colour); + + if (msg.empty()) { + if (!m_statictext_ams_msg->GetLabel().empty()) { + m_statictext_ams_msg->SetLabel(wxEmptyString); + m_statictext_ams_msg->Hide(); + Layout(); + Fit(); + } } else { - update_warn_msg(wxEmptyString); - update_info_msg(msg); + auto str_new = msg.ToStdString(); + stripWhiteSpace(str_new); + + auto str_old = m_statictext_ams_msg->GetLabel().ToStdString(); + stripWhiteSpace(str_old); + + if (str_new != str_old) { + if (m_statictext_ams_msg->GetLabel() != msg) { + m_statictext_ams_msg->SetLabel(msg); + m_statictext_ams_msg->SetMinSize(wxSize(FromDIP(400), -1)); + m_statictext_ams_msg->SetMaxSize(wxSize(FromDIP(400), -1)); + m_statictext_ams_msg->Wrap(FromDIP(400)); + m_statictext_ams_msg->Show(); + Layout(); + Fit(); + } + } + } +} + +void SelectMachineDialog::update_priner_status_msg(wxString msg, bool is_warning) +{ + auto colour = is_warning ? wxColour(0xFF, 0x6F, 0x00) : wxColour(0x6B, 0x6B, 0x6B); + m_statictext_printer_msg->SetForegroundColour(colour); + + if (msg.empty()) { + if (!m_statictext_printer_msg->GetLabel().empty()) { + m_statictext_printer_msg->SetLabel(wxEmptyString); + m_statictext_printer_msg->Hide(); + Layout(); + Fit(); + } + } else { + auto str_new = msg.ToStdString(); + stripWhiteSpace(str_new); + + auto str_old = m_statictext_printer_msg->GetLabel().ToStdString(); + stripWhiteSpace(str_old); + + if (str_new != str_old) { + if (m_statictext_printer_msg->GetLabel() != msg) { + m_statictext_printer_msg->SetLabel(msg); + m_statictext_printer_msg->SetMinSize(wxSize(FromDIP(400), -1)); + m_statictext_printer_msg->SetMaxSize(wxSize(FromDIP(400), -1)); + m_statictext_printer_msg->Wrap(FromDIP(400)); + m_statictext_printer_msg->Show(); + Layout(); + Fit(); + } + } + } +} + +void SelectMachineDialog::update_print_status_msg(wxString msg, bool is_warning, bool is_printer_msg) +{ + if (is_printer_msg) { + update_ams_status_msg(wxEmptyString, false); + update_priner_status_msg(msg, is_warning); + } else { + update_ams_status_msg(msg, is_warning); + update_priner_status_msg(wxEmptyString, false); } } void SelectMachineDialog::show_status(PrintDialogStatus status) { - BOOST_LOG_TRIVIAL(trace) << "select_machine_dialog: show_status = " << status; + if (m_print_status != status) + BOOST_LOG_TRIVIAL(info) << "select_machine_dialog: show_status = " << status; m_print_status = status; // m_comboBox_printer @@ -1272,73 +1245,73 @@ void SelectMachineDialog::show_status(PrintDialogStatus status) // other if (status == PrintDialogStatus::PrintStatusInit) { - update_print_status_msg(wxEmptyString, false); + update_print_status_msg(wxEmptyString, false, false); Enable_Send_Button(false); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusNoUserLogin) { wxString msg_text = _L("No login account, only printers in LAN mode are displayed"); - update_print_status_msg(msg_text, false); + update_print_status_msg(msg_text, false, true); Enable_Send_Button(false); Enable_Refresh_Button(true); }else if (status == PrintDialogStatus::PrintStatusInvalidPrinter) { - update_print_status_msg(wxEmptyString, true); + update_print_status_msg(wxEmptyString, true, true); Enable_Send_Button(false); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusConnectingServer) { wxString msg_text = _L("Connecting to server"); - update_print_status_msg(msg_text, true); + update_print_status_msg(msg_text, true, true); Enable_Send_Button(true); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusReading) { wxString msg_text = _L("Synchronizing device information"); - update_print_status_msg(msg_text, false); + update_print_status_msg(msg_text, false, true); Enable_Send_Button(false); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusReadingFinished) { - update_print_status_msg(wxEmptyString, false); + update_print_status_msg(wxEmptyString, false, true); Enable_Send_Button(true); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusReadingTimeout) { wxString msg_text = _L("Synchronizing device information time out"); - update_print_status_msg(msg_text, true); + update_print_status_msg(msg_text, true, true); Enable_Send_Button(true); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusInUpgrading) { wxString msg_text = _L("Cannot send the print task when the upgrade is in progress"); - update_print_status_msg(msg_text, true); + update_print_status_msg(msg_text, true, true); Enable_Send_Button(false); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusInSystemPrinting) { wxString msg_text = _L("The printer is executing instructions. Please restart printing after it ends"); - update_print_status_msg(msg_text, true); + update_print_status_msg(msg_text, true, true); Enable_Send_Button(false); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusInPrinting) { wxString msg_text = _L("The printer is busy on other print job"); - update_print_status_msg(msg_text, true); + update_print_status_msg(msg_text, true, true); Enable_Send_Button(false); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusNeedUpgradingAms) { - wxString msg_text = _L("The firmware versions of printer and AMS are too low.Please update to the latest version before sending the print job"); - update_print_status_msg(msg_text, true); - Enable_Send_Button(false); + wxString msg_text = _L("Printer firmware does not support material = >ams slot mapping."); + update_print_status_msg(msg_text, true, true); + Enable_Send_Button(true); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusAmsMappingSuccess){ wxString msg_text = _L("Filaments to AMS slots mappings have been established. You can click a filament above to change its mapping AMS slot"); - update_print_status_msg(msg_text, true); + update_print_status_msg(msg_text, true, false); Enable_Send_Button(true); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusAmsMappingInvalid) { wxString msg_text = _L("Please click each filament above to specify its mapping AMS slot before sending the print job"); - update_print_status_msg(msg_text, true); + update_print_status_msg(msg_text, true, false); Enable_Send_Button(false); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusAmsMappingValid) { - update_print_status_msg(wxEmptyString, false); + update_print_status_msg(wxEmptyString, false, false); Enable_Send_Button(true); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusRefreshingMachineList) { - update_print_status_msg(wxEmptyString, false); + update_print_status_msg(wxEmptyString, false, true); Enable_Send_Button(false); Enable_Refresh_Button(false); } else if (status == PrintDialogStatus::PrintStatusSending) { @@ -1349,29 +1322,17 @@ void SelectMachineDialog::show_status(PrintDialogStatus status) Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusNoSdcard) { wxString msg_text = _L("An SD card needs to be inserted before printing via LAN."); - update_print_status_msg(msg_text, true); + update_print_status_msg(msg_text, true, true); Enable_Send_Button(true); Enable_Refresh_Button(true); } else if (status == PrintDialogStatus::PrintStatusAmsMappingByOrder) { + wxString msg_text = _L("Printer firmware does not support material = >ams slot mapping."); + update_print_status_msg(msg_text, false, false); Enable_Send_Button(true); Enable_Refresh_Button(true); } } -void SelectMachineDialog::update_err_msg(wxString msg) -{ - /* - if (msg.empty()) { - m_statictext_err->SetLabel(wxEmptyString); - m_panel_err->Hide(); - } else { - m_statictext_err->SetLabel(msg); - m_panel_err->Show(); - } - Layout(); - Fit(); - */ -} void SelectMachineDialog::init_model() { @@ -1476,10 +1437,8 @@ void SelectMachineDialog::on_ok(wxCommandEvent &event) m_print_job->task_ams_mapping = ams_mapping_array; else m_print_job->task_ams_mapping = ""; - - if (obj_->has_sdcard()) { - m_print_job->has_sdcard = obj_->has_sdcard(); - } + + m_print_job->has_sdcard = obj_->has_sdcard(); if (obj_->is_only_support_cloud_print()) { m_print_job->cloud_print_only = true; @@ -1505,17 +1464,21 @@ void SelectMachineDialog::on_ok(wxCommandEvent &event) m_print_job->start(); } -void SelectMachineDialog::on_refresh(wxCommandEvent &event) +void SelectMachineDialog::update_user_machine_list() { - show_status(PrintDialogStatus::PrintStatusRefreshingMachineList); - - if (wxGetApp().is_user_login()) { - if (this == NULL || this == nullptr) { return; } - boost::thread get_print_info_thread = Slic3r::create_thread([this] { - DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev) return; - dev->update_user_machine_list_info(); - + NetworkAgent* m_agent = wxGetApp().getAgent(); + if (m_agent && m_agent->is_user_login()) { + boost::thread get_print_info_thread = Slic3r::create_thread([&] { + NetworkAgent* agent = wxGetApp().getAgent(); + unsigned int http_code; + std::string body; + int result = agent->get_user_print_info(&http_code, &body); + if (result == 0) { + m_print_info = body; + } + else { + m_print_info = ""; + } wxCommandEvent event(EVT_UPDATE_USER_MACHINE_LIST); event.SetEventObject(this); wxPostEvent(this, event); @@ -1527,26 +1490,36 @@ void SelectMachineDialog::on_refresh(wxCommandEvent &event) } } +void SelectMachineDialog::on_refresh(wxCommandEvent &event) +{ + BOOST_LOG_TRIVIAL(info) << "m_printer_last_select: on_refresh"; + show_status(PrintDialogStatus::PrintStatusRefreshingMachineList); + + update_user_machine_list(); +} + void SelectMachineDialog::on_set_finish_mapping(wxCommandEvent &evt) { - for (auto i = 0; i < m_ams_mapping_result.size(); i++) { - if (m_ams_mapping_result[i].id == m_current_filament_id) { - m_ams_mapping_result[i].tray_id = evt.GetInt(); - } - } + auto selection_data = evt.GetString(); + auto selection_data_arr = wxSplit(selection_data.ToStdString(), '|'); - auto colours = evt.GetString(); - auto colours_arr = wxSplit(colours.ToStdString(), '|'); - auto c = colours_arr[3]; + BOOST_LOG_TRIVIAL(info) << "The ams mapping selection result: data is " << selection_data; + + if (selection_data_arr.size() == 5) { + for (auto i = 0; i < m_ams_mapping_result.size(); i++) { + if (m_ams_mapping_result[i].id == wxAtoi(selection_data_arr[4])) { + m_ams_mapping_result[i].tray_id = evt.GetInt(); + } + BOOST_LOG_TRIVIAL(trace) << "The ams mapping result: id is " << m_ams_mapping_result[i].id << "tray_id is " << m_ams_mapping_result[i].tray_id; + } - if (colours_arr.size() == 4) { MaterialHash::iterator iter = m_materialList.begin(); while (iter != m_materialList.end()) { Material* item = iter->second; MaterialItem *m = item->item; if (item->id == m_current_filament_id) { - auto ams_colour = wxColour(wxAtoi(colours_arr[0]),wxAtoi(colours_arr[1]),wxAtoi(colours_arr[2])); - m->set_ams_info(ams_colour, colours_arr[3]); + auto ams_colour = wxColour(wxAtoi(selection_data_arr[0]), wxAtoi(selection_data_arr[1]), wxAtoi(selection_data_arr[2])); + m->set_ams_info(ams_colour, selection_data_arr[3]); } iter++; } @@ -1582,37 +1555,32 @@ void SelectMachineDialog::reset_timeout() timeout_count = 0; } -void SelectMachineDialog::update_printer_combobox(wxCommandEvent &event) +void SelectMachineDialog::update_user_printer() { - Slic3r::DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) return; + // update user print info + if (!m_print_info.empty()) { + dev->parse_user_print_info(m_print_info); + m_print_info = ""; + } + // clear machine list m_list.clear(); m_comboBox_printer->Clear(); - - std::vector machine_list; - std::map option_list; + std::vector machine_list; + wxArrayString machine_list_name; + std::map option_list; option_list = dev->get_my_machine_list(); - // local lan machine - /*std::map local_machine_list = dev->get_local_machine_list(); - for (auto it = local_machine_list.begin(); it != local_machine_list.end(); it++) { - if (it->second->is_lan_mode_printer()) { - if (option_list.find(it->first) == option_list.end()) { - option_list.insert(std::make_pair(it->first, it->second)); - } - } - }*/ - // same machine only appear once for (auto it = option_list.begin(); it != option_list.end(); it++) { - if (it->second && it->second->is_online()) { + if (it->second && (it->second->is_online() || it->second->is_connected())) { machine_list.push_back(it->second->dev_name); } } - machine_list = sort_string(machine_list); for (auto tt = machine_list.begin(); tt != machine_list.end(); tt++) { for (auto it = option_list.begin(); it != option_list.end(); it++) { @@ -1622,20 +1590,24 @@ void SelectMachineDialog::update_printer_combobox(wxCommandEvent &event) if (it->second->is_lan_mode_printer()) { dev_name_text += "(LAN)"; } - m_comboBox_printer->Append(dev_name_text); + machine_list_name.Add(dev_name_text); break; } } } + m_comboBox_printer->Set(machine_list_name); + MachineObject* obj = dev->get_selected_machine(); if (obj) { m_printer_last_select = obj->dev_id; + } else { + m_printer_last_select = ""; } + if (m_list.size() > 0) { // select a default machine if (m_printer_last_select.empty()) { - update_select_layout(m_list[0]->printer_type); m_printer_last_select = m_list[0]->dev_id; m_comboBox_printer->SetSelection(0); wxCommandEvent event(wxEVT_COMBOBOX); @@ -1644,58 +1616,71 @@ void SelectMachineDialog::update_printer_combobox(wxCommandEvent &event) } for (auto i = 0; i < m_list.size(); i++) { if (m_list[i]->dev_id == m_printer_last_select) { - update_select_layout(m_list[i]->printer_type); m_comboBox_printer->SetSelection(i); wxCommandEvent event(wxEVT_COMBOBOX); event.SetEventObject(m_comboBox_printer); wxPostEvent(m_comboBox_printer, event); } } - } else { + } + else { m_printer_last_select = ""; update_select_layout(PRINTER_TYPE::PRINTER_3DPrinter_NONE); m_comboBox_printer->SetTextLabel(""); } - dev->set_selected_machine(m_printer_last_select); - - MachineObject* obj_ = dev->get_selected_machine(); - NetworkAgent* agent = wxGetApp().getAgent(); - if (!obj_) { - if (agent) { - if (agent->is_user_login()) { - show_status(PrintDialogStatus::PrintStatusInit); - } - else { - show_status(PrintDialogStatus::PrintStatusNoUserLogin); - } - } - } else { - /* check cloud machine connections */ - if (!obj_->is_lan_mode_printer()) { - if (!obj_->is_info_ready()) { - if (!agent->is_server_connected()) { - agent->refresh_connection(); - show_status(PrintDialogStatus::PrintStatusConnectingServer); - } else { - show_status(PrintDialogStatus::PrintStatusReading); - } - } - } else { - if (obj_->is_info_ready()) { - if (obj_->has_sdcard()) { - show_status(PrintDialogStatus::PrintStatusReading); - } else { - show_status(PrintDialogStatus::PrintStatusNoSdcard); - } - } - } - } - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "for send task, current printer id = " << m_printer_last_select << std::endl; } +void SelectMachineDialog::update_printer_combobox(wxCommandEvent &event) +{ + show_status(PrintDialogStatus::PrintStatusInit); + update_user_printer(); +} + void SelectMachineDialog::on_timer(wxTimerEvent &event) +{ + wxGetApp().reset_to_active(); + update_show_status(); +} + +void SelectMachineDialog::on_selection_changed(wxCommandEvent &event) +{ + /* reset timeout and reading printer info */ + m_status_bar->reset(); + timeout_count = 0; + m_ams_mapping_res = false; + ams_mapping_valid = false; + m_ams_mapping_result.clear(); + + auto selection = m_comboBox_printer->GetSelection(); + DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) return; + + MachineObject* obj = nullptr; + for (int i = 0; i < m_list.size(); i++) { + if (i == selection) { + m_printer_last_select = m_list[i]->dev_id; + obj = m_list[i]; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "for send task, current printer id = " << m_printer_last_select << std::endl; + break; + } + } + + if (obj) { + dev->set_selected_machine(m_printer_last_select); + update_select_layout(obj->printer_type); + } else { + BOOST_LOG_TRIVIAL(error) << "on_selection_changed dev_id not found"; + return; + } + + reset_ams_material(); + + update_show_status(); +} + +void SelectMachineDialog::update_show_status() { // refreshing return if (get_status() == PrintDialogStatus::PrintStatusRefreshingMachineList) @@ -1711,12 +1696,13 @@ void SelectMachineDialog::on_timer(wxTimerEvent &event) DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!agent) return; if (!dev) return; - MachineObject* obj_ = dev->get_selected_machine(); + MachineObject* obj_ = dev->get_my_machine(m_printer_last_select); if (!obj_) { if (agent) { if (agent->is_user_login()) { show_status(PrintDialogStatus::PrintStatusInvalidPrinter); - } else { + } + else { show_status(PrintDialogStatus::PrintStatusNoUserLogin); } } @@ -1737,26 +1723,38 @@ void SelectMachineDialog::on_timer(wxTimerEvent &event) if (is_timeout()) { show_status(PrintDialogStatus::PrintStatusReadingTimeout); return; - } else { + } + else { timeout_count++; show_status(PrintDialogStatus::PrintStatusReading); return; } return; } + reset_timeout(); - + // reading done if (obj_->is_in_upgrading()) { show_status(PrintDialogStatus::PrintStatusInUpgrading); return; - } else if (obj_->is_system_printing()) { + } + else if (obj_->is_system_printing()) { show_status(PrintDialogStatus::PrintStatusInSystemPrinting); return; - } else if (obj_->is_in_printing()) { + } + else if (obj_->is_in_printing()) { show_status(PrintDialogStatus::PrintStatusInPrinting); return; - } + } + + // check sdcard when if lan mode printer + if (obj_->is_lan_mode_printer()) { + if (!obj_->has_sdcard()) { + show_status(PrintDialogStatus::PrintStatusNoSdcard); + return; + } + } // no ams if (!obj_->has_ams()) { @@ -1764,72 +1762,38 @@ void SelectMachineDialog::on_timer(wxTimerEvent &event) return; } - if (!obj_->is_support_ams_mapping()) { - do_ams_mapping(obj_); - show_status(PrintDialogStatus::PrintStatusAmsMappingByOrder); - return; - } - // do ams mapping if no ams result if (m_ams_mapping_result.empty()) { do_ams_mapping(obj_); } + if (!obj_->is_support_ams_mapping()) { + show_status(PrintDialogStatus::PrintStatusNeedUpgradingAms); + return; + } + if (m_ams_mapping_res) { show_status(PrintDialogStatus::PrintStatusAmsMappingSuccess); return; - } else { + } + else { if (obj_->is_valid_mapping_result(m_ams_mapping_result)) { show_status(PrintDialogStatus::PrintStatusAmsMappingValid); - } else { + } + else { show_status(PrintDialogStatus::PrintStatusAmsMappingInvalid); } } } -void SelectMachineDialog::on_selection_changed(wxCommandEvent &event) +void SelectMachineDialog::reset_ams_material() { - /* reset timeout and reading printer info */ - timeout_count = 0; - m_ams_mapping_res = false; - ams_mapping_valid = false; - m_ams_mapping_result.clear(); - - // reading printer info - show_status(PrintDialogStatus::PrintStatusReading); - - if (event.GetString().empty()) { return; } - - auto dev_name = event.GetString().ToStdString(); - auto selection = event.GetSelection(); - - - DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev) return; - MachineObject* obj = nullptr; - for (int i = 0; i < m_list.size(); i++) { - if (i == selection) { - m_printer_last_select = m_list[i]->dev_id; - obj = m_list[i]; - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "for send task, current printer id = " << m_printer_last_select << std::endl; - break; - } - } - - if (obj) { - dev->set_selected_machine(m_printer_last_select); - update_select_layout(obj->printer_type); - } else { - BOOST_LOG_TRIVIAL(error) << "on_selection_changed dev_id not found"; - return; - } - MaterialHash::iterator iter = m_materialList.begin(); while (iter != m_materialList.end()) { - int id = iter->first; - Material * item = iter->second; - MaterialItem *m = item->item; - wxString ams_id = "-"; + int id = iter->first; + Material* item = iter->second; + MaterialItem* m = item->item; + wxString ams_id = "-"; wxColour ams_col = wxColour(0xEE, 0xEE, 0xEE); m->set_ams_info(ams_col, ams_id); iter++; @@ -1873,7 +1837,9 @@ void SelectMachineDialog::Enable_Send_Button(bool en) void SelectMachineDialog::on_dpi_changed(const wxRect &suggested_rect) { m_button_refresh->SetMinSize(SELECT_MACHINE_DIALOG_BUTTON_SIZE); + m_button_refresh->SetCornerRadius(FromDIP(10)); m_button_ensure->SetMinSize(SELECT_MACHINE_DIALOG_BUTTON_SIZE); + m_button_ensure->SetCornerRadius(FromDIP(10)); m_status_bar->msw_rescale(); Fit(); Refresh(); @@ -1898,6 +1864,7 @@ void SelectMachineDialog::set_default() m_list.clear(); m_comboBox_printer->Clear(); m_printer_last_select = ""; + m_print_info = ""; m_comboBox_printer->SetValue(wxEmptyString); m_comboBox_printer->Enable(); // rset status bar @@ -1911,14 +1878,15 @@ void SelectMachineDialog::set_default() show_status(PrintDialogStatus::PrintStatusNoUserLogin); } } + select_bed->Show(); + select_flow->Show(); // checkbox default values m_checkbox_list["bed_leveling"]->SetValue(true); m_checkbox_list["flow_cali"]->SetValue(true); // thumbmail - Freeze(); - wxBitmap bitmap; + //wxBitmap bitmap; ThumbnailData &data = m_plater->get_partplate_list().get_curr_plate()->thumbnail_data; if (data.is_valid()) { wxImage image(data.width, data.height); @@ -1932,12 +1900,12 @@ void SelectMachineDialog::set_default() } } image = image.Rescale(FromDIP(256), FromDIP(256)); - bitmap = wxBitmap(image); - } else { - bitmap = wxBitmap(wxSize(FromDIP(256), FromDIP(256)), 0); + m_thumbnailPanel->set_thumbnail(image); + //bitmap = wxBitmap(image); } - m_staticbitmap->SetBitmap(bitmap); - sizer_thumbnail->Layout(); + + //m_staticbitmap->SetBitmap(bitmap); + //sizer_thumbnail->Layout(); std::vector materials; { @@ -1966,6 +1934,7 @@ void SelectMachineDialog::set_default() m_sizer_material->Clear(); m_materialList.clear(); + m_filaments.clear(); for (auto i = 0; i < extruders.size(); i++) { @@ -1975,35 +1944,12 @@ void SelectMachineDialog::set_default() bmcache.parse_color(colour, rgb); auto colour_rgb = wxColour((int) rgb[0], (int) rgb[1], (int) rgb[2]); - MaterialItem *item = new MaterialItem(this, colour_rgb, _L(materials[extruder])); - m_sizer_material->Add(item, 0, wxLEFT | wxRIGHT, FromDIP(5)); + if (extruder >= materials.size() || extruder < 0) + continue; + MaterialItem *item = new MaterialItem(this, colour_rgb, _L(materials[extruder])); + m_sizer_material->Add(item, 0, wxALL, FromDIP(4)); - // item->Layout(); - - //item->Bind(wxEVT_LEFT_UP, [this, item, materials, extruder](wxMouseEvent &e) { - // auto mouse_pos = ClientToScreen(e.GetPosition()); - // wxPoint rect = item->ClientToScreen(wxPoint(0, 0)); - - // auto mapping = new AmsMapingPopup(this); - // wxPoint pos = item->ClientToScreen(wxPoint(0, 0)); - // pos.y += item->GetRect().height; - // mapping->Position(pos, wxSize(0, 0)); - - // // update ams data - // DeviceManager *dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); - // if (!dev_manager) return; - // MachineObject *obj_ = dev_manager->get_selected_machine(); - - // if (obj_ && obj_->has_ams()) { - // mapping->update_ams_data(obj_->amsList); - // mapping->set_tag_texture(materials[extruder]); - // mapping->Popup(); - // } - // e.Skip(); - //}); - - item->Bind(wxEVT_LEFT_DOWN, [this, item, extruder](wxMouseEvent &e) { - Freeze(); + item->Bind(wxEVT_LEFT_UP, [this, item, materials, extruder](wxMouseEvent &e) { MaterialHash::iterator iter = m_materialList.begin(); while (iter != m_materialList.end()) { int id = iter->first; @@ -2015,8 +1961,29 @@ void SelectMachineDialog::set_default() m_current_filament_id = extruder; item->on_selected(); - Thaw(); - e.Skip(); + }); + + item->Bind(wxEVT_LEFT_DOWN, [this, item, materials, extruder](wxMouseEvent &e) { + auto mouse_pos = ClientToScreen(e.GetPosition()); + wxPoint rect = item->ClientToScreen(wxPoint(0, 0)); + // update ams data + DeviceManager *dev_manager = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev_manager) return; + MachineObject *obj_ = dev_manager->get_selected_machine(); + + if (obj_ && obj_->is_support_ams_mapping()) { + if (m_mapping_popup.IsShown()) return; + wxPoint pos = item->ClientToScreen(wxPoint(0, 0)); + pos.y += item->GetRect().height; + m_mapping_popup.Position(pos, wxSize(0, 0)); + + if (obj_ && obj_->has_ams()) { + m_mapping_popup.set_current_filament_id(extruder); + m_mapping_popup.update_ams_data(obj_->amsList); + m_mapping_popup.set_tag_texture(materials[extruder]); + m_mapping_popup.Popup(); + } + } }); Material *material_item = new Material(); @@ -2025,7 +1992,7 @@ void SelectMachineDialog::set_default() m_materialList[i] = material_item; // build for ams mapping - if (extruder < materials.size()) { + if (extruder < materials.size() && extruder >= 0) { FilamentInfo info; info.id = extruder; info.type = materials[extruder]; @@ -2034,12 +2001,24 @@ void SelectMachineDialog::set_default() } } + if (extruders.size() <= 4) { + m_sizer_material->SetCols(extruders.size()); + Layout(); + Fit(); + } else { + m_sizer_material->SetCols(4); + Layout(); + Fit(); + } + + reset_ams_material(); + // basic info auto aprint_stats = m_plater->get_partplate_list().get_current_fff_print().print_statistics(); wxString time; PartPlate *plate = m_plater->get_partplate_list().get_curr_plate(); if (plate) { - if (plate->get_slice_result()) { time = wxString::Format("%s", get_bbl_remain_time_dhms(plate->get_slice_result()->print_statistics.modes[0].time)); } + if (plate->get_slice_result()) { time = wxString::Format("%s", get_bbl_monitor_time_dhm(plate->get_slice_result()->print_statistics.modes[0].time)); } } char weight[64]; @@ -2051,36 +2030,13 @@ void SelectMachineDialog::set_default() bool SelectMachineDialog::Show(bool show) { + show_status(PrintDialogStatus::PrintStatusInit); + // set default value when show this dialog if (show) { + wxGetApp().reset_to_active(); set_default(); - } - - NetworkAgent *agent = Slic3r::GUI::wxGetApp().getAgent(); - if (agent) { - if (show) - agent->start_subscribe("send_print"); - else - agent->stop_subscribe("send_print"); - - if (agent->is_user_login()) { - boost::thread get_print_info_thread = Slic3r::create_thread([this] { - DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (dev) { - dev->update_user_machine_list_info(); - } - - wxCommandEvent event(EVT_UPDATE_USER_MACHINE_LIST); - event.SetEventObject(this); - wxPostEvent(this, event); - }); - } - - /*if (show) { - agent->start_discovery(true, true); - } else { - agent->start_discovery(true, false); - }*/ + update_user_machine_list(); } if (show) { @@ -2088,10 +2044,11 @@ bool SelectMachineDialog::Show(bool show) } else { m_refresh_timer->Stop(); } - Thaw(); + if (show) { CenterOnParent(); } Layout(); + Fit(); return DPIDialog::Show(show); } @@ -2212,4 +2169,28 @@ void EditDevNameDialog::on_edit_name(wxCommandEvent &e) } } + ThumbnailPanel::ThumbnailPanel(wxWindow *parent, wxWindowID winid, const wxPoint &pos, const wxSize &size) + : wxPanel(parent, winid, pos, size) + { +#ifdef __WINDOWS__ + SetDoubleBuffered(true); +#endif //__WINDOWS__ + + SetBackgroundStyle(wxBG_STYLE_CUSTOM); + wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); + m_staticbitmap = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize); + sizer->Add(m_staticbitmap, 1, wxEXPAND|wxALL, 0); + SetSizer(sizer); + Layout(); + Fit(); + } + + void ThumbnailPanel::set_thumbnail(wxImage img) + { + wxBitmap bitmap(img); + m_staticbitmap->SetBitmap(bitmap); + } + + ThumbnailPanel::~ThumbnailPanel() {} + }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index e8b8105783..a026b50f06 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -105,6 +105,7 @@ private: class MachineObjectPanel : public wxPanel { private: + bool m_is_my_devices {false}; bool m_show_edit{false}; bool m_show_bind{false}; bool m_hover {false}; @@ -142,12 +143,11 @@ public: void show_bind_dialog(); void set_printer_state(PrinterState state); - //void set_can_bind(bool canbind); void show_printer_bind(bool show, PrinterBindState state); void show_edit_printer_name(bool show); - void update_machine_info(MachineObject *info); + void update_machine_info(MachineObject *info, bool is_my_devices = false); protected: void OnPaint(wxPaintEvent &event); @@ -155,12 +155,11 @@ protected: void doRender(wxDC &dc); void on_mouse_enter(wxMouseEvent &evt); void on_mouse_leave(wxMouseEvent &evt); - void on_mouse_left_down(wxMouseEvent &evt); void on_mouse_left_up(wxMouseEvent &evt); }; #define SELECT_MACHINE_POPUP_SIZE wxSize(FromDIP(218), FromDIP(364)) -#define SELECT_MACHINE_LIST_SIZE wxSize(FromDIP(210), FromDIP(306)) +#define SELECT_MACHINE_LIST_SIZE wxSize(FromDIP(214), FromDIP(360)) #define SELECT_MACHINE_ITEM_SIZE wxSize(FromDIP(180), FromDIP(35)) #define SELECT_MACHINE_GREY900 wxColour(38, 46, 48) #define SELECT_MACHINE_GREY600 wxColour(144,144,144) @@ -176,7 +175,8 @@ public: MachineObjectPanel *mPanel; }; -WX_DEFINE_ARRAY(MachinePanel*, MachinePanelHash); + +class ThumbnailPanel; class SelectMachinePopup : public wxPopupTransientWindow { @@ -202,7 +202,7 @@ private: wxWindow * m_panel_body{nullptr}; wxTimer * m_refresh_timer{nullptr}; std::vector m_user_list_machine_panel; - std::vector m_list_Machine_panel; + std::vector m_other_list_machine_panel; boost::thread* get_print_info_thread{ nullptr }; std::string m_print_info; bool m_dismiss { false }; @@ -211,20 +211,13 @@ private: std::map m_free_machine_list; private: - void OnMouse(wxMouseEvent &event); void OnLeftUp(wxMouseEvent &event); - void OnSize(wxSizeEvent &event); - void OnSetFocus(wxFocusEvent &event); - void OnKillFocus(wxFocusEvent &event); void on_timer(wxTimerEvent &event); void update_other_devices(); void update_user_devices(); + void on_dissmiss_win(wxCommandEvent &event); wxWindow *create_title_panel(wxString text); - -private: - wxDECLARE_ABSTRACT_CLASS(SelectMachinePopup); - wxDECLARE_EVENT_TABLE(); }; #define SELECT_MACHINE_DIALOG_BUTTON_SIZE wxSize(FromDIP(68), FromDIP(24)) @@ -250,7 +243,7 @@ enum PrintDialogStatus { PrintStatusRefreshingMachineList, PrintStatusSending, PrintStatusSendingCanceled, - PrintStatusNoSdcard, + PrintStatusNoSdcard }; class SelectMachineDialog : public DPIDialog @@ -263,7 +256,7 @@ private: int m_print_plate_idx; std::string m_printer_last_select; - PrintDialogStatus m_print_status; + PrintDialogStatus m_print_status { PrintStatusInit }; std::vector m_bedtype_list; std::map m_checkbox_list; @@ -279,30 +272,23 @@ protected: bool ams_mapping_valid { false }; Plater * m_plater{nullptr}; wxPanel * m_line_top{nullptr}; - wxPanel * m_image{nullptr}; + wxPanel * m_panel_image{nullptr}; wxStaticText *m_stext_time{nullptr}; wxStaticText *m_stext_weight{nullptr}; - wxPanel * m__line_materia{nullptr}; + wxPanel * m_line_materia{nullptr}; wxStaticText *m_stext_printer_title{nullptr}; - wxStaticText *m_text_load_ams_data{nullptr}; - wxStaticText *m_error_load_ams_data{nullptr}; + wxStaticText *m_statictext_ams_msg{nullptr}; + wxStaticText * m_statictext_printer_msg{nullptr}; wxStaticBitmap* m_staticbitmap {nullptr}; + ThumbnailPanel *m_thumbnailPanel {nullptr}; ::ComboBox * m_comboBox_printer{nullptr}; ::ComboBox * m_comboBox_bed{nullptr}; - wxPanel * m_panel_warn{nullptr}; - wxStaticText *m_statictext_warn{nullptr}; - wxPanel * m_line_bed{nullptr}; wxStaticText *m_staticText_bed_title{nullptr}; wxPanel * m_line_schedule{nullptr}; - wxPanel * m_panel_err{nullptr}; - wxStaticText *m_statictext_err{nullptr}; wxPanel * m_panel_sending{nullptr}; wxStaticText *m_stext_sending{nullptr}; - wxStaticText *m_stext_percent{nullptr}; - wxGauge * m_sending_gauge{nullptr}; - Button * m_cancel{nullptr}; wxPanel * m_panel_prepare{nullptr}; Button * m_button_refresh{nullptr}; Button * m_button_ensure{nullptr}; @@ -320,16 +306,13 @@ protected: wxBoxSizer * m_sizer_bottom; wxWindow *select_bed{nullptr}; - //wxWindow *select_vibration{nullptr}; wxWindow *select_flow{nullptr}; - //wxWindow *select_layer_inspect {nullptr}; - //wxWindow *select_record{nullptr}; - void stripWhiteSpace(std::string& str); - void update_info_msg(wxString msg); - void update_warn_msg(wxString msg); - void update_err_msg(wxString msg); + void stripWhiteSpace(std::string& str); + void update_ams_status_msg(wxString msg, bool is_warning = false); + void update_priner_status_msg(wxString msg, bool is_warning = false); + void update_print_status_msg(wxString msg, bool is_warning = false, bool is_printer = true); public: SelectMachineDialog(Plater *plater = nullptr); @@ -341,11 +324,10 @@ public: void sending_mode(); void finish_mode(); - bool do_ams_mapping(MachineObject* obj_); + void sync_ams_mapping_result(std::vector& result); + bool do_ams_mapping(MachineObject *obj_); bool get_ams_mapping_result(std::string &mapping_array_str); void prepare(int print_plate_idx); - - void update_print_status_msg(wxString msg, bool is_warning = false); void show_status(PrintDialogStatus status); PrintDialogStatus get_status() { return m_print_status; } @@ -358,16 +340,21 @@ public: protected: std::vector m_list; - wxDataViewCtrl * m_dataViewListCtrl_machines; - wxStaticText * m_staticText_left; - wxHyperlinkCtrl * m_hyperlink_add_machine; - wxGauge * m_gauge_job_progress; - wxPanel * m_panel_status; - wxButton * m_button_cancel; + wxDataViewCtrl * m_dataViewListCtrl_machines{nullptr}; + wxStaticText * m_staticText_left{nullptr}; + wxHyperlinkCtrl * m_hyperlink_add_machine{nullptr}; + wxGauge * m_gauge_job_progress{nullptr}; + wxPanel * m_panel_status{nullptr}; + wxButton * m_button_cancel{nullptr}; + AmsMapingPopup m_mapping_popup{nullptr}; + std::string m_print_info; int timeout_count = 0; - bool is_timeout(); - void reset_timeout(); + bool is_timeout(); + void reset_timeout(); + void update_user_printer(); + void reset_ams_material(); + void update_show_status(); wxTimer *m_refresh_timer; @@ -386,6 +373,7 @@ protected: void Enable_Refresh_Button(bool en); void Enable_Send_Button(bool en); void on_dpi_changed(const wxRect &suggested_rect) override; + void update_user_machine_list(); wxImage * LoadImageFromBlob(const unsigned char *data, int size); std::vector sort_string(std::vector strArray); }; @@ -394,6 +382,11 @@ wxDECLARE_EVENT(EVT_FINISHED_UPDATE_MACHINE_LIST, wxCommandEvent); wxDECLARE_EVENT(EVT_REQUEST_BIND_LIST, wxCommandEvent); wxDECLARE_EVENT(EVT_WILL_DISMISS_MACHINE_LIST, wxCommandEvent); wxDECLARE_EVENT(EVT_UPDATE_WINDOWS_POSITION, wxCommandEvent); +wxDECLARE_EVENT(EVT_DISSMISS_MACHINE_LIST, wxCommandEvent); +wxDECLARE_EVENT(EVT_CONNECT_LAN_PRINT, wxCommandEvent); +wxDECLARE_EVENT(EVT_EDIT_PRINT_NAME, wxCommandEvent); +wxDECLARE_EVENT(EVT_UNBIND_MACHINE, wxCommandEvent); +wxDECLARE_EVENT(EVT_BIND_MACHINE, wxCommandEvent); class EditDevNameDialog : public DPIDialog { @@ -411,6 +404,24 @@ public: Button* m_button_confirm {nullptr}; }; + +class ThumbnailPanel : public wxPanel +{ +public: + wxBitmap * m_bitmap{nullptr}; + wxStaticBitmap *m_staticbitmap{nullptr}; + + ThumbnailPanel(wxWindow * parent, + wxWindowID winid = wxID_ANY, + const wxPoint & pos = wxDefaultPosition, + const wxSize & size = wxDefaultSize); + void OnPaint(wxPaintEvent &event); + void PaintBackground(wxDC &dc); + void OnEraseBackground(wxEraseEvent &event); + void set_thumbnail(wxImage img); + ~ThumbnailPanel(); +}; + }} // namespace Slic3r::GUI #endif diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 0fdc195719..69f2a35836 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -39,8 +39,8 @@ static const wxColour STAGE_TEXT_COL = wxColour(0, 174, 66); static const wxColour GROUP_STATIC_LINE_COL = wxColour(206, 206, 206); /* font and foreground colors */ -static const wxFont PAGE_TITLE_FONT = wxFont(11, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, 0, false, wxT("HarmonyOS Sans SC")); -static const wxFont GROUP_TITLE_FONT = wxFont(13, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, 0, false, wxT("HarmonyOS Sans SC")); +static const wxFont PAGE_TITLE_FONT = Label::Body_14; +static const wxFont GROUP_TITLE_FONT = Label::sysFont(17); static wxColour PAGE_TITLE_FONT_COL = wxColour(107, 107, 107); static wxColour GROUP_TITLE_FONT_COL = wxColour(172, 172, 172); @@ -61,6 +61,7 @@ static wxColour TEXT_LIGHT_FONT_COL = wxColour(107, 107, 107); #define SWITCH_BUTTON_SIZE (wxSize(FromDIP(40), -1)) #define TASK_THUMBNAIL_SIZE (wxSize(FromDIP(120), FromDIP(120))) #define TASK_BUTTON_SIZE (wxSize(FromDIP(48), FromDIP(24))) +#define TASK_BUTTON_SIZE2 (wxSize(-1, FromDIP(24))) #define Z_BUTTON_SIZE (wxSize(FromDIP(52), FromDIP(52))) #define MISC_BUTTON_SIZE (wxSize(FromDIP(68), FromDIP(55))) #define TEMP_CTRL_MIN_SIZE (wxSize(FromDIP(122), FromDIP(52))) @@ -167,9 +168,10 @@ void StatusBasePanel::init_bitmaps() m_bitmap_speed_active = create_scaled_bitmap("monitor_speed_active", nullptr, 24); m_thumbnail_placeholder = create_scaled_bitmap("monitor_placeholder", nullptr, 120); m_thumbnail_sdcard = create_scaled_bitmap("monitor_sdcard_thumbnail", nullptr, 120); - m_bitmap_camera = create_scaled_bitmap("monitor_camera", nullptr, 18); + //m_bitmap_camera = create_scaled_bitmap("monitor_camera", nullptr, 18); m_bitmap_extruder = *cache.load_png("monitor_extruder", FromDIP(28), FromDIP(70), false, false); - + m_bitmap_sdcard_state_on = create_scaled_bitmap("sdcard_state_on", nullptr, 16); + m_bitmap_sdcard_state_off = create_scaled_bitmap("sdcard_state_off", nullptr, 16); } wxBoxSizer *StatusBasePanel::create_monitoring_page() @@ -182,7 +184,7 @@ wxBoxSizer *StatusBasePanel::create_monitoring_page() wxBoxSizer *bSizer_monitoring_title; bSizer_monitoring_title = new wxBoxSizer(wxHORIZONTAL); - m_staticText_monitoring = new wxStaticText(m_panel_monitoring_title, wxID_ANY, _L("Monitoring"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); + m_staticText_monitoring = new wxStaticText(m_panel_monitoring_title, wxID_ANY, _L("Camera"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT); m_staticText_monitoring->Wrap(-1); m_staticText_monitoring->SetFont(PAGE_TITLE_FONT); m_staticText_monitoring->SetForegroundColour(PAGE_TITLE_FONT_COL); @@ -202,9 +204,32 @@ wxBoxSizer *StatusBasePanel::create_monitoring_page() m_bmToggleBtn_timelapse->Hide(); bSizer_monitoring_title->Add(m_bmToggleBtn_timelapse, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5)); - m_bitmap_camera_img = new wxStaticBitmap(m_panel_monitoring_title, wxID_ANY, m_bitmap_camera , wxDefaultPosition, wxSize(FromDIP(32), FromDIP(18)), 0); - m_bitmap_camera_img->SetMinSize(wxSize(FromDIP(32), FromDIP(18))); - bSizer_monitoring_title->Add(m_bitmap_camera_img, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5)); + //m_bitmap_camera_img = new wxStaticBitmap(m_panel_monitoring_title, wxID_ANY, m_bitmap_camera , wxDefaultPosition, wxSize(FromDIP(32), FromDIP(18)), 0); + //m_bitmap_camera_img->SetMinSize(wxSize(FromDIP(32), FromDIP(18))); + //bSizer_monitoring_title->Add(m_bitmap_camera_img, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5)); + + m_bitmap_sdcard_off_img = new wxStaticBitmap(m_panel_monitoring_title, wxID_ANY, m_bitmap_sdcard_state_off, wxDefaultPosition, wxSize(FromDIP(32), FromDIP(16)), 0); + m_bitmap_sdcard_off_img->SetMinSize(wxSize(FromDIP(32), FromDIP(16))); + m_bitmap_sdcard_on_img = new wxStaticBitmap(m_panel_monitoring_title, wxID_ANY, m_bitmap_sdcard_state_on, wxDefaultPosition, wxSize(FromDIP(32), FromDIP(16)), 0); + m_bitmap_sdcard_on_img->SetMinSize(wxSize(FromDIP(32), FromDIP(16))); + m_bitmap_sdcard_on_img->Hide(); + + m_timelapse_button = new CameraItem(m_panel_monitoring_title, "timelapse_off_normal", "timelapse_on_normal", "timelapse_off_hover", "timelapse_on_hover"); + m_timelapse_button->SetMinSize(wxSize(32, 24)); + m_timelapse_button->SetBackgroundColour(STATUS_TITLE_BG); + + m_recording_button = new CameraItem(m_panel_monitoring_title, "recording_off_normal", "recording_on_normal", "recording_off_hover", "recording_on_hover"); + m_recording_button->SetMinSize(wxSize(32, 24)); + m_recording_button->SetBackgroundColour(STATUS_TITLE_BG); + + m_timelapse_button->SetToolTip(_L("Timelapse")); + m_recording_button->SetToolTip(_L("Video")); + + bSizer_monitoring_title->Add(m_bitmap_sdcard_off_img, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5)); + bSizer_monitoring_title->Add(m_bitmap_sdcard_on_img, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5)); + bSizer_monitoring_title->Add(m_timelapse_button, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5)); + bSizer_monitoring_title->Add(m_recording_button, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5)); + bSizer_monitoring_title->Add(FromDIP(13), 0, 0); m_panel_monitoring_title->SetSizer(bSizer_monitoring_title); @@ -313,7 +338,7 @@ wxBoxSizer *StatusBasePanel::create_project_task_page(wxWindow *parent) std::pair(wxColour(238, 238, 238), StateColor::Hovered), std::pair(wxColour(255, 255, 255), StateColor::Enabled), std::pair(wxColour(255, 255, 255), StateColor::Normal)); m_button_report->SetBackgroundColor(report_bg); - m_button_report->SetMinSize(TASK_BUTTON_SIZE); + m_button_report->SetMinSize(TASK_BUTTON_SIZE2); StateColor report_bd(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); m_button_report->SetBorderColor(report_bd); StateColor report_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); @@ -333,7 +358,7 @@ wxBoxSizer *StatusBasePanel::create_project_task_page(wxWindow *parent) StateColor pause_resume_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(255, 255, 255), StateColor::Enabled)); m_button_pause_resume->SetTextColor(pause_resume_text); m_button_pause_resume->SetFont(Label::Body_10); - m_button_pause_resume->SetMinSize(TASK_BUTTON_SIZE); + m_button_pause_resume->SetMinSize(TASK_BUTTON_SIZE2); //bSizer_task_btn->Add(m_button_pause_resume, 0, wxALIGN_RIGHT | wxALL, FromDIP(5)); m_sizer_progressbar->Add(m_button_pause_resume, 0, wxALL, FromDIP(5)); @@ -348,7 +373,7 @@ wxBoxSizer *StatusBasePanel::create_project_task_page(wxWindow *parent) StateColor abort_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); m_button_abort->SetTextColor(abort_text); m_button_abort->SetFont(Label::Body_10); - m_button_abort->SetMinSize(TASK_BUTTON_SIZE); + m_button_abort->SetMinSize(TASK_BUTTON_SIZE2); //bSizer_task_btn->Add(m_button_abort, 0, wxALIGN_RIGHT | wxALL, FromDIP(5)); m_sizer_progressbar->Add(m_button_abort, 0, wxALL, FromDIP(5)); @@ -435,7 +460,7 @@ wxBoxSizer *StatusBasePanel::create_machine_control_page(wxWindow *parent) m_calibration_btn->SetBorderColor(btn_bd_green); m_calibration_btn->SetTextColor(*wxWHITE); m_calibration_btn->SetSize(wxSize(FromDIP(128), FromDIP(26))); - m_calibration_btn->SetMinSize(wxSize(FromDIP(128), FromDIP(26))); + m_calibration_btn->SetMinSize(wxSize(-1, FromDIP(26))); bSizer_control_title->Add(m_staticText_control, 1, wxALIGN_CENTER_VERTICAL | wxLEFT, PAGE_TITLE_LEFT_MARGIN); bSizer_control_title->Add(0, 0, 1, wxEXPAND, 0); @@ -623,6 +648,7 @@ void StatusBasePanel::reset_temp_misc_control() m_tempCtrl_bed->GetTextCtrl()->SetLabel(TEMP_BLANK_STR); m_tempCtrl_frame->SetLabel(TEMP_BLANK_STR); m_tempCtrl_frame->GetTextCtrl()->SetLabel(TEMP_BLANK_STR); + m_button_unload->Show(); m_tempCtrl_nozzle->Enable(true); m_tempCtrl_frame->Enable(true); @@ -778,7 +804,7 @@ wxBoxSizer *StatusBasePanel::create_extruder_control(wxWindow *parent) StateColor abort_text(std::pair(wxColour(144, 144, 144), StateColor::Disabled), std::pair(wxColour(38, 46, 48), StateColor::Enabled)); m_button_unload->SetTextColor(abort_text); m_button_unload->SetFont(Label::Body_10); - m_button_unload->SetMinSize(wxSize(FromDIP(52), FromDIP(26))); + m_button_unload->SetMinSize(wxSize(-1, FromDIP(24))); m_button_unload->SetCornerRadius(FromDIP(10)); bSizer_e_ctrl->Add(0, 0, 1, wxEXPAND, 0); bSizer_e_ctrl->Add(m_button_unload, 0, wxALIGN_CENTER_HORIZONTAL| wxTOP|wxBOTTOM, FromDIP(5)); @@ -844,6 +870,40 @@ void StatusBasePanel::show_ams_group(bool show) m_show_ams_group = show; } +void StatusBasePanel::upodate_camera_state(bool recording, bool timelapse, bool has_sdcard) +{ + + //sdcard + /* if (has_sdcard && !m_bitmap_sdcard_img->IsShown()) { + m_bitmap_sdcard_img->Show(); + m_panel_monitoring_title->Layout(); + } + if (!has_sdcard && m_bitmap_sdcard_img->IsShown()) { + m_bitmap_sdcard_img->Hide(); + m_panel_monitoring_title->Layout(); + }*/ + + if (has_sdcard) { + if (m_bitmap_sdcard_off_img->IsShown()) { + m_bitmap_sdcard_on_img->Show(); + m_bitmap_sdcard_off_img->Hide(); + m_panel_monitoring_title->Layout(); + } + } else { + if (m_bitmap_sdcard_on_img->IsShown()) { + m_bitmap_sdcard_on_img->Hide(); + m_bitmap_sdcard_off_img->Show(); + m_panel_monitoring_title->Layout(); + } + } + + //recording + m_recording_button->set_switch(recording); + + //timelapse + m_timelapse_button->set_switch(timelapse); +} + StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name) : StatusBasePanel(parent, id, pos, size, style) { @@ -855,6 +915,7 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co m_buttons.push_back(m_button_report); m_buttons.push_back(m_button_pause_resume); m_buttons.push_back(m_button_abort); + m_buttons.push_back(m_button_unload); m_buttons.push_back(m_bpButton_z_10); m_buttons.push_back(m_bpButton_z_1); m_buttons.push_back(m_bpButton_z_down_1); @@ -887,8 +948,7 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co // Connect Events //m_bitmap_thumbnail->Connect(wxEVT_ENTER_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_enter), NULL, this); //m_bitmap_thumbnail->Connect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_leave), NULL, this); - m_bitmap_camera_img->Connect(wxEVT_ENTER_WINDOW, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this); - //m_bitmap_camera_img->Connect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(StatusPanel::on_camera_leave), NULL, this); + m_recording_button->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::on_switch_recording), NULL, this); m_project_task_panel->Connect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_leave), NULL, this); m_button_pause_resume->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_pause_resume), NULL, this); @@ -924,8 +984,7 @@ StatusPanel::~StatusPanel() // Disconnect Events //m_bitmap_thumbnail->Disconnect(wxEVT_ENTER_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_enter), NULL, this); //m_bitmap_thumbnail->Disconnect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(StatusPanel::on_thumbnail_leave), NULL, this); - m_bitmap_camera_img->Disconnect(wxEVT_ENTER_WINDOW, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this); - //m_bitmap_camera_img->Disconnect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(StatusPanel::on_camera_leave), NULL, this); + m_recording_button->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::on_switch_recording), NULL, this); m_button_pause_resume->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_pause_resume), NULL, this); m_button_abort->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(StatusPanel::on_subtask_abort), NULL, this); m_tempCtrl_bed->Disconnect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_kill_focus), NULL, this); @@ -955,7 +1014,7 @@ void StatusPanel::init_scaled_buttons() m_button_pause_resume->SetCornerRadius(FromDIP(12)); m_button_abort->SetMinSize(wxSize(FromDIP(48), FromDIP(24))); m_button_abort->SetCornerRadius(FromDIP(12)); - m_button_unload->SetMinSize(wxSize(FromDIP(52), FromDIP(24))); + m_button_unload->SetMinSize(wxSize(-1, FromDIP(24))); m_button_unload->SetCornerRadius(FromDIP(10)); m_bpButton_z_10->SetMinSize(Z_BUTTON_SIZE); m_bpButton_z_10->SetCornerRadius(0); @@ -1095,7 +1154,6 @@ void StatusPanel::update(MachineObject *obj) // update_tasklist(obj); update_ams(obj); - update_cali(obj); if (obj) { if (calibration_dlg == nullptr) { @@ -1108,6 +1166,7 @@ void StatusPanel::update(MachineObject *obj) } + upodate_camera_state(obj->has_recording(), obj->has_timelapse(), obj->has_sdcard()); m_machine_ctrl_panel->Thaw(); } @@ -1202,22 +1261,21 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj) m_tempCtrl_frame->SetTagTemp(obj->chamber_temp); } -void StatusPanel::show_unload_ctrl() -{ - m_button_unload->Show(); - m_button_unload->GetParent()->Layout(); -} - void StatusPanel::update_misc_ctrl(MachineObject *obj) { if (!obj) return; if (obj->has_ams()) { - m_button_unload->Hide(); - m_button_unload->GetParent()->Layout(); + if (m_button_unload->IsShown()) { + m_button_unload->Hide(); + m_button_unload->GetParent()->Layout(); + } + } else { - m_button_unload->Show(); - m_button_unload->GetParent()->Layout(); + if (!m_button_unload->IsShown()) { + m_button_unload->Show(); + m_button_unload->GetParent()->Layout(); + } } // nozzle fan @@ -1285,18 +1343,28 @@ void StatusPanel::update_ams(MachineObject *obj) info.ams_id = ams->first; if (ams->second->is_exists && info.parse_ams_info(ams->second)) ams_info.push_back(info); } - if (obj->ams_exist_bits != last_ams_exist_bits || obj->tray_exist_bits != last_tray_exist_bits || obj->tray_is_bbl_bits != last_tray_is_bbl_bits || - obj->tray_read_done_bits != last_read_done_bits || obj->ams_version != last_ams_version) { - m_ams_control->UpdateAms(ams_info, false); - // select current ams - //if (!obj->m_ams_id.empty()) m_ams_control->SwitchAms(obj->m_ams_id); + //if (obj->ams_exist_bits != last_ams_exist_bits || obj->tray_exist_bits != last_tray_exist_bits || obj->tray_is_bbl_bits != last_tray_is_bbl_bits || + // obj->tray_read_done_bits != last_read_done_bits || obj->ams_version != last_ams_version) { + // m_ams_control->UpdateAms(ams_info, false); + // // select current ams + // //if (!obj->m_ams_id.empty()) m_ams_control->SwitchAms(obj->m_ams_id); - last_tray_exist_bits = obj->tray_exist_bits; - last_ams_exist_bits = obj->ams_exist_bits; - last_tray_is_bbl_bits = obj->tray_is_bbl_bits; - last_read_done_bits = obj->tray_read_done_bits; - last_ams_version = obj->ams_version; - } + // last_tray_exist_bits = obj->tray_exist_bits; + // last_ams_exist_bits = obj->ams_exist_bits; + // last_tray_is_bbl_bits = obj->tray_is_bbl_bits; + // last_read_done_bits = obj->tray_read_done_bits; + // last_ams_version = obj->ams_version; + //} + + // select current ams + // if (!obj->m_ams_id.empty()) m_ams_control->SwitchAms(obj->m_ams_id); + + m_ams_control->UpdateAms(ams_info, false); + last_tray_exist_bits = obj->tray_exist_bits; + last_ams_exist_bits = obj->ams_exist_bits; + last_tray_is_bbl_bits = obj->tray_is_bbl_bits; + last_read_done_bits = obj->tray_read_done_bits; + last_ams_version = obj->ams_version; } if (!obj->is_ams_unload()) { @@ -1314,40 +1382,60 @@ void StatusPanel::update_ams(MachineObject *obj) if (obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { // wait to heat hotend if (obj->ams_status_sub == 0x02) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE); + if (curr_ams_id == obj->m_ams_id) { if (!obj->is_ams_unload()) { + m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, true); m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_3); } else { + m_ams_control->SetFilamentStep(FilamentStep::STEP_HEAT_NOZZLE, false); m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_3); } } } else if (obj->ams_status_sub == 0x03) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT); - if (!obj->is_ams_unload()) + if (!obj->is_ams_unload()) { + m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, true); m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP1); - else + } + else { + m_ams_control->SetFilamentStep(FilamentStep::STEP_CUT_FILAMENT, false); m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); + } + } else if (obj->ams_status_sub == 0x04) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT); - if (!obj->is_ams_unload()) + if (!obj->is_ams_unload()) { + m_ams_control->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, true); m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); - else + } + else { + //FilamentStep::STEP_PULL_CURR_FILAMENT); + m_ams_control->SetFilamentStep(FilamentStep::STEP_PULL_CURR_FILAMENT, false); m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + } } else if (obj->ams_status_sub == 0x05) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT); - if (!obj->is_ams_unload()) + if (!obj->is_ams_unload()) { + m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, true); m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); - else + } + else { + m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, false); m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + } } else if (obj->ams_status_sub == 0x06) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT); - if (!obj->is_ams_unload()) + if (!obj->is_ams_unload()) { + m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, true); m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); - else + } else { + m_ams_control->SetFilamentStep(FilamentStep::STEP_PUSH_NEW_FILAMENT, false); m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + } } else if (obj->ams_status_sub == 0x07) { - m_ams_control->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT); + if (!obj->is_ams_unload()) { + m_ams_control->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT); + } else { + m_ams_control->SetFilamentStep(FilamentStep::STEP_PURGE_OLD_FILAMENT, false); + } + m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); } else { m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); @@ -1360,7 +1448,7 @@ void StatusPanel::update_ams(MachineObject *obj) m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); } } else { - m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE); + m_ams_control->SetFilamentStep(FilamentStep::STEP_IDLE, false); if (obj->is_filament_move()) { m_ams_control->SetAmsStep(curr_ams_id, obj->m_tray_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); } else { @@ -1387,75 +1475,52 @@ void StatusPanel::update_ams(MachineObject *obj) // update rfid button style // update load/unload enable state - // printing - if (obj->ams_status_main != AMS_STATUS_MAIN_FILAMENT_CHANGE) { - if (obj->m_tray_now == "255") { - m_ams_control->SetActionState(AMSAction::AMS_ACTION_LOAD); - } else { - m_ams_control->SetActionState(AMSAction::AMS_ACTION_NORMAL); - } - } else { + if (obj->is_in_printing() && !obj->can_resume()) { m_ams_control->SetActionState(AMSAction::AMS_ACTION_PRINTING); + } else { + if (obj->ams_status_main != AMS_STATUS_MAIN_FILAMENT_CHANGE) { + if (obj->m_tray_now == "255") { + m_ams_control->SetActionState(AMSAction::AMS_ACTION_LOAD); + } else { + m_ams_control->SetActionState(AMSAction::AMS_ACTION_NORMAL); + } + } else { + m_ams_control->SetActionState(AMSAction::AMS_ACTION_PRINTING); + } } } void StatusPanel::update_cali(MachineObject *obj) { if (!obj) return; - if (obj->is_in_printing()) { - m_calibration_btn->Disable(); - return; - } else { - m_calibration_btn->Enable(); - if (!obj->is_in_calibration()) { - m_calibration_btn->SetLabel(_L("Start Calibration")); - } else { + + if (obj->is_in_calibration()) { + m_calibration_btn->SetLabel(_L("Calibrating")); + if (calibration_dlg && calibration_dlg->IsShown()) { m_calibration_btn->Disable(); - m_calibration_btn->SetLabel(_L("Calibrating")); + } else { + m_calibration_btn->Enable(); + } + } else { + // IDLE + m_calibration_btn->SetLabel(_L("Start Calibration")); + // disable in printing + if (obj->is_in_printing()) { + m_calibration_btn->Disable(); + } else { + m_calibration_btn->Enable(); } } } -void StatusPanel::update_subtask(MachineObject *obj) +void StatusPanel::update_left_time(int mc_left_time) { - if (!obj) return; - - if (!obj->is_in_printing() - || obj->is_system_printing() - ) { - reset_printing_values(); - return; - } - - // update button enable status - if (obj->can_abort()) { - m_button_abort->Enable(); - } else { - m_button_abort->Enable(false); - } - - if (obj->can_pause() || obj->can_resume()) { - m_button_pause_resume->Enable(); - if (obj->can_resume()) - m_button_pause_resume->SetLabel(_L("Resume")); - else - m_button_pause_resume->SetLabel(_L("Pause")); - } else { - m_button_pause_resume->Enable(false); - } - - if (obj->is_sdcard_printing()) { - update_sdcard_subtask(obj); - } else { - update_cloud_subtask(obj); - } - // update gcode progress std::string left_time; wxString left_time_text = NA_STR; try { - left_time = get_bbl_monitor_time_dhm(obj->mc_left_time); + left_time = get_bbl_monitor_time_dhm(mc_left_time); } catch (...) { ; } @@ -1463,12 +1528,57 @@ void StatusPanel::update_subtask(MachineObject *obj) // update current subtask progress m_staticText_progress_left->SetLabelText(left_time_text); +} - if (!obj->is_printing_finished()) { - // update printing stage - m_printing_stage_value->SetLabelText(obj->get_curr_stage()); +void StatusPanel::update_subtask(MachineObject *obj) +{ + if (!obj) return; + + if (obj->is_system_printing()) { + reset_printing_values(); + } else if (obj->is_in_printing() || obj->print_status == "FINISH") { + if (obj->is_in_prepare()) { + m_button_abort->Enable(false); + m_button_pause_resume->Enable(false); + m_button_pause_resume->SetLabel(_L("Pause")); + wxString prepare_text = wxString::Format(_L("Downloading...")); + if (obj->gcode_file_prepare_percent >= 0 && obj->gcode_file_prepare_percent <= 100) + prepare_text += wxString::Format("(%d%%)", obj->gcode_file_prepare_percent); + m_printing_stage_value->SetLabelText(prepare_text); + m_gauge_progress->SetValue(0); + m_staticText_progress_percent->SetLabelText(NA_STR); + m_staticText_progress_left->SetLabel(NA_STR); + m_staticText_progress_left->SetLabelText(NA_STR); + wxString subtask_text = wxString::Format("%s", GUI::from_u8(obj->subtask_name)); + m_staticText_subtask_value->SetLabelText(subtask_text); + } else { + if (obj->can_resume()) + m_button_pause_resume->SetLabel(_L("Resume")); + else + m_button_pause_resume->SetLabel(_L("Pause")); + m_button_abort->Enable(true); + m_button_pause_resume->Enable(true); + // update printing stage + m_printing_stage_value->SetLabelText(obj->get_curr_stage()); + update_left_time(obj->mc_left_time); + if (obj->subtask_) { + m_gauge_progress->SetValue(obj->subtask_->task_progress); + m_staticText_progress_percent->SetLabelText(wxString::Format("%d%%", obj->subtask_->task_progress)); + } else { + m_gauge_progress->SetValue(0); + m_staticText_progress_percent->SetLabelText(NA_STR); + } + } + wxString subtask_text = wxString::Format("%s", GUI::from_u8(obj->subtask_name)); + m_staticText_subtask_value->SetLabelText(subtask_text); + //update thumbnail + if (obj->is_sdcard_printing()) { + update_sdcard_subtask(obj); + } else { + update_cloud_subtask(obj); + } } else { - m_printing_stage_value->SetLabelText(""); + reset_printing_values(); } this->Layout(); @@ -1505,42 +1615,28 @@ void StatusPanel::update_cloud_subtask(MachineObject *obj) } } } - - // update subtask name - wxString subtask_text; - subtask_text = wxString::Format("%s", GUI::from_u8(obj->subtask_name)); - - m_staticText_subtask_value->SetLabelText(subtask_text); - - m_gauge_progress->SetValue(obj->subtask_->task_progress); - m_staticText_progress_percent->SetLabelText(wxString::Format("%d%%", obj->subtask_->task_progress)); } void StatusPanel::update_sdcard_subtask(MachineObject *obj) { if (!obj) return; - wxString subtask_text = wxString::Format("%s", GUI::from_u8(obj->subtask_name)); - m_staticText_subtask_value->SetLabelText(subtask_text); - if (!m_load_sdcard_thumbnail) { m_bitmap_thumbnail->SetBitmap(m_thumbnail_sdcard); m_load_sdcard_thumbnail = true; } - - m_gauge_progress->SetValue(obj->subtask_->task_progress); - m_staticText_progress_percent->SetLabelText(wxString::Format("%d%%", obj->subtask_->task_progress)); } void StatusPanel::reset_printing_values() { m_button_pause_resume->Enable(false); + m_button_pause_resume->SetLabel(_L("Pause")); m_button_abort->Enable(false); m_gauge_progress->SetValue(0); - m_staticText_subtask_value->SetLabelText("N/A"); + m_staticText_subtask_value->SetLabelText(NA_STR); m_printing_stage_value->SetLabelText(""); - m_staticText_progress_left->SetLabelText("N/A"); - m_staticText_progress_percent->SetLabelText("N/A"); + m_staticText_progress_left->SetLabelText(NA_STR); + m_staticText_progress_percent->SetLabelText(NA_STR); m_bitmap_thumbnail->SetBitmap(m_thumbnail_placeholder); m_start_loading_thumbnail = false; m_load_sdcard_thumbnail = false; @@ -1602,7 +1698,7 @@ void StatusPanel::on_set_bed_temp() try { long bed_temp; if (str.ToLong(&bed_temp) && obj) { - m_temp_bed_timeout = COMMAND_TIMEOUT; + set_hold_count(m_temp_bed_timeout); obj->command_set_bed(bed_temp); } } catch (...) { @@ -1616,7 +1712,7 @@ void StatusPanel::on_set_nozzle_temp() try { long nozzle_temp; if (str.ToLong(&nozzle_temp) && obj) { - m_temp_nozzle_timeout = COMMAND_TIMEOUT; + set_hold_count(m_temp_nozzle_timeout); obj->command_set_nozzle(nozzle_temp); } } catch (...) { @@ -1719,16 +1815,53 @@ void StatusPanel::on_filament_edit(wxCommandEvent &event) void StatusPanel::on_ams_refresh_rfid(wxCommandEvent &event) { if (obj) { - std::string tray_id = event.GetString().ToStdString(); - obj->command_ams_refresh_rfid(tray_id); + std::string curr_ams_id = m_ams_control->GetCurentAms(); + std::string curr_can_id = event.GetString().ToStdString(); + + std::map::iterator it = obj->amsList.find(curr_ams_id); + if (it == obj->amsList.end()) { + BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_ams_id << " failed"; + return; + } + auto tray_it = it->second->trayList.find(curr_can_id); + if (tray_it == it->second->trayList.end()) { + BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_can_id << " failed"; + return; + } + + try { + int tray_index = atoi(curr_ams_id.c_str()) * 4 + atoi(tray_it->second->id.c_str()); + obj->command_ams_refresh_rfid(std::to_string(tray_index)); + } catch (...) { + ; + } } } void StatusPanel::on_ams_selected(wxCommandEvent &event) { if (obj) { - std::string tray_id = event.GetString().ToStdString(); - obj->command_ams_select_tray(tray_id); + std::string curr_ams_id = m_ams_control->GetCurentAms(); + std::string curr_can_id = event.GetString().ToStdString(); + + std::map::iterator it = obj->amsList.find(curr_ams_id); + if (it == obj->amsList.end()) { + BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_ams_id << " failed"; + return; + } + auto tray_it = it->second->trayList.find(curr_can_id); + if (tray_it == it->second->trayList.end()) { + BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_can_id << " failed"; + return; + } + + + try { + int tray_index = atoi(curr_ams_id.c_str()) * 4 + atoi(tray_it->second->id.c_str()); + obj->command_ams_select_tray(std::to_string(tray_index)); + } catch (...) { + ; + } } } @@ -1795,7 +1928,7 @@ void StatusPanel::on_switch_speed(wxCommandEvent &event) step->Bind(EVT_STEP_CHANGED, [this](auto &e) { this->speed_lvl = e.GetInt() + 1; if (obj) { - this-> speed_lvl_timeout = COMMAND_TIMEOUT; + set_hold_count(this->speed_lvl_timeout); obj->command_set_printing_speed((PrintingSpeedLevel)this->speed_lvl); } }); @@ -1819,11 +1952,11 @@ void StatusPanel::on_printing_fan_switch(wxCommandEvent &event) if (value) { obj->command_control_fan(MachineObject::FanType::BIG_COOLING_FAN, true); m_switch_printing_fan->SetValue(true); - m_switch_printing_fan_timeout = COMMAND_TIMEOUT; + set_hold_count(this->m_switch_printing_fan_timeout); } else { obj->command_control_fan(MachineObject::FanType::BIG_COOLING_FAN, false); m_switch_printing_fan->SetValue(false); - m_switch_printing_fan_timeout = COMMAND_TIMEOUT; + set_hold_count(this->m_switch_printing_fan_timeout); } } @@ -1836,11 +1969,11 @@ void StatusPanel::on_nozzle_fan_switch(wxCommandEvent &event) if (value) { obj->command_control_fan(MachineObject::FanType::COOLING_FAN, true); m_switch_nozzle_fan->SetValue(true); - m_switch_nozzle_fan_timeout = COMMAND_TIMEOUT; + set_hold_count(this->m_switch_nozzle_fan_timeout); } else { obj->command_control_fan(MachineObject::FanType::COOLING_FAN, false); m_switch_nozzle_fan->SetValue(false); - m_switch_nozzle_fan_timeout = COMMAND_TIMEOUT; + set_hold_count(this->m_switch_nozzle_fan_timeout); } } void StatusPanel::on_lamp_switch(wxCommandEvent &event) @@ -1852,11 +1985,11 @@ void StatusPanel::on_lamp_switch(wxCommandEvent &event) if (value) { m_switch_lamp->SetValue(true); // do not update when timeout > 0 - m_switch_lamp_timeout = COMMAND_TIMEOUT; + set_hold_count(this->m_switch_lamp_timeout); obj->command_set_chamber_light(MachineObject::LIGHT_EFFECT::LIGHT_EFFECT_ON); } else { m_switch_lamp->SetValue(false); - m_switch_lamp_timeout = COMMAND_TIMEOUT; + set_hold_count(this->m_switch_lamp_timeout); obj->command_set_chamber_light(MachineObject::LIGHT_EFFECT::LIGHT_EFFECT_OFF); } } @@ -1892,6 +2025,13 @@ void StatusPanel::on_thumbnail_leave(wxMouseEvent &event) } } +void StatusPanel::on_switch_recording(wxMouseEvent &event) +{ + if (!obj) return; + bool value = m_recording_button->get_switch_status(); + obj->command_ipcam_record(!value); +} + void StatusPanel::on_camera_enter(wxMouseEvent& event) { if (obj) { @@ -1962,11 +2102,11 @@ void StatusPanel::set_default() m_switch_nozzle_fan_timeout = 0; m_switch_printing_fan_timeout = 0; m_show_ams_group = false; - reset_printing_values(); reset_temp_misc_control(); m_ams_control->Hide(); + m_ams_control->Reset(); clean_tasklist_info(); } @@ -1975,14 +2115,29 @@ void StatusPanel::show_status(int status) if (last_status == status) return; last_status = status; - if (((status & (int) MonitorStatus::MONITOR_DISCONNECTED) != 0) || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0)) { + if (((status & (int) MonitorStatus::MONITOR_DISCONNECTED) != 0) + || ((status & (int) MonitorStatus::MONITOR_DISCONNECTED_SERVER) != 0) + || ((status & (int)MonitorStatus::MONITOR_CONNECTING) != 0) + ) { m_text_tasklist_caption->SetForegroundColour(DISCONNECT_TEXT_COL); show_printing_status(false, false); + m_calibration_btn->Disable(); } else if ((status & (int) MonitorStatus::MONITOR_NORMAL) != 0) { show_printing_status(true, true); + m_calibration_btn->Disable(); } } +void StatusPanel::set_hold_count(int& count) +{ + if (obj) { + if (obj->is_U0_firmware()) { + count = COMMAND_TIMEOUT_U0; + } + } + count = COMMAND_TIMEOUT; +} + void StatusPanel::msw_rescale() { init_bitmaps(); @@ -2011,8 +2166,13 @@ void StatusPanel::msw_rescale() slice_info_list[i]->msw_rescale(); } - m_bitmap_camera_img->SetBitmap(m_bitmap_camera); - m_bitmap_camera_img->SetMinSize(wxSize(FromDIP(32), FromDIP(18))); + //m_bitmap_camera_img->SetBitmap(m_bitmap_camera); + //m_bitmap_camera_img->SetMinSize(wxSize(FromDIP(32), FromDIP(18))); + + m_timelapse_button->SetMinSize(wxSize(32, 24)); + m_recording_button->SetMinSize(wxSize(32, 24)); + m_bitmap_sdcard_off_img->SetMinSize(wxSize(FromDIP(32), FromDIP(20))); + m_bitmap_sdcard_on_img->SetMinSize(wxSize(FromDIP(32), FromDIP(20))); m_bpButton_xy->Rescale(); m_tempCtrl_nozzle->SetMinSize(TEMP_CTRL_MIN_SIZE); @@ -2039,7 +2199,8 @@ void StatusPanel::msw_rescale() m_ams_control->msw_rescale(); // m_filament_step->Rescale(); - m_calibration_btn->SetMinSize(wxSize(FromDIP(128), FromDIP(26))); + m_calibration_btn->SetMinSize(wxSize(-1, FromDIP(26))); + m_calibration_btn->Rescale(); Layout(); Refresh(); diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index 0eb2210592..046d9c8fcf 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -30,17 +30,35 @@ class StepIndicator; -#define COMMAND_TIMEOUT 2 +#define COMMAND_TIMEOUT_U0 15 +#define COMMAND_TIMEOUT 5 namespace Slic3r { namespace GUI { enum MonitorStatus { - MONITOR_UNKNOWN = 0, - MONITOR_NORMAL = 1 << 1, - MONITOR_NO_PRINTER = 1 << 2, - MONITOR_DISCONNECTED = 1 << 3, + MONITOR_UNKNOWN = 0, + MONITOR_NORMAL = 1 << 1, + MONITOR_NO_PRINTER = 1 << 2, + MONITOR_DISCONNECTED = 1 << 3, MONITOR_DISCONNECTED_SERVER = 1 << 4, + MONITOR_CONNECTING = 1 << 5, +}; + +enum CameraRecordingStatus { + RECORDING_NONE, + RECORDING_OFF_NORMAL, + RECORDING_OFF_HOVER, + RECORDING_ON_NORMAL, + RECORDING_ON_HOVER, +}; + +enum CameraTimelapseStatus { + TIMELAPSE_NONE, + TIMELAPSE_OFF_NORMAL, + TIMELAPSE_OFF_HOVER, + TIMELAPSE_ON_NORMAL, + TIMELAPSE_ON_HOVER, }; class StatusBasePanel : public wxScrolledWindow @@ -60,7 +78,17 @@ protected: wxBitmap m_bitmap_fan_on; wxBitmap m_bitmap_fan_off; wxBitmap m_bitmap_extruder; + + CameraRecordingStatus m_state_recording{CameraRecordingStatus::RECORDING_NONE}; + CameraTimelapseStatus m_state_timelapse{CameraTimelapseStatus::TIMELAPSE_NONE}; + + + CameraItem *m_timelapse_button; + CameraItem *m_recording_button; + wxBitmap m_bitmap_camera; + wxBitmap m_bitmap_sdcard_state_on; + wxBitmap m_bitmap_sdcard_state_off; /* title panel */ wxPanel * media_ctrl_panel; @@ -70,9 +98,13 @@ protected: wxStaticText * m_staticText_monitoring; wxStaticText * m_staticText_timelapse; - wxStaticBitmap* m_bitmap_camera_img; SwitchButton * m_bmToggleBtn_timelapse; + wxStaticBitmap *m_bitmap_camera_img; + wxStaticBitmap *m_bitmap_recording_img; + wxStaticBitmap *m_bitmap_sdcard_on_img; + wxStaticBitmap *m_bitmap_sdcard_off_img; + wxMediaCtrl2 * m_media_ctrl; MediaPlayCtrl * m_media_play_ctrl; @@ -186,6 +218,7 @@ public: wxBoxSizer *create_ams_group(wxWindow *parent); void show_ams_group(bool show = true); + void upodate_camera_state(bool recording, bool timelapse, bool has_sdcard); }; @@ -260,7 +293,8 @@ protected: void on_nozzle_fan_switch(wxCommandEvent &event); void on_thumbnail_enter(wxMouseEvent &event); void on_thumbnail_leave(wxMouseEvent &event); - void on_camera_enter(wxMouseEvent& event); + void on_switch_recording(wxMouseEvent &event); + void on_camera_enter(wxMouseEvent &event); void on_camera_leave(wxMouseEvent& event); void on_auto_leveling(wxCommandEvent &event); void on_xyz_abs(wxCommandEvent &event); @@ -272,11 +306,11 @@ protected: /* update apis */ void update(MachineObject* obj); void show_printing_status(bool ctrl_area = true, bool temp_area = true); + void update_left_time(int mc_left_time); void update_subtask(MachineObject *obj); void update_cloud_subtask(MachineObject *obj); void update_sdcard_subtask(MachineObject *obj); void update_temp_ctrl(MachineObject *obj); - void show_unload_ctrl(); void update_misc_ctrl(MachineObject *obj); void update_ams(MachineObject* obj); void update_cali(MachineObject* obj); @@ -311,10 +345,10 @@ public: void set_default(); void show_status(int status); + void set_hold_count(int& count); + void msw_rescale(); }; - - } } #endif diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 17ddcd3308..1b591d16e2 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1756,7 +1756,6 @@ void TabPrint::build() optgroup->append_single_option_line("minimum_sparse_infill_area"); optgroup->append_single_option_line("infill_combination"); optgroup->append_single_option_line("detect_narrow_internal_solid_infill"); - optgroup->append_single_option_line("reduce_infill_retraction"); page = add_options_page(L("Speed"), "empty"); optgroup = page->new_optgroup(L("Initial layer speed"), 15); @@ -1827,8 +1826,9 @@ void TabPrint::build() //optgroup->append_single_option_line("support_interface_loop_pattern"); optgroup->append_single_option_line("support_object_xy_distance"); - //optgroup->append_single_option_line("bridge_no_support"); + optgroup->append_single_option_line("bridge_no_support"); optgroup->append_single_option_line("max_bridge_length"); + optgroup->append_single_option_line("thick_bridges"); //optgroup->append_single_option_line("independent_support_layer_height"); page = add_options_page(L("Others"), "advanced"); @@ -1852,6 +1852,7 @@ void TabPrint::build() optgroup = page->new_optgroup(L("Flush options")); optgroup->append_single_option_line("flush_into_infill"); optgroup->append_single_option_line("flush_into_objects"); + optgroup->append_single_option_line("flush_into_support"); optgroup = page->new_optgroup(L("Special mode")); optgroup->append_single_option_line("print_sequence"); @@ -1875,7 +1876,8 @@ void TabPrint::build() optgroup->append_single_option_line("fuzzy_skin_thickness"); - optgroup = page->new_optgroup(L("Output file")); + optgroup = page->new_optgroup(L("G-code output")); + optgroup->append_single_option_line("reduce_infill_retraction"); optgroup->append_single_option_line("gcode_add_line_number"); Option option = optgroup->get_option("filename_format"); option.opt.full_width = true; diff --git a/src/slic3r/GUI/Tabbook.cpp b/src/slic3r/GUI/Tabbook.cpp index d7a822ee33..fb02ceaac6 100644 --- a/src/slic3r/GUI/Tabbook.cpp +++ b/src/slic3r/GUI/Tabbook.cpp @@ -17,8 +17,8 @@ wxDEFINE_EVENT(wxCUSTOMEVT_TABBOOK_SEL_CHANGED, wxCommandEvent); const static wxColour TAB_BUTTON_BG = wxColour(255, 255, 255, 255); const static wxColour TAB_BUTTON_SEL = wxColour(219, 253, 213, 255); -static const wxFont TAB_BUTTON_FONT = Label::Body_14; -static const wxFont TAB_BUTTON_FONT_SEL = Label::Head_14; +static const wxFont& TAB_BUTTON_FONT = Label::Body_14; +static const wxFont& TAB_BUTTON_FONT_SEL = Label::Head_14; static const int BUTTON_DEF_HEIGHT = 46; diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp index 72cb8f70d1..c62377b39a 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.cpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.cpp @@ -1188,9 +1188,10 @@ static wxString get_string_value(std::string opt_key, const DynamicPrintConfig& int orig_opt_idx = -1; int opt_idx = -1; int pos = opt_key.find("#"); + std::string temp_str = opt_key; if (pos > 0) { - boost::erase_head(opt_key, pos + 1); - orig_opt_idx = static_cast(atoi(opt_key.c_str())); + boost::erase_head(temp_str, pos + 1); + orig_opt_idx = static_cast(atoi(temp_str.c_str())); } opt_idx = orig_opt_idx >= 0 ? orig_opt_idx : 0; opt_key = get_pure_opt_key(opt_key); diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index ebabbc0008..00ab7628f3 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -141,7 +141,7 @@ MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates, bool force_ sizer_button->Add(0, 0, 1, wxEXPAND, 5); - StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), + StateColor btn_bg_green(std::pair(wxColour(27, 136, 68), StateColor::Pressed), std::pair(wxColour(61, 203, 115), StateColor::Hovered), std::pair(AMS_CONTROL_BRAND_COLOUR, StateColor::Normal)); StateColor btn_bg_white(std::pair(wxColour(206, 206, 206), StateColor::Pressed), diff --git a/src/slic3r/GUI/WebDailytipDialog.cpp b/src/slic3r/GUI/WebDailytipDialog.cpp deleted file mode 100644 index 2a2a046443..0000000000 --- a/src/slic3r/GUI/WebDailytipDialog.cpp +++ /dev/null @@ -1,352 +0,0 @@ -#include "WebDailytipDialog.hpp" - -#include -#include "I18N.hpp" -#include "libslic3r/AppConfig.hpp" -#include "slic3r/GUI/wxExtensions.hpp" -#include "slic3r/GUI/GUI_App.hpp" -#include "libslic3r_version.h" -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -using namespace nlohmann; - -namespace Slic3r { namespace GUI { - -// BEGIN_EVENT_TABLE(DailytipFrame,wxCheckBox) -// EVT_CHECKBOX(SKIP_CHECKBOX, DailytipFrame::OnSkipClick) -// END_EVENT_TABLE() - -DailytipFrame::DailytipFrame(GUI_App *pGUI) - : wxDialog((wxWindow *) (pGUI->mainframe), wxID_ANY, "BambuStudio") -{ - wxString ExePath = boost::dll::program_location().parent_path().string(); - wxString TargetUrl = "file:///" + ExePath + "\\resources\\dailytip\\index.html"; - - m_MainPtr = pGUI; - - wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL); - - // Create the webview - m_browser = WebView::CreateWebView(this, TargetUrl); - if (m_browser == nullptr) { - wxLogError("Could not init m_browser"); - return; - } - - topsizer->Add(m_browser, wxSizerFlags().Expand().Proportion(1)); - SetSizer(topsizer); - -#ifdef __WXMAC__ - // With WKWebView handlers need to be registered before creation - m_browser->RegisterHandler( - wxSharedPtr(new wxWebViewArchiveHandler("wxfs"))); - m_browser->RegisterHandler( - wxSharedPtr(new wxWebViewFSHandler("memory"))); -#endif - - // topsizer->Add(m_browser, wxSizerFlags().Expand().Proportion(1)); - - // Set a more sensible size for web browsing - m_browser->SetSize(FromDIP(wxSize(560, 640))); - SetSize(FromDIP(wxSize(560, 710))); - - // Connect the webview events - Bind(wxEVT_WEBVIEW_NAVIGATING, &DailytipFrame::OnNavigationRequest, this, - m_browser->GetId()); - Bind(wxEVT_WEBVIEW_NAVIGATED, &DailytipFrame::OnNavigationComplete, this, - m_browser->GetId()); - Bind(wxEVT_WEBVIEW_LOADED, &DailytipFrame::OnDocumentLoaded, this, - m_browser->GetId()); - Bind(wxEVT_WEBVIEW_ERROR, &DailytipFrame::OnError, this, - m_browser->GetId()); - Bind(wxEVT_WEBVIEW_NEWWINDOW, &DailytipFrame::OnNewWindow, this, - m_browser->GetId()); - Bind(wxEVT_WEBVIEW_TITLE_CHANGED, &DailytipFrame::OnTitleChanged, this, - m_browser->GetId()); - Bind(wxEVT_WEBVIEW_FULLSCREEN_CHANGED, - &DailytipFrame::OnFullScreenChanged, this, m_browser->GetId()); - Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, - &DailytipFrame::OnScriptMessage, this, m_browser->GetId()); - - // Connect the idle events - // Bind(wxEVT_IDLE, &DailytipFrame::OnIdle, this); - // Bind(wxEVT_CLOSE_WINDOW, &DailytipFrame::OnClose, this); - - // UI - SetTitle(L"Daily Tip"); - CenterOnParent(); - - // INI - m_SectionName = "dailytip"; - - // Skip CheckBox - m_SkipBtn = new wxCheckBox(this, wxID_ANY, L"Never Show", - FromDIP(wxPoint(10, 640)), - FromDIP(wxSize(200, 30))); - Bind(wxEVT_CHECKBOX, &DailytipFrame::OnSkipClick, this, - m_SkipBtn->GetId()); -} - -DailytipFrame::~DailytipFrame() {} - -void DailytipFrame::load_url(wxString &url) -{ - this->Show(); - m_browser->LoadURL(url); - m_browser->SetFocus(); - UpdateState(); -} - -/** - * Method that retrieves the current state from the web control and updates - * the GUI the reflect this current state. - */ -void DailytipFrame::UpdateState() -{ - // SetTitle(m_browser->GetCurrentTitle()); -} - -void DailytipFrame::OnIdle(wxIdleEvent &WXUNUSED(evt)) -{ - if (m_browser->IsBusy()) { - wxSetCursor(wxCURSOR_ARROWWAIT); - } else { - wxSetCursor(wxNullCursor); - } -} - -/** - * Callback invoked when there is a request to load a new page (for instance - * when the user clicks a link) - */ -void DailytipFrame::OnNavigationRequest(wxWebViewEvent &evt) -{ - // wxLogMessage("%s", "Navigation request to '" + evt.GetURL() + "' - // (target='" + evt.GetTarget() + "')"); - - UpdateState(); -} - -/** - * Callback invoked when a navigation request was accepted - */ -void DailytipFrame::OnNavigationComplete(wxWebViewEvent &evt) -{ - // wxLogMessage("%s", "Navigation complete; url='" + evt.GetURL() + "'"); - UpdateState(); -} - -/** - * Callback invoked when a page is finished loading - */ -void DailytipFrame::OnDocumentLoaded(wxWebViewEvent &evt) -{ - UpdateShowTime(); - - // Only notify if the document is the main frame, not a subframe - wxString tmpUrl = evt.GetURL(); - wxString NowUrl = m_browser->GetCurrentURL(); - - if (evt.GetURL() == m_browser->GetCurrentURL()) { - // wxLogMessage("%s", "Document loaded; url='" + evt.GetURL() + "'"); - } - UpdateState(); - - // wxCommandEvent *event = new - // wxCommandEvent(EVT_WEB_RESPONSE_MESSAGE,this->GetId()); - // wxQueueEvent(this, event); -} - -/** - * On new window, we veto to stop extra windows appearing - */ -void DailytipFrame::OnNewWindow(wxWebViewEvent &evt) -{ - wxString flag = " (other)"; - - if (evt.GetNavigationAction() == wxWEBVIEW_NAV_ACTION_USER) { - flag = " (user)"; - } - - // wxLogMessage("%s", "New window; url='" + evt.GetURL() + "'" + flag); - - // If we handle new window events then just load them in this window as we - // are a single window browser - // if (m_tools_handle_new_window->IsChecked()) - // m_browser->LoadURL(evt.GetURL()); - - UpdateState(); -} - -void DailytipFrame::OnTitleChanged(wxWebViewEvent &evt) -{ - // SetTitle(evt.GetString()); - // wxLogMessage("%s", "Title changed; title='" + evt.GetString() + "'"); -} - -void DailytipFrame::OnFullScreenChanged(wxWebViewEvent &evt) -{ - // wxLogMessage("Full screen changed; status = %d", evt.GetInt()); - ShowFullScreen(evt.GetInt() != 0); -} - -void DailytipFrame::OnScriptMessage(wxWebViewEvent &evt) -{ - ; -} - -void DailytipFrame::RunScript(const wxString &javascript) -{ - // Remember the script we run in any case, so the next time the user opens - // the "Run Script" dialog box, it is shown there for convenient updating. - m_javascript = javascript; - - // wxLogMessage("Running JavaScript:\n%s\n", javascript); - - if (!m_browser) return; - - WebView::RunScript(m_browser, javascript); -} - -#if wxUSE_WEBVIEW_IE -void DailytipFrame::OnRunScriptObjectWithEmulationLevel( - wxCommandEvent &WXUNUSED(evt)) -{ - wxWebViewIE::MSWSetModernEmulationLevel(); - RunScript("function f(){var person = new Object();person.name = 'Foo'; \ - person.lastName = 'Bar';return person;}f();"); - wxWebViewIE::MSWSetModernEmulationLevel(false); -} - -void DailytipFrame::OnRunScriptDateWithEmulationLevel( - wxCommandEvent &WXUNUSED(evt)) -{ - wxWebViewIE::MSWSetModernEmulationLevel(); - RunScript("function f(){var d = new Date('10/08/2017 21:30:40'); \ - var tzoffset = d.getTimezoneOffset() * 60000; return \ - new Date(d.getTime() - tzoffset);}f();"); - wxWebViewIE::MSWSetModernEmulationLevel(false); -} - -void DailytipFrame::OnRunScriptArrayWithEmulationLevel( - wxCommandEvent &WXUNUSED(evt)) -{ - wxWebViewIE::MSWSetModernEmulationLevel(); - RunScript("function f(){ return [\"foo\", \"bar\"]; }f();"); - wxWebViewIE::MSWSetModernEmulationLevel(false); -} -#endif - -/** - * Callback invoked when a loading error occurs - */ -void DailytipFrame::OnError(wxWebViewEvent &evt) -{ -#define WX_ERROR_CASE(type) \ - case type: category = #type; break; - - wxString category; - switch (evt.GetInt()) { - WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_CONNECTION); - WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_CERTIFICATE); - WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_AUTH); - WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_SECURITY); - WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_NOT_FOUND); - WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_REQUEST); - WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_USER_CANCELLED); - WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_OTHER); - } - - // wxLogMessage("%s", "Error; url='" + evt.GetURL() + "', error='" + - // category + " (" + evt.GetString() + ")'"); - - // Show the info bar with an error - // m_info->ShowMessage(_L("An error occurred loading ") + evt.GetURL() + - // "\n" + "'" + category + "'", wxICON_ERROR); - - UpdateState(); -} - -void DailytipFrame::OnScriptResponseMessage(wxCommandEvent &WXUNUSED(evt)) -{ - // if (!m_response_js.empty()) - //{ - // RunScript(m_response_js); - //} - - // RunScript("This is a message to Web!"); - // RunScript("postMessage(\"AABBCCDD\");"); -} - -bool DailytipFrame::IsTodayUsed() -{ - std::string strTime = - wxGetApp().app_config->get(std::string(m_SectionName.mbc_str()), - "lasttime"); - - int nLastTime = wxAtol(strTime); - - int NowTime = std::time(0); - - int T1 = NowTime - NowTime % 86400; - int T2 = T1 + 86400; - - if (nLastTime >= T1 && nLastTime < T2) return true; - - return false; -} - -bool DailytipFrame::IsSkip() -{ - wxString strSkip = wxGetApp().app_config->get(std::string( - m_SectionName.mbc_str()), - "skip"); - if (strSkip == "1") return true; - - return false; -} - -bool DailytipFrame::IsWhetherShow() -{ - if (IsSkip() || IsTodayUsed()) return false; - - return true; -} - -void DailytipFrame::UpdateShowTime() -{ - int NowTime = std::time(0); - - wxGetApp().app_config->set(std::string(m_SectionName.mbc_str()), - "lasttime", std::to_string(NowTime)); - wxGetApp().app_config->save(); -} - -void DailytipFrame::OnSkipClick(wxCommandEvent &evt) -{ - bool bSelect = m_SkipBtn->GetValue(); - - int nVal = 0; - if (bSelect) nVal = 1; - - // wxMessageBox(wxString::Format(wxT("%i"), nVal), "Checkbox Value", MB_OK); - - wxGetApp().app_config->set(std::string(m_SectionName.mbc_str()), "skip", - std::to_string(nVal)); - wxGetApp().app_config->save(); -} - -}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/WebDownPluginDlg.cpp b/src/slic3r/GUI/WebDownPluginDlg.cpp new file mode 100644 index 0000000000..ee5ce10577 --- /dev/null +++ b/src/slic3r/GUI/WebDownPluginDlg.cpp @@ -0,0 +1,339 @@ +#include "WebDownPluginDlg.hpp" +#include "ConfigWizard.hpp" + +#include +#include "I18N.hpp" +#include "libslic3r/AppConfig.hpp" +#include "slic3r/GUI/wxExtensions.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "libslic3r_version.h" + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include "MainFrame.hpp" +#include +#include +#include +#include +#include + +using namespace nlohmann; + +namespace Slic3r { namespace GUI { + +DownPluginFrame::DownPluginFrame(GUI_App *pGUI) : wxDialog((wxWindow *) (pGUI->mainframe), wxID_ANY, "Bambu Studio"), m_appconfig_new() +{ + // INI + m_MainPtr = pGUI; + + // set the frame icon + wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL); + wxString TargetUrl = from_u8((boost::filesystem::path(resources_dir()) / "web/guide/6/index.html").make_preferred().string()); + + TargetUrl = "file://" + TargetUrl; + + // Create the webview + m_browser = WebView::CreateWebView(this, TargetUrl); + if (m_browser == nullptr) { + wxLogError("Could not init m_browser"); + return; + } + + SetSizer(topsizer); + topsizer->Add(m_browser, wxSizerFlags().Expand().Proportion(1)); + + // Log backend information + // wxLogMessage(wxWebView::GetBackendVersionInfo().ToString()); + // wxLogMessage("Backend: %s Version: %s", + // m_browser->GetClassInfo()->GetClassName(),wxWebView::GetBackendVersionInfo().ToString()); + // wxLogMessage("User Agent: %s", m_browser->GetUserAgent()); + + // Set a more sensible size for web browsing + wxSize pSize = FromDIP(wxSize(410, 200)); + SetSize(pSize); + + CenterOnParent(); + // int screenheight = wxSystemSettings::GetMetric(wxSYS_SCREEN_Y, NULL); + // int screenwidth = wxSystemSettings::GetMetric(wxSYS_SCREEN_X, NULL); + // int MaxY = (screenheight - pSize.y) > 0 ? (screenheight - pSize.y) / 2 : 0; + // MoveWindow(this->m_hWnd, (screenwidth - pSize.x) / 2, MaxY, pSize.x, pSize.y, TRUE); + + // Connect the webview events + Bind(wxEVT_WEBVIEW_NAVIGATING, &DownPluginFrame::OnNavigationRequest, this, m_browser->GetId()); + Bind(wxEVT_WEBVIEW_NAVIGATED, &DownPluginFrame::OnNavigationComplete, this, m_browser->GetId()); + Bind(wxEVT_WEBVIEW_LOADED, &DownPluginFrame::OnDocumentLoaded, this, m_browser->GetId()); + Bind(wxEVT_WEBVIEW_ERROR, &DownPluginFrame::OnError, this, m_browser->GetId()); + Bind(wxEVT_WEBVIEW_NEWWINDOW, &DownPluginFrame::OnNewWindow, this, m_browser->GetId()); + Bind(wxEVT_WEBVIEW_TITLE_CHANGED, &DownPluginFrame::OnTitleChanged, this, m_browser->GetId()); + Bind(wxEVT_WEBVIEW_FULLSCREEN_CHANGED, &DownPluginFrame::OnFullScreenChanged, this, m_browser->GetId()); + Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &DownPluginFrame::OnScriptMessage, this, m_browser->GetId()); + +} + +DownPluginFrame::~DownPluginFrame() +{ + if (m_browser) { + delete m_browser; + m_browser = nullptr; + } +} + +void DownPluginFrame::load_url(wxString &url) +{ + BOOST_LOG_TRIVIAL(trace) << "app_start: DownPluginFrame url=" << url.ToStdString(); + this->Show(); + m_browser->LoadURL(url); + m_browser->SetFocus(); + UpdateState(); +} + +/** + * Method that retrieves the current state from the web control and updates + * the GUI the reflect this current state. + */ +void DownPluginFrame::UpdateState() +{ + // SetTitle(m_browser->GetCurrentTitle()); +} + +void DownPluginFrame::OnIdle(wxIdleEvent &WXUNUSED(evt)) +{ + if (m_browser->IsBusy()) { + wxSetCursor(wxCURSOR_ARROWWAIT); + } else { + wxSetCursor(wxNullCursor); + } +} + +// void DownPluginFrame::OnClose(wxCloseEvent& evt) +//{ +// this->Hide(); +//} + +/** + * Callback invoked when there is a request to load a new page (for instance + * when the user clicks a link) + */ +void DownPluginFrame::OnNavigationRequest(wxWebViewEvent &evt) +{ + // wxLogMessage("%s", "Navigation request to '" + evt.GetURL() + "' + // (target='" + evt.GetTarget() + "')"); + + UpdateState(); +} + +/** + * Callback invoked when a navigation request was accepted + */ +void DownPluginFrame::OnNavigationComplete(wxWebViewEvent &evt) +{ + // wxLogMessage("%s", "Navigation complete; url='" + evt.GetURL() + "'"); + + wxString NewUrl = evt.GetURL(); + + UpdateState(); +} + +/** + * Callback invoked when a page is finished loading + */ +void DownPluginFrame::OnDocumentLoaded(wxWebViewEvent &evt) +{ + // Only notify if the document is the main frame, not a subframe + wxString tmpUrl = evt.GetURL(); + wxString NowUrl = m_browser->GetCurrentURL(); + + if (evt.GetURL() == m_browser->GetCurrentURL()) { + // wxLogMessage("%s", "Document loaded; url='" + evt.GetURL() + "'"); + } + UpdateState(); + + // wxCommandEvent *event = new + // wxCommandEvent(EVT_WEB_RESPONSE_MESSAGE,this->GetId()); wxQueueEvent(this, + // event); +} + +/** + * On new window, we veto to stop extra windows appearing + */ +void DownPluginFrame::OnNewWindow(wxWebViewEvent &evt) +{ + wxString flag = " (other)"; + + wxString NewUrl = evt.GetURL(); + wxLaunchDefaultBrowser(NewUrl); + // if (evt.GetNavigationAction() == wxWEBVIEW_NAV_ACTION_USER) { flag = " (user)"; } + // wxLogMessage("%s", "New window; url='" + evt.GetURL() + "'" + flag); + + // If we handle new window events then just load them in this window as we + // are a single window browser + // if (m_tools_handle_new_window->IsChecked()) + // m_browser->LoadURL(evt.GetURL()); + + UpdateState(); +} + +void DownPluginFrame::OnTitleChanged(wxWebViewEvent &evt) +{ + // SetTitle(evt.GetString()); + // wxLogMessage("%s", "Title changed; title='" + evt.GetString() + "'"); +} + +void DownPluginFrame::OnFullScreenChanged(wxWebViewEvent &evt) +{ + // wxLogMessage("Full screen changed; status = %d", evt.GetInt()); + ShowFullScreen(evt.GetInt() != 0); +} + +void DownPluginFrame::OnScriptMessage(wxWebViewEvent &evt) +{ + try { + wxString strInput = evt.GetString(); + json j = json::parse(strInput); + + wxString strCmd = j["command"]; + + if (strCmd == "Begin_Download_network_plugin") { + wxGetApp().CallAfter([this] { DownloadPlugin(); }); + } + else if (strCmd == "netplugin_download_cancel") { + wxGetApp().cancel_networking_install(); + this->EndModal(wxID_CANCEL); + this->Close(); + } + else if (strCmd == "begin_install_plugin") { + wxGetApp().CallAfter([this] { InstallPlugin(); }); + } + else if (strCmd == "restart_studio") { + wxGetApp().restart_networking(); + this->EndModal(wxID_OK); + this->Close(); + } + else if (strCmd == "close_download_dialog") { + this->EndModal(wxID_OK); + this->Close(); + } + else if (strCmd == "open_plugin_folder") { + auto plugin_folder = (boost::filesystem::path(wxStandardPaths::Get().GetUserDataDir().ToUTF8().data()) / "plugins").make_preferred().string(); + desktop_open_any_folder(plugin_folder); + } + } catch (std::exception &e) { + // wxMessageBox(e.what(), "json Exception", MB_OK); + } +} + +void DownPluginFrame::RunScript(const wxString &javascript) +{ + // Remember the script we run in any case, so the next time the user opens + // the "Run Script" dialog box, it is shown there for convenient updating. + // m_javascript = javascript; + + // wxLogMessage("Running JavaScript:\n%s\n", javascript); + + if (!m_browser) return; + + WebView::RunScript(m_browser, javascript); +} + +#if wxUSE_WEBVIEW_IE +void DownPluginFrame::OnRunScriptObjectWithEmulationLevel(wxCommandEvent &WXUNUSED(evt)) +{ + wxWebViewIE::MSWSetModernEmulationLevel(); + RunScript("function f(){var person = new Object();person.name = 'Foo'; \ + person.lastName = 'Bar';return person;}f();"); + wxWebViewIE::MSWSetModernEmulationLevel(false); +} + +void DownPluginFrame::OnRunScriptDateWithEmulationLevel(wxCommandEvent &WXUNUSED(evt)) +{ + wxWebViewIE::MSWSetModernEmulationLevel(); + RunScript("function f(){var d = new Date('10/08/2017 21:30:40'); \ + var tzoffset = d.getTimezoneOffset() * 60000; return \ + new Date(d.getTime() - tzoffset);}f();"); + wxWebViewIE::MSWSetModernEmulationLevel(false); +} + +void DownPluginFrame::OnRunScriptArrayWithEmulationLevel(wxCommandEvent &WXUNUSED(evt)) +{ + wxWebViewIE::MSWSetModernEmulationLevel(); + RunScript("function f(){ return [\"foo\", \"bar\"]; }f();"); + wxWebViewIE::MSWSetModernEmulationLevel(false); +} +#endif + +/** + * Callback invoked when a loading error occurs + */ +void DownPluginFrame::OnError(wxWebViewEvent &evt) +{ +#define WX_ERROR_CASE(type) \ + case type: category = #type; break; + + wxString category; + switch (evt.GetInt()) { + WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_CONNECTION); + WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_CERTIFICATE); + WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_AUTH); + WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_SECURITY); + WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_NOT_FOUND); + WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_REQUEST); + WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_USER_CANCELLED); + WX_ERROR_CASE(wxWEBVIEW_NAV_ERR_OTHER); + } + + // wxLogMessage("%s", "Error; url='" + evt.GetURL() + "', error='" + + // category + " (" + evt.GetString() + ")'"); + + // Show the info bar with an error + // m_info->ShowMessage(_L("An error occurred loading ") + evt.GetURL() + + // "\n" + "'" + category + "'", wxICON_ERROR); + BOOST_LOG_TRIVIAL(info) << "DownPluginFrame::OnError: An error occurred loading " << evt.GetURL() << category; + + UpdateState(); +} + +void DownPluginFrame::OnScriptResponseMessage(wxCommandEvent &WXUNUSED(evt)) +{ + +} + +int DownPluginFrame::DownloadPlugin() +{ + return wxGetApp().download_plugin([this](int status, int percent, bool &cancel) { return ShowPluginStatus(status, percent, cancel); }, nullptr); +} + +int DownPluginFrame::InstallPlugin() +{ + return wxGetApp().install_plugin([this](int status, int percent, bool &cancel) { return ShowPluginStatus(status, percent, cancel); }); +} + +int DownPluginFrame::ShowPluginStatus(int status, int percent, bool &cancel) +{ + // TODO + json m_Data = json::object(); + m_Data["status"] = status; + m_Data["percent"] = percent; + + json m_Res = json::object(); + m_Res["command"] = "ShowStatusPercent"; + m_Res["sequence_id"] = "10001"; + m_Res["data"] = m_Data; + + wxString strJS = wxString::Format("HandleStudio(%s)", m_Res.dump(-1, ' ', false, json::error_handler_t::ignore)); + + wxGetApp().CallAfter([this, strJS] { RunScript(strJS); }); + + return 0; +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/WebDailytipDialog.hpp b/src/slic3r/GUI/WebDownPluginDlg.hpp similarity index 78% rename from src/slic3r/GUI/WebDailytipDialog.hpp rename to src/slic3r/GUI/WebDownPluginDlg.hpp index 83fc4fb862..c05de098e5 100644 --- a/src/slic3r/GUI/WebDailytipDialog.hpp +++ b/src/slic3r/GUI/WebDownPluginDlg.hpp @@ -30,15 +30,15 @@ namespace Slic3r { namespace GUI { -enum { SKIP_CHECKBOX }; - -class DailytipFrame : public wxDialog +class DownPluginFrame : public wxDialog { public: - DailytipFrame(GUI_App *pGUI); - virtual ~DailytipFrame(); + DownPluginFrame(GUI_App *pGUI); + virtual ~DownPluginFrame(); - void load_url(wxString &url); + + // Web Function + void load_url(wxString &url); void UpdateState(); void OnIdle(wxIdleEvent &evt); @@ -56,23 +56,16 @@ public: void OnScriptResponseMessage(wxCommandEvent &evt); void RunScript(const wxString &javascript); - bool IsTodayUsed(); - bool IsSkip(); - bool IsWhetherShow(); - void UpdateShowTime(); - - void OnSkipClick(wxCommandEvent &evt); + // install plugin + int DownloadPlugin(); + int InstallPlugin(); + int ShowPluginStatus(int status, int percent, bool &cancel); private: - GUI_App *m_MainPtr; + GUI_App * m_MainPtr; + AppConfig m_appconfig_new; - wxWebView * m_browser; - wxCheckBox *m_SkipBtn; - - wxString m_SectionName; - - // User Config - bool PrivacyUse; + wxWebView *m_browser; #if wxUSE_WEBVIEW_IE wxMenuItem *m_script_object_el; diff --git a/src/slic3r/GUI/WebGuideDialog.cpp b/src/slic3r/GUI/WebGuideDialog.cpp index f54cdb3304..05de4938ea 100644 --- a/src/slic3r/GUI/WebGuideDialog.cpp +++ b/src/slic3r/GUI/WebGuideDialog.cpp @@ -23,7 +23,9 @@ #include "MainFrame.hpp" #include #include - +#include +#include +#include using namespace nlohmann; @@ -38,14 +40,15 @@ GuideFrame::GuideFrame(GUI_App *pGUI, long style) // INI m_SectionName = "firstguide"; PrivacyUse = true; + InstallNetplugin = false; m_MainPtr = pGUI; // set the frame icon wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", set start page to welcome"); wxString TargetUrl = SetStartPage(BBL_WELCOME, false); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", set start page to welcome ") << TargetUrl; // Create the webview m_browser = WebView::CreateWebView(this, TargetUrl); @@ -350,7 +353,9 @@ void GuideFrame::OnScriptMessage(wxWebViewEvent &evt) } this->EndModal(wxID_OK); - //this->Close(); + + if (InstallNetplugin) + GUI::wxGetApp().CallAfter([this] { GUI::wxGetApp().ShowDownNetPluginDlg(); }); if (bLogin) GUI::wxGetApp().CallAfter([this] { login(); }); @@ -360,6 +365,14 @@ void GuideFrame::OnScriptMessage(wxWebViewEvent &evt) this->Close(); } else if (strCmd == "save_region") { m_Region = j["region"]; + } + else if (strCmd == "network_plugin_install") { + std::string sAction = j["data"]["action"]; + + if (sAction == "yes") + InstallNetplugin = true; + else + InstallNetplugin = false; } } catch (std::exception &e) { // wxMessageBox(e.what(), "json Exception", MB_OK); @@ -433,6 +446,7 @@ void GuideFrame::OnError(wxWebViewEvent &evt) // Show the info bar with an error // m_info->ShowMessage(_L("An error occurred loading ") + evt.GetURL() + // "\n" + "'" + category + "'", wxICON_ERROR); + BOOST_LOG_TRIVIAL(info) << "GuideFrame::OnError: An error occurred loading " << evt.GetURL() << category; UpdateState(); } @@ -911,8 +925,10 @@ int GuideFrame::LoadProfile() //----region m_Region = wxGetApp().app_config->get("region"); m_ProfileJson["region"] = m_Region; - - } + + m_ProfileJson["network_plugin_install"] = wxGetApp().app_config->get("app","installed_networking"); + m_ProfileJson["network_plugin_compability"] = wxGetApp().is_compatibility_version() ? "1" : "0"; + } catch (std::exception &e) { //wxLogMessage("GUIDE: load_profile_error %s ", e.what()); // wxMessageBox(e.what(), "", MB_OK); @@ -926,6 +942,18 @@ int GuideFrame::LoadProfile() return 0; } +void StringReplace(string &strBase, string strSrc, string strDes) +{ + string::size_type pos = 0; + string::size_type srcLen = strSrc.size(); + string::size_type desLen = strDes.size(); + pos = strBase.find(strSrc, pos); + while ((pos != string::npos)) { + strBase.replace(pos, srcLen, strDes); + pos = strBase.find(strSrc, (pos + desLen)); + } +} + int GuideFrame::LoadProfileFamily(std::string strVendor, std::string strFilePath) { @@ -968,7 +996,9 @@ int GuideFrame::LoadProfileFamily(std::string strVendor, std::string strFilePath //wxLogMessage("GUIDE: json_path2 loaded"); OneModel["vendor"] = strVendor; - OneModel["nozzle_diameter"] = pm["nozzle_diameter"]; + std::string NozzleOpt = pm["nozzle_diameter"]; + StringReplace(NozzleOpt, " ", ""); + OneModel["nozzle_diameter"] = NozzleOpt; OneModel["materials"] = pm["default_materials"]; //wxString strCoverPath = wxString::Format("%s\\%s\\%s_cover.png", strFolder, strVendor, std::string(s1.mb_str())); @@ -1144,6 +1174,30 @@ bool GuideFrame::LoadFile(std::string jPath, std::string &sContent) return true; } +int GuideFrame::DownloadPlugin() +{ + return wxGetApp().download_plugin( + [this](int status, int percent, bool& cancel) { + return ShowPluginStatus(status, percent, cancel); + } + , nullptr); +} + +int GuideFrame::InstallPlugin() +{ + return wxGetApp().install_plugin( + [this](int status, int percent, bool &cancel) { + return ShowPluginStatus(status, percent, cancel); + } + ); +} + +int GuideFrame::ShowPluginStatus(int status, int percent, bool& cancel) +{ + //TODO + return 0; +} + }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/WebGuideDialog.hpp b/src/slic3r/GUI/WebGuideDialog.hpp index d33b67b92b..83d7799dbf 100644 --- a/src/slic3r/GUI/WebGuideDialog.hpp +++ b/src/slic3r/GUI/WebGuideDialog.hpp @@ -87,6 +87,11 @@ public: void GetStardardFilePath(std::string &FilePath); bool LoadFile(std::string jPath, std::string & sContent); + // install plugin + int DownloadPlugin(); + int InstallPlugin(); + int ShowPluginStatus(int status, int percent, bool &cancel); + private: GUI_App *m_MainPtr; AppConfig m_appconfig_new; @@ -104,6 +109,8 @@ private: bool PrivacyUse; std::string m_Region; + bool InstallNetplugin; + #if wxUSE_WEBVIEW_IE wxMenuItem *m_script_object_el; wxMenuItem *m_script_date_el; diff --git a/src/slic3r/GUI/WebUpdatePlugin.cpp b/src/slic3r/GUI/WebUpdatePlugin.cpp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/slic3r/GUI/WebUpdatePlugin.hpp b/src/slic3r/GUI/WebUpdatePlugin.hpp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/slic3r/GUI/WebViewDialog.cpp b/src/slic3r/GUI/WebViewDialog.cpp index 3214355b55..bfc84553ee 100644 --- a/src/slic3r/GUI/WebViewDialog.cpp +++ b/src/slic3r/GUI/WebViewDialog.cpp @@ -421,6 +421,27 @@ void WebViewPanel::SendLoginInfo() } } +void WebViewPanel::ShowNetpluginTip() +{ + // Install Network Plugin + //std::string NP_Installed = wxGetApp().app_config->get("installed_networking"); + bool bValid = wxGetApp().is_compatibility_version(); + + int nShow = 0; + if (!bValid) nShow = 1; + + BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< boost::format(": bValid=%1%, nShow=%2%")%bValid %nShow; + + json m_Res = json::object(); + m_Res["command"] = "network_plugin_installtip"; + m_Res["sequence_id"] = "10001"; + m_Res["show"] = nShow; + + wxString strJS = wxString::Format("window.postMessage(%s)", m_Res.dump(-1, ' ', false, json::error_handler_t::ignore)); + + RunScript(strJS); +} + void WebViewPanel::update_mode() { int app_mode = Slic3r::GUI::wxGetApp().get_mode(); @@ -486,6 +507,7 @@ void WebViewPanel::OnDocumentLoaded(wxWebViewEvent& evt) wxLogMessage("%s", "Document loaded; url='" + evt.GetURL() + "'"); } UpdateState(); + ShowNetpluginTip(); } void WebViewPanel::OnTitleChanged(wxWebViewEvent &evt) diff --git a/src/slic3r/GUI/WebViewDialog.hpp b/src/slic3r/GUI/WebViewDialog.hpp index a878a3e9b6..01bbdb40ed 100644 --- a/src/slic3r/GUI/WebViewDialog.hpp +++ b/src/slic3r/GUI/WebViewDialog.hpp @@ -92,6 +92,7 @@ public: public: void SendRecentList(wxString const &sequence_id); void SendLoginInfo(); + void ShowNetpluginTip(); void update_mode(); private: diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index a810a9ec20..c359eba440 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -14,14 +14,14 @@ static const int UNLOAD_STEP_COUNT = 3; static const wxColour AMS_TRAY_DEFAULT_COL = wxColour(255, 255, 255); static wxString FILAMENT_LOAD_STEP_STRING[LOAD_STEP_COUNT] = { - _L("Heat the nozzle to target \ntemperature"), + _L("Heat the nozzle to target temperature"), _L("Cut filament"), _L("Pull back current filament"), - _L("Push new filament \ninto extruder"), + _L("Push new filament into extruder"), _L("Purge old filament"), }; -static wxString FILAMENT_UNLOAD_STEP_STRING[UNLOAD_STEP_COUNT] = {_L("Heat the nozzle to target \ntemperature"), _L("Cut filament"), _L("Pull back current filament")}; +static wxString FILAMENT_UNLOAD_STEP_STRING[UNLOAD_STEP_COUNT] = {_L("Heat the nozzle to target temperature"), _L("Cut filament"), _L("Pull back current filament")}; wxDEFINE_EVENT(EVT_AMS_LOAD, SimpleEvent); wxDEFINE_EVENT(EVT_AMS_UNLOAD, SimpleEvent); @@ -1138,13 +1138,6 @@ void AmsCans::SelectCan(std::string canid) void AmsCans::SetAmsStep(wxString canid, AMSPassRoadType type, AMSPassRoadSTEP step) { - auto tag_can_index = -1; - for (auto i = 0; i < m_can_road_list.GetCount(); i++) { - CanRoads *road = m_can_road_list[i]; - if (canid == road->canRoad->m_info.can_id) { tag_can_index = road->canRoad->m_canindex; } - } - - if (tag_can_index == -1) return; if (step == AMSPassRoadSTEP::AMS_ROAD_STEP_NONE) { for (auto i = 0; i < m_can_road_list.GetCount(); i++) { @@ -1157,6 +1150,14 @@ void AmsCans::SetAmsStep(wxString canid, AMSPassRoadType type, AMSPassRoadSTEP s return; } + + auto tag_can_index = -1; + for (auto i = 0; i < m_can_road_list.GetCount(); i++) { + CanRoads *road = m_can_road_list[i]; + if (canid == road->canRoad->m_info.can_id) { tag_can_index = road->canRoad->m_canindex; } + } + if (tag_can_index == -1) return; + // get colour auto tag_colour = *wxWHITE; for (auto i = 0; i < m_can_lib_list.GetCount(); i++) { @@ -1430,6 +1431,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons amswin->SetSizer(m_sizer_body); amswin->Layout(); amswin->Fit(); + //Thaw(); SetSize(amswin->GetSize()); @@ -1503,7 +1505,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons m_simplebook_calibration->AddPage(m_calibration_err_panel, wxEmptyString, false); AddPage(amswin, wxEmptyString, false); - AddPage(m_in_calibration_panel, wxEmptyString, false); + AddPage(m_simplebook_calibration, wxEmptyString, false); UpdateStepCtrl(); @@ -1518,11 +1520,11 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons void AMSControl::init_scaled_buttons() { - m_button_extruder_feed->SetMinSize(wxSize(FromDIP(54), FromDIP(24))); + m_button_extruder_feed->SetMinSize(wxSize(-1, FromDIP(24))); m_button_extruder_feed->SetCornerRadius(FromDIP(11)); - m_button_extruder_back->SetMinSize(wxSize(FromDIP(54), FromDIP(24))); + m_button_extruder_back->SetMinSize(wxSize(-1, FromDIP(24))); m_button_extruder_back->SetCornerRadius(FromDIP(11)); - m_button_ams_setting->SetMinSize(wxSize(FromDIP(88), FromDIP(33))); + m_button_ams_setting->SetMinSize(wxSize(-1, FromDIP(33))); m_button_ams_setting->SetCornerRadius(FromDIP(12)); } @@ -1651,9 +1653,9 @@ void AMSControl::StopRridLoading(wxString amsid, wxString canid) void AMSControl::msw_rescale() { m_extruder->msw_rescale(); - m_button_extruder_back->SetMinSize(wxSize(FromDIP(54), FromDIP(24))); - m_button_extruder_feed->SetMinSize(wxSize(FromDIP(54), FromDIP(24))); - m_button_ams_setting->SetMinSize(wxSize(FromDIP(88), FromDIP(33))); + m_button_extruder_back->SetMinSize(wxSize(-1, FromDIP(24))); + m_button_extruder_feed->SetMinSize(wxSize(-1, FromDIP(24))); + m_button_ams_setting->SetMinSize(wxSize(-1, FromDIP(33))); for (auto i = 0; i < m_ams_cans_list.GetCount(); i++) { AmsCansWindow *cans = m_ams_cans_list[i]; @@ -1689,6 +1691,13 @@ void AMSControl::CreateAms() Thaw(); } +void AMSControl::Reset() +{ + m_current_ams = ""; + m_current_senect = ""; +} + + void AMSControl::UpdateAms(std::vector info, bool keep_selection) { std::string curr_ams_id = GetCurentAms(); diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index 1f9dc7b78f..52e3690b4f 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -490,6 +490,7 @@ public: void on_ams_setting_click(wxCommandEvent &event); void on_clibration_again_click(wxMouseEvent &event); void on_clibration_cancel_click(wxMouseEvent &event); + void Reset(); void post_event(wxEvent &&event); diff --git a/src/slic3r/GUI/Widgets/Button.cpp b/src/slic3r/GUI/Widgets/Button.cpp index 4e32469c0f..0a21b74f02 100644 --- a/src/slic3r/GUI/Widgets/Button.cpp +++ b/src/slic3r/GUI/Widgets/Button.cpp @@ -151,7 +151,6 @@ void Button::render(wxDC& dc) wxSize szIcon; wxSize szContent = textSize; - ScalableBitmap icon; if (m_selected || ((states & (int)StateColor::State::Hovered) != 0)) icon = active_icon; @@ -217,7 +216,10 @@ void Button::messureSize() if (szIcon.y > szContent.y) szContent.y = szIcon.y; } - wxWindow::SetMinSize(szContent + paddingSize * 2); + wxSize size = szContent + paddingSize * 2; + if (minSize.GetHeight() > 0) + size.SetHeight(minSize.GetHeight()); + wxWindow::SetMinSize(size); } void Button::mouseDown(wxMouseEvent& event) diff --git a/src/slic3r/GUI/Widgets/CheckBox.cpp b/src/slic3r/GUI/Widgets/CheckBox.cpp index 3a2d3cebc5..aec46c3376 100644 --- a/src/slic3r/GUI/Widgets/CheckBox.cpp +++ b/src/slic3r/GUI/Widgets/CheckBox.cpp @@ -4,9 +4,12 @@ CheckBox::CheckBox(wxWindow* parent) : wxBitmapToggleButton(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE) - , m_on(this, "check_on", 16) - , m_half(this, "check_half", 16) - , m_off(this, "check_off", 16) + , m_on(this, "check_on", 16) + , m_half(this, "check_half", 16) + , m_off(this, "check_off", 16) + , m_on_disabled(this, "check_on_disabled", 16) + , m_half_disabled(this, "check_half_disabled", 16) + , m_off_disabled(this, "check_off_disabled", 16) { //SetBackgroundStyle(wxBG_STYLE_TRANSPARENT); if (parent) @@ -40,4 +43,5 @@ void CheckBox::Rescale() void CheckBox::update() { SetBitmap((m_half_checked ? m_half : GetValue() ? m_on : m_off).bmp()); -} \ No newline at end of file + SetBitmapDisabled((m_half_checked ? m_half_disabled : GetValue() ? m_on_disabled : m_off_disabled).bmp()); +} diff --git a/src/slic3r/GUI/Widgets/CheckBox.hpp b/src/slic3r/GUI/Widgets/CheckBox.hpp index d4c2dabe07..69d0e0e7d7 100644 --- a/src/slic3r/GUI/Widgets/CheckBox.hpp +++ b/src/slic3r/GUI/Widgets/CheckBox.hpp @@ -21,10 +21,13 @@ private: void update(); private: - ScalableBitmap m_on; - ScalableBitmap m_half; - ScalableBitmap m_off; - bool m_half_checked = false; + ScalableBitmap m_on; + ScalableBitmap m_half; + ScalableBitmap m_off; + ScalableBitmap m_on_disabled; + ScalableBitmap m_half_disabled; + ScalableBitmap m_off_disabled; + bool m_half_checked = false; }; #endif // !slic3r_GUI_CheckBox_hpp_ diff --git a/src/slic3r/GUI/Widgets/Label.cpp b/src/slic3r/GUI/Widgets/Label.cpp index 589b9c7ee3..6f7d1b9766 100644 --- a/src/slic3r/GUI/Widgets/Label.cpp +++ b/src/slic3r/GUI/Widgets/Label.cpp @@ -35,6 +35,33 @@ wxFont Label::Body_14 = Label::sysFont(14, false); wxFont Label::Body_13 = Label::sysFont(13, false); wxFont Label::Body_12 = Label::sysFont(12, false); wxFont Label::Body_10 = Label::sysFont(10, false); +wxFont Label::Body_9 = Label::sysFont(9, false); + +wxSize Label::split_lines(wxDC &dc, int width, const wxString &text, wxString &multiline_text) +{ + multiline_text = text; + if (width > 0 && dc.GetTextExtent(text).x > width) { + size_t start = 0; + while (true) { + size_t idx = size_t(-1); + for (size_t i = start; i < multiline_text.Len(); i++) { + if (multiline_text[i] == ' ') { + if (dc.GetTextExtent(multiline_text.SubString(start, i)).x < width) + idx = i; + else { + if (idx == size_t(-1)) idx = i; + break; + } + } + } + if (idx == size_t(-1)) break; + multiline_text[idx] = '\n'; + start = idx + 1; + if (dc.GetTextExtent(multiline_text.Mid(start)).x < width) break; + } + } + return dc.GetMultiLineTextExtent(multiline_text); +} Label::Label(wxString const &text, wxWindow *parent) : Label(Body_16, text, parent) {} diff --git a/src/slic3r/GUI/Widgets/Label.hpp b/src/slic3r/GUI/Widgets/Label.hpp index 613215bc7d..c1ffe913d5 100644 --- a/src/slic3r/GUI/Widgets/Label.hpp +++ b/src/slic3r/GUI/Widgets/Label.hpp @@ -29,8 +29,11 @@ public: static wxFont Body_13; static wxFont Body_12; static wxFont Body_10; + static wxFont Body_9; static wxFont sysFont(int size, bool bold = false); + + static wxSize split_lines(wxDC &dc, int width, const wxString &text, wxString &multiline_text); }; #endif // !slic3r_GUI_Label_hpp_ diff --git a/src/slic3r/GUI/Widgets/SideButton.cpp b/src/slic3r/GUI/Widgets/SideButton.cpp index 404e31f2f1..885abd7e5d 100644 --- a/src/slic3r/GUI/Widgets/SideButton.cpp +++ b/src/slic3r/GUI/Widgets/SideButton.cpp @@ -165,7 +165,11 @@ void SideButton::paintEvent(wxPaintEvent& evt) { // depending on your system you may need to look at double-buffered dcs wxPaintDC dc(this); +#ifdef __WXMSW__ wxGCDC dc2(dc); +#else + wxDC & dc2(dc); +#endif render(dc2); } diff --git a/src/slic3r/GUI/Widgets/SideMenuPopup.cpp b/src/slic3r/GUI/Widgets/SideMenuPopup.cpp index 34ce269a10..466b48f9e3 100644 --- a/src/slic3r/GUI/Widgets/SideMenuPopup.cpp +++ b/src/slic3r/GUI/Widgets/SideMenuPopup.cpp @@ -42,9 +42,18 @@ bool SidePopup::Show( bool show ) void SidePopup::Popup(wxWindow* focus) { Create(); + int screenwidth = wxSystemSettings::GetMetric(wxSYS_SCREEN_X,NULL); + int max_width = 0; + for (auto btn : btn_list) + { + max_width = std::max(btn->GetMinSize().x, max_width); + } if (focus) { wxPoint pos = focus->ClientToScreen(wxPoint(0, -6)); - Position(pos, {0, focus->GetSize().y + 12}); + if (pos.x + max_width > screenwidth) + Position({pos.x - (pos.x + max_width - screenwidth),pos.y}, {0, focus->GetSize().y + 12}); + else + Position(pos, {0, focus->GetSize().y + 12}); } wxPopupTransientWindow::Popup(); } diff --git a/src/slic3r/GUI/Widgets/StepCtrl.cpp b/src/slic3r/GUI/Widgets/StepCtrl.cpp index b333755449..44847c8405 100644 --- a/src/slic3r/GUI/Widgets/StepCtrl.cpp +++ b/src/slic3r/GUI/Widgets/StepCtrl.cpp @@ -242,36 +242,35 @@ void StepIndicator::doRender(wxDC &dc) states = clr_step.Disabled; } - int font_height = radius * 2; - if (steps.size() > 0) - font_height = dc.GetTextExtent(steps[0]).y; + int textWidth = size.x - radius * 5; + dc.SetFont(GetFont()); + wxString firstLine; + if (step == 0) dc.SetFont(GetFont().Bold()); + wxSize firstLineSize = Label::split_lines(dc, textWidth, steps.front(), firstLine); + wxString lastLine; + if (step == steps.size() - 1) dc.SetFont(GetFont().Bold()); + wxSize lastLineSize = Label::split_lines(dc, textWidth, steps.back(), lastLine); + int firstPadding = std::max(0, firstLineSize.y / 2 - radius); + int lastPadding = std::max(0, lastLineSize.y / 2 - radius); - int itemWidth = steps.size() == 1 ? size.y : (size.y - font_height) / (steps.size() - 1); - wxRect rcBar = {radius - bar_width / 2, radius, bar_width, size.y - radius * 4}; + wxRect rcBar = {radius * 2 - bar_width / 2, radius * 2 + firstPadding, bar_width, size.y - radius * 6 - firstPadding - lastPadding}; + int itemWidth = steps.size() == 1 ? size.y : rcBar.height / (steps.size() - 1); + // Draw thin bar stick dc.SetPen(wxPen(clr_bar.colorForStates(states))); dc.SetBrush(wxBrush(clr_bar.colorForStates(states))); dc.DrawRectangle(rcBar); - int circleX = radius; - int circleY = radius; + + int circleX = radius * 2; + int circleY = radius * 3 + firstPadding; dc.SetPen(wxPen(clr_step.colorForStates(states))); dc.SetBrush(wxBrush(clr_step.colorForStates(states))); for (int i = 0; i < steps.size(); ++i) { bool disabled = step > i; bool checked = step == i; + // Draw circle point & texts in it dc.DrawEllipse(circleX - radius, circleY - radius, radius * 2, radius * 2); - dc.SetTextForeground(clr_text.colorForStates(states - | (disabled ? StateColor::Disabled : checked ? StateColor::Checked : 0))); - dc.SetFont(checked ? GetFont().Bold() : GetFont()); - wxSize textSize = dc.GetTextExtent(steps[i]); - - - if (steps[i].Find("\n") >= 0) { - dc.DrawText(steps[i], circleX + radius * 3, circleY - textSize.y / 4); - } else { - dc.DrawText(steps[i], circleX + radius * 3, circleY - (textSize.y/2)); - } - + // Draw content ( icon or text ) in circle if (disabled) { wxSize sz = bmp_ok.GetBmpSize(); dc.DrawBitmap(bmp_ok.bmp(), circleX - radius, circleY - radius); @@ -283,6 +282,22 @@ void StepIndicator::doRender(wxDC &dc) wxSize sz = dc.GetTextExtent(tip); dc.DrawText(tip, circleX - sz.x / 2, circleY - sz.y / 2 + 1); } + // Draw step text + dc.SetTextForeground(clr_text.colorForStates(states + | (disabled ? StateColor::Disabled : checked ? StateColor::Checked : 0))); + dc.SetFont(checked ? GetFont().Bold() : GetFont()); + wxString text; + wxSize textSize; + if (i == 0) { + text = firstLine; + textSize = firstLineSize; + } else if (i == steps.size() - 1) { + text = lastLine; + textSize = lastLineSize; + } else { + textSize = Label::split_lines(dc, textWidth, steps[i], text); + } + dc.DrawText(text, circleX + radius * 3, circleY - (textSize.y / 2)); circleY += itemWidth; } } diff --git a/src/slic3r/GUI/Widgets/StepCtrl.hpp b/src/slic3r/GUI/Widgets/StepCtrl.hpp index 1d6d96fcd2..6fbba600c4 100644 --- a/src/slic3r/GUI/Widgets/StepCtrl.hpp +++ b/src/slic3r/GUI/Widgets/StepCtrl.hpp @@ -10,7 +10,7 @@ class StepCtrlBase : public StaticBox { protected: wxFont font_tip; - StateColor clr_bar; + StateColor clr_bar; StateColor clr_step; StateColor clr_text; StateColor clr_tip; diff --git a/src/slic3r/GUI/Widgets/TempInput.cpp b/src/slic3r/GUI/Widgets/TempInput.cpp index 0d9f9b630a..02602ada54 100644 --- a/src/slic3r/GUI/Widgets/TempInput.cpp +++ b/src/slic3r/GUI/Widgets/TempInput.cpp @@ -88,16 +88,16 @@ void TempInput::Create(wxWindow *parent, wxString text, wxString label, wxString if (!AllisNum(temp.ToStdString())) return; if (max_temp <= 0) return; - auto tempint = std::stoi(temp.ToStdString()); - if ((tempint > max_temp || tempint < min_temp) && !warning_mode) { - if (tempint > max_temp) - Warning(true, WARNING_TOO_HIGH); - else if (tempint < min_temp) - Warning(true, WARNING_TOO_LOW); - return; - } else { - Warning(false); - } + /* auto tempint = std::stoi(temp.ToStdString()); + if ((tempint > max_temp || tempint < min_temp) && !warning_mode) { + if (tempint > max_temp) + Warning(true, WARNING_TOO_HIGH); + else if (tempint < min_temp) + Warning(true, WARNING_TOO_LOW); + return; + } else { + Warning(false); + }*/ SetFinish(); }); text_ctrl->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent &e) { @@ -428,22 +428,28 @@ void TempInput::render(wxDC &dc) auto text = wxWindow::GetLabel(); dc.SetFont(::Label::Head_14); labelSize = dc.GetMultiLineTextExtent(wxWindow::GetLabel()); - dc.SetTextForeground(label_color.colorForStates((int) StateColor::Normal)); - if (!IsEnabled()) + + if (!IsEnabled()) { + dc.SetTextForeground(wxColour(0xAC, 0xAC, 0xAC)); dc.SetTextBackground(background_color.colorForStates((int) StateColor::Disabled)); - else + } + else { + dc.SetTextForeground(wxColour(0x32, 0x3A, 0x3D)); dc.SetTextBackground(background_color.colorForStates((int) states)); - - if (!text.IsEmpty()) { - wxSize textSize = text_ctrl->GetSize(); - if (align_right) { - if (pt.x + labelSize.x > size.x) text = wxControl::Ellipsize(text, dc, wxELLIPSIZE_END, size.x - pt.x); - pt.y = (size.y - labelSize.y) / 2; - } else { - pt.y = (size.y - labelSize.y) / 2; - } - dc.DrawText(text, pt); } + + + /*if (!text.IsEmpty()) { + + }*/ + wxSize textSize = text_ctrl->GetSize(); + if (align_right) { + if (pt.x + labelSize.x > size.x) text = wxControl::Ellipsize(text, dc, wxELLIPSIZE_END, size.x - pt.x); + pt.y = (size.y - labelSize.y) / 2; + } else { + pt.y = (size.y - labelSize.y) / 2; + } + dc.DrawText(text, pt); // separator dc.SetFont(::Label::Body_12); diff --git a/src/slic3r/GUI/WipeTowerDialog.cpp b/src/slic3r/GUI/WipeTowerDialog.cpp index a60876723b..e2f552e97f 100644 --- a/src/slic3r/GUI/WipeTowerDialog.cpp +++ b/src/slic3r/GUI/WipeTowerDialog.cpp @@ -94,6 +94,18 @@ wxBoxSizer* WipingDialog::create_btn_sizer(long flags) std::pair(wxColour(255, 255, 255), StateColor::Normal) ); + if (flags & wxRESET) { + Button* calc_btn = new Button(this, _L("Auto-Calc")); + calc_btn->SetMinSize(wxSize(FromDIP(75), FromDIP(24))); + calc_btn->SetCornerRadius(12); + calc_btn->SetBackgroundColor(ok_btn_bg); + calc_btn->SetBorderColor(ok_btn_bd); + calc_btn->SetTextColor(ok_btn_text); + calc_btn->SetFocus(); + calc_btn->SetId(wxID_RESET); + btn_sizer->Add(calc_btn, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, BTN_GAP); + } + if (flags & wxOK) { Button* ok_btn = new Button(this, _L("OK")); ok_btn->SetMinSize(BTN_SIZE); @@ -121,13 +133,14 @@ wxBoxSizer* WipingDialog::create_btn_sizer(long flags) }; // Parent dialog for purging volume adjustments - it fathers WipingPanel widget (that contains all controls) and a button to toggle simple/advanced mode: -WipingDialog::WipingDialog(wxWindow* parent, const std::vector& matrix, const std::vector& extruders, const std::vector& extruder_colours) +WipingDialog::WipingDialog(wxWindow* parent, const std::vector& matrix, const std::vector& extruders, const std::vector& extruder_colours, + int extra_flush_volume, float flush_multiplier) : wxDialog(parent, wxID_ANY, _(L("Flushing volumes for filament change")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE/* | wxRESIZE_BORDER*/) { this->SetBackgroundColour(*wxWHITE); this->SetMinSize(wxSize(MIN_WIPING_DIALOG_WIDTH, -1)); - m_panel_wiping = new WipingPanel(this, matrix, extruders, extruder_colours, nullptr); + m_panel_wiping = new WipingPanel(this, matrix, extruders, extruder_colours, nullptr, extra_flush_volume, flush_multiplier); auto main_sizer = new wxBoxSizer(wxVERTICAL); @@ -155,6 +168,9 @@ WipingDialog::WipingDialog(wxWindow* parent, const std::vector& matrix, c this->FindWindowById(wxID_CANCEL, this)->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { EndModal(wxCANCEL); }); } + if (this->FindWindowById(wxID_RESET, this)) { + this->FindWindowById(wxID_RESET, this)->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { m_panel_wiping->calc_flushing_volumes(); }); + } this->Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& e) { EndModal(wxCANCEL); }); } @@ -191,8 +207,9 @@ void WipingPanel::create_panels(wxWindow* parent, const int num) { } // This panel contains all control widgets for both simple and advanced mode (these reside in separate sizers) -WipingPanel::WipingPanel(wxWindow* parent, const std::vector& matrix, const std::vector& extruders, const std::vector& extruder_colours, wxButton* widget_button) -: wxPanel(parent,wxID_ANY, wxDefaultPosition, wxDefaultSize/*,wxBORDER_RAISED*/) +WipingPanel::WipingPanel(wxWindow* parent, const std::vector& matrix, const std::vector& extruders, const std::vector& extruder_colours, wxButton* widget_button, + int extra_flush_volume, float flush_multiplier) +: wxPanel(parent,wxID_ANY, wxDefaultPosition, wxDefaultSize/*,wxBORDER_RAISED*/), m_extra_flush_volume(extra_flush_volume) { // BBS: toggle button is removed //m_widget_button = widget_button; // pointer to the button in parent dialog @@ -286,6 +303,24 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector& matrix, con m_sizer_advanced->Add(info_str, 0, wxEXPAND | wxLEFT, TEXT_BEG_PADDING); m_sizer_advanced->AddSpacer(BTN_SIZE.y); + // BBS: for tunning flush volumes + { + wxBoxSizer* param_sizer = new wxBoxSizer(wxHORIZONTAL); + param_sizer->AddSpacer(FromDIP(15)); + + wxStaticText* flush_multiplier_title = new wxStaticText(m_page_advanced, wxID_ANY, _L("Flush multiplier")); + param_sizer->Add(flush_multiplier_title); + param_sizer->AddSpacer(FromDIP(5)); + m_flush_multiplier_ebox = new wxTextCtrl(m_page_advanced, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(50), -1)); + char flush_multi_str[32] = { 0 }; + snprintf(flush_multi_str, sizeof(flush_multi_str), "%.2f", flush_multiplier); + m_flush_multiplier_ebox->SetValue(flush_multi_str); + param_sizer->Add(m_flush_multiplier_ebox); + param_sizer->AddStretchSpacer(1); + + m_sizer_advanced->Add(param_sizer, 0, wxALIGN_CENTER_VERTICAL | wxTOP | wxBOTTOM, 10); + } + m_page_advanced->Hide(); // Now the same for simple mode: @@ -382,6 +417,114 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector& matrix, con }); } +static float to_radians(float degree) +{ + return degree / 180.f * M_PI; +} + +float DeltaHS_BBS(float h1, float s1, float v1, float h2, float s2, float v2) +{ + float h1_rad = to_radians(h1); + float h2_rad = to_radians(h2); + + float dx = std::cos(h1_rad) * s1 * v1 - cos(h2_rad) * s2 * v2; + float dy = std::sin(h1_rad) * s1 * v1 - sin(h2_rad) * s2 * v2; + float dxy = std::sqrt(dx * dx + dy * dy); + return std::min(1.2f, dxy); +} + +static float get_luminance(float r, float g, float b) +{ + return r * 0.3 + g * 0.59 + b * 0.11; +} + +static float calc_triangle_3rd_edge(float edge_a, float edge_b, float degree_ab) +{ + return std::sqrt(edge_a * edge_a + edge_b * edge_b - 2 * edge_a * edge_b * std::cos(to_radians(degree_ab))); +} + +int WipingPanel::calc_flushing_volume(const wxColour& from, const wxColour& to) +{ + float from_hsv_h, from_hsv_s, from_hsv_v; + float to_hsv_h, to_hsv_s, to_hsv_v; + + // Calculate color distance in HSV color space + RGB2HSV((float)from.Red() / 255.f, (float)from.Green() / 255.f, (float)from.Blue() / 255.f, &from_hsv_h, &from_hsv_s, &from_hsv_v); + RGB2HSV((float)to.Red() / 255.f, (float)to.Green() / 255.f, (float)to.Blue() / 255.f, &to_hsv_h, &to_hsv_s, &to_hsv_v); + float hs_dist = DeltaHS_BBS(from_hsv_h, from_hsv_s, from_hsv_v, to_hsv_h, to_hsv_s, to_hsv_v); + + // 1. Color difference is more obvious if the dest color has high luminance + // 2. Color difference is more obvious if the source color has low luminance + float from_lumi = get_luminance((float)from.Red() / 255.f, (float)from.Green() / 255.f, (float)from.Blue() / 255.f); + float to_lumi = get_luminance((float)to.Red() / 255.f, (float)to.Green() / 255.f, (float)to.Blue() / 255.f); + float lumi_flush = 0.f; + if (to_lumi >= from_lumi) { + lumi_flush = std::pow(to_lumi - from_lumi, 0.7f) * 560.f; + } + else { + lumi_flush = (from_lumi - to_lumi) * 80.f; + + float inter_hsv_v = 0.67 * to_hsv_v + 0.33 * from_hsv_v; + hs_dist = std::min(inter_hsv_v, hs_dist); + } + float hs_flush = 230.f * hs_dist; + + float flush_volume = calc_triangle_3rd_edge(hs_flush, lumi_flush, 120.f); + flush_volume = std::max(flush_volume, 60.f); + + float flush_multiplier = std::atof(m_flush_multiplier_ebox->GetValue().c_str()); + flush_volume = (flush_volume + m_extra_flush_volume) * flush_multiplier; + return std::min((int)flush_volume, g_max_flush_volume); +} + +void WipingPanel::calc_flushing_volumes() +{ + auto is_support_filament = [](int extruder_id) -> bool { + auto& filament_presets = Slic3r::GUI::wxGetApp().preset_bundle->filament_presets; + auto& filaments = Slic3r::GUI::wxGetApp().preset_bundle->filaments; + + if (extruder_id >= filament_presets.size()) + return false; + + Slic3r::Preset* filament = filaments.find_preset(filament_presets[extruder_id]); + if (filament == nullptr) + return false; + + Slic3r::ConfigOptionBools* support_option = dynamic_cast(filament->config.option("filament_is_support")); + if (support_option == nullptr) + return false; + + return support_option->get_at(0); + }; + + for (int from_idx = 0; from_idx < m_colours.size(); from_idx++) { + const wxColour& from = m_colours[from_idx]; + bool is_from_support = is_support_filament(from_idx); + for (int to_idx = 0; to_idx < m_colours.size(); to_idx++) { + bool is_to_support = is_support_filament(to_idx); + if (from_idx == to_idx) { + edit_boxes[to_idx][from_idx]->SetValue(std::to_string(0)); + } + else { + int flushing_volume = 0; + if (is_to_support) { + flushing_volume = g_flush_volume_to_support; + } + else { + const wxColour& to = m_colours[to_idx]; + flushing_volume = calc_flushing_volume(from, to); + if (is_from_support) { + flushing_volume = std::max(g_min_flush_volume_from_support, flushing_volume); + } + } + + edit_boxes[to_idx][from_idx]->SetValue(std::to_string(flushing_volume)); + } + } + } +} + + // Reads values from the (advanced) wiping matrix: std::vector WipingPanel::read_matrix_values() { if (!m_advanced) diff --git a/src/slic3r/GUI/WipeTowerDialog.hpp b/src/slic3r/GUI/WipeTowerDialog.hpp index 26846a1edf..f54d2888f9 100644 --- a/src/slic3r/GUI/WipeTowerDialog.hpp +++ b/src/slic3r/GUI/WipeTowerDialog.hpp @@ -9,15 +9,26 @@ class WipingPanel : public wxPanel { public: - WipingPanel(wxWindow* parent, const std::vector& matrix, const std::vector& extruders, const std::vector& extruder_colours, wxButton* widget_button); + WipingPanel(wxWindow* parent, const std::vector& matrix, const std::vector& extruders, const std::vector& extruder_colours, wxButton* widget_button, + int extra_flush_volume, float flush_multiplier); std::vector read_matrix_values(); std::vector read_extruders_values(); void toggle_advanced(bool user_action = false); void create_panels(wxWindow* parent, const int num); + void calc_flushing_volumes(); + + float get_flush_multiplier() + { + if (m_flush_multiplier_ebox == nullptr) + return 1.f; + + return std::atof(m_flush_multiplier_ebox->GetValue().c_str()); + } private: void fill_in_matrix(); bool advanced_matches_simple(); + int calc_flushing_volume(const wxColour& from, const wxColour& to); std::vector m_old; std::vector m_new; @@ -33,6 +44,9 @@ private: wxBoxSizer* m_sizer_advanced = nullptr; wxGridSizer* m_gridsizer_advanced = nullptr; wxButton* m_widget_button = nullptr; + + wxTextCtrl* m_flush_multiplier_ebox = nullptr; + float m_extra_flush_volume = 0; }; @@ -41,12 +55,21 @@ private: class WipingDialog : public wxDialog { public: - WipingDialog(wxWindow* parent, const std::vector& matrix, const std::vector& extruders, const std::vector& extruder_colours); + WipingDialog(wxWindow* parent, const std::vector& matrix, const std::vector& extruders, const std::vector& extruder_colours, + int extra_flush_volume, float flush_multiplier); std::vector get_matrix() const { return m_output_matrix; } std::vector get_extruders() const { return m_output_extruders; } wxBoxSizer* create_btn_sizer(long flags); + float get_flush_multiplier() + { + if (m_panel_wiping == nullptr) + return 1.f; + + return m_panel_wiping->get_flush_multiplier(); + } + private: WipingPanel* m_panel_wiping = nullptr; std::vector m_output_matrix; diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index b0144d2d93..8eb2d9d07e 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -115,7 +115,7 @@ wxMenuItem* append_submenu(wxMenu* menu, wxMenu* sub_menu, int id, const wxStrin if (id == wxID_ANY) id = wxNewId(); - wxMenuItem* item = new wxMenuItem(menu, id, string, description); + wxMenuItem* item = new wxMenuItem(menu, id, string, description, wxITEM_NORMAL, sub_menu); if (!icon.empty()) { item->SetBitmap(create_menu_bitmap(icon)); // FIXME: pass window ptr //#ifdef __WXMSW__ @@ -124,7 +124,6 @@ wxMenuItem* append_submenu(wxMenu* menu, wxMenu* sub_menu, int id, const wxStrin #endif /* __WXMSW__ */ } - item->SetSubMenu(sub_menu); menu->Append(item); if (parent) { diff --git a/src/slic3r/GUI/wxMediaCtrl2.cpp b/src/slic3r/GUI/wxMediaCtrl2.cpp index cd7b7c107e..c889785142 100644 --- a/src/slic3r/GUI/wxMediaCtrl2.cpp +++ b/src/slic3r/GUI/wxMediaCtrl2.cpp @@ -1,4 +1,5 @@ #include "wxMediaCtrl2.h" +#include "I18N.hpp" wxMediaCtrl2::wxMediaCtrl2(wxWindow *parent) : wxMediaCtrl(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxMEDIACTRLPLAYERCONTROLS_NONE) @@ -8,6 +9,26 @@ wxMediaCtrl2::wxMediaCtrl2(wxWindow *parent) void wxMediaCtrl2::Load(wxURI url) { #ifdef __WIN32__ + if (m_imp == nullptr) { + auto res = wxMessageBox(_L("Windows Media Player is required for this task! Shall I take you to the guide page of 'Get Windows Media Player'?"), _L("Error"), wxOK | wxCANCEL); + if (res == wxOK) { + wxString url = "https://support.microsoft.com/en-au/windows/get-windows-media-player-81718e0d-cfce-25b1-aee3-94596b658287"; + wxExecute("cmd /c start " + url, wxEXEC_HIDE_CONSOLE); + } + m_error = 2; + wxMediaEvent event(wxEVT_MEDIA_STATECHANGED); + event.SetId(GetId()); + event.SetEventObject(this); + wxPostEvent(this, event); + return; + } + + auto hModExe = LoadLibrary(NULL); + auto NvOptimusEnablement = (DWORD *) GetProcAddress(hModExe, "NvOptimusEnablement"); + auto AmdPowerXpressRequestHighPerformance = (int *) GetProcAddress(hModExe, "AmdPowerXpressRequestHighPerformance"); + if (NvOptimusEnablement) *NvOptimusEnablement = 0; + if (AmdPowerXpressRequestHighPerformance) *AmdPowerXpressRequestHighPerformance = 0; + url = wxURI(url.BuildURI().append("&hwnd=").append( boost::lexical_cast(GetHandle()))); #endif @@ -21,7 +42,7 @@ void wxMediaCtrl2::Stop() { wxMediaCtrl::Stop(); } wxSize wxMediaCtrl2::GetVideoSize() const { - return m_imp->GetVideoSize(); + return m_imp ? m_imp->GetVideoSize() : wxSize(0, 0); } wxSize wxMediaCtrl2::DoGetBestSize() const diff --git a/src/slic3r/GUI/wxMediaCtrl2.h b/src/slic3r/GUI/wxMediaCtrl2.h index 43a82ee178..44fc8f42c3 100644 --- a/src/slic3r/GUI/wxMediaCtrl2.h +++ b/src/slic3r/GUI/wxMediaCtrl2.h @@ -17,19 +17,19 @@ class wxMediaCtrl2 : public wxWindow { public: wxMediaCtrl2(wxWindow * parent); - + void Load(wxURI url); - + void Play(); - + void Stop(); void SetIdleImage(wxString const & image); - + wxMediaState GetState() const; - + wxSize GetVideoSize() const; - + int GetLastError() const { return m_error; } static constexpr wxMediaState MEDIASTATE_BUFFERING = (wxMediaState) 6; @@ -38,6 +38,7 @@ protected: void DoSetSize(int x, int y, int width, int height, int sizeFlags) override; private: + void create_player(); void * m_player = nullptr; wxMediaState m_state = wxMEDIASTATE_STOPPED; int m_error = 0; @@ -59,12 +60,12 @@ public: void SetIdleImage(wxString const & image); int GetLastError() const { return m_error; } - + wxSize GetVideoSize() const; protected: wxSize DoGetBestSize() const override; - + void DoSetSize(int x, int y, int width, int height, int sizeFlags) override; #ifdef __WIN32__ diff --git a/src/slic3r/GUI/wxMediaCtrl2.mm b/src/slic3r/GUI/wxMediaCtrl2.mm index da2a2ab724..9f6fa850d4 100644 --- a/src/slic3r/GUI/wxMediaCtrl2.mm +++ b/src/slic3r/GUI/wxMediaCtrl2.mm @@ -11,6 +11,7 @@ #import #import "BambuPlayer/BambuPlayer.h" +#import "../Utils/NetworkAgent.hpp" #include #include @@ -43,12 +44,23 @@ wxMediaCtrl2::wxMediaCtrl2(wxWindow * parent) imageView.layer.backgroundColor = color; CGColorRelease(color); imageView.wantsLayer = YES; - auto module = dlopen("libBambuSource.dylib", RTLD_LAZY); + create_player(); +} + +void wxMediaCtrl2::create_player() +{ + auto module = Slic3r::NetworkAgent::get_bambu_source_entry(); + if (!module) { + //not ready yet + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "Network plugin not ready currently!"; + return; + } Class cls = (__bridge Class) dlsym(module, "OBJC_CLASS_$_BambuPlayer"); if (cls == nullptr) { m_error = -2; return; } + NSView * imageView = (NSView *) GetHandle(); BambuPlayer * player = [cls alloc]; [player initWithImageView: imageView]; [player setLogger: bambu_log withContext: &m_error]; @@ -57,6 +69,14 @@ wxMediaCtrl2::wxMediaCtrl2(wxWindow * parent) void wxMediaCtrl2::Load(wxURI url) { + if (!m_player) { + create_player(); + if (!m_player) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": create_player failed currently!"; + return; + } + } + BambuPlayer * player = (BambuPlayer *) m_player; if (player) { [player close]; @@ -71,6 +91,13 @@ void wxMediaCtrl2::Load(wxURI url) void wxMediaCtrl2::Play() { + if (!m_player) { + create_player(); + if (!m_player) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": create_player failed currently!"; + return; + } + } BambuPlayer * player2 = (BambuPlayer *) m_player; [player2 play]; if (m_state != wxMEDIASTATE_PLAYING) { @@ -84,6 +111,13 @@ void wxMediaCtrl2::Play() void wxMediaCtrl2::Stop() { + if (!m_player) { + create_player(); + if (!m_player) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": create_player failed currently!"; + return; + } + } BambuPlayer * player2 = (BambuPlayer *) m_player; [player2 close]; if (m_state != wxMEDIASTATE_STOPPED) { diff --git a/src/slic3r/Utils/Http.cpp b/src/slic3r/Utils/Http.cpp index 73acf06306..b5dd178f03 100644 --- a/src/slic3r/Utils/Http.cpp +++ b/src/slic3r/Utils/Http.cpp @@ -83,6 +83,8 @@ struct CurlGlobalInit std::unique_ptr CurlGlobalInit::instance; +std::map extra_headers; + struct Http::priv { enum { @@ -454,9 +456,10 @@ void Http::priv::http_perform() } } -Http::Http(const std::string &url) : p(new priv(url)) -{ - ; +Http::Http(const std::string &url) : p(new priv(url)) { + + for (auto it = extra_headers.begin(); it != extra_headers.end(); it++) + this->header(it->first, it->second); } @@ -723,6 +726,11 @@ Http Http::del(std::string url) return http; } +void Http::set_extra_headers(std::map headers) +{ + extra_headers.swap(headers); +} + bool Http::ca_file_supported() { ::CURL *curl = ::curl_easy_init(); diff --git a/src/slic3r/Utils/Http.hpp b/src/slic3r/Utils/Http.hpp index 09671e9f73..e8e4f41c04 100644 --- a/src/slic3r/Utils/Http.hpp +++ b/src/slic3r/Utils/Http.hpp @@ -10,6 +10,23 @@ namespace Slic3r { +enum HttpErrorCode +{ + HttpErrorResourcesNotFound = 2, + HtttErrorNoDevice = 3, + HttpErrorRequestLogin = 4, + HttpErrorResourcesNotExists = 6, + HttpErrorMQTTError = 7, + HttpErrorResourcesForbidden = 8, + HttpErrorInternalRequestError = 9, + HttpErrorInternalError = 10, + HttpErrorFileFormatError = 11, + HttpErrorResoucesConflict = 12, + HttpErrorTimeout = 13, + HttpErrorResourcesExhaust = 14, + HttpErrorVersionLimited = 15, +}; + /// Represetns a Http request class Http : public std::enable_shared_from_this { private: @@ -65,6 +82,9 @@ public: static Http put2(std::string url); static Http patch(std::string url); + //BBS set global header for each http request + static void set_extra_headers(std::map headers); + ~Http(); Http(const Http &) = delete; diff --git a/src/slic3r/Utils/MacDarkMode.mm b/src/slic3r/Utils/MacDarkMode.mm index 3609db4fde..8a85322e9c 100644 --- a/src/slic3r/Utils/MacDarkMode.mm +++ b/src/slic3r/Utils/MacDarkMode.mm @@ -97,3 +97,13 @@ void set_miniaturizable(void * window) } @end + + +@implementation NSTextField (FocusRing) + +- (NSFocusRingType) focusRingType +{ + return NSFocusRingTypeNone; +} + +@end diff --git a/src/slic3r/Utils/NetworkAgent.cpp b/src/slic3r/Utils/NetworkAgent.cpp index 07cc35a9e5..6d9f0b4c45 100644 --- a/src/slic3r/Utils/NetworkAgent.cpp +++ b/src/slic3r/Utils/NetworkAgent.cpp @@ -11,16 +11,24 @@ #include "NetworkAgent.hpp" + using namespace BBL; namespace Slic3r { +#define BAMBU_SOURCE_LIBRARY "BambuSource" + #if defined(_MSC_VER) || defined(_WIN32) static HMODULE netwoking_module = NULL; +static HMODULE source_module = NULL; #else static void* netwoking_module = NULL; +static void* source_module = NULL; #endif + +func_check_debug_consistent NetworkAgent::check_debug_consistent_ptr = nullptr; +func_get_version NetworkAgent::get_version_ptr = nullptr; func_create_agent NetworkAgent::create_agent_ptr = nullptr; func_destroy_agent NetworkAgent::destroy_agent_ptr = nullptr; func_init_log NetworkAgent::init_log_ptr = nullptr; @@ -103,36 +111,50 @@ int NetworkAgent::initialize_network_module() { //int ret = -1; std::string library; + auto plugin_folder = boost::filesystem::path(wxStandardPaths::Get().GetUserDataDir().ToUTF8().data()) / "plugins"; //first load the library #if defined(_MSC_VER) || defined(_WIN32) - library = std::string(BAMBU_NETWORK_LIBRARY) + ".dll"; + library = plugin_folder.string() + "/" + std::string(BAMBU_NETWORK_LIBRARY) + ".dll"; wchar_t lib_wstr[128]; memset(lib_wstr, 0, sizeof(lib_wstr)); ::MultiByteToWideChar(CP_UTF8, NULL, library.c_str(), strlen(library.c_str())+1, lib_wstr, sizeof(lib_wstr) / sizeof(lib_wstr[0])); netwoking_module = LoadLibrary(lib_wstr); -#elif defined(__WXMAC__) - std::string resource_dir = resources_dir(); - library = resource_dir + "/../Library/"+ std::string("lib") + BAMBU_NETWORK_LIBRARY + ".dylib"; + /*if (!netwoking_module) { + library = std::string(BAMBU_NETWORK_LIBRARY) + ".dll"; + memset(lib_wstr, 0, sizeof(lib_wstr)); + ::MultiByteToWideChar(CP_UTF8, NULL, library.c_str(), strlen(library.c_str()) + 1, lib_wstr, sizeof(lib_wstr) / sizeof(lib_wstr[0])); + netwoking_module = LoadLibrary(lib_wstr); + }*/ +#else + #if defined(__WXMAC__) + library = plugin_folder.string() + "/" + std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + ".dylib"; + #else + library = plugin_folder.string() + "/" + std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + ".so"; + #endif printf("loading network module at %s\n", library.c_str()); netwoking_module = dlopen( library.c_str(), RTLD_LAZY); if (!netwoking_module) { + /*#if defined(__WXMAC__) library = std::string("lib") + BAMBU_NETWORK_LIBRARY + ".dylib"; - netwoking_module = dlopen( library.c_str(), RTLD_LAZY); + #else + library = std::string("lib") + BAMBU_NETWORK_LIBRARY + ".so"; + #endif*/ + //netwoking_module = dlopen( library.c_str(), RTLD_LAZY); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", error, dlerror is %1%")%dlerror(); } printf("after dlopen, network_module is %p\n", netwoking_module); -#else - library = std::string("lib") + BAMBU_NETWORK_LIBRARY + ".so"; - netwoking_module = dlopen( library.c_str(), RTLD_LAZY); #endif if (!netwoking_module) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", can not Load Library for %1%")%library; return -1; } - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", successfully loaded library %1%")%library; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", successfully loaded library %1%, module %2%")%library %netwoking_module; //load the functions + check_debug_consistent_ptr = reinterpret_cast(get_network_function("bambu_network_check_debug_consistent")); + get_version_ptr = reinterpret_cast(get_network_function("bambu_network_get_version")); create_agent_ptr = reinterpret_cast(get_network_function("bambu_network_create_agent")); destroy_agent_ptr = reinterpret_cast(get_network_function("bambu_network_destroy_agent")); init_log_ptr = reinterpret_cast(get_network_function("bambu_network_init_log")); @@ -196,6 +218,140 @@ int NetworkAgent::initialize_network_module() return 0; } +int NetworkAgent::unload_network_module() +{ + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", network module %1%")%netwoking_module; +#if defined(_MSC_VER) || defined(_WIN32) + if (netwoking_module) { + FreeLibrary(netwoking_module); + netwoking_module = NULL; + } + if (source_module) { + FreeLibrary(source_module); + source_module = NULL; + } +#else + if (netwoking_module) { + dlclose(netwoking_module); + netwoking_module = NULL; + } + if (source_module) { + dlclose(source_module); + source_module = NULL; + } +#endif + + check_debug_consistent_ptr = nullptr; + get_version_ptr = nullptr; + create_agent_ptr = nullptr; + destroy_agent_ptr = nullptr; + init_log_ptr = nullptr; + set_config_dir_ptr = nullptr; + set_cert_file_ptr = nullptr; + set_country_code_ptr = nullptr; + start_ptr = nullptr; + set_on_ssdp_msg_fn_ptr = nullptr; + set_on_user_login_fn_ptr = nullptr; + set_on_printer_connected_fn_ptr = nullptr; + set_on_server_connected_fn_ptr = nullptr; + set_on_http_error_fn_ptr = nullptr; + set_get_country_code_fn_ptr = nullptr; + set_on_message_fn_ptr = nullptr; + set_on_local_connect_fn_ptr = nullptr; + set_on_local_message_fn_ptr = nullptr; + connect_server_ptr = nullptr; + is_server_connected_ptr = nullptr; + refresh_connection_ptr = nullptr; + start_subscribe_ptr = nullptr; + stop_subscribe_ptr = nullptr; + send_message_ptr = nullptr; + connect_printer_ptr = nullptr; + disconnect_printer_ptr = nullptr; + send_message_to_printer_ptr = nullptr; + start_discovery_ptr = nullptr; + change_user_ptr = nullptr; + is_user_login_ptr = nullptr; + user_logout_ptr = nullptr; + get_user_id_ptr = nullptr; + get_user_name_ptr = nullptr; + get_user_avatar_ptr = nullptr; + get_user_nickanme_ptr = nullptr; + build_login_cmd_ptr = nullptr; + build_logout_cmd_ptr = nullptr; + build_login_info_ptr = nullptr; + bind_ptr = nullptr; + unbind_ptr = nullptr; + get_bambulab_host_ptr = nullptr; + get_user_selected_machine_ptr = nullptr; + set_user_selected_machine_ptr = nullptr; + start_print_ptr = nullptr; + start_local_print_with_record_ptr = nullptr; + start_local_print_ptr = nullptr; + get_user_presets_ptr = nullptr; + request_setting_id_ptr = nullptr; + put_setting_ptr = nullptr; + get_setting_list_ptr = nullptr; + delete_setting_ptr = nullptr; + get_studio_info_url_ptr = nullptr; + set_extra_http_header_ptr = nullptr; + check_user_task_report_ptr = nullptr; + get_user_print_info_ptr = nullptr; + get_printer_firmware_ptr = nullptr; + get_task_plate_index_ptr = nullptr; + get_slice_info_ptr = nullptr; + query_bind_status_ptr = nullptr; + modify_printer_name_ptr = nullptr; + get_camera_url_ptr = nullptr; + + return 0; +} + +#if defined(_MSC_VER) || defined(_WIN32) +HMODULE NetworkAgent::get_bambu_source_entry() +#else +void* NetworkAgent::get_bambu_source_entry() +#endif +{ + if ((source_module) || (!netwoking_module)) + return source_module; + + //int ret = -1; + std::string library; + auto plugin_folder = boost::filesystem::path(wxStandardPaths::Get().GetUserDataDir().ToUTF8().data()) / "plugins"; +#if defined(_MSC_VER) || defined(_WIN32) + wchar_t lib_wstr[128]; + + //goto load bambu source + library = plugin_folder.string() + "/" + std::string(BAMBU_SOURCE_LIBRARY) + ".dll"; + memset(lib_wstr, 0, sizeof(lib_wstr)); + ::MultiByteToWideChar(CP_UTF8, NULL, library.c_str(), strlen(library.c_str())+1, lib_wstr, sizeof(lib_wstr) / sizeof(lib_wstr[0])); + source_module = LoadLibrary(lib_wstr); + /*if (!source_module) { + library = std::string(BAMBU_SOURCE_LIBRARY) + ".dll"; + memset(lib_wstr, 0, sizeof(lib_wstr)); + ::MultiByteToWideChar(CP_UTF8, NULL, library.c_str(), strlen(library.c_str()) + 1, lib_wstr, sizeof(lib_wstr) / sizeof(lib_wstr[0])); + source_module = LoadLibrary(lib_wstr); + }*/ +#else +#if defined(__WXMAC__) + library = plugin_folder.string() + "/" + std::string("lib") + std::string(BAMBU_SOURCE_LIBRARY) + ".dylib"; +#else + library = plugin_folder.string() + "/" + std::string("lib") + std::string(BAMBU_SOURCE_LIBRARY) + ".so"; +#endif + source_module = dlopen( library.c_str(), RTLD_LAZY); + /*if (!source_module) { +#if defined(__WXMAC__) + library = std::string("lib") + BAMBU_SOURCE_LIBRARY + ".dylib"; +#else + library = std::string("lib") + BAMBU_SOURCE_LIBRARY + ".so"; +#endif + source_module = dlopen( library.c_str(), RTLD_LAZY); + }*/ +#endif + + return source_module; +} + void* NetworkAgent::get_network_function(const char* name) { void* function = nullptr; @@ -215,6 +371,28 @@ void* NetworkAgent::get_network_function(const char* name) return function; } +std::string NetworkAgent::get_version() +{ + bool consistent = true; + //check the debug consistent first + if (check_debug_consistent_ptr) { +#if defined(NDEBUG) + consistent = check_debug_consistent_ptr(false); +#else + consistent = check_debug_consistent_ptr(true); +#endif + } + if (!consistent) { + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", inconsistent library,return 00.00.00.00!"); + return "00.00.00.00"; + } + if (get_version_ptr) { + return get_version_ptr(); + } + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", get_version not supported,return 00.00.00.00!"); + return "00.00.00.00"; +} + int NetworkAgent::init_log() { int ret = 0; @@ -737,7 +915,7 @@ int NetworkAgent::check_user_task_report(int* task_id, bool* printable) int ret = 0; if (network_agent && check_user_task_report_ptr) { ret = check_user_task_report_ptr(network_agent, task_id, printable); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(" error: network_agent=%1%, ret=%2%, task_id=%3%, printable=%4%")%network_agent %ret %(*task_id) %(*printable); + BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(" error: network_agent=%1%, ret=%2%, task_id=%3%, printable=%4%")%network_agent %ret %(*task_id) %(*printable); } return ret; } @@ -747,7 +925,7 @@ int NetworkAgent::get_user_print_info(unsigned int* http_code, std::string* http int ret = 0; if (network_agent && get_user_print_info_ptr) { ret = get_user_print_info_ptr(network_agent, http_code, http_body); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(" error: network_agent=%1%, ret=%2%, http_code=%3%, http_body=%4%")%network_agent %ret %(*http_code) %(*http_body); + BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(" error: network_agent=%1%, ret=%2%, http_code=%3%, http_body=%4%")%network_agent %ret %(*http_code) %(*http_body); } return ret; } @@ -757,7 +935,7 @@ int NetworkAgent::get_printer_firmware(std::string dev_id, unsigned* http_code, int ret = 0; if (network_agent && get_printer_firmware_ptr) { ret = get_printer_firmware_ptr(network_agent, dev_id, http_code, http_body); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(" : network_agent=%1%, ret=%2%, dev_id=%3%, http_code=%4%, http_body=%5%") + BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(" : network_agent=%1%, ret=%2%, dev_id=%3%, http_code=%4%, http_body=%5%") %network_agent %ret %dev_id %(*http_code) %(*http_body); } return ret; @@ -779,7 +957,7 @@ int NetworkAgent::get_slice_info(std::string project_id, std::string profile_id, int ret; if (network_agent && get_slice_info_ptr) { ret = get_slice_info_ptr(network_agent, project_id, profile_id, plate_index, slice_json); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(" : network_agent=%1%, project_id=%2%, profile_id=%3%, plate_index=%4%, slice_json=%5%") + BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(" : network_agent=%1%, project_id=%2%, profile_id=%3%, plate_index=%4%, slice_json=%5%") %network_agent %project_id %profile_id %plate_index %(*slice_json); } return ret; diff --git a/src/slic3r/Utils/NetworkAgent.hpp b/src/slic3r/Utils/NetworkAgent.hpp index 577c126ae7..9f1deab24e 100644 --- a/src/slic3r/Utils/NetworkAgent.hpp +++ b/src/slic3r/Utils/NetworkAgent.hpp @@ -6,7 +6,8 @@ using namespace BBL; namespace Slic3r { - +typedef bool (*func_check_debug_consistent)(bool is_debug); +typedef std::string (*func_get_version)(void); typedef void* (*func_create_agent)(void); typedef int (*func_destroy_agent)(void *agent); typedef int (*func_init_log)(void *agent); @@ -75,6 +76,13 @@ class NetworkAgent public: static int initialize_network_module(); + static int unload_network_module(); +#if defined(_MSC_VER) || defined(_WIN32) + static HMODULE get_bambu_source_entry(); +#else + static void* get_bambu_source_entry(); +#endif + static std::string get_version(); static void* get_network_function(const char* name); NetworkAgent(); ~NetworkAgent(); @@ -141,6 +149,8 @@ private: void* network_agent { nullptr }; + static func_check_debug_consistent check_debug_consistent_ptr; + static func_get_version get_version_ptr; static func_create_agent create_agent_ptr; static func_destroy_agent destroy_agent_ptr; static func_init_log init_log_ptr; diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 659949f680..8e12dfc1bb 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -187,7 +187,7 @@ struct Updates wxDEFINE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); wxDEFINE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); -wxDEFINE_EVENT(EVT_ENTER_FORCE_UPGRADE, wxCommandEvent); + struct PresetUpdater::priv { @@ -225,9 +225,9 @@ struct PresetUpdater::priv void prune_tmps() const; void sync_version() const; void parse_version_string(const std::string& body) const; - void sync_resources(std::map &resources); - void sync_config(const VendorMap vendors); - void sync_tooltip(); + void sync_resources(std::string http_url, std::map &resources); + void sync_config(std::string http_url, const VendorMap vendors); + void sync_tooltip(std::string http_url); //BBS: refine preset update logic bool install_bundles_rsrc(std::vector bundles, bool snapshot) const; @@ -401,6 +401,7 @@ void PresetUpdater::priv::sync_version() const // Version string must contain release version on first line. Follows non-mandatory alpha / beta releases on following lines (alpha=2.0.0-alpha1). void PresetUpdater::priv::parse_version_string(const std::string& body) const { +#if 0 // release version std::string version; const auto first_nl_pos = body.find_first_of("\n\r"); @@ -464,21 +465,17 @@ void PresetUpdater::priv::parse_version_string(const std::string& body) const evt->SetString(GUI::from_u8(version)); GUI::wxGetApp().QueueEvent(evt); } +#endif + return; } //BBS: refine the Preset Updater logic // Download vendor indices. Also download new bundles if an index indicates there's a new one available. // Both are saved in cache. -void PresetUpdater::priv::sync_resources(std::map &resources) +void PresetUpdater::priv::sync_resources(std::string http_url, std::map &resources) { std::map resource_list; - NetworkAgent* m_agent = GUI::wxGetApp().getAgent(); - if (!m_agent) { - BOOST_LOG_TRIVIAL(error) << "[BBL Updater]: can not get account manager"; - return; - } - BOOST_LOG_TRIVIAL(info) << format("[BBL Updater]: get preferred setting version for app version %1%, url: `%2%`", SLIC3R_APP_NAME, version_check_url); std::string query_params = "?"; @@ -494,7 +491,7 @@ void PresetUpdater::priv::sync_resources(std::map &resour first = false; } - std::string url = m_agent->get_studio_info_url(); + std::string url = http_url; url += query_params; Slic3r::Http http = Slic3r::Http::get(url); http.on_complete([this, &resource_list, resources](std::string body, unsigned) { @@ -606,7 +603,7 @@ void PresetUpdater::priv::sync_resources(std::map &resour //BBS: refine the Preset Updater logic // Download vendor indices. Also download new bundles if an index indicates there's a new one available. // Both are saved in cache. -void PresetUpdater::priv::sync_config(const VendorMap vendors) +void PresetUpdater::priv::sync_config(std::string http_url, const VendorMap vendors) { std::map> vendor_list; std::map vendor_descriptions; @@ -614,12 +611,6 @@ void PresetUpdater::priv::sync_config(const VendorMap vendors) if (!enabled_config_update) { return; } - NetworkAgent* agent = GUI::wxGetApp().getAgent(); - if (!agent) { - BOOST_LOG_TRIVIAL(error) << "[BBL Updater]: can not get account manager"; - return; - } - BOOST_LOG_TRIVIAL(info) << format("[BBL Updater]: get preferred setting version for app version %1%, url: `%2%`", SLIC3R_APP_NAME, version_check_url); std::string query_params = "?"; @@ -640,7 +631,7 @@ void PresetUpdater::priv::sync_config(const VendorMap vendors) query_params += query_vendor; } - std::string url = agent->get_studio_info_url(); + std::string url = http_url; url += query_params; Slic3r::Http http = Slic3r::Http::get(url); http.on_complete( @@ -787,7 +778,7 @@ void PresetUpdater::priv::sync_config(const VendorMap vendors) } } -void PresetUpdater::priv::sync_tooltip() +void PresetUpdater::priv::sync_tooltip(std::string http_url) { try { std::string language = GUI::into_u8(GUI::wxGetApp().current_language_code()); @@ -805,7 +796,7 @@ void PresetUpdater::priv::sync_tooltip() {"slicer/tooltip/common", { common_version, "", "", (cache_root / "common").string() }}, {"slicer/tooltip/" + language, { language_version, "", "", (cache_root / language).string() }} }; - sync_resources(resources); + sync_resources(http_url, resources); for (auto &r : resources) { if (!r.second.url.empty()) { GUI::MarkdownTip::Reload(); @@ -1063,7 +1054,7 @@ PresetUpdater::~PresetUpdater() //BBS: change directories by design //BBS: refine the preset updater logic -void PresetUpdater::sync(PresetBundle *preset_bundle) +void PresetUpdater::sync(std::string http_url, PresetBundle *preset_bundle) { //p->set_download_prefs(GUI::wxGetApp().app_config); if (!p->enabled_version_check && !p->enabled_config_update) { return; } @@ -1073,11 +1064,11 @@ void PresetUpdater::sync(PresetBundle *preset_bundle) // into the closure (but perhaps the compiler can elide this). VendorMap vendors = preset_bundle->vendors; - p->thread = std::thread([this, vendors]() { + p->thread = std::thread([this, vendors, http_url]() { this->p->prune_tmps(); this->p->sync_version(); - this->p->sync_config(std::move(vendors)); - this->p->sync_tooltip(); + this->p->sync_config(http_url, std::move(vendors)); + this->p->sync_tooltip(http_url); }); } diff --git a/src/slic3r/Utils/PresetUpdater.hpp b/src/slic3r/Utils/PresetUpdater.hpp index af891ec123..8e949efbc5 100644 --- a/src/slic3r/Utils/PresetUpdater.hpp +++ b/src/slic3r/Utils/PresetUpdater.hpp @@ -26,7 +26,7 @@ public: ~PresetUpdater(); // If either version check or config updating is enabled, get the appropriate data in the background and cache it. - void sync(PresetBundle *preset_bundle); + void sync(std::string http_url, PresetBundle *preset_bundle); // If version check is enabled, check if chaced online slic3r version is newer, notify if so. void slic3r_update_notify(); @@ -67,6 +67,7 @@ private: wxDECLARE_EVENT(EVT_SLIC3R_VERSION_ONLINE, wxCommandEvent); wxDECLARE_EVENT(EVT_SLIC3R_EXPERIMENTAL_VERSION_ONLINE, wxCommandEvent); -wxDECLARE_EVENT(EVT_ENTER_FORCE_UPGRADE, wxCommandEvent); + + } #endif diff --git a/src/slic3r/Utils/bambu_networking.hpp b/src/slic3r/Utils/bambu_networking.hpp index 3fcafe7310..ffdef3f7ae 100644 --- a/src/slic3r/Utils/bambu_networking.hpp +++ b/src/slic3r/Utils/bambu_networking.hpp @@ -36,7 +36,7 @@ namespace BBL { #define BAMBU_NETWORK_LIBRARY "bambu_networking" #define BAMBU_NETWORK_AGENT_NAME "bambu_network_agent" -#define BAMBU_NETWORK_AGENT_VERSION "1.0.0.2" +#define BAMBU_NETWORK_AGENT_VERSION "01.01.00.10" //iot preset type strings diff --git a/version.inc b/version.inc index 2c1aa3a304..89591147ec 100644 --- a/version.inc +++ b/version.inc @@ -7,4 +7,4 @@ set(SLIC3R_APP_KEY "BambuStudio") if(NOT DEFINED BBL_RELEASE_TO_PUBLIC) set(BBL_RELEASE_TO_PUBLIC "0") endif() -set(SLIC3R_VERSION "01.00.10.05") +set(SLIC3R_VERSION "01.01.00.10") From b5311059aa5a5b5977a4f78eb4e4509472b668dc Mon Sep 17 00:00:00 2001 From: tao wang Date: Fri, 22 Jul 2022 20:33:10 +0800 Subject: [PATCH 3/4] FIX:printer setting background colour is wrong Change-Id: Ice0e326e01cbd0e4afa5a5858fc7bd1c5894420a --- src/slic3r/GUI/Plater.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 38b75637fc..5e0e1d0b82 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -453,6 +453,7 @@ Sidebar::Sidebar(Plater *parent) p->m_text_printer_settings = new wxStaticText(p->m_panel_printer_title, wxID_ANY, _L("Printer"), wxDefaultPosition, wxDefaultSize, 0); p->m_text_printer_settings->Wrap(-1); p->m_text_printer_settings->SetFont(Label::Body_14); + p->m_text_printer_settings->SetBackgroundColour(0xF1F1F1); p->m_printer_setting = new ScalableButton(p->m_panel_printer_title, wxID_ANY, "settings"); p->m_printer_setting->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { @@ -546,6 +547,7 @@ Sidebar::Sidebar(Plater *parent) p->m_staticText_filament_settings = new wxStaticText( p->m_panel_filament_title, wxID_ANY, _L("Filament"), wxDefaultPosition, wxDefaultSize, 0 ); p->m_staticText_filament_settings->Wrap( -1 ); p->m_staticText_filament_settings->SetFont(Label::Body_14); + p->m_staticText_filament_settings->SetBackgroundColour(0xF1F1F1); bSizer39->Add(p->m_filament_icon, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, FromDIP(10)); bSizer39->Add( p->m_staticText_filament_settings, 0, wxALIGN_CENTER ); bSizer39->Add(FromDIP(10), 0, 0, 0, 0); From a363daed9b9a0a732d01baef3ee4a0f65d91651f Mon Sep 17 00:00:00 2001 From: gerrit Date: Fri, 22 Jul 2022 20:37:47 +0800 Subject: [PATCH 4/4] ci: update build version to 01.01.00.13 Change-Id: I854534ef6aebd376363e14dff9ba68990ca47228 --- version.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.inc b/version.inc index 89591147ec..90d37ecdb2 100644 --- a/version.inc +++ b/version.inc @@ -7,4 +7,4 @@ set(SLIC3R_APP_KEY "BambuStudio") if(NOT DEFINED BBL_RELEASE_TO_PUBLIC) set(BBL_RELEASE_TO_PUBLIC "0") endif() -set(SLIC3R_VERSION "01.01.00.10") +set(SLIC3R_VERSION "01.01.00.13")