diff --git a/.gitignore b/.gitignore
index 60b59e6829..2ec5af2b9b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -71,3 +71,4 @@ run.sh
.scannerwork/
CuraEngine
+/.coverage
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000..f4a4d0771a
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,12 @@
+image: registry.gitlab.com/ultimaker/cura/cura-build-environment:centos7
+
+stages:
+ - build
+
+build-and-test:
+ stage: build
+ script:
+ - docker/build.sh
+ artifacts:
+ paths:
+ - build
diff --git a/CMakeLists.txt b/CMakeLists.txt
index be6c9d938e..ba427a745d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,11 +1,10 @@
-project(cura NONE)
-cmake_minimum_required(VERSION 2.8.12)
-
-set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/
- ${CMAKE_MODULE_PATH})
+project(cura)
+cmake_minimum_required(VERSION 3.6)
include(GNUInstallDirs)
+list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
+
set(URANIUM_DIR "${CMAKE_SOURCE_DIR}/../Uranium" CACHE DIRECTORY "The location of the Uranium repository")
set(URANIUM_SCRIPTS_DIR "${URANIUM_DIR}/scripts" CACHE DIRECTORY "The location of the scripts directory of the Uranium repository")
@@ -28,6 +27,26 @@ set(CURA_CLOUD_API_VERSION "" CACHE STRING "Alternative Cura cloud API version")
configure_file(${CMAKE_SOURCE_DIR}/cura.desktop.in ${CMAKE_BINARY_DIR}/cura.desktop @ONLY)
configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY)
+
+# FIXME: Remove the code for CMake <3.12 once we have switched over completely.
+# FindPython3 is a new module since CMake 3.12. It deprecates FindPythonInterp and FindPythonLibs. The FindPython3
+# module is copied from the CMake repository here so in CMake <3.12 we can still use it.
+if(${CMAKE_VERSION} VERSION_LESS 3.12)
+ # Use FindPythonInterp and FindPythonLibs for CMake <3.12
+ find_package(PythonInterp 3 REQUIRED)
+
+ set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})
+
+ set(Python3_VERSION ${PYTHON_VERSION_STRING})
+ set(Python3_VERSION_MAJOR ${PYTHON_VERSION_MAJOR})
+ set(Python3_VERSION_MINOR ${PYTHON_VERSION_MINOR})
+ set(Python3_VERSION_PATCH ${PYTHON_VERSION_PATCH})
+else()
+ # Use FindPython3 for CMake >=3.12
+ find_package(Python3 REQUIRED COMPONENTS Interpreter Development)
+endif()
+
+
if(NOT ${URANIUM_DIR} STREQUAL "")
set(CMAKE_MODULE_PATH "${URANIUM_DIR}/cmake")
endif()
@@ -40,12 +59,12 @@ if(NOT ${URANIUM_SCRIPTS_DIR} STREQUAL "")
CREATE_TRANSLATION_TARGETS()
endif()
-find_package(PythonInterp 3.5.0 REQUIRED)
install(DIRECTORY resources
DESTINATION ${CMAKE_INSTALL_DATADIR}/cura)
install(DIRECTORY plugins
DESTINATION lib${LIB_SUFFIX}/cura)
+
if(NOT APPLE AND NOT WIN32)
install(FILES cura_app.py
DESTINATION ${CMAKE_INSTALL_BINDIR}
@@ -53,16 +72,16 @@ if(NOT APPLE AND NOT WIN32)
RENAME cura)
if(EXISTS /etc/debian_version)
install(DIRECTORY cura
- DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}/dist-packages
+ DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}/dist-packages
FILES_MATCHING PATTERN *.py)
install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py
- DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}/dist-packages/cura)
+ DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}/dist-packages/cura)
else()
install(DIRECTORY cura
- DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages
+ DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages
FILES_MATCHING PATTERN *.py)
install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py
- DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura)
+ DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages/cura)
endif()
install(FILES ${CMAKE_BINARY_DIR}/cura.desktop
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
@@ -78,8 +97,8 @@ else()
DESTINATION ${CMAKE_INSTALL_BINDIR}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
install(DIRECTORY cura
- DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages
+ DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages
FILES_MATCHING PATTERN *.py)
install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py
- DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura)
+ DESTINATION lib${LIB_SUFFIX}/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages/cura)
endif()
diff --git a/cmake/CuraTests.cmake b/cmake/CuraTests.cmake
index b6d04de036..c0762e2b91 100644
--- a/cmake/CuraTests.cmake
+++ b/cmake/CuraTests.cmake
@@ -1,10 +1,21 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-enable_testing()
+include(CTest)
include(CMakeParseArguments)
-find_package(PythonInterp 3.5.0 REQUIRED)
+# FIXME: Remove the code for CMake <3.12 once we have switched over completely.
+# FindPython3 is a new module since CMake 3.12. It deprecates FindPythonInterp and FindPythonLibs. The FindPython3
+# module is copied from the CMake repository here so in CMake <3.12 we can still use it.
+if(${CMAKE_VERSION} VERSION_LESS 3.12)
+ # Use FindPythonInterp and FindPythonLibs for CMake <3.12
+ find_package(PythonInterp 3 REQUIRED)
+
+ set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})
+else()
+ # Use FindPython3 for CMake >=3.12
+ find_package(Python3 REQUIRED COMPONENTS Interpreter Development)
+endif()
add_custom_target(test-verbose COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
@@ -36,7 +47,7 @@ function(cura_add_test)
if (NOT ${test_exists})
add_test(
NAME ${_NAME}
- COMMAND ${PYTHON_EXECUTABLE} -m pytest --verbose --full-trace --capture=no --no-print-log --junitxml=${CMAKE_BINARY_DIR}/junit-${_NAME}.xml ${_DIRECTORY}
+ COMMAND ${Python3_EXECUTABLE} -m pytest --verbose --full-trace --capture=no --no-print-log --junitxml=${CMAKE_BINARY_DIR}/junit-${_NAME}.xml ${_DIRECTORY}
)
set_tests_properties(${_NAME} PROPERTIES ENVIRONMENT LANG=C)
set_tests_properties(${_NAME} PROPERTIES ENVIRONMENT "PYTHONPATH=${_PYTHONPATH}")
@@ -59,13 +70,13 @@ endforeach()
#Add code style test.
add_test(
NAME "code-style"
- COMMAND ${PYTHON_EXECUTABLE} run_mypy.py
+ COMMAND ${Python3_EXECUTABLE} run_mypy.py
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
#Add test for whether the shortcut alt-keys are unique in every translation.
add_test(
NAME "shortcut-keys"
- COMMAND ${PYTHON_EXECUTABLE} scripts/check_shortcut_keys.py
+ COMMAND ${Python3_EXECUTABLE} scripts/check_shortcut_keys.py
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
-)
\ No newline at end of file
+)
diff --git a/contributing.md b/contributing.md
new file mode 100644
index 0000000000..06f9dd472b
--- /dev/null
+++ b/contributing.md
@@ -0,0 +1,19 @@
+Submitting bug reports
+----------------------
+Please submit bug reports for all of Cura and CuraEngine to the [Cura repository](https://github.com/Ultimaker/Cura/issues). There will be a template there to fill in. Depending on the type of issue, we will usually ask for the [Cura log](Logging Issues) or a project file.
+
+If a bug report would contain private information, such as a proprietary 3D model, you may also e-mail us. Ask for contact information in the issue.
+
+Bugs related to supporting certain types of printers can usually not be solved by the Cura maintainers, since we don't have access to every 3D printer model in the world either. We have to rely on external contributors to fix this. If it's something simple and obvious, such as a mistake in the start g-code, then we can directly fix it for you, but e.g. issues with USB cable connectivity are impossible for us to debug.
+
+Requesting features
+-------------------
+The issue template in the Cura repository does not apply to feature requests. You can ignore it.
+
+When requesting a feature, please describe clearly what you need and why you think this is valuable to users or what problem it solves.
+
+Making pull requests
+--------------------
+If you want to propose a change to Cura's source code, please create a pull request in the appropriate repository (being [Cura](https://github.com/Ultimaker/Cura), [Uranium](https://github.com/Ultimaker/Uranium), [CuraEngine](https://github.com/Ultimaker/CuraEngine), [fdm_materials](https://github.com/Ultimaker/fdm_materials), [libArcus](https://github.com/Ultimaker/libArcus), [cura-build](https://github.com/Ultimaker/cura-build), [cura-build-environment](https://github.com/Ultimaker/cura-build-environment), [libSavitar](https://github.com/Ultimaker/libSavitar), [libCharon](https://github.com/Ultimaker/libCharon) or [cura-binary-data](https://github.com/Ultimaker/cura-binary-data)) and if your change requires changes on multiple of these repositories, please link them together so that we know to merge them together.
+
+Some of these repositories will have automated tests running when you create a pull request, indicated by green check marks or red crosses in the Github web page. If you see a red cross, that means that a test has failed. If the test doesn't fail on the Master branch but does fail on your branch, that indicates that you've probably made a mistake and you need to do that. Click on the cross for more details, or run the test locally by running `cmake . && ctest --verbose`.
\ No newline at end of file
diff --git a/cura/API/Account.py b/cura/API/Account.py
index 30401454b3..0e3af0e6c1 100644
--- a/cura/API/Account.py
+++ b/cura/API/Account.py
@@ -29,6 +29,7 @@ i18n_catalog = i18nCatalog("cura")
class Account(QObject):
# Signal emitted when user logged in or out.
loginStateChanged = pyqtSignal(bool)
+ accessTokenChanged = pyqtSignal()
def __init__(self, application: "CuraApplication", parent = None) -> None:
super().__init__(parent)
@@ -59,8 +60,12 @@ class Account(QObject):
self._authorization_service.initialize(self._application.getPreferences())
self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged)
self._authorization_service.onAuthenticationError.connect(self._onLoginStateChanged)
+ self._authorization_service.accessTokenChanged.connect(self._onAccessTokenChanged)
self._authorization_service.loadAuthDataFromPreferences()
+ def _onAccessTokenChanged(self):
+ self.accessTokenChanged.emit()
+
## Returns a boolean indicating whether the given authentication is applied against staging or not.
@property
def is_staging(self) -> bool:
@@ -105,7 +110,7 @@ class Account(QObject):
return None
return user_profile.profile_image_url
- @pyqtProperty(str, notify=loginStateChanged)
+ @pyqtProperty(str, notify=accessTokenChanged)
def accessToken(self) -> Optional[str]:
return self._authorization_service.getAccessToken()
diff --git a/cura/Arranging/Arrange.py b/cura/Arranging/Arrange.py
index 32796005c8..caa7aae910 100644
--- a/cura/Arranging/Arrange.py
+++ b/cura/Arranging/Arrange.py
@@ -217,11 +217,6 @@ class Arrange:
prio_slice = self._priority[min_y:max_y, min_x:max_x]
prio_slice[new_occupied] = 999
- # If you want to see how the rasterized arranger build plate looks like, uncomment this code
- # numpy.set_printoptions(linewidth=500, edgeitems=200)
- # print(self._occupied.shape)
- # print(self._occupied)
-
@property
def isEmpty(self):
return self._is_empty
diff --git a/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py b/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py
index 8bbc2bf132..89f613e180 100644
--- a/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py
+++ b/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from UM.Application import Application
@@ -48,7 +48,6 @@ class ArrangeArray:
return self._count
def get(self, index):
- print(self._arrange)
return self._arrange[index]
def getFirstEmpty(self):
diff --git a/cura/AutoSave.py b/cura/AutoSave.py
index 1639868d6a..605a1e7beb 100644
--- a/cura/AutoSave.py
+++ b/cura/AutoSave.py
@@ -19,6 +19,7 @@ class AutoSave:
self._change_timer.setInterval(self._application.getPreferences().getValue("cura/autosave_delay"))
self._change_timer.setSingleShot(True)
+ self._enabled = True
self._saving = False
def initialize(self):
@@ -32,6 +33,13 @@ class AutoSave:
if not self._saving:
self._change_timer.start()
+ def setEnabled(self, enabled: bool) -> None:
+ self._enabled = enabled
+ if self._enabled:
+ self._change_timer.start()
+ else:
+ self._change_timer.stop()
+
def _onGlobalStackChanged(self):
if self._global_stack:
self._global_stack.propertyChanged.disconnect(self._triggerTimer)
diff --git a/cura/Backups/Backup.py b/cura/Backups/Backup.py
index 714d6527fe..399a4ea7b0 100644
--- a/cura/Backups/Backup.py
+++ b/cura/Backups/Backup.py
@@ -116,12 +116,13 @@ class Backup:
current_version = self._application.getVersion()
version_to_restore = self.meta_data.get("cura_release", "master")
- if current_version != version_to_restore:
- # Cannot restore version older or newer than current because settings might have changed.
- # Restoring this will cause a lot of issues so we don't allow this for now.
+
+ if current_version < version_to_restore:
+ # Cannot restore version newer than current because settings might have changed.
+ Logger.log("d", "Tried to restore a Cura backup of version {version_to_restore} with cura version {current_version}".format(version_to_restore = version_to_restore, current_version = current_version))
self._showMessage(
self.catalog.i18nc("@info:backup_failed",
- "Tried to restore a Cura backup that does not match your current version."))
+ "Tried to restore a Cura backup that is higher than the current version."))
return False
version_data_dir = Resources.getDataStoragePath()
diff --git a/cura/Backups/BackupsManager.py b/cura/Backups/BackupsManager.py
index a0d3881209..91ee578941 100644
--- a/cura/Backups/BackupsManager.py
+++ b/cura/Backups/BackupsManager.py
@@ -51,8 +51,8 @@ class BackupsManager:
## Here we try to disable the auto-save plug-in as it might interfere with
# restoring a back-up.
def _disableAutoSave(self) -> None:
- self._application.setSaveDataEnabled(False)
+ self._application.getAutoSave().setEnabled(False)
## Re-enable auto-save after we're done.
def _enableAutoSave(self) -> None:
- self._application.setSaveDataEnabled(True)
+ self._application.getAutoSave().setEnabled(True)
diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py
index 18d0fff6a8..706e136d53 100755
--- a/cura/CuraApplication.py
+++ b/cura/CuraApplication.py
@@ -13,113 +13,122 @@ from PyQt5.QtGui import QColor, QIcon
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtQml import qmlRegisterUncreatableType, qmlRegisterSingletonType, qmlRegisterType
+from UM.i18n import i18nCatalog
from UM.Application import Application
+from UM.Decorators import override
+from UM.FlameProfiler import pyqtSlot
+from UM.Logger import Logger
+from UM.Message import Message
+from UM.Platform import Platform
from UM.PluginError import PluginNotFoundError
-from UM.Scene.SceneNode import SceneNode
-from UM.Scene.Camera import Camera
-from UM.Math.Vector import Vector
-from UM.Math.Quaternion import Quaternion
+from UM.Resources import Resources
+from UM.Preferences import Preferences
+from UM.Qt.Bindings import MainWindow
+from UM.Qt.QtApplication import QtApplication # The class we're inheriting from.
+import UM.Util
+from UM.View.SelectionPass import SelectionPass # For typing.
+
from UM.Math.AxisAlignedBox import AxisAlignedBox
from UM.Math.Matrix import Matrix
-from UM.Platform import Platform
-from UM.Resources import Resources
-from UM.Scene.ToolHandle import ToolHandle
-from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
+from UM.Math.Quaternion import Quaternion
+from UM.Math.Vector import Vector
+
from UM.Mesh.ReadMeshJob import ReadMeshJob
-from UM.Logger import Logger
-from UM.Preferences import Preferences
-from UM.Qt.QtApplication import QtApplication #The class we're inheriting from.
-from UM.View.SelectionPass import SelectionPass #For typing.
-from UM.Scene.Selection import Selection
-from UM.Scene.GroupDecorator import GroupDecorator
-from UM.Settings.ContainerStack import ContainerStack
-from UM.Settings.InstanceContainer import InstanceContainer
-from UM.Settings.Validator import Validator
-from UM.Message import Message
-from UM.i18n import i18nCatalog
-from UM.Workspace.WorkspaceReader import WorkspaceReader
from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation
from UM.Operations.GroupedOperation import GroupedOperation
from UM.Operations.SetTransformOperation import SetTransformOperation
+from UM.Scene.Camera import Camera
+from UM.Scene.GroupDecorator import GroupDecorator
+from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
+from UM.Scene.SceneNode import SceneNode
+from UM.Scene.Selection import Selection
+from UM.Scene.ToolHandle import ToolHandle
+
+from UM.Settings.ContainerRegistry import ContainerRegistry
+from UM.Settings.ContainerStack import ContainerStack
+from UM.Settings.InstanceContainer import InstanceContainer
+from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType
+from UM.Settings.SettingFunction import SettingFunction
+from UM.Settings.Validator import Validator
+
+from UM.Workspace.WorkspaceReader import WorkspaceReader
+
from cura.API import CuraAPI
+
from cura.Arranging.Arrange import Arrange
from cura.Arranging.ArrangeObjectsJob import ArrangeObjectsJob
from cura.Arranging.ArrangeObjectsAllBuildPlatesJob import ArrangeObjectsAllBuildPlatesJob
from cura.Arranging.ShapeArray import ShapeArray
-from cura.MultiplyObjectsJob import MultiplyObjectsJob
-from cura.GlobalStacksModel import GlobalStacksModel
-from cura.Scene.ConvexHullDecorator import ConvexHullDecorator
+
from cura.Operations.SetParentOperation import SetParentOperation
-from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
+
from cura.Scene.BlockSlicingDecorator import BlockSlicingDecorator
from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
-from cura.Scene.CuraSceneNode import CuraSceneNode
-
+from cura.Scene.ConvexHullDecorator import ConvexHullDecorator
from cura.Scene.CuraSceneController import CuraSceneController
-
-from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType
-from UM.Settings.ContainerRegistry import ContainerRegistry
-from UM.Settings.SettingFunction import SettingFunction
-from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
-from cura.Settings.MachineNameValidator import MachineNameValidator
-
-from cura.Machines.Models.BuildPlateModel import BuildPlateModel
-from cura.Machines.Models.NozzleModel import NozzleModel
-from cura.Machines.Models.QualityProfilesDropDownMenuModel import QualityProfilesDropDownMenuModel
-from cura.Machines.Models.CustomQualityProfilesDropDownMenuModel import CustomQualityProfilesDropDownMenuModel
-from cura.Machines.Models.MultiBuildPlateModel import MultiBuildPlateModel
-from cura.Machines.Models.FavoriteMaterialsModel import FavoriteMaterialsModel
-from cura.Machines.Models.GenericMaterialsModel import GenericMaterialsModel
-from cura.Machines.Models.MaterialBrandsModel import MaterialBrandsModel
-from cura.Machines.Models.QualityManagementModel import QualityManagementModel
-from cura.Machines.Models.QualitySettingsModel import QualitySettingsModel
-from cura.Machines.Models.MachineManagementModel import MachineManagementModel
-
-from cura.Machines.Models.SettingVisibilityPresetsModel import SettingVisibilityPresetsModel
+from cura.Scene.CuraSceneNode import CuraSceneNode
+from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
+from cura.Scene import ZOffsetDecorator
from cura.Machines.MachineErrorChecker import MachineErrorChecker
+from cura.Machines.VariantManager import VariantManager
+from cura.Machines.Models.BuildPlateModel import BuildPlateModel
+from cura.Machines.Models.CustomQualityProfilesDropDownMenuModel import CustomQualityProfilesDropDownMenuModel
+from cura.Machines.Models.DiscoveredPrintersModel import DiscoveredPrintersModel
+from cura.Machines.Models.ExtrudersModel import ExtrudersModel
+from cura.Machines.Models.FavoriteMaterialsModel import FavoriteMaterialsModel
+from cura.Machines.Models.FirstStartMachineActionsModel import FirstStartMachineActionsModel
+from cura.Machines.Models.GenericMaterialsModel import GenericMaterialsModel
+from cura.Machines.Models.GlobalStacksModel import GlobalStacksModel
+from cura.Machines.Models.MaterialBrandsModel import MaterialBrandsModel
+from cura.Machines.Models.MultiBuildPlateModel import MultiBuildPlateModel
+from cura.Machines.Models.NozzleModel import NozzleModel
+from cura.Machines.Models.QualityManagementModel import QualityManagementModel
+from cura.Machines.Models.QualityProfilesDropDownMenuModel import QualityProfilesDropDownMenuModel
+from cura.Machines.Models.QualitySettingsModel import QualitySettingsModel
+from cura.Machines.Models.SettingVisibilityPresetsModel import SettingVisibilityPresetsModel
+from cura.Machines.Models.UserChangesModel import UserChangesModel
+
+from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice
+from cura.PrinterOutput.NetworkMJPGImage import NetworkMJPGImage
+
+import cura.Settings.cura_empty_instance_containers
+from cura.Settings.ContainerManager import ContainerManager
+from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
+from cura.Settings.CuraFormulaFunctions import CuraFormulaFunctions
+from cura.Settings.ExtruderManager import ExtruderManager
+from cura.Settings.MachineManager import MachineManager
+from cura.Settings.MachineNameValidator import MachineNameValidator
+from cura.Settings.MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler
from cura.Settings.SettingInheritanceManager import SettingInheritanceManager
+from cura.Settings.SidebarCustomMenuItemsModel import SidebarCustomMenuItemsModel
from cura.Settings.SimpleModeSettingsManager import SimpleModeSettingsManager
-from cura.Machines.VariantManager import VariantManager
+from cura.TaskManagement.OnExitCallbackManager import OnExitCallbackManager
+
+from cura.UI import CuraSplashScreen, MachineActionManager, PrintInformation
+from cura.UI.MachineSettingsManager import MachineSettingsManager
+from cura.UI.ObjectsModel import ObjectsModel
+from cura.UI.TextManager import TextManager
+from cura.UI.AddPrinterPagesModel import AddPrinterPagesModel
+from cura.UI.WelcomePagesModel import WelcomePagesModel
+from cura.UI.WhatsNewPagesModel import WhatsNewPagesModel
+
+from cura.Utils.NetworkingUtil import NetworkingUtil
from .SingleInstance import SingleInstance
from .AutoSave import AutoSave
from . import PlatformPhysics
from . import BuildVolume
from . import CameraAnimation
-from . import PrintInformation
from . import CuraActions
-from cura.Scene import ZOffsetDecorator
-from . import CuraSplashScreen
from . import PrintJobPreviewImageProvider
-from . import MachineActionManager
-
-from cura.TaskManagement.OnExitCallbackManager import OnExitCallbackManager
-
-from cura.Settings.MachineManager import MachineManager
-from cura.Settings.ExtruderManager import ExtruderManager
-from cura.Settings.UserChangesModel import UserChangesModel
-from cura.Settings.ExtrudersModel import ExtrudersModel
-from cura.Settings.MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler
-from cura.Settings.ContainerManager import ContainerManager
-from cura.Settings.SidebarCustomMenuItemsModel import SidebarCustomMenuItemsModel
-import cura.Settings.cura_empty_instance_containers
-from cura.Settings.CuraFormulaFunctions import CuraFormulaFunctions
-
-from cura.ObjectsModel import ObjectsModel
-
-from cura.PrinterOutputDevice import PrinterOutputDevice
-from cura.PrinterOutput.NetworkMJPGImage import NetworkMJPGImage
from cura import ApplicationMetadata, UltimakerCloudAuthentication
-from UM.FlameProfiler import pyqtSlot
-from UM.Decorators import override
-
if TYPE_CHECKING:
from cura.Machines.MaterialManager import MaterialManager
from cura.Machines.QualityManager import QualityManager
@@ -208,6 +217,15 @@ class CuraApplication(QtApplication):
self._cura_scene_controller = None
self._machine_error_checker = None
+ self._machine_settings_manager = MachineSettingsManager(self, parent = self)
+
+ self._discovered_printer_model = DiscoveredPrintersModel(self, parent = self)
+ self._first_start_machine_actions_model = FirstStartMachineActionsModel(self, parent = self)
+ self._welcome_pages_model = WelcomePagesModel(self, parent = self)
+ self._add_printer_pages_model = AddPrinterPagesModel(self, parent = self)
+ self._whats_new_pages_model = WhatsNewPagesModel(self, parent = self)
+ self._text_manager = TextManager(parent = self)
+
self._quality_profile_drop_down_menu_model = None
self._custom_quality_profile_drop_down_menu_model = None
self._cura_API = CuraAPI(self)
@@ -237,15 +255,12 @@ class CuraApplication(QtApplication):
self._update_platform_activity_timer = None
- self._need_to_show_user_agreement = True
-
self._sidebar_custom_menu_items = [] # type: list # Keeps list of custom menu items for the side bar
self._plugins_loaded = False
# Backups
self._auto_save = None
- self._save_data_enabled = True
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
self._container_registry_class = CuraContainerRegistry
@@ -450,7 +465,6 @@ class CuraApplication(QtApplication):
# Misc.:
"ConsoleLogger", #You want to be able to read the log if something goes wrong.
"CuraEngineBackend", #Cura is useless without this one since you can't slice.
- "UserAgreement", #Our lawyers want every user to see this at least once.
"FileLogger", #You want to be able to read the log if something goes wrong.
"XmlMaterialProfile", #Cura crashes without this one.
"Toolbox", #This contains the interface to enable/disable plug-ins, so if you disable it you can't enable it back.
@@ -512,6 +526,10 @@ class CuraApplication(QtApplication):
preferences.addPreference("cura/show_list_of_files", False)
preferences.addPreference("view/settings_list_height", 400)
preferences.addPreference("view/settings_visible", False)
+ preferences.addPreference("view/settings_xpos", 0)
+ preferences.addPreference("view/settings_ypos", 56)
+ preferences.addPreference("view/colorscheme_xpos", 0)
+ preferences.addPreference("view/colorscheme_ypos", 56)
preferences.addPreference("cura/currency", "€")
preferences.addPreference("cura/material_settings", "{}")
@@ -523,7 +541,7 @@ class CuraApplication(QtApplication):
preferences.addPreference("cura/expanded_brands", "")
preferences.addPreference("cura/expanded_types", "")
- self._need_to_show_user_agreement = not preferences.getValue("general/accepted_user_agreement")
+ preferences.addPreference("general/accepted_user_agreement", False)
for key in [
"dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin
@@ -546,13 +564,20 @@ class CuraApplication(QtApplication):
@pyqtProperty(bool)
def needToShowUserAgreement(self) -> bool:
- return self._need_to_show_user_agreement
+ return not UM.Util.parseBool(self.getPreferences().getValue("general/accepted_user_agreement"))
- def setNeedToShowUserAgreement(self, set_value = True) -> None:
- self._need_to_show_user_agreement = set_value
+ @pyqtSlot(bool)
+ def setNeedToShowUserAgreement(self, set_value: bool = True) -> None:
+ self.getPreferences().setValue("general/accepted_user_agreement", str(not set_value))
+
+ @pyqtSlot(str, str)
+ def writeToLog(self, severity: str, message: str) -> None:
+ Logger.log(severity, message)
# DO NOT call this function to close the application, use checkAndExitApplication() instead which will perform
# pre-exit checks such as checking for in-progress USB printing, etc.
+ # Except for the 'Decline and close' in the 'User Agreement'-step in the Welcome-pages, that should be a hard exit.
+ @pyqtSlot()
def closeApplication(self) -> None:
Logger.log("i", "Close application")
main_window = self.getMainWindow()
@@ -650,13 +675,10 @@ class CuraApplication(QtApplication):
self._message_box_callback(button, *self._message_box_callback_arguments)
self._message_box_callback = None
self._message_box_callback_arguments = []
-
- def setSaveDataEnabled(self, enabled: bool) -> None:
- self._save_data_enabled = enabled
# Cura has multiple locations where instance containers need to be saved, so we need to handle this differently.
def saveSettings(self):
- if not self.started or not self._save_data_enabled:
+ if not self.started:
# Do not do saving during application start or when data should not be saved on quit.
return
ContainerRegistry.getInstance().saveDirtyContainers()
@@ -746,6 +768,11 @@ class CuraApplication(QtApplication):
# Initialize Cura API
self._cura_API.initialize()
+ self._output_device_manager.start()
+ self._welcome_pages_model.initialize()
+ self._add_printer_pages_model.initialize()
+ self._whats_new_pages_model.initialize()
+
# Detect in which mode to run and execute that mode
if self._is_headless:
self.runWithoutGUI()
@@ -840,10 +867,38 @@ class CuraApplication(QtApplication):
# Hide the splash screen
self.closeSplash()
+ @pyqtSlot(result = QObject)
+ def getDiscoveredPrintersModel(self, *args) -> "DiscoveredPrintersModel":
+ return self._discovered_printer_model
+
+ @pyqtSlot(result = QObject)
+ def getFirstStartMachineActionsModel(self, *args) -> "FirstStartMachineActionsModel":
+ return self._first_start_machine_actions_model
+
@pyqtSlot(result = QObject)
def getSettingVisibilityPresetsModel(self, *args) -> SettingVisibilityPresetsModel:
return self._setting_visibility_presets_model
+ @pyqtSlot(result = QObject)
+ def getWelcomePagesModel(self, *args) -> "WelcomePagesModel":
+ return self._welcome_pages_model
+
+ @pyqtSlot(result = QObject)
+ def getAddPrinterPagesModel(self, *args) -> "AddPrinterPagesModel":
+ return self._add_printer_pages_model
+
+ @pyqtSlot(result = QObject)
+ def getWhatsNewPagesModel(self, *args) -> "WhatsNewPagesModel":
+ return self._whats_new_pages_model
+
+ @pyqtSlot(result = QObject)
+ def getMachineSettingsManager(self, *args) -> "MachineSettingsManager":
+ return self._machine_settings_manager
+
+ @pyqtSlot(result = QObject)
+ def getTextManager(self, *args) -> "TextManager":
+ return self._text_manager
+
def getCuraFormulaFunctions(self, *args) -> "CuraFormulaFunctions":
if self._cura_formula_functions is None:
self._cura_formula_functions = CuraFormulaFunctions(self)
@@ -976,6 +1031,13 @@ class CuraApplication(QtApplication):
qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 0, "SimpleModeSettingsManager", self.getSimpleModeSettingsManager)
qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager)
+ qmlRegisterType(NetworkingUtil, "Cura", 1, 5, "NetworkingUtil")
+
+ qmlRegisterType(WelcomePagesModel, "Cura", 1, 0, "WelcomePagesModel")
+ qmlRegisterType(WhatsNewPagesModel, "Cura", 1, 0, "WhatsNewPagesModel")
+ qmlRegisterType(AddPrinterPagesModel, "Cura", 1, 0, "AddPrinterPagesModel")
+ qmlRegisterType(TextManager, "Cura", 1, 0, "TextManager")
+
qmlRegisterType(NetworkMJPGImage, "Cura", 1, 0, "NetworkMJPGImage")
qmlRegisterType(ObjectsModel, "Cura", 1, 0, "ObjectsModel")
@@ -989,7 +1051,8 @@ class CuraApplication(QtApplication):
qmlRegisterType(GenericMaterialsModel, "Cura", 1, 0, "GenericMaterialsModel")
qmlRegisterType(MaterialBrandsModel, "Cura", 1, 0, "MaterialBrandsModel")
qmlRegisterType(QualityManagementModel, "Cura", 1, 0, "QualityManagementModel")
- qmlRegisterType(MachineManagementModel, "Cura", 1, 0, "MachineManagementModel")
+
+ qmlRegisterType(DiscoveredPrintersModel, "Cura", 1, 0, "DiscoveredPrintersModel")
qmlRegisterSingletonType(QualityProfilesDropDownMenuModel, "Cura", 1, 0,
"QualityProfilesDropDownMenuModel", self.getQualityProfilesDropDownMenuModel)
@@ -1000,6 +1063,7 @@ class CuraApplication(QtApplication):
qmlRegisterType(MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler")
qmlRegisterType(SettingVisibilityPresetsModel, "Cura", 1, 0, "SettingVisibilityPresetsModel")
qmlRegisterType(QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel")
+ qmlRegisterType(FirstStartMachineActionsModel, "Cura", 1, 0, "FirstStartMachineActionsModel")
qmlRegisterType(MachineNameValidator, "Cura", 1, 0, "MachineNameValidator")
qmlRegisterType(UserChangesModel, "Cura", 1, 0, "UserChangesModel")
qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.getInstance)
@@ -1056,7 +1120,6 @@ class CuraApplication(QtApplication):
self._camera_animation.setTarget(Selection.getSelectedObject(0).getWorldPosition())
self._camera_animation.start()
- requestAddPrinter = pyqtSignal()
activityChanged = pyqtSignal()
sceneBoundingBoxChanged = pyqtSignal()
@@ -1716,3 +1779,32 @@ class CuraApplication(QtApplication):
def getSidebarCustomMenuItems(self) -> list:
return self._sidebar_custom_menu_items
+ @pyqtSlot(result = bool)
+ def shouldShowWelcomeDialog(self) -> bool:
+ # Only show the complete flow if there is no printer yet.
+ return self._machine_manager.activeMachine is None
+
+ @pyqtSlot(result = bool)
+ def shouldShowWhatsNewDialog(self) -> bool:
+ has_active_machine = self._machine_manager.activeMachine is not None
+ has_app_just_upgraded = self.hasJustUpdatedFromOldVersion()
+
+ # Only show the what's new dialog if there's no machine and we have just upgraded
+ show_whatsnew_only = has_active_machine and has_app_just_upgraded
+ return show_whatsnew_only
+
+ @pyqtSlot(result = int)
+ def appWidth(self) -> int:
+ main_window = QtApplication.getInstance().getMainWindow()
+ if main_window:
+ return main_window.width()
+ else:
+ return 0
+
+ @pyqtSlot(result = int)
+ def appHeight(self) -> int:
+ main_window = QtApplication.getInstance().getMainWindow()
+ if main_window:
+ return main_window.height()
+ else:
+ return 0
diff --git a/cura/CuraView.py b/cura/CuraView.py
index 978c651b43..45cd7ba61b 100644
--- a/cura/CuraView.py
+++ b/cura/CuraView.py
@@ -3,8 +3,11 @@
from PyQt5.QtCore import pyqtProperty, QUrl
+from UM.Resources import Resources
from UM.View.View import View
+from cura.CuraApplication import CuraApplication
+
# Since Cura has a few pre-defined "space claims" for the locations of certain components, we've provided some structure
# to indicate this.
@@ -12,13 +15,20 @@ from UM.View.View import View
# the stageMenuComponent returns an item that should be used somehwere in the stage menu. It's up to the active stage
# to actually do something with this.
class CuraView(View):
- def __init__(self, parent = None) -> None:
+ def __init__(self, parent = None, use_empty_menu_placeholder: bool = False) -> None:
super().__init__(parent)
+ self._empty_menu_placeholder_url = QUrl(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles,
+ "EmptyViewMenuComponent.qml"))
+ self._use_empty_menu_placeholder = use_empty_menu_placeholder
+
@pyqtProperty(QUrl, constant = True)
def mainComponent(self) -> QUrl:
return self.getDisplayComponent("main")
@pyqtProperty(QUrl, constant = True)
def stageMenuComponent(self) -> QUrl:
- return self.getDisplayComponent("menu")
\ No newline at end of file
+ url = self.getDisplayComponent("menu")
+ if not url.toString() and self._use_empty_menu_placeholder:
+ url = self._empty_menu_placeholder_url
+ return url
diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py
index 072d5f94f5..ddf1450664 100644
--- a/cura/LayerPolygon.py
+++ b/cura/LayerPolygon.py
@@ -20,7 +20,7 @@ class LayerPolygon:
MoveCombingType = 8
MoveRetractionType = 9
SupportInterfaceType = 10
- PrimeTower = 11
+ PrimeTowerType = 11
__number_of_types = 12
__jump_map = numpy.logical_or(numpy.logical_or(numpy.arange(__number_of_types) == NoneType, numpy.arange(__number_of_types) == MoveCombingType), numpy.arange(__number_of_types) == MoveRetractionType)
@@ -245,7 +245,7 @@ class LayerPolygon:
theme.getColor("layerview_move_combing").getRgbF(), # MoveCombingType
theme.getColor("layerview_move_retraction").getRgbF(), # MoveRetractionType
theme.getColor("layerview_support_interface").getRgbF(), # SupportInterfaceType
- theme.getColor("layerview_prime_tower").getRgbF()
+ theme.getColor("layerview_prime_tower").getRgbF() # PrimeTowerType
])
return cls.__color_map
diff --git a/cura/MachineAction.py b/cura/MachineAction.py
index 94b096f9c1..0f05401c89 100644
--- a/cura/MachineAction.py
+++ b/cura/MachineAction.py
@@ -2,8 +2,9 @@
# Cura is released under the terms of the LGPLv3 or higher.
import os
+from typing import Optional
-from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal
+from PyQt5.QtCore import QObject, QUrl, pyqtSlot, pyqtProperty, pyqtSignal
from UM.Logger import Logger
from UM.PluginObject import PluginObject
@@ -33,6 +34,12 @@ class MachineAction(QObject, PluginObject):
def getKey(self) -> str:
return self._key
+ ## Whether this action needs to ask the user anything.
+ # If not, we shouldn't present the user with certain screens which otherwise show up.
+ # Defaults to true to be in line with the old behaviour.
+ def needsUserInteraction(self) -> bool:
+ return True
+
@pyqtProperty(str, notify = labelChanged)
def label(self) -> str:
return self._label
@@ -66,18 +73,26 @@ class MachineAction(QObject, PluginObject):
return self._finished
## Protected helper to create a view object based on provided QML.
- def _createViewFromQML(self) -> None:
+ def _createViewFromQML(self) -> Optional["QObject"]:
plugin_path = PluginRegistry.getInstance().getPluginPath(self.getPluginId())
if plugin_path is None:
Logger.log("e", "Cannot create QML view: cannot find plugin path for plugin [%s]", self.getPluginId())
- return
+ return None
path = os.path.join(plugin_path, self._qml_url)
from cura.CuraApplication import CuraApplication
- self._view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self})
+ view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self})
+ return view
- @pyqtProperty(QObject, constant = True)
- def displayItem(self):
- if not self._view:
- self._createViewFromQML()
- return self._view
+ @pyqtProperty(QUrl, constant = True)
+ def qmlPath(self) -> "QUrl":
+ plugin_path = PluginRegistry.getInstance().getPluginPath(self.getPluginId())
+ if plugin_path is None:
+ Logger.log("e", "Cannot create QML view: cannot find plugin path for plugin [%s]", self.getPluginId())
+ return QUrl("")
+ path = os.path.join(plugin_path, self._qml_url)
+ return QUrl.fromLocalFile(path)
+
+ @pyqtSlot(result = QObject)
+ def getDisplayItem(self) -> Optional["QObject"]:
+ return self._createViewFromQML()
diff --git a/cura/Machines/MaterialManager.py b/cura/Machines/MaterialManager.py
index 68e894642d..2163cde623 100644
--- a/cura/Machines/MaterialManager.py
+++ b/cura/Machines/MaterialManager.py
@@ -103,6 +103,8 @@ class MaterialManager(QObject):
continue
root_material_id = material_metadata.get("base_file", "")
+ if root_material_id not in material_metadatas: #Not a registered material profile. Don't store this in the look-up tables.
+ continue
if root_material_id not in self._material_group_map:
self._material_group_map[root_material_id] = MaterialGroup(root_material_id, MaterialNode(material_metadatas[root_material_id]))
self._material_group_map[root_material_id].is_read_only = self._container_registry.isReadOnly(root_material_id)
@@ -219,7 +221,7 @@ class MaterialManager(QObject):
root_material_id = material_metadata["base_file"]
definition = material_metadata["definition"]
- approximate_diameter = material_metadata["approximate_diameter"]
+ approximate_diameter = str(material_metadata["approximate_diameter"])
if approximate_diameter not in self._diameter_machine_nozzle_buildplate_material_map:
self._diameter_machine_nozzle_buildplate_material_map[approximate_diameter] = {}
@@ -332,7 +334,6 @@ class MaterialManager(QObject):
buildplate_node = nozzle_node.getChildNode(buildplate_name)
nodes_to_check = [buildplate_node, nozzle_node, machine_node, default_machine_node]
-
# Fallback mechanism of finding materials:
# 1. buildplate-specific material
# 2. nozzle-specific material
@@ -537,16 +538,40 @@ class MaterialManager(QObject):
return
nodes_to_remove = [material_group.root_material_node] + material_group.derived_material_node_list
+ # Sort all nodes with respect to the container ID lengths in the ascending order so the base material container
+ # will be the first one to be removed. We need to do this to ensure that all containers get loaded & deleted.
+ nodes_to_remove = sorted(nodes_to_remove, key = lambda x: len(x.getMetaDataEntry("id", "")))
+ # Try to load all containers first. If there is any faulty ones, they will be put into the faulty container
+ # list, so removeContainer() can ignore those ones.
+ for node in nodes_to_remove:
+ container_id = node.getMetaDataEntry("id", "")
+ results = self._container_registry.findContainers(id = container_id)
+ if not results:
+ self._container_registry.addWrongContainerId(container_id)
for node in nodes_to_remove:
self._container_registry.removeContainer(node.getMetaDataEntry("id", ""))
#
# Methods for GUI
#
+ @pyqtSlot("QVariant", result=bool)
+ def canMaterialBeRemoved(self, material_node: "MaterialNode"):
+ # Check if the material is active in any extruder train. In that case, the material shouldn't be removed!
+ # In the future we might enable this again, but right now, it's causing a ton of issues if we do (since it
+ # corrupts the configuration)
+ root_material_id = material_node.getMetaDataEntry("base_file")
+ material_group = self.getMaterialGroup(root_material_id)
+ if not material_group:
+ return False
+
+ nodes_to_remove = [material_group.root_material_node] + material_group.derived_material_node_list
+ ids_to_remove = [node.getMetaDataEntry("id", "") for node in nodes_to_remove]
+
+ for extruder_stack in self._container_registry.findContainerStacks(type="extruder_train"):
+ if extruder_stack.material.getId() in ids_to_remove:
+ return False
+ return True
- #
- # Sets the new name for the given material.
- #
@pyqtSlot("QVariant", str)
def setMaterialName(self, material_node: "MaterialNode", name: str) -> None:
root_material_id = material_node.getMetaDataEntry("base_file")
diff --git a/cura/Machines/Models/DiscoveredPrintersModel.py b/cura/Machines/Models/DiscoveredPrintersModel.py
new file mode 100644
index 0000000000..a2a1fac3f7
--- /dev/null
+++ b/cura/Machines/Models/DiscoveredPrintersModel.py
@@ -0,0 +1,250 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from typing import Callable, Dict, List, Optional, TYPE_CHECKING
+
+from PyQt5.QtCore import pyqtSlot, pyqtProperty, pyqtSignal, QObject, QTimer
+
+from UM.i18n import i18nCatalog
+from UM.Logger import Logger
+from UM.Util import parseBool
+from UM.OutputDevice.OutputDeviceManager import ManualDeviceAdditionAttempt
+
+if TYPE_CHECKING:
+ from PyQt5.QtCore import QObject
+ from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin
+ from cura.CuraApplication import CuraApplication
+ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice
+
+
+catalog = i18nCatalog("cura")
+
+
+class DiscoveredPrinter(QObject):
+
+ def __init__(self, ip_address: str, key: str, name: str, create_callback: Callable[[str], None], machine_type: str,
+ device: "NetworkedPrinterOutputDevice", parent: Optional["QObject"] = None) -> None:
+ super().__init__(parent)
+
+ self._ip_address = ip_address
+ self._key = key
+ self._name = name
+ self.create_callback = create_callback
+ self._machine_type = machine_type
+ self._device = device
+
+ nameChanged = pyqtSignal()
+
+ def getKey(self) -> str:
+ return self._key
+
+ @pyqtProperty(str, notify = nameChanged)
+ def name(self) -> str:
+ return self._name
+
+ def setName(self, name: str) -> None:
+ if self._name != name:
+ self._name = name
+ self.nameChanged.emit()
+
+ @pyqtProperty(str, constant = True)
+ def address(self) -> str:
+ return self._ip_address
+
+ machineTypeChanged = pyqtSignal()
+
+ @pyqtProperty(str, notify = machineTypeChanged)
+ def machineType(self) -> str:
+ return self._machine_type
+
+ def setMachineType(self, machine_type: str) -> None:
+ if self._machine_type != machine_type:
+ self._machine_type = machine_type
+ self.machineTypeChanged.emit()
+
+ # Human readable machine type string
+ @pyqtProperty(str, notify = machineTypeChanged)
+ def readableMachineType(self) -> str:
+ from cura.CuraApplication import CuraApplication
+ machine_manager = CuraApplication.getInstance().getMachineManager()
+ # In ClusterUM3OutputDevice, when it updates a printer information, it updates the machine type using the field
+ # "machine_variant", and for some reason, it's not the machine type ID/codename/... but a human-readable string
+ # like "Ultimaker 3". The code below handles this case.
+ if machine_manager.hasHumanReadableMachineTypeName(self._machine_type):
+ readable_type = self._machine_type
+ else:
+ readable_type = machine_manager.getMachineTypeNameFromId(self._machine_type)
+ if not readable_type:
+ readable_type = catalog.i18nc("@label", "Unknown")
+ return readable_type
+
+ @pyqtProperty(bool, notify = machineTypeChanged)
+ def isUnknownMachineType(self) -> bool:
+ from cura.CuraApplication import CuraApplication
+ machine_manager = CuraApplication.getInstance().getMachineManager()
+ if machine_manager.hasHumanReadableMachineTypeName(self._machine_type):
+ readable_type = self._machine_type
+ else:
+ readable_type = machine_manager.getMachineTypeNameFromId(self._machine_type)
+ return not readable_type
+
+ @pyqtProperty(QObject, constant = True)
+ def device(self) -> "NetworkedPrinterOutputDevice":
+ return self._device
+
+ @pyqtProperty(bool, constant = True)
+ def isHostOfGroup(self) -> bool:
+ return getattr(self._device, "clusterSize", 1) > 0
+
+ @pyqtProperty(str, constant = True)
+ def sectionName(self) -> str:
+ if self.isUnknownMachineType or not self.isHostOfGroup:
+ return catalog.i18nc("@label", "The printer(s) below cannot be connected because they are part of a group")
+ else:
+ return catalog.i18nc("@label", "Available networked printers")
+
+
+#
+# Discovered printers are all the printers that were found on the network, which provide a more convenient way
+# to add networked printers (Plugin finds a bunch of printers, user can select one from the list, plugin can then
+# add that printer to Cura as the active one).
+#
+class DiscoveredPrintersModel(QObject):
+
+ def __init__(self, application: "CuraApplication", parent: Optional["QObject"] = None) -> None:
+ super().__init__(parent)
+
+ self._application = application
+ self._discovered_printer_by_ip_dict = dict() # type: Dict[str, DiscoveredPrinter]
+
+ self._plugin_for_manual_device = None # type: Optional[OutputDevicePlugin]
+ self._manual_device_address = ""
+
+ self._manual_device_request_timeout_in_seconds = 5 # timeout for adding a manual device in seconds
+ self._manual_device_request_timer = QTimer()
+ self._manual_device_request_timer.setInterval(self._manual_device_request_timeout_in_seconds * 1000)
+ self._manual_device_request_timer.setSingleShot(True)
+ self._manual_device_request_timer.timeout.connect(self._onManualRequestTimeout)
+
+ discoveredPrintersChanged = pyqtSignal()
+
+ @pyqtSlot(str)
+ def checkManualDevice(self, address: str) -> None:
+ if self.hasManualDeviceRequestInProgress:
+ Logger.log("i", "A manual device request for address [%s] is still in progress, do nothing",
+ self._manual_device_address)
+ return
+
+ priority_order = [
+ ManualDeviceAdditionAttempt.PRIORITY,
+ ManualDeviceAdditionAttempt.POSSIBLE,
+ ] # type: List[ManualDeviceAdditionAttempt]
+
+ all_plugins_dict = self._application.getOutputDeviceManager().getAllOutputDevicePlugins()
+
+ can_add_manual_plugins = [item for item in filter(
+ lambda plugin_item: plugin_item.canAddManualDevice(address) in priority_order,
+ all_plugins_dict.values())]
+
+ if not can_add_manual_plugins:
+ Logger.log("d", "Could not find a plugin to accept adding %s manually via address.", address)
+ return
+
+ plugin = max(can_add_manual_plugins, key = lambda p: priority_order.index(p.canAddManualDevice(address)))
+ self._plugin_for_manual_device = plugin
+ self._plugin_for_manual_device.addManualDevice(address, callback = self._onManualDeviceRequestFinished)
+ self._manual_device_address = address
+ self._manual_device_request_timer.start()
+ self.hasManualDeviceRequestInProgressChanged.emit()
+
+ @pyqtSlot()
+ def cancelCurrentManualDeviceRequest(self) -> None:
+ self._manual_device_request_timer.stop()
+
+ if self._manual_device_address:
+ if self._plugin_for_manual_device is not None:
+ self._plugin_for_manual_device.removeManualDevice(self._manual_device_address, address = self._manual_device_address)
+ self._manual_device_address = ""
+ self._plugin_for_manual_device = None
+ self.hasManualDeviceRequestInProgressChanged.emit()
+ self.manualDeviceRequestFinished.emit(False)
+
+ def _onManualRequestTimeout(self) -> None:
+ Logger.log("w", "Manual printer [%s] request timed out. Cancel the current request.", self._manual_device_address)
+ self.cancelCurrentManualDeviceRequest()
+
+ hasManualDeviceRequestInProgressChanged = pyqtSignal()
+
+ @pyqtProperty(bool, notify = hasManualDeviceRequestInProgressChanged)
+ def hasManualDeviceRequestInProgress(self) -> bool:
+ return self._manual_device_address != ""
+
+ manualDeviceRequestFinished = pyqtSignal(bool, arguments = ["success"])
+
+ def _onManualDeviceRequestFinished(self, success: bool, address: str) -> None:
+ self._manual_device_request_timer.stop()
+ if address == self._manual_device_address:
+ self._manual_device_address = ""
+ self.hasManualDeviceRequestInProgressChanged.emit()
+ self.manualDeviceRequestFinished.emit(success)
+
+ @pyqtProperty("QVariantMap", notify = discoveredPrintersChanged)
+ def discoveredPrintersByAddress(self) -> Dict[str, DiscoveredPrinter]:
+ return self._discovered_printer_by_ip_dict
+
+ @pyqtProperty("QVariantList", notify = discoveredPrintersChanged)
+ def discoveredPrinters(self) -> List["DiscoveredPrinter"]:
+ item_list = list(
+ x for x in self._discovered_printer_by_ip_dict.values() if not parseBool(x.device.getProperty("temporary")))
+
+ # Split the printers into 2 lists and sort them ascending based on names.
+ available_list = []
+ not_available_list = []
+ for item in item_list:
+ if item.isUnknownMachineType or getattr(item.device, "clusterSize", 1) < 1:
+ not_available_list.append(item)
+ else:
+ available_list.append(item)
+
+ available_list.sort(key = lambda x: x.device.name)
+ not_available_list.sort(key = lambda x: x.device.name)
+
+ return available_list + not_available_list
+
+ def addDiscoveredPrinter(self, ip_address: str, key: str, name: str, create_callback: Callable[[str], None],
+ machine_type: str, device: "NetworkedPrinterOutputDevice") -> None:
+ if ip_address in self._discovered_printer_by_ip_dict:
+ Logger.log("e", "Printer with ip [%s] has already been added", ip_address)
+ return
+
+ discovered_printer = DiscoveredPrinter(ip_address, key, name, create_callback, machine_type, device, parent = self)
+ self._discovered_printer_by_ip_dict[ip_address] = discovered_printer
+ self.discoveredPrintersChanged.emit()
+
+ def updateDiscoveredPrinter(self, ip_address: str,
+ name: Optional[str] = None,
+ machine_type: Optional[str] = None) -> None:
+ if ip_address not in self._discovered_printer_by_ip_dict:
+ Logger.log("w", "Printer with ip [%s] is not known", ip_address)
+ return
+
+ item = self._discovered_printer_by_ip_dict[ip_address]
+
+ if name is not None:
+ item.setName(name)
+ if machine_type is not None:
+ item.setMachineType(machine_type)
+
+ def removeDiscoveredPrinter(self, ip_address: str) -> None:
+ if ip_address not in self._discovered_printer_by_ip_dict:
+ Logger.log("w", "Key [%s] does not exist in the discovered printers list.", ip_address)
+ return
+
+ del self._discovered_printer_by_ip_dict[ip_address]
+ self.discoveredPrintersChanged.emit()
+
+ # A convenience function for QML to create a machine (GlobalStack) out of the given discovered printer.
+ # This function invokes the given discovered printer's "create_callback" to do this.
+ @pyqtSlot("QVariant")
+ def createMachineFromDiscoveredPrinter(self, discovered_printer: "DiscoveredPrinter") -> None:
+ discovered_printer.create_callback(discovered_printer.getKey())
diff --git a/cura/Settings/ExtrudersModel.py b/cura/Machines/Models/ExtrudersModel.py
similarity index 97%
rename from cura/Settings/ExtrudersModel.py
rename to cura/Machines/Models/ExtrudersModel.py
index 93cc1ce402..9eee7f5f9e 100644
--- a/cura/Settings/ExtrudersModel.py
+++ b/cura/Machines/Models/ExtrudersModel.py
@@ -2,23 +2,25 @@
# Cura is released under the terms of the LGPLv3 or higher.
from PyQt5.QtCore import Qt, pyqtSignal, pyqtProperty, QTimer
-from typing import Iterable
+from typing import Iterable, TYPE_CHECKING
from UM.i18n import i18nCatalog
-import UM.Qt.ListModel
+from UM.Qt.ListModel import ListModel
from UM.Application import Application
import UM.FlameProfiler
-from cura.Settings.ExtruderStack import ExtruderStack # To listen to changes on the extruders.
+if TYPE_CHECKING:
+ from cura.Settings.ExtruderStack import ExtruderStack # To listen to changes on the extruders.
catalog = i18nCatalog("cura")
+
## Model that holds extruders.
#
# This model is designed for use by any list of extruders, but specifically
# intended for drop-down lists of the current machine's extruders in place of
# settings.
-class ExtrudersModel(UM.Qt.ListModel.ListModel):
+class ExtrudersModel(ListModel):
# The ID of the container stack for the extruder.
IdRole = Qt.UserRole + 1
diff --git a/cura/Machines/Models/FirstStartMachineActionsModel.py b/cura/Machines/Models/FirstStartMachineActionsModel.py
new file mode 100644
index 0000000000..ce0e9bf856
--- /dev/null
+++ b/cura/Machines/Models/FirstStartMachineActionsModel.py
@@ -0,0 +1,112 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from typing import Optional, Dict, Any, TYPE_CHECKING
+
+from PyQt5.QtCore import QObject, Qt, pyqtProperty, pyqtSignal, pyqtSlot
+
+from UM.Qt.ListModel import ListModel
+
+if TYPE_CHECKING:
+ from cura.CuraApplication import CuraApplication
+
+
+#
+# This model holds all first-start machine actions for the currently active machine. It has 2 roles:
+# - title : the title/name of the action
+# - content : the QObject of the QML content of the action
+# - action : the MachineAction object itself
+#
+class FirstStartMachineActionsModel(ListModel):
+
+ TitleRole = Qt.UserRole + 1
+ ContentRole = Qt.UserRole + 2
+ ActionRole = Qt.UserRole + 3
+
+ def __init__(self, application: "CuraApplication", parent: Optional[QObject] = None) -> None:
+ super().__init__(parent)
+
+ self.addRoleName(self.TitleRole, "title")
+ self.addRoleName(self.ContentRole, "content")
+ self.addRoleName(self.ActionRole, "action")
+
+ self._current_action_index = 0
+
+ self._application = application
+ self._application.initializationFinished.connect(self._initialize)
+
+ self._previous_global_stack = None
+
+ def _initialize(self) -> None:
+ self._application.getMachineManager().globalContainerChanged.connect(self._update)
+ self._update()
+
+ currentActionIndexChanged = pyqtSignal()
+ allFinished = pyqtSignal() # Emitted when all actions have been finished.
+
+ @pyqtProperty(int, notify = currentActionIndexChanged)
+ def currentActionIndex(self) -> int:
+ return self._current_action_index
+
+ @pyqtProperty("QVariantMap", notify = currentActionIndexChanged)
+ def currentItem(self) -> Optional[Dict[str, Any]]:
+ if self._current_action_index >= self.count:
+ return dict()
+ else:
+ return self.getItem(self._current_action_index)
+
+ @pyqtProperty(bool, notify = currentActionIndexChanged)
+ def hasMoreActions(self) -> bool:
+ return self._current_action_index < self.count - 1
+
+ @pyqtSlot()
+ def goToNextAction(self) -> None:
+ # finish the current item
+ if "action" in self.currentItem:
+ self.currentItem["action"].setFinished()
+
+ if not self.hasMoreActions:
+ self.allFinished.emit()
+ self.reset()
+ return
+
+ self._current_action_index += 1
+ self.currentActionIndexChanged.emit()
+
+ # Resets the current action index to 0 so the wizard panel can show actions from the beginning.
+ @pyqtSlot()
+ def reset(self) -> None:
+ self._current_action_index = 0
+ self.currentActionIndexChanged.emit()
+
+ if self.count == 0:
+ self.allFinished.emit()
+
+ def _update(self) -> None:
+ global_stack = self._application.getMachineManager().activeMachine
+ if global_stack is None:
+ self.setItems([])
+ return
+
+ # Do not update if the machine has not been switched. This can cause the SettingProviders on the Machine
+ # Setting page to do a force update, but they can use potential outdated cached values.
+ if self._previous_global_stack is not None and global_stack.getId() == self._previous_global_stack.getId():
+ return
+ self._previous_global_stack = global_stack
+
+ definition_id = global_stack.definition.getId()
+ first_start_actions = self._application.getMachineActionManager().getFirstStartActions(definition_id)
+
+ item_list = []
+ for item in first_start_actions:
+ item_list.append({"title": item.label,
+ "content": item.getDisplayItem(),
+ "action": item,
+ })
+ item.reset()
+
+ self.setItems(item_list)
+ self.reset()
+
+
+__all__ = ["FirstStartMachineActionsModel"]
diff --git a/cura/Machines/Models/GenericMaterialsModel.py b/cura/Machines/Models/GenericMaterialsModel.py
index 8f41dd6a70..e81a73de24 100644
--- a/cura/Machines/Models/GenericMaterialsModel.py
+++ b/cura/Machines/Models/GenericMaterialsModel.py
@@ -1,7 +1,6 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-from UM.Logger import Logger
from cura.Machines.Models.BaseMaterialsModel import BaseMaterialsModel
class GenericMaterialsModel(BaseMaterialsModel):
diff --git a/cura/GlobalStacksModel.py b/cura/Machines/Models/GlobalStacksModel.py
similarity index 68%
rename from cura/GlobalStacksModel.py
rename to cura/Machines/Models/GlobalStacksModel.py
index 3c3321e5ca..9db4ffe6db 100644
--- a/cura/GlobalStacksModel.py
+++ b/cura/Machines/Models/GlobalStacksModel.py
@@ -1,14 +1,14 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
+from PyQt5.QtCore import Qt, QTimer
from UM.Qt.ListModel import ListModel
+from UM.i18n import i18nCatalog
+from UM.Util import parseBool
-from PyQt5.QtCore import pyqtProperty, Qt, QTimer
-
-from cura.PrinterOutputDevice import ConnectionType
+from cura.PrinterOutput.PrinterOutputDevice import ConnectionType
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
-
from cura.Settings.GlobalStack import GlobalStack
@@ -18,14 +18,18 @@ class GlobalStacksModel(ListModel):
HasRemoteConnectionRole = Qt.UserRole + 3
ConnectionTypeRole = Qt.UserRole + 4
MetaDataRole = Qt.UserRole + 5
+ DiscoverySourceRole = Qt.UserRole + 6 # For separating local and remote printers in the machine management page
- def __init__(self, parent = None):
+ def __init__(self, parent = None) -> None:
super().__init__(parent)
+
+ self._catalog = i18nCatalog("cura")
+
self.addRoleName(self.NameRole, "name")
self.addRoleName(self.IdRole, "id")
self.addRoleName(self.HasRemoteConnectionRole, "hasRemoteConnection")
self.addRoleName(self.MetaDataRole, "metadata")
- self._container_stacks = []
+ self.addRoleName(self.DiscoverySourceRole, "discoverySource")
self._change_timer = QTimer()
self._change_timer.setInterval(200)
@@ -36,35 +40,38 @@ class GlobalStacksModel(ListModel):
CuraContainerRegistry.getInstance().containerAdded.connect(self._onContainerChanged)
CuraContainerRegistry.getInstance().containerMetaDataChanged.connect(self._onContainerChanged)
CuraContainerRegistry.getInstance().containerRemoved.connect(self._onContainerChanged)
- self._filter_dict = {}
self._updateDelayed()
## Handler for container added/removed events from registry
- def _onContainerChanged(self, container):
+ def _onContainerChanged(self, container) -> None:
# We only need to update when the added / removed container GlobalStack
if isinstance(container, GlobalStack):
self._updateDelayed()
- def _updateDelayed(self):
+ def _updateDelayed(self) -> None:
self._change_timer.start()
def _update(self) -> None:
items = []
container_stacks = CuraContainerRegistry.getInstance().findContainerStacks(type = "machine")
-
for container_stack in container_stacks:
has_remote_connection = False
for connection_type in container_stack.configuredConnectionTypes:
- has_remote_connection |= connection_type in [ConnectionType.NetworkConnection.value, ConnectionType.CloudConnection.value]
+ has_remote_connection |= connection_type in [ConnectionType.NetworkConnection.value,
+ ConnectionType.CloudConnection.value]
- if container_stack.getMetaDataEntry("hidden", False) in ["True", True]:
+ if parseBool(container_stack.getMetaDataEntry("hidden", False)):
continue
+ section_name = "Network enabled printers" if has_remote_connection else "Local printers"
+ section_name = self._catalog.i18nc("@info:title", section_name)
+
items.append({"name": container_stack.getMetaDataEntry("group_name", container_stack.getName()),
"id": container_stack.getId(),
"hasRemoteConnection": has_remote_connection,
- "metadata": container_stack.getMetaData().copy()})
- items.sort(key=lambda i: not i["hasRemoteConnection"])
+ "metadata": container_stack.getMetaData().copy(),
+ "discoverySource": section_name})
+ items.sort(key = lambda i: (not i["hasRemoteConnection"], i["name"]))
self.setItems(items)
diff --git a/cura/Machines/Models/MachineManagementModel.py b/cura/Machines/Models/MachineManagementModel.py
deleted file mode 100644
index 3297b8a467..0000000000
--- a/cura/Machines/Models/MachineManagementModel.py
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-from UM.Qt.ListModel import ListModel
-
-from PyQt5.QtCore import Qt
-
-from UM.Settings.ContainerRegistry import ContainerRegistry
-from UM.Settings.ContainerStack import ContainerStack
-
-from UM.i18n import i18nCatalog
-catalog = i18nCatalog("cura")
-
-
-#
-# This the QML model for the quality management page.
-#
-class MachineManagementModel(ListModel):
- NameRole = Qt.UserRole + 1
- IdRole = Qt.UserRole + 2
- MetaDataRole = Qt.UserRole + 3
- GroupRole = Qt.UserRole + 4
-
- def __init__(self, parent = None):
- super().__init__(parent)
- self.addRoleName(self.NameRole, "name")
- self.addRoleName(self.IdRole, "id")
- self.addRoleName(self.MetaDataRole, "metadata")
- self.addRoleName(self.GroupRole, "group")
- self._local_container_stacks = []
- self._network_container_stacks = []
-
- # Listen to changes
- ContainerRegistry.getInstance().containerAdded.connect(self._onContainerChanged)
- ContainerRegistry.getInstance().containerMetaDataChanged.connect(self._onContainerChanged)
- ContainerRegistry.getInstance().containerRemoved.connect(self._onContainerChanged)
- self._filter_dict = {}
- self._update()
-
- ## Handler for container added/removed events from registry
- def _onContainerChanged(self, container):
- # We only need to update when the added / removed container is a stack.
- if isinstance(container, ContainerStack) and container.getMetaDataEntry("type") == "machine":
- self._update()
-
- ## Private convenience function to reset & repopulate the model.
- def _update(self):
- items = []
-
- # Get first the network enabled printers
- network_filter_printers = {"type": "machine",
- "um_network_key": "*",
- "hidden": "False"}
- self._network_container_stacks = ContainerRegistry.getInstance().findContainerStacks(**network_filter_printers)
- self._network_container_stacks.sort(key = lambda i: i.getMetaDataEntry("group_name", ""))
-
- for container in self._network_container_stacks:
- metadata = container.getMetaData().copy()
- if container.getBottom():
- metadata["definition_name"] = container.getBottom().getName()
-
- items.append({"name": metadata.get("group_name", ""),
- "id": container.getId(),
- "metadata": metadata,
- "group": catalog.i18nc("@info:title", "Network enabled printers")})
-
- # Get now the local printers
- local_filter_printers = {"type": "machine", "um_network_key": None}
- self._local_container_stacks = ContainerRegistry.getInstance().findContainerStacks(**local_filter_printers)
- self._local_container_stacks.sort(key = lambda i: i.getName())
-
- for container in self._local_container_stacks:
- metadata = container.getMetaData().copy()
- if container.getBottom():
- metadata["definition_name"] = container.getBottom().getName()
-
- items.append({"name": container.getName(),
- "id": container.getId(),
- "metadata": metadata,
- "group": catalog.i18nc("@info:title", "Local printers")})
-
- self.setItems(items)
diff --git a/cura/Machines/Models/MaterialBrandsModel.py b/cura/Machines/Models/MaterialBrandsModel.py
index ac82cf6670..c4721db5f7 100644
--- a/cura/Machines/Models/MaterialBrandsModel.py
+++ b/cura/Machines/Models/MaterialBrandsModel.py
@@ -1,9 +1,8 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-from PyQt5.QtCore import Qt, pyqtSignal, pyqtProperty
+from PyQt5.QtCore import Qt, pyqtSignal
from UM.Qt.ListModel import ListModel
-from UM.Logger import Logger
from cura.Machines.Models.BaseMaterialsModel import BaseMaterialsModel
class MaterialTypesModel(ListModel):
diff --git a/cura/Settings/UserChangesModel.py b/cura/Machines/Models/UserChangesModel.py
similarity index 99%
rename from cura/Settings/UserChangesModel.py
rename to cura/Machines/Models/UserChangesModel.py
index 9a26e5607e..e629295397 100644
--- a/cura/Settings/UserChangesModel.py
+++ b/cura/Machines/Models/UserChangesModel.py
@@ -10,7 +10,6 @@ from UM.Application import Application
from UM.Settings.ContainerRegistry import ContainerRegistry
from UM.i18n import i18nCatalog
from UM.Settings.SettingFunction import SettingFunction
-
from UM.Qt.ListModel import ListModel
diff --git a/cura/Machines/QualityManager.py b/cura/Machines/QualityManager.py
index 34cc9ce4b2..ef1ff920fe 100644
--- a/cura/Machines/QualityManager.py
+++ b/cura/Machines/QualityManager.py
@@ -209,6 +209,7 @@ class QualityManager(QObject):
# (1) the machine-specific node
# (2) the generic node
machine_node = self._machine_nozzle_buildplate_material_quality_type_to_quality_dict.get(machine_definition_id)
+
# Check if this machine has specific quality profiles for its extruders, if so, when looking up extruder
# qualities, we should not fall back to use the global qualities.
has_extruder_specific_qualities = False
@@ -441,7 +442,8 @@ class QualityManager(QObject):
quality_changes_group = quality_model_item["quality_changes_group"]
if quality_changes_group is None:
# create global quality changes only
- new_quality_changes = self._createQualityChanges(quality_group.quality_type, quality_changes_name,
+ new_name = self._container_registry.uniqueName(quality_changes_name)
+ new_quality_changes = self._createQualityChanges(quality_group.quality_type, new_name,
global_stack, None)
self._container_registry.addContainer(new_quality_changes)
else:
diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py
index f4a29962a4..08309fa30e 100644
--- a/cura/OAuth2/AuthorizationHelpers.py
+++ b/cura/OAuth2/AuthorizationHelpers.py
@@ -50,6 +50,7 @@ class AuthorizationHelpers:
# \param refresh_token:
# \return An AuthenticationResponse object.
def getAccessTokenUsingRefreshToken(self, refresh_token: str) -> "AuthenticationResponse":
+ Logger.log("d", "Refreshing the access token.")
data = {
"client_id": self._settings.CLIENT_ID if self._settings.CLIENT_ID is not None else "",
"redirect_uri": self._settings.CALLBACK_URL if self._settings.CALLBACK_URL is not None else "",
diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py
index a4214ee958..27041b1f80 100644
--- a/cura/OAuth2/AuthorizationService.py
+++ b/cura/OAuth2/AuthorizationService.py
@@ -34,6 +34,8 @@ class AuthorizationService:
# Emit signal when authentication failed.
onAuthenticationError = Signal()
+ accessTokenChanged = Signal()
+
def __init__(self, settings: "OAuth2Settings", preferences: Optional["Preferences"] = None) -> None:
self._settings = settings
self._auth_helpers = AuthorizationHelpers(settings)
@@ -68,6 +70,7 @@ class AuthorizationService:
self._user_profile = self._parseJWT()
except requests.exceptions.ConnectionError:
# Unable to get connection, can't login.
+ Logger.logException("w", "Unable to validate user data with the remote server.")
return None
if not self._user_profile and self._auth_data:
@@ -83,6 +86,7 @@ class AuthorizationService:
def _parseJWT(self) -> Optional["UserProfile"]:
if not self._auth_data or self._auth_data.access_token is None:
# If no auth data exists, we should always log in again.
+ Logger.log("d", "There was no auth data or access token")
return None
user_data = self._auth_helpers.parseJWT(self._auth_data.access_token)
if user_data:
@@ -90,12 +94,16 @@ class AuthorizationService:
return user_data
# The JWT was expired or invalid and we should request a new one.
if self._auth_data.refresh_token is None:
+ Logger.log("w", "There was no refresh token in the auth data.")
return None
self._auth_data = self._auth_helpers.getAccessTokenUsingRefreshToken(self._auth_data.refresh_token)
if not self._auth_data or self._auth_data.access_token is None:
+ Logger.log("w", "Unable to use the refresh token to get a new access token.")
# The token could not be refreshed using the refresh token. We should login again.
return None
-
+ # Ensure it gets stored as otherwise we only have it in memory. The stored refresh token has been deleted
+ # from the server already.
+ self._storeAuthData(self._auth_data)
return self._auth_helpers.parseJWT(self._auth_data.access_token)
## Get the access token as provided by the repsonse data.
@@ -124,7 +132,8 @@ class AuthorizationService:
self._storeAuthData(response)
self.onAuthStateChanged.emit(logged_in = True)
else:
- self.onAuthStateChanged(logged_in = False)
+ Logger.log("w", "Failed to get a new access token from the server.")
+ self.onAuthStateChanged.emit(logged_in = False)
## Delete the authentication data that we have stored locally (eg; logout)
def deleteAuthData(self) -> None:
@@ -194,6 +203,7 @@ class AuthorizationService:
## Store authentication data in preferences.
def _storeAuthData(self, auth_data: Optional[AuthenticationResponse] = None) -> None:
+ Logger.log("d", "Attempting to store the auth data")
if self._preferences is None:
Logger.log("e", "Unable to save authentication data, since no preference has been set!")
return
@@ -206,6 +216,8 @@ class AuthorizationService:
self._user_profile = None
self._preferences.resetPreference(self._settings.AUTH_DATA_PREFERENCE_KEY)
+ self.accessTokenChanged.emit()
+
def _onMessageActionTriggered(self, _, action):
if action == "retry":
self.loadAuthDataFromPreferences()
diff --git a/cura/Operations/PlatformPhysicsOperation.py b/cura/Operations/PlatformPhysicsOperation.py
index 75c5b437bc..9571679c3c 100644
--- a/cura/Operations/PlatformPhysicsOperation.py
+++ b/cura/Operations/PlatformPhysicsOperation.py
@@ -29,4 +29,4 @@ class PlatformPhysicsOperation(Operation):
return group
def __repr__(self):
- return "PlatformPhysicsOperation(translation = {0})".format(self._translation)
+ return "PlatformPhysicsOp.(trans.={0})".format(self._translation)
diff --git a/cura/PrinterOutput/FirmwareUpdater.py b/cura/PrinterOutput/FirmwareUpdater.py
index c6d9513ee0..3f20e0f3c4 100644
--- a/cura/PrinterOutput/FirmwareUpdater.py
+++ b/cura/PrinterOutput/FirmwareUpdater.py
@@ -9,7 +9,7 @@ from typing import Union
MYPY = False
if MYPY:
- from cura.PrinterOutputDevice import PrinterOutputDevice
+ from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice
class FirmwareUpdater(QObject):
firmwareProgressChanged = pyqtSignal()
diff --git a/cura/PrinterOutput/GenericOutputController.py b/cura/PrinterOutput/GenericOutputController.py
index 1cb416787c..e770fc79a1 100644
--- a/cura/PrinterOutput/GenericOutputController.py
+++ b/cura/PrinterOutput/GenericOutputController.py
@@ -3,14 +3,15 @@
from typing import TYPE_CHECKING, Set, Union, Optional
-from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
from PyQt5.QtCore import QTimer
+from .PrinterOutputController import PrinterOutputController
+
if TYPE_CHECKING:
- from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
- from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
- from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice
- from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel
+ from .Models.PrintJobOutputModel import PrintJobOutputModel
+ from .Models.PrinterOutputModel import PrinterOutputModel
+ from .PrinterOutputDevice import PrinterOutputDevice
+ from .Models.ExtruderOutputModel import ExtruderOutputModel
class GenericOutputController(PrinterOutputController):
diff --git a/cura/PrinterOutput/MaterialOutputModel.py b/cura/PrinterOutput/MaterialOutputModel.py
deleted file mode 100644
index 64ebd3c94c..0000000000
--- a/cura/PrinterOutput/MaterialOutputModel.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright (c) 2017 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot
-
-
-class MaterialOutputModel(QObject):
- def __init__(self, guid, type, color, brand, name, parent = None):
- super().__init__(parent)
- self._guid = guid
- self._type = type
- self._color = color
- self._brand = brand
- self._name = name
-
- @pyqtProperty(str, constant = True)
- def guid(self):
- return self._guid
-
- @pyqtProperty(str, constant=True)
- def type(self):
- return self._type
-
- @pyqtProperty(str, constant=True)
- def brand(self):
- return self._brand
-
- @pyqtProperty(str, constant=True)
- def color(self):
- return self._color
-
- @pyqtProperty(str, constant=True)
- def name(self):
- return self._name
\ No newline at end of file
diff --git a/cura/PrinterOutput/ExtruderConfigurationModel.py b/cura/PrinterOutput/Models/ExtruderConfigurationModel.py
similarity index 77%
rename from cura/PrinterOutput/ExtruderConfigurationModel.py
rename to cura/PrinterOutput/Models/ExtruderConfigurationModel.py
index da0ad6b0b2..5b4cb5d6f5 100644
--- a/cura/PrinterOutput/ExtruderConfigurationModel.py
+++ b/cura/PrinterOutput/Models/ExtruderConfigurationModel.py
@@ -4,7 +4,7 @@ from typing import Optional
from PyQt5.QtCore import pyqtProperty, QObject, pyqtSignal
-from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel
+from .MaterialOutputModel import MaterialOutputModel
class ExtruderConfigurationModel(QObject):
@@ -62,9 +62,26 @@ class ExtruderConfigurationModel(QObject):
return " ".join(message_chunks)
def __eq__(self, other) -> bool:
- return hash(self) == hash(other)
+ if not isinstance(other, ExtruderConfigurationModel):
+ return False
+
+ if self._position != other.position:
+ return False
+ # Empty materials should be ignored for comparison
+ if self.activeMaterial is not None and other.activeMaterial is not None:
+ if self.activeMaterial.guid != other.activeMaterial.guid:
+ if self.activeMaterial.guid != "" and other.activeMaterial.guid != "":
+ return False
+ else:
+ # At this point there is no material, so it doesn't matter what the hotend is.
+ return True
+
+ if self.hotendID != other.hotendID:
+ return False
+
+ return True
# Calculating a hash function using the position of the extruder, the material GUID and the hotend id to check if is
# unique within a set
def __hash__(self):
- return hash(self._position) ^ (hash(self._material.guid) if self._material is not None else hash(0)) ^ hash(self._hotend_id)
\ No newline at end of file
+ return hash(self._position) ^ (hash(self._material.guid) if self._material is not None else hash(0)) ^ hash(self._hotend_id)
diff --git a/cura/PrinterOutput/ExtruderOutputModel.py b/cura/PrinterOutput/Models/ExtruderOutputModel.py
similarity index 95%
rename from cura/PrinterOutput/ExtruderOutputModel.py
rename to cura/PrinterOutput/Models/ExtruderOutputModel.py
index 30d53bbd85..889e140312 100644
--- a/cura/PrinterOutput/ExtruderOutputModel.py
+++ b/cura/PrinterOutput/Models/ExtruderOutputModel.py
@@ -1,14 +1,15 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot
-from cura.PrinterOutput.ExtruderConfigurationModel import ExtruderConfigurationModel
-
from typing import Optional, TYPE_CHECKING
+from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot
+
+from .ExtruderConfigurationModel import ExtruderConfigurationModel
+
if TYPE_CHECKING:
- from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
- from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel
+ from .MaterialOutputModel import MaterialOutputModel
+ from .PrinterOutputModel import PrinterOutputModel
class ExtruderOutputModel(QObject):
diff --git a/cura/PrinterOutput/Models/MaterialOutputModel.py b/cura/PrinterOutput/Models/MaterialOutputModel.py
new file mode 100644
index 0000000000..7a17ef3cce
--- /dev/null
+++ b/cura/PrinterOutput/Models/MaterialOutputModel.py
@@ -0,0 +1,36 @@
+# Copyright (c) 2017 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from typing import Optional
+
+from PyQt5.QtCore import pyqtProperty, QObject
+
+
+class MaterialOutputModel(QObject):
+ def __init__(self, guid: Optional[str], type: str, color: str, brand: str, name: str, parent = None) -> None:
+ super().__init__(parent)
+ self._guid = guid
+ self._type = type
+ self._color = color
+ self._brand = brand
+ self._name = name
+
+ @pyqtProperty(str, constant = True)
+ def guid(self) -> str:
+ return self._guid if self._guid else ""
+
+ @pyqtProperty(str, constant = True)
+ def type(self) -> str:
+ return self._type
+
+ @pyqtProperty(str, constant = True)
+ def brand(self) -> str:
+ return self._brand
+
+ @pyqtProperty(str, constant = True)
+ def color(self) -> str:
+ return self._color
+
+ @pyqtProperty(str, constant = True)
+ def name(self) -> str:
+ return self._name
diff --git a/cura/PrinterOutput/Models/PrintJobOutputModel.py b/cura/PrinterOutput/Models/PrintJobOutputModel.py
new file mode 100644
index 0000000000..b4296a5494
--- /dev/null
+++ b/cura/PrinterOutput/Models/PrintJobOutputModel.py
@@ -0,0 +1,171 @@
+# Copyright (c) 2018 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from typing import Optional, TYPE_CHECKING, List
+
+from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot, QUrl
+from PyQt5.QtGui import QImage
+
+if TYPE_CHECKING:
+ from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
+ from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel
+ from cura.PrinterOutput.Models.PrinterConfigurationModel import PrinterConfigurationModel
+
+
+class PrintJobOutputModel(QObject):
+ stateChanged = pyqtSignal()
+ timeTotalChanged = pyqtSignal()
+ timeElapsedChanged = pyqtSignal()
+ nameChanged = pyqtSignal()
+ keyChanged = pyqtSignal()
+ assignedPrinterChanged = pyqtSignal()
+ ownerChanged = pyqtSignal()
+ configurationChanged = pyqtSignal()
+ previewImageChanged = pyqtSignal()
+ compatibleMachineFamiliesChanged = pyqtSignal()
+
+ def __init__(self, output_controller: "PrinterOutputController", key: str = "", name: str = "", parent = None) -> None:
+ super().__init__(parent)
+ self._output_controller = output_controller
+ self._state = ""
+ self._time_total = 0
+ self._time_elapsed = 0
+ self._name = name # Human readable name
+ self._key = key # Unique identifier
+ self._assigned_printer = None # type: Optional[PrinterOutputModel]
+ self._owner = "" # Who started/owns the print job?
+
+ self._configuration = None # type: Optional[PrinterConfigurationModel]
+ self._compatible_machine_families = [] # type: List[str]
+ self._preview_image_id = 0
+
+ self._preview_image = None # type: Optional[QImage]
+
+ @pyqtProperty("QStringList", notify=compatibleMachineFamiliesChanged)
+ def compatibleMachineFamilies(self):
+ # Hack; Some versions of cluster will return a family more than once...
+ return list(set(self._compatible_machine_families))
+
+ def setCompatibleMachineFamilies(self, compatible_machine_families: List[str]) -> None:
+ if self._compatible_machine_families != compatible_machine_families:
+ self._compatible_machine_families = compatible_machine_families
+ self.compatibleMachineFamiliesChanged.emit()
+
+ @pyqtProperty(QUrl, notify=previewImageChanged)
+ def previewImageUrl(self):
+ self._preview_image_id += 1
+ # There is an image provider that is called "print_job_preview". In order to ensure that the image qml object, that
+ # requires a QUrl to function, updates correctly we add an increasing number. This causes to see the QUrl
+ # as new (instead of relying on cached version and thus forces an update.
+ temp = "image://print_job_preview/" + str(self._preview_image_id) + "/" + self._key
+ return QUrl(temp, QUrl.TolerantMode)
+
+ def getPreviewImage(self) -> Optional[QImage]:
+ return self._preview_image
+
+ def updatePreviewImage(self, preview_image: Optional[QImage]) -> None:
+ if self._preview_image != preview_image:
+ self._preview_image = preview_image
+ self.previewImageChanged.emit()
+
+ @pyqtProperty(QObject, notify=configurationChanged)
+ def configuration(self) -> Optional["PrinterConfigurationModel"]:
+ return self._configuration
+
+ def updateConfiguration(self, configuration: Optional["PrinterConfigurationModel"]) -> None:
+ if self._configuration != configuration:
+ self._configuration = configuration
+ self.configurationChanged.emit()
+
+ @pyqtProperty(str, notify=ownerChanged)
+ def owner(self):
+ return self._owner
+
+ def updateOwner(self, owner):
+ if self._owner != owner:
+ self._owner = owner
+ self.ownerChanged.emit()
+
+ @pyqtProperty(QObject, notify=assignedPrinterChanged)
+ def assignedPrinter(self):
+ return self._assigned_printer
+
+ def updateAssignedPrinter(self, assigned_printer: Optional["PrinterOutputModel"]) -> None:
+ if self._assigned_printer != assigned_printer:
+ old_printer = self._assigned_printer
+ self._assigned_printer = assigned_printer
+ if old_printer is not None:
+ # If the previously assigned printer is set, this job is moved away from it.
+ old_printer.updateActivePrintJob(None)
+ self.assignedPrinterChanged.emit()
+
+ @pyqtProperty(str, notify=keyChanged)
+ def key(self):
+ return self._key
+
+ def updateKey(self, key: str):
+ if self._key != key:
+ self._key = key
+ self.keyChanged.emit()
+
+ @pyqtProperty(str, notify = nameChanged)
+ def name(self):
+ return self._name
+
+ def updateName(self, name: str):
+ if self._name != name:
+ self._name = name
+ self.nameChanged.emit()
+
+ @pyqtProperty(int, notify = timeTotalChanged)
+ def timeTotal(self) -> int:
+ return self._time_total
+
+ @pyqtProperty(int, notify = timeElapsedChanged)
+ def timeElapsed(self) -> int:
+ return self._time_elapsed
+
+ @pyqtProperty(int, notify = timeElapsedChanged)
+ def timeRemaining(self) -> int:
+ # Never get a negative time remaining
+ return max(self.timeTotal - self.timeElapsed, 0)
+
+ @pyqtProperty(float, notify = timeElapsedChanged)
+ def progress(self) -> float:
+ result = float(self.timeElapsed) / max(self.timeTotal, 1.0) # Prevent a division by zero exception.
+ return min(result, 1.0) # Never get a progress past 1.0
+
+ @pyqtProperty(str, notify=stateChanged)
+ def state(self) -> str:
+ return self._state
+
+ @pyqtProperty(bool, notify=stateChanged)
+ def isActive(self) -> bool:
+ inactive_states = [
+ "pausing",
+ "paused",
+ "resuming",
+ "wait_cleanup"
+ ]
+ if self.state in inactive_states and self.timeRemaining > 0:
+ return False
+ return True
+
+ def updateTimeTotal(self, new_time_total):
+ if self._time_total != new_time_total:
+ self._time_total = new_time_total
+ self.timeTotalChanged.emit()
+
+ def updateTimeElapsed(self, new_time_elapsed):
+ if self._time_elapsed != new_time_elapsed:
+ self._time_elapsed = new_time_elapsed
+ self.timeElapsedChanged.emit()
+
+ def updateState(self, new_state):
+ if self._state != new_state:
+ self._state = new_state
+ self.stateChanged.emit()
+
+ @pyqtSlot(str)
+ def setState(self, state):
+ self._output_controller.setJobState(self, state)
diff --git a/cura/PrinterOutput/ConfigurationModel.py b/cura/PrinterOutput/Models/PrinterConfigurationModel.py
similarity index 77%
rename from cura/PrinterOutput/ConfigurationModel.py
rename to cura/PrinterOutput/Models/PrinterConfigurationModel.py
index 312e3cffb0..47b9532080 100644
--- a/cura/PrinterOutput/ConfigurationModel.py
+++ b/cura/PrinterOutput/Models/PrinterConfigurationModel.py
@@ -6,10 +6,10 @@ from typing import List
MYPY = False
if MYPY:
- from cura.PrinterOutput.ExtruderConfigurationModel import ExtruderConfigurationModel
+ from cura.PrinterOutput.Models.ExtruderConfigurationModel import ExtruderConfigurationModel
-class ConfigurationModel(QObject):
+class PrinterConfigurationModel(QObject):
configurationChanged = pyqtSignal()
@@ -19,14 +19,14 @@ class ConfigurationModel(QObject):
self._extruder_configurations = [] # type: List[ExtruderConfigurationModel]
self._buildplate_configuration = ""
- def setPrinterType(self, printer_type):
+ def setPrinterType(self, printer_type: str) -> None:
self._printer_type = printer_type
@pyqtProperty(str, fset = setPrinterType, notify = configurationChanged)
def printerType(self) -> str:
return self._printer_type
- def setExtruderConfigurations(self, extruder_configurations: List["ExtruderConfigurationModel"]):
+ def setExtruderConfigurations(self, extruder_configurations: List["ExtruderConfigurationModel"]) -> None:
if self._extruder_configurations != extruder_configurations:
self._extruder_configurations = extruder_configurations
@@ -40,7 +40,7 @@ class ConfigurationModel(QObject):
return self._extruder_configurations
def setBuildplateConfiguration(self, buildplate_configuration: str) -> None:
- if self._buildplate_configuration != buildplate_configuration:
+ if self._buildplate_configuration != buildplate_configuration:
self._buildplate_configuration = buildplate_configuration
self.configurationChanged.emit()
@@ -71,7 +71,23 @@ class ConfigurationModel(QObject):
return "\n".join(message_chunks)
def __eq__(self, other):
- return hash(self) == hash(other)
+ if not isinstance(other, PrinterConfigurationModel):
+ return False
+
+ if self.printerType != other.printerType:
+ return False
+
+ if self.buildplateConfiguration != other.buildplateConfiguration:
+ return False
+
+ if len(self.extruderConfigurations) != len(other.extruderConfigurations):
+ return False
+
+ for self_extruder, other_extruder in zip(sorted(self._extruder_configurations, key=lambda x: x.position), sorted(other.extruderConfigurations, key=lambda x: x.position)):
+ if self_extruder != other_extruder:
+ return False
+
+ return True
## The hash function is used to compare and create unique sets. The configuration is unique if the configuration
# of the extruders is unique (the order of the extruders matters), and the type and buildplate is the same.
@@ -86,4 +102,4 @@ class ConfigurationModel(QObject):
if first_extruder:
extruder_hash &= hash(first_extruder)
- return hash(self._printer_type) ^ extruder_hash ^ hash(self._buildplate_configuration)
\ No newline at end of file
+ return hash(self._printer_type) ^ extruder_hash ^ hash(self._buildplate_configuration)
diff --git a/cura/PrinterOutput/Models/PrinterOutputModel.py b/cura/PrinterOutput/Models/PrinterOutputModel.py
new file mode 100644
index 0000000000..4004a90a33
--- /dev/null
+++ b/cura/PrinterOutput/Models/PrinterOutputModel.py
@@ -0,0 +1,297 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot, QUrl
+from typing import List, Dict, Optional
+from UM.Math.Vector import Vector
+from cura.PrinterOutput.Models.PrinterConfigurationModel import PrinterConfigurationModel
+from cura.PrinterOutput.Models.ExtruderOutputModel import ExtruderOutputModel
+
+MYPY = False
+if MYPY:
+ from cura.PrinterOutput.Models.PrintJobOutputModel import PrintJobOutputModel
+ from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
+
+
+class PrinterOutputModel(QObject):
+ bedTemperatureChanged = pyqtSignal()
+ targetBedTemperatureChanged = pyqtSignal()
+ isPreheatingChanged = pyqtSignal()
+ stateChanged = pyqtSignal()
+ activePrintJobChanged = pyqtSignal()
+ nameChanged = pyqtSignal()
+ headPositionChanged = pyqtSignal()
+ keyChanged = pyqtSignal()
+ typeChanged = pyqtSignal()
+ buildplateChanged = pyqtSignal()
+ cameraUrlChanged = pyqtSignal()
+ configurationChanged = pyqtSignal()
+ canUpdateFirmwareChanged = pyqtSignal()
+
+ def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None, firmware_version = "") -> None:
+ super().__init__(parent)
+ self._bed_temperature = -1 # type: float # Use -1 for no heated bed.
+ self._target_bed_temperature = 0 # type: float
+ self._name = ""
+ self._key = "" # Unique identifier
+ self._controller = output_controller
+ self._controller.canUpdateFirmwareChanged.connect(self._onControllerCanUpdateFirmwareChanged)
+ self._extruders = [ExtruderOutputModel(printer = self, position = i) for i in range(number_of_extruders)]
+ self._printer_configuration = PrinterConfigurationModel() # Indicates the current configuration setup in this printer
+ self._head_position = Vector(0, 0, 0)
+ self._active_print_job = None # type: Optional[PrintJobOutputModel]
+ self._firmware_version = firmware_version
+ self._printer_state = "unknown"
+ self._is_preheating = False
+ self._printer_type = ""
+ self._buildplate = ""
+
+ self._printer_configuration.extruderConfigurations = [extruder.extruderConfiguration for extruder in
+ self._extruders]
+
+ self._camera_url = QUrl() # type: QUrl
+
+ @pyqtProperty(str, constant = True)
+ def firmwareVersion(self) -> str:
+ return self._firmware_version
+
+ def setCameraUrl(self, camera_url: "QUrl") -> None:
+ if self._camera_url != camera_url:
+ self._camera_url = camera_url
+ self.cameraUrlChanged.emit()
+
+ @pyqtProperty(QUrl, fset = setCameraUrl, notify = cameraUrlChanged)
+ def cameraUrl(self) -> "QUrl":
+ return self._camera_url
+
+ def updateIsPreheating(self, pre_heating: bool) -> None:
+ if self._is_preheating != pre_heating:
+ self._is_preheating = pre_heating
+ self.isPreheatingChanged.emit()
+
+ @pyqtProperty(bool, notify=isPreheatingChanged)
+ def isPreheating(self) -> bool:
+ return self._is_preheating
+
+ @pyqtProperty(str, notify = typeChanged)
+ def type(self) -> str:
+ return self._printer_type
+
+ def updateType(self, printer_type: str) -> None:
+ if self._printer_type != printer_type:
+ self._printer_type = printer_type
+ self._printer_configuration.printerType = self._printer_type
+ self.typeChanged.emit()
+ self.configurationChanged.emit()
+
+ @pyqtProperty(str, notify = buildplateChanged)
+ def buildplate(self) -> str:
+ return self._buildplate
+
+ def updateBuildplate(self, buildplate: str) -> None:
+ if self._buildplate != buildplate:
+ self._buildplate = buildplate
+ self._printer_configuration.buildplateConfiguration = self._buildplate
+ self.buildplateChanged.emit()
+ self.configurationChanged.emit()
+
+ @pyqtProperty(str, notify=keyChanged)
+ def key(self) -> str:
+ return self._key
+
+ def updateKey(self, key: str) -> None:
+ if self._key != key:
+ self._key = key
+ self.keyChanged.emit()
+
+ @pyqtSlot()
+ def homeHead(self) -> None:
+ self._controller.homeHead(self)
+
+ @pyqtSlot()
+ def homeBed(self) -> None:
+ self._controller.homeBed(self)
+
+ @pyqtSlot(str)
+ def sendRawCommand(self, command: str) -> None:
+ self._controller.sendRawCommand(self, command)
+
+ @pyqtProperty("QVariantList", constant = True)
+ def extruders(self) -> List["ExtruderOutputModel"]:
+ return self._extruders
+
+ @pyqtProperty(QVariant, notify = headPositionChanged)
+ def headPosition(self) -> Dict[str, float]:
+ return {"x": self._head_position.x, "y": self._head_position.y, "z": self.head_position.z}
+
+ def updateHeadPosition(self, x: float, y: float, z: float) -> None:
+ if self._head_position.x != x or self._head_position.y != y or self._head_position.z != z:
+ self._head_position = Vector(x, y, z)
+ self.headPositionChanged.emit()
+
+ @pyqtProperty(float, float, float)
+ @pyqtProperty(float, float, float, float)
+ def setHeadPosition(self, x: float, y: float, z: float, speed: float = 3000) -> None:
+ self.updateHeadPosition(x, y, z)
+ self._controller.setHeadPosition(self, x, y, z, speed)
+
+ @pyqtProperty(float)
+ @pyqtProperty(float, float)
+ def setHeadX(self, x: float, speed: float = 3000) -> None:
+ self.updateHeadPosition(x, self._head_position.y, self._head_position.z)
+ self._controller.setHeadPosition(self, x, self._head_position.y, self._head_position.z, speed)
+
+ @pyqtProperty(float)
+ @pyqtProperty(float, float)
+ def setHeadY(self, y: float, speed: float = 3000) -> None:
+ self.updateHeadPosition(self._head_position.x, y, self._head_position.z)
+ self._controller.setHeadPosition(self, self._head_position.x, y, self._head_position.z, speed)
+
+ @pyqtProperty(float)
+ @pyqtProperty(float, float)
+ def setHeadZ(self, z: float, speed:float = 3000) -> None:
+ self.updateHeadPosition(self._head_position.x, self._head_position.y, z)
+ self._controller.setHeadPosition(self, self._head_position.x, self._head_position.y, z, speed)
+
+ @pyqtSlot(float, float, float)
+ @pyqtSlot(float, float, float, float)
+ def moveHead(self, x: float = 0, y: float = 0, z: float = 0, speed: float = 3000) -> None:
+ self._controller.moveHead(self, x, y, z, speed)
+
+ ## Pre-heats the heated bed of the printer.
+ #
+ # \param temperature The temperature to heat the bed to, in degrees
+ # Celsius.
+ # \param duration How long the bed should stay warm, in seconds.
+ @pyqtSlot(float, float)
+ def preheatBed(self, temperature: float, duration: float) -> None:
+ self._controller.preheatBed(self, temperature, duration)
+
+ @pyqtSlot()
+ def cancelPreheatBed(self) -> None:
+ self._controller.cancelPreheatBed(self)
+
+ def getController(self) -> "PrinterOutputController":
+ return self._controller
+
+ @pyqtProperty(str, notify = nameChanged)
+ def name(self) -> str:
+ return self._name
+
+ def setName(self, name: str) -> None:
+ self.updateName(name)
+
+ def updateName(self, name: str) -> None:
+ if self._name != name:
+ self._name = name
+ self.nameChanged.emit()
+
+ ## Update the bed temperature. This only changes it locally.
+ def updateBedTemperature(self, temperature: float) -> None:
+ if self._bed_temperature != temperature:
+ self._bed_temperature = temperature
+ self.bedTemperatureChanged.emit()
+
+ def updateTargetBedTemperature(self, temperature: float) -> None:
+ if self._target_bed_temperature != temperature:
+ self._target_bed_temperature = temperature
+ self.targetBedTemperatureChanged.emit()
+
+ ## Set the target bed temperature. This ensures that it's actually sent to the remote.
+ @pyqtSlot(float)
+ def setTargetBedTemperature(self, temperature: float) -> None:
+ self._controller.setTargetBedTemperature(self, temperature)
+ self.updateTargetBedTemperature(temperature)
+
+ def updateActivePrintJob(self, print_job: Optional["PrintJobOutputModel"]) -> None:
+ if self._active_print_job != print_job:
+ old_print_job = self._active_print_job
+
+ if print_job is not None:
+ print_job.updateAssignedPrinter(self)
+ self._active_print_job = print_job
+
+ if old_print_job is not None:
+ old_print_job.updateAssignedPrinter(None)
+ self.activePrintJobChanged.emit()
+
+ def updateState(self, printer_state: str) -> None:
+ if self._printer_state != printer_state:
+ self._printer_state = printer_state
+ self.stateChanged.emit()
+
+ @pyqtProperty(QObject, notify = activePrintJobChanged)
+ def activePrintJob(self) -> Optional["PrintJobOutputModel"]:
+ return self._active_print_job
+
+ @pyqtProperty(str, notify = stateChanged)
+ def state(self) -> str:
+ return self._printer_state
+
+ @pyqtProperty(float, notify = bedTemperatureChanged)
+ def bedTemperature(self) -> float:
+ return self._bed_temperature
+
+ @pyqtProperty(float, notify = targetBedTemperatureChanged)
+ def targetBedTemperature(self) -> float:
+ return self._target_bed_temperature
+
+ # Does the printer support pre-heating the bed at all
+ @pyqtProperty(bool, constant = True)
+ def canPreHeatBed(self) -> bool:
+ if self._controller:
+ return self._controller.can_pre_heat_bed
+ return False
+
+ # Does the printer support pre-heating the bed at all
+ @pyqtProperty(bool, constant = True)
+ def canPreHeatHotends(self) -> bool:
+ if self._controller:
+ return self._controller.can_pre_heat_hotends
+ return False
+
+ # Does the printer support sending raw G-code at all
+ @pyqtProperty(bool, constant = True)
+ def canSendRawGcode(self) -> bool:
+ if self._controller:
+ return self._controller.can_send_raw_gcode
+ return False
+
+ # Does the printer support pause at all
+ @pyqtProperty(bool, constant = True)
+ def canPause(self) -> bool:
+ if self._controller:
+ return self._controller.can_pause
+ return False
+
+ # Does the printer support abort at all
+ @pyqtProperty(bool, constant = True)
+ def canAbort(self) -> bool:
+ if self._controller:
+ return self._controller.can_abort
+ return False
+
+ # Does the printer support manual control at all
+ @pyqtProperty(bool, constant = True)
+ def canControlManually(self) -> bool:
+ if self._controller:
+ return self._controller.can_control_manually
+ return False
+
+ # Does the printer support upgrading firmware
+ @pyqtProperty(bool, notify = canUpdateFirmwareChanged)
+ def canUpdateFirmware(self) -> bool:
+ if self._controller:
+ return self._controller.can_update_firmware
+ return False
+
+ # Stub to connect UM.Signal to pyqtSignal
+ def _onControllerCanUpdateFirmwareChanged(self) -> None:
+ self.canUpdateFirmwareChanged.emit()
+
+ # Returns the configuration (material, variant and buildplate) of the current printer
+ @pyqtProperty(QObject, notify = configurationChanged)
+ def printerConfiguration(self) -> Optional[PrinterConfigurationModel]:
+ if self._printer_configuration.isValid():
+ return self._printer_configuration
+ return None
\ No newline at end of file
diff --git a/cura/PrinterOutput/Models/__init__.py b/cura/PrinterOutput/Models/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py
index 0e33a71249..86da9bf57f 100644
--- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py
+++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py
@@ -7,7 +7,7 @@ from UM.Scene.SceneNode import SceneNode #For typing.
from cura.API import Account
from cura.CuraApplication import CuraApplication
-from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState, ConnectionType
+from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice, ConnectionState, ConnectionType
from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply, QAuthenticator
from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QUrl, QCoreApplication
@@ -18,6 +18,8 @@ from enum import IntEnum
import os # To get the username
import gzip
+from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
+
class AuthState(IntEnum):
NotAuthenticated = 1
@@ -319,12 +321,27 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
self._manager.authenticationRequired.connect(self._onAuthenticationRequired)
if self._properties.get(b"temporary", b"false") != b"true":
- CuraApplication.getInstance().getMachineManager().checkCorrectGroupName(self.getId(), self.name)
+ self._checkCorrectGroupName(self.getId(), self.name)
def _registerOnFinishedCallback(self, reply: QNetworkReply, on_finished: Optional[Callable[[QNetworkReply], None]]) -> None:
if on_finished is not None:
self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = on_finished
+ ## This method checks if the name of the group stored in the definition container is correct.
+ # After updating from 3.2 to 3.3 some group names may be temporary. If there is a mismatch in the name of the group
+ # then all the container stacks are updated, both the current and the hidden ones.
+ def _checkCorrectGroupName(self, device_id: str, group_name: str) -> None:
+ global_container_stack = CuraApplication.getInstance().getGlobalContainerStack()
+ active_machine_network_name = CuraApplication.getInstance().getMachineManager().activeMachineNetworkKey()
+ if global_container_stack and device_id == active_machine_network_name:
+ # Check if the group_name is correct. If not, update all the containers connected to the same printer
+ if CuraApplication.getInstance().getMachineManager().activeMachineNetworkGroupName != group_name:
+ metadata_filter = {"um_network_key": active_machine_network_name}
+ containers = CuraContainerRegistry.getInstance().findContainerStacks(type="machine",
+ **metadata_filter)
+ for container in containers:
+ container.setMetaDataEntry("group_name", group_name)
+
def _handleOnFinished(self, reply: QNetworkReply) -> None:
# Due to garbage collection, we need to cache certain bits of post operations.
# As we don't want to keep them around forever, delete them if we get a reply.
diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py
index fb163ef065..a810d40e9a 100644
--- a/cura/PrinterOutput/PrintJobOutputModel.py
+++ b/cura/PrinterOutput/PrintJobOutputModel.py
@@ -1,172 +1,4 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot
-from typing import Optional, TYPE_CHECKING, List
-
-from PyQt5.QtCore import QUrl
-from PyQt5.QtGui import QImage
-
-if TYPE_CHECKING:
- from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
- from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
- from cura.PrinterOutput.ConfigurationModel import ConfigurationModel
-
-
-class PrintJobOutputModel(QObject):
- stateChanged = pyqtSignal()
- timeTotalChanged = pyqtSignal()
- timeElapsedChanged = pyqtSignal()
- nameChanged = pyqtSignal()
- keyChanged = pyqtSignal()
- assignedPrinterChanged = pyqtSignal()
- ownerChanged = pyqtSignal()
- configurationChanged = pyqtSignal()
- previewImageChanged = pyqtSignal()
- compatibleMachineFamiliesChanged = pyqtSignal()
-
- def __init__(self, output_controller: "PrinterOutputController", key: str = "", name: str = "", parent=None) -> None:
- super().__init__(parent)
- self._output_controller = output_controller
- self._state = ""
- self._time_total = 0
- self._time_elapsed = 0
- self._name = name # Human readable name
- self._key = key # Unique identifier
- self._assigned_printer = None # type: Optional[PrinterOutputModel]
- self._owner = "" # Who started/owns the print job?
-
- self._configuration = None # type: Optional[ConfigurationModel]
- self._compatible_machine_families = [] # type: List[str]
- self._preview_image_id = 0
-
- self._preview_image = None # type: Optional[QImage]
-
- @pyqtProperty("QStringList", notify=compatibleMachineFamiliesChanged)
- def compatibleMachineFamilies(self):
- # Hack; Some versions of cluster will return a family more than once...
- return list(set(self._compatible_machine_families))
-
- def setCompatibleMachineFamilies(self, compatible_machine_families: List[str]) -> None:
- if self._compatible_machine_families != compatible_machine_families:
- self._compatible_machine_families = compatible_machine_families
- self.compatibleMachineFamiliesChanged.emit()
-
- @pyqtProperty(QUrl, notify=previewImageChanged)
- def previewImageUrl(self):
- self._preview_image_id += 1
- # There is an image provider that is called "print_job_preview". In order to ensure that the image qml object, that
- # requires a QUrl to function, updates correctly we add an increasing number. This causes to see the QUrl
- # as new (instead of relying on cached version and thus forces an update.
- temp = "image://print_job_preview/" + str(self._preview_image_id) + "/" + self._key
- return QUrl(temp, QUrl.TolerantMode)
-
- def getPreviewImage(self) -> Optional[QImage]:
- return self._preview_image
-
- def updatePreviewImage(self, preview_image: Optional[QImage]) -> None:
- if self._preview_image != preview_image:
- self._preview_image = preview_image
- self.previewImageChanged.emit()
-
- @pyqtProperty(QObject, notify=configurationChanged)
- def configuration(self) -> Optional["ConfigurationModel"]:
- return self._configuration
-
- def updateConfiguration(self, configuration: Optional["ConfigurationModel"]) -> None:
- if self._configuration != configuration:
- self._configuration = configuration
- self.configurationChanged.emit()
-
- @pyqtProperty(str, notify=ownerChanged)
- def owner(self):
- return self._owner
-
- def updateOwner(self, owner):
- if self._owner != owner:
- self._owner = owner
- self.ownerChanged.emit()
-
- @pyqtProperty(QObject, notify=assignedPrinterChanged)
- def assignedPrinter(self):
- return self._assigned_printer
-
- def updateAssignedPrinter(self, assigned_printer: Optional["PrinterOutputModel"]) -> None:
- if self._assigned_printer != assigned_printer:
- old_printer = self._assigned_printer
- self._assigned_printer = assigned_printer
- if old_printer is not None:
- # If the previously assigned printer is set, this job is moved away from it.
- old_printer.updateActivePrintJob(None)
- self.assignedPrinterChanged.emit()
-
- @pyqtProperty(str, notify=keyChanged)
- def key(self):
- return self._key
-
- def updateKey(self, key: str):
- if self._key != key:
- self._key = key
- self.keyChanged.emit()
-
- @pyqtProperty(str, notify = nameChanged)
- def name(self):
- return self._name
-
- def updateName(self, name: str):
- if self._name != name:
- self._name = name
- self.nameChanged.emit()
-
- @pyqtProperty(int, notify = timeTotalChanged)
- def timeTotal(self) -> int:
- return self._time_total
-
- @pyqtProperty(int, notify = timeElapsedChanged)
- def timeElapsed(self) -> int:
- return self._time_elapsed
-
- @pyqtProperty(int, notify = timeElapsedChanged)
- def timeRemaining(self) -> int:
- # Never get a negative time remaining
- return max(self.timeTotal - self.timeElapsed, 0)
-
- @pyqtProperty(float, notify = timeElapsedChanged)
- def progress(self) -> float:
- result = float(self.timeElapsed) / max(self.timeTotal, 1.0) # Prevent a division by zero exception.
- return min(result, 1.0) # Never get a progress past 1.0
-
- @pyqtProperty(str, notify=stateChanged)
- def state(self) -> str:
- return self._state
-
- @pyqtProperty(bool, notify=stateChanged)
- def isActive(self) -> bool:
- inactiveStates = [
- "pausing",
- "paused",
- "resuming",
- "wait_cleanup"
- ]
- if self.state in inactiveStates and self.timeRemaining > 0:
- return False
- return True
-
- def updateTimeTotal(self, new_time_total):
- if self._time_total != new_time_total:
- self._time_total = new_time_total
- self.timeTotalChanged.emit()
-
- def updateTimeElapsed(self, new_time_elapsed):
- if self._time_elapsed != new_time_elapsed:
- self._time_elapsed = new_time_elapsed
- self.timeElapsedChanged.emit()
-
- def updateState(self, new_state):
- if self._state != new_state:
- self._state = new_state
- self.stateChanged.emit()
-
- @pyqtSlot(str)
- def setState(self, state):
- self._output_controller.setJobState(self, state)
+import warnings
+warnings.warn("Importing cura.PrinterOutput.PrintJobOutputModel has been deprecated since 4.1, use cura.PrinterOutput.Models.PrintJobOutputModel inststad", DeprecationWarning, stacklevel=2)
+# We moved the the models to one submodule deeper
+from cura.PrinterOutput.Models.PrintJobOutputModel import PrintJobOutputModel
\ No newline at end of file
diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py
index aa06ada8a3..3d710582ca 100644
--- a/cura/PrinterOutput/PrinterOutputController.py
+++ b/cura/PrinterOutput/PrinterOutputController.py
@@ -4,14 +4,12 @@
from UM.Logger import Logger
from UM.Signal import Signal
-from typing import Union
-
MYPY = False
if MYPY:
- from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
- from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel
- from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
- from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice
+ from .Models.PrintJobOutputModel import PrintJobOutputModel
+ from .Models.ExtruderOutputModel import ExtruderOutputModel
+ from .Models.PrinterOutputModel import PrinterOutputModel
+ from .PrinterOutputDevice import PrinterOutputDevice
class PrinterOutputController:
diff --git a/cura/PrinterOutput/PrinterOutputDevice.py b/cura/PrinterOutput/PrinterOutputDevice.py
new file mode 100644
index 0000000000..8e1b220a86
--- /dev/null
+++ b/cura/PrinterOutput/PrinterOutputDevice.py
@@ -0,0 +1,261 @@
+# Copyright (c) 2018 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from enum import IntEnum
+from typing import Callable, List, Optional, Union
+
+from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject, QTimer, QUrl
+from PyQt5.QtWidgets import QMessageBox
+
+from UM.Logger import Logger
+from UM.Signal import signalemitter
+from UM.Qt.QtApplication import QtApplication
+from UM.FlameProfiler import pyqtSlot
+from UM.Decorators import deprecated
+from UM.i18n import i18nCatalog
+from UM.OutputDevice.OutputDevice import OutputDevice
+
+MYPY = False
+if MYPY:
+ from UM.FileHandler.FileHandler import FileHandler
+ from UM.Scene.SceneNode import SceneNode
+ from .Models.PrinterOutputModel import PrinterOutputModel
+ from .Models.PrinterConfigurationModel import PrinterConfigurationModel
+ from .FirmwareUpdater import FirmwareUpdater
+
+i18n_catalog = i18nCatalog("cura")
+
+
+## The current processing state of the backend.
+class ConnectionState(IntEnum):
+ Closed = 0
+ Connecting = 1
+ Connected = 2
+ Busy = 3
+ Error = 4
+
+
+class ConnectionType(IntEnum):
+ NotConnected = 0
+ UsbConnection = 1
+ NetworkConnection = 2
+ CloudConnection = 3
+
+
+## Printer output device adds extra interface options on top of output device.
+#
+# The assumption is made the printer is a FDM printer.
+#
+# Note that a number of settings are marked as "final". This is because decorators
+# are not inherited by children. To fix this we use the private counter part of those
+# functions to actually have the implementation.
+#
+# For all other uses it should be used in the same way as a "regular" OutputDevice.
+@signalemitter
+class PrinterOutputDevice(QObject, OutputDevice):
+
+ printersChanged = pyqtSignal()
+ connectionStateChanged = pyqtSignal(str)
+ acceptsCommandsChanged = pyqtSignal()
+
+ # Signal to indicate that the material of the active printer on the remote changed.
+ materialIdChanged = pyqtSignal()
+
+ # # Signal to indicate that the hotend of the active printer on the remote changed.
+ hotendIdChanged = pyqtSignal()
+
+ # Signal to indicate that the info text about the connection has changed.
+ connectionTextChanged = pyqtSignal()
+
+ # Signal to indicate that the configuration of one of the printers has changed.
+ uniqueConfigurationsChanged = pyqtSignal()
+
+ def __init__(self, device_id: str, connection_type: "ConnectionType" = ConnectionType.NotConnected, parent: QObject = None) -> None:
+ super().__init__(device_id = device_id, parent = parent) # type: ignore # MyPy complains with the multiple inheritance
+
+ self._printers = [] # type: List[PrinterOutputModel]
+ self._unique_configurations = [] # type: List[PrinterConfigurationModel]
+
+ self._monitor_view_qml_path = "" # type: str
+ self._monitor_component = None # type: Optional[QObject]
+ self._monitor_item = None # type: Optional[QObject]
+
+ self._control_view_qml_path = "" # type: str
+ self._control_component = None # type: Optional[QObject]
+ self._control_item = None # type: Optional[QObject]
+
+ self._accepts_commands = False # type: bool
+
+ self._update_timer = QTimer() # type: QTimer
+ self._update_timer.setInterval(2000) # TODO; Add preference for update interval
+ self._update_timer.setSingleShot(False)
+ self._update_timer.timeout.connect(self._update)
+
+ self._connection_state = ConnectionState.Closed # type: ConnectionState
+ self._connection_type = connection_type # type: ConnectionType
+
+ self._firmware_updater = None # type: Optional[FirmwareUpdater]
+ self._firmware_name = None # type: Optional[str]
+ self._address = "" # type: str
+ self._connection_text = "" # type: str
+ self.printersChanged.connect(self._onPrintersChanged)
+ QtApplication.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._updateUniqueConfigurations)
+
+ @pyqtProperty(str, notify = connectionTextChanged)
+ def address(self) -> str:
+ return self._address
+
+ def setConnectionText(self, connection_text):
+ if self._connection_text != connection_text:
+ self._connection_text = connection_text
+ self.connectionTextChanged.emit()
+
+ @pyqtProperty(str, constant=True)
+ def connectionText(self) -> str:
+ return self._connection_text
+
+ def materialHotendChangedMessage(self, callback: Callable[[int], None]) -> None:
+ Logger.log("w", "materialHotendChangedMessage needs to be implemented, returning 'Yes'")
+ callback(QMessageBox.Yes)
+
+ def isConnected(self) -> bool:
+ return self._connection_state != ConnectionState.Closed and self._connection_state != ConnectionState.Error
+
+ def setConnectionState(self, connection_state: "ConnectionState") -> None:
+ if self._connection_state != connection_state:
+ self._connection_state = connection_state
+ self.connectionStateChanged.emit(self._id)
+
+ @pyqtProperty(int, constant = True)
+ def connectionType(self) -> "ConnectionType":
+ return self._connection_type
+
+ @pyqtProperty(int, notify = connectionStateChanged)
+ def connectionState(self) -> "ConnectionState":
+ return self._connection_state
+
+ def _update(self) -> None:
+ pass
+
+ def _getPrinterByKey(self, key: str) -> Optional["PrinterOutputModel"]:
+ for printer in self._printers:
+ if printer.key == key:
+ return printer
+
+ return None
+
+ def requestWrite(self, nodes: List["SceneNode"], file_name: Optional[str] = None, limit_mimetypes: bool = False,
+ file_handler: Optional["FileHandler"] = None, **kwargs: str) -> None:
+ raise NotImplementedError("requestWrite needs to be implemented")
+
+ @pyqtProperty(QObject, notify = printersChanged)
+ def activePrinter(self) -> Optional["PrinterOutputModel"]:
+ if len(self._printers):
+ return self._printers[0]
+ return None
+
+ @pyqtProperty("QVariantList", notify = printersChanged)
+ def printers(self) -> List["PrinterOutputModel"]:
+ return self._printers
+
+ @pyqtProperty(QObject, constant = True)
+ def monitorItem(self) -> QObject:
+ # Note that we specifically only check if the monitor component is created.
+ # It could be that it failed to actually create the qml item! If we check if the item was created, it will try to
+ # create the item (and fail) every time.
+ if not self._monitor_component:
+ self._createMonitorViewFromQML()
+ return self._monitor_item
+
+ @pyqtProperty(QObject, constant = True)
+ def controlItem(self) -> QObject:
+ if not self._control_component:
+ self._createControlViewFromQML()
+ return self._control_item
+
+ def _createControlViewFromQML(self) -> None:
+ if not self._control_view_qml_path:
+ return
+ if self._control_item is None:
+ self._control_item = QtApplication.getInstance().createQmlComponent(self._control_view_qml_path, {"OutputDevice": self})
+
+ def _createMonitorViewFromQML(self) -> None:
+ if not self._monitor_view_qml_path:
+ return
+
+ if self._monitor_item is None:
+ self._monitor_item = QtApplication.getInstance().createQmlComponent(self._monitor_view_qml_path, {"OutputDevice": self})
+
+ ## Attempt to establish connection
+ def connect(self) -> None:
+ self.setConnectionState(ConnectionState.Connecting)
+ self._update_timer.start()
+
+ ## Attempt to close the connection
+ def close(self) -> None:
+ self._update_timer.stop()
+ self.setConnectionState(ConnectionState.Closed)
+
+ ## Ensure that close gets called when object is destroyed
+ def __del__(self) -> None:
+ self.close()
+
+ @pyqtProperty(bool, notify = acceptsCommandsChanged)
+ def acceptsCommands(self) -> bool:
+ return self._accepts_commands
+
+ @deprecated("Please use the protected function instead", "3.2")
+ def setAcceptsCommands(self, accepts_commands: bool) -> None:
+ self._setAcceptsCommands(accepts_commands)
+
+ ## Set a flag to signal the UI that the printer is not (yet) ready to receive commands
+ def _setAcceptsCommands(self, accepts_commands: bool) -> None:
+ if self._accepts_commands != accepts_commands:
+ self._accepts_commands = accepts_commands
+
+ self.acceptsCommandsChanged.emit()
+
+ # Returns the unique configurations of the printers within this output device
+ @pyqtProperty("QVariantList", notify = uniqueConfigurationsChanged)
+ def uniqueConfigurations(self) -> List["PrinterConfigurationModel"]:
+ return self._unique_configurations
+
+ def _updateUniqueConfigurations(self) -> None:
+ self._unique_configurations = sorted(
+ {printer.printerConfiguration for printer in self._printers if printer.printerConfiguration is not None},
+ key=lambda config: config.printerType,
+ )
+ self.uniqueConfigurationsChanged.emit()
+
+ # Returns the unique configurations of the printers within this output device
+ @pyqtProperty("QStringList", notify = uniqueConfigurationsChanged)
+ def uniquePrinterTypes(self) -> List[str]:
+ return list(sorted(set([configuration.printerType for configuration in self._unique_configurations])))
+
+ def _onPrintersChanged(self) -> None:
+ for printer in self._printers:
+ printer.configurationChanged.connect(self._updateUniqueConfigurations)
+
+ # At this point there may be non-updated configurations
+ self._updateUniqueConfigurations()
+
+ ## Set the device firmware name
+ #
+ # \param name The name of the firmware.
+ def _setFirmwareName(self, name: str) -> None:
+ self._firmware_name = name
+
+ ## Get the name of device firmware
+ #
+ # This name can be used to define device type
+ def getFirmwareName(self) -> Optional[str]:
+ return self._firmware_name
+
+ def getFirmwareUpdater(self) -> Optional["FirmwareUpdater"]:
+ return self._firmware_updater
+
+ @pyqtSlot(str)
+ def updateFirmware(self, firmware_file: Union[str, QUrl]) -> None:
+ if not self._firmware_updater:
+ return
+
+ self._firmware_updater.updateFirmware(firmware_file)
diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py
index 12884b5f9b..736e6c7aa3 100644
--- a/cura/PrinterOutput/PrinterOutputModel.py
+++ b/cura/PrinterOutput/PrinterOutputModel.py
@@ -1,297 +1,4 @@
-# Copyright (c) 2019 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot, QUrl
-from typing import List, Dict, Optional
-from UM.Math.Vector import Vector
-from cura.PrinterOutput.ConfigurationModel import ConfigurationModel
-from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel
-
-MYPY = False
-if MYPY:
- from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
- from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
-
-
-class PrinterOutputModel(QObject):
- bedTemperatureChanged = pyqtSignal()
- targetBedTemperatureChanged = pyqtSignal()
- isPreheatingChanged = pyqtSignal()
- stateChanged = pyqtSignal()
- activePrintJobChanged = pyqtSignal()
- nameChanged = pyqtSignal()
- headPositionChanged = pyqtSignal()
- keyChanged = pyqtSignal()
- typeChanged = pyqtSignal()
- buildplateChanged = pyqtSignal()
- cameraUrlChanged = pyqtSignal()
- configurationChanged = pyqtSignal()
- canUpdateFirmwareChanged = pyqtSignal()
-
- def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None, firmware_version = "") -> None:
- super().__init__(parent)
- self._bed_temperature = -1 # type: float # Use -1 for no heated bed.
- self._target_bed_temperature = 0 # type: float
- self._name = ""
- self._key = "" # Unique identifier
- self._controller = output_controller
- self._controller.canUpdateFirmwareChanged.connect(self._onControllerCanUpdateFirmwareChanged)
- self._extruders = [ExtruderOutputModel(printer = self, position = i) for i in range(number_of_extruders)]
- self._printer_configuration = ConfigurationModel() # Indicates the current configuration setup in this printer
- self._head_position = Vector(0, 0, 0)
- self._active_print_job = None # type: Optional[PrintJobOutputModel]
- self._firmware_version = firmware_version
- self._printer_state = "unknown"
- self._is_preheating = False
- self._printer_type = ""
- self._buildplate = ""
-
- self._printer_configuration.extruderConfigurations = [extruder.extruderConfiguration for extruder in
- self._extruders]
-
- self._camera_url = QUrl() # type: QUrl
-
- @pyqtProperty(str, constant = True)
- def firmwareVersion(self) -> str:
- return self._firmware_version
-
- def setCameraUrl(self, camera_url: "QUrl") -> None:
- if self._camera_url != camera_url:
- self._camera_url = camera_url
- self.cameraUrlChanged.emit()
-
- @pyqtProperty(QUrl, fset = setCameraUrl, notify = cameraUrlChanged)
- def cameraUrl(self) -> "QUrl":
- return self._camera_url
-
- def updateIsPreheating(self, pre_heating: bool) -> None:
- if self._is_preheating != pre_heating:
- self._is_preheating = pre_heating
- self.isPreheatingChanged.emit()
-
- @pyqtProperty(bool, notify=isPreheatingChanged)
- def isPreheating(self) -> bool:
- return self._is_preheating
-
- @pyqtProperty(str, notify = typeChanged)
- def type(self) -> str:
- return self._printer_type
-
- def updateType(self, printer_type: str) -> None:
- if self._printer_type != printer_type:
- self._printer_type = printer_type
- self._printer_configuration.printerType = self._printer_type
- self.typeChanged.emit()
- self.configurationChanged.emit()
-
- @pyqtProperty(str, notify = buildplateChanged)
- def buildplate(self) -> str:
- return self._buildplate
-
- def updateBuildplate(self, buildplate: str) -> None:
- if self._buildplate != buildplate:
- self._buildplate = buildplate
- self._printer_configuration.buildplateConfiguration = self._buildplate
- self.buildplateChanged.emit()
- self.configurationChanged.emit()
-
- @pyqtProperty(str, notify=keyChanged)
- def key(self) -> str:
- return self._key
-
- def updateKey(self, key: str) -> None:
- if self._key != key:
- self._key = key
- self.keyChanged.emit()
-
- @pyqtSlot()
- def homeHead(self) -> None:
- self._controller.homeHead(self)
-
- @pyqtSlot()
- def homeBed(self) -> None:
- self._controller.homeBed(self)
-
- @pyqtSlot(str)
- def sendRawCommand(self, command: str) -> None:
- self._controller.sendRawCommand(self, command)
-
- @pyqtProperty("QVariantList", constant = True)
- def extruders(self) -> List["ExtruderOutputModel"]:
- return self._extruders
-
- @pyqtProperty(QVariant, notify = headPositionChanged)
- def headPosition(self) -> Dict[str, float]:
- return {"x": self._head_position.x, "y": self._head_position.y, "z": self.head_position.z}
-
- def updateHeadPosition(self, x: float, y: float, z: float) -> None:
- if self._head_position.x != x or self._head_position.y != y or self._head_position.z != z:
- self._head_position = Vector(x, y, z)
- self.headPositionChanged.emit()
-
- @pyqtProperty(float, float, float)
- @pyqtProperty(float, float, float, float)
- def setHeadPosition(self, x: float, y: float, z: float, speed: float = 3000) -> None:
- self.updateHeadPosition(x, y, z)
- self._controller.setHeadPosition(self, x, y, z, speed)
-
- @pyqtProperty(float)
- @pyqtProperty(float, float)
- def setHeadX(self, x: float, speed: float = 3000) -> None:
- self.updateHeadPosition(x, self._head_position.y, self._head_position.z)
- self._controller.setHeadPosition(self, x, self._head_position.y, self._head_position.z, speed)
-
- @pyqtProperty(float)
- @pyqtProperty(float, float)
- def setHeadY(self, y: float, speed: float = 3000) -> None:
- self.updateHeadPosition(self._head_position.x, y, self._head_position.z)
- self._controller.setHeadPosition(self, self._head_position.x, y, self._head_position.z, speed)
-
- @pyqtProperty(float)
- @pyqtProperty(float, float)
- def setHeadZ(self, z: float, speed:float = 3000) -> None:
- self.updateHeadPosition(self._head_position.x, self._head_position.y, z)
- self._controller.setHeadPosition(self, self._head_position.x, self._head_position.y, z, speed)
-
- @pyqtSlot(float, float, float)
- @pyqtSlot(float, float, float, float)
- def moveHead(self, x: float = 0, y: float = 0, z: float = 0, speed: float = 3000) -> None:
- self._controller.moveHead(self, x, y, z, speed)
-
- ## Pre-heats the heated bed of the printer.
- #
- # \param temperature The temperature to heat the bed to, in degrees
- # Celsius.
- # \param duration How long the bed should stay warm, in seconds.
- @pyqtSlot(float, float)
- def preheatBed(self, temperature: float, duration: float) -> None:
- self._controller.preheatBed(self, temperature, duration)
-
- @pyqtSlot()
- def cancelPreheatBed(self) -> None:
- self._controller.cancelPreheatBed(self)
-
- def getController(self) -> "PrinterOutputController":
- return self._controller
-
- @pyqtProperty(str, notify = nameChanged)
- def name(self) -> str:
- return self._name
-
- def setName(self, name: str) -> None:
- self.updateName(name)
-
- def updateName(self, name: str) -> None:
- if self._name != name:
- self._name = name
- self.nameChanged.emit()
-
- ## Update the bed temperature. This only changes it locally.
- def updateBedTemperature(self, temperature: float) -> None:
- if self._bed_temperature != temperature:
- self._bed_temperature = temperature
- self.bedTemperatureChanged.emit()
-
- def updateTargetBedTemperature(self, temperature: float) -> None:
- if self._target_bed_temperature != temperature:
- self._target_bed_temperature = temperature
- self.targetBedTemperatureChanged.emit()
-
- ## Set the target bed temperature. This ensures that it's actually sent to the remote.
- @pyqtSlot(float)
- def setTargetBedTemperature(self, temperature: float) -> None:
- self._controller.setTargetBedTemperature(self, temperature)
- self.updateTargetBedTemperature(temperature)
-
- def updateActivePrintJob(self, print_job: Optional["PrintJobOutputModel"]) -> None:
- if self._active_print_job != print_job:
- old_print_job = self._active_print_job
-
- if print_job is not None:
- print_job.updateAssignedPrinter(self)
- self._active_print_job = print_job
-
- if old_print_job is not None:
- old_print_job.updateAssignedPrinter(None)
- self.activePrintJobChanged.emit()
-
- def updateState(self, printer_state: str) -> None:
- if self._printer_state != printer_state:
- self._printer_state = printer_state
- self.stateChanged.emit()
-
- @pyqtProperty(QObject, notify = activePrintJobChanged)
- def activePrintJob(self) -> Optional["PrintJobOutputModel"]:
- return self._active_print_job
-
- @pyqtProperty(str, notify = stateChanged)
- def state(self) -> str:
- return self._printer_state
-
- @pyqtProperty(float, notify = bedTemperatureChanged)
- def bedTemperature(self) -> float:
- return self._bed_temperature
-
- @pyqtProperty(float, notify = targetBedTemperatureChanged)
- def targetBedTemperature(self) -> float:
- return self._target_bed_temperature
-
- # Does the printer support pre-heating the bed at all
- @pyqtProperty(bool, constant = True)
- def canPreHeatBed(self) -> bool:
- if self._controller:
- return self._controller.can_pre_heat_bed
- return False
-
- # Does the printer support pre-heating the bed at all
- @pyqtProperty(bool, constant = True)
- def canPreHeatHotends(self) -> bool:
- if self._controller:
- return self._controller.can_pre_heat_hotends
- return False
-
- # Does the printer support sending raw G-code at all
- @pyqtProperty(bool, constant = True)
- def canSendRawGcode(self) -> bool:
- if self._controller:
- return self._controller.can_send_raw_gcode
- return False
-
- # Does the printer support pause at all
- @pyqtProperty(bool, constant = True)
- def canPause(self) -> bool:
- if self._controller:
- return self._controller.can_pause
- return False
-
- # Does the printer support abort at all
- @pyqtProperty(bool, constant = True)
- def canAbort(self) -> bool:
- if self._controller:
- return self._controller.can_abort
- return False
-
- # Does the printer support manual control at all
- @pyqtProperty(bool, constant = True)
- def canControlManually(self) -> bool:
- if self._controller:
- return self._controller.can_control_manually
- return False
-
- # Does the printer support upgrading firmware
- @pyqtProperty(bool, notify = canUpdateFirmwareChanged)
- def canUpdateFirmware(self) -> bool:
- if self._controller:
- return self._controller.can_update_firmware
- return False
-
- # Stub to connect UM.Signal to pyqtSignal
- def _onControllerCanUpdateFirmwareChanged(self) -> None:
- self.canUpdateFirmwareChanged.emit()
-
- # Returns the configuration (material, variant and buildplate) of the current printer
- @pyqtProperty(QObject, notify = configurationChanged)
- def printerConfiguration(self) -> Optional[ConfigurationModel]:
- if self._printer_configuration.isValid():
- return self._printer_configuration
- return None
\ No newline at end of file
+import warnings
+warnings.warn("Importing cura.PrinterOutput.PrinterOutputModel has been deprecated since 4.1, use cura.PrinterOutput.Models.PrinterOutputModel inststad", DeprecationWarning, stacklevel=2)
+# We moved the the models to one submodule deeper
+from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel
\ No newline at end of file
diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py
index dbdf8c986c..0da1ae349d 100644
--- a/cura/PrinterOutputDevice.py
+++ b/cura/PrinterOutputDevice.py
@@ -1,261 +1,4 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-from enum import IntEnum
-from typing import Callable, List, Optional, Union
-
-from UM.Decorators import deprecated
-from UM.i18n import i18nCatalog
-from UM.OutputDevice.OutputDevice import OutputDevice
-from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject, QTimer, QUrl
-from PyQt5.QtWidgets import QMessageBox
-
-from UM.Logger import Logger
-from UM.Signal import signalemitter
-from UM.Qt.QtApplication import QtApplication
-from UM.FlameProfiler import pyqtSlot
-
-MYPY = False
-if MYPY:
- from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
- from cura.PrinterOutput.ConfigurationModel import ConfigurationModel
- from cura.PrinterOutput.FirmwareUpdater import FirmwareUpdater
- from UM.FileHandler.FileHandler import FileHandler
- from UM.Scene.SceneNode import SceneNode
-
-i18n_catalog = i18nCatalog("cura")
-
-
-## The current processing state of the backend.
-class ConnectionState(IntEnum):
- Closed = 0
- Connecting = 1
- Connected = 2
- Busy = 3
- Error = 4
-
-
-class ConnectionType(IntEnum):
- NotConnected = 0
- UsbConnection = 1
- NetworkConnection = 2
- CloudConnection = 3
-
-
-## Printer output device adds extra interface options on top of output device.
-#
-# The assumption is made the printer is a FDM printer.
-#
-# Note that a number of settings are marked as "final". This is because decorators
-# are not inherited by children. To fix this we use the private counter part of those
-# functions to actually have the implementation.
-#
-# For all other uses it should be used in the same way as a "regular" OutputDevice.
-@signalemitter
-class PrinterOutputDevice(QObject, OutputDevice):
-
- printersChanged = pyqtSignal()
- connectionStateChanged = pyqtSignal(str)
- acceptsCommandsChanged = pyqtSignal()
-
- # Signal to indicate that the material of the active printer on the remote changed.
- materialIdChanged = pyqtSignal()
-
- # # Signal to indicate that the hotend of the active printer on the remote changed.
- hotendIdChanged = pyqtSignal()
-
- # Signal to indicate that the info text about the connection has changed.
- connectionTextChanged = pyqtSignal()
-
- # Signal to indicate that the configuration of one of the printers has changed.
- uniqueConfigurationsChanged = pyqtSignal()
-
- def __init__(self, device_id: str, connection_type: "ConnectionType" = ConnectionType.NotConnected, parent: QObject = None) -> None:
- super().__init__(device_id = device_id, parent = parent) # type: ignore # MyPy complains with the multiple inheritance
-
- self._printers = [] # type: List[PrinterOutputModel]
- self._unique_configurations = [] # type: List[ConfigurationModel]
-
- self._monitor_view_qml_path = "" # type: str
- self._monitor_component = None # type: Optional[QObject]
- self._monitor_item = None # type: Optional[QObject]
-
- self._control_view_qml_path = "" # type: str
- self._control_component = None # type: Optional[QObject]
- self._control_item = None # type: Optional[QObject]
-
- self._accepts_commands = False # type: bool
-
- self._update_timer = QTimer() # type: QTimer
- self._update_timer.setInterval(2000) # TODO; Add preference for update interval
- self._update_timer.setSingleShot(False)
- self._update_timer.timeout.connect(self._update)
-
- self._connection_state = ConnectionState.Closed # type: ConnectionState
- self._connection_type = connection_type # type: ConnectionType
-
- self._firmware_updater = None # type: Optional[FirmwareUpdater]
- self._firmware_name = None # type: Optional[str]
- self._address = "" # type: str
- self._connection_text = "" # type: str
- self.printersChanged.connect(self._onPrintersChanged)
- QtApplication.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._updateUniqueConfigurations)
-
- @pyqtProperty(str, notify = connectionTextChanged)
- def address(self) -> str:
- return self._address
-
- def setConnectionText(self, connection_text):
- if self._connection_text != connection_text:
- self._connection_text = connection_text
- self.connectionTextChanged.emit()
-
- @pyqtProperty(str, constant=True)
- def connectionText(self) -> str:
- return self._connection_text
-
- def materialHotendChangedMessage(self, callback: Callable[[int], None]) -> None:
- Logger.log("w", "materialHotendChangedMessage needs to be implemented, returning 'Yes'")
- callback(QMessageBox.Yes)
-
- def isConnected(self) -> bool:
- return self._connection_state != ConnectionState.Closed and self._connection_state != ConnectionState.Error
-
- def setConnectionState(self, connection_state: "ConnectionState") -> None:
- if self._connection_state != connection_state:
- self._connection_state = connection_state
- self.connectionStateChanged.emit(self._id)
-
- @pyqtProperty(int, constant = True)
- def connectionType(self) -> "ConnectionType":
- return self._connection_type
-
- @pyqtProperty(int, notify = connectionStateChanged)
- def connectionState(self) -> "ConnectionState":
- return self._connection_state
-
- def _update(self) -> None:
- pass
-
- def _getPrinterByKey(self, key: str) -> Optional["PrinterOutputModel"]:
- for printer in self._printers:
- if printer.key == key:
- return printer
-
- return None
-
- def requestWrite(self, nodes: List["SceneNode"], file_name: Optional[str] = None, limit_mimetypes: bool = False,
- file_handler: Optional["FileHandler"] = None, **kwargs: str) -> None:
- raise NotImplementedError("requestWrite needs to be implemented")
-
- @pyqtProperty(QObject, notify = printersChanged)
- def activePrinter(self) -> Optional["PrinterOutputModel"]:
- if len(self._printers):
- return self._printers[0]
- return None
-
- @pyqtProperty("QVariantList", notify = printersChanged)
- def printers(self) -> List["PrinterOutputModel"]:
- return self._printers
-
- @pyqtProperty(QObject, constant = True)
- def monitorItem(self) -> QObject:
- # Note that we specifically only check if the monitor component is created.
- # It could be that it failed to actually create the qml item! If we check if the item was created, it will try to
- # create the item (and fail) every time.
- if not self._monitor_component:
- self._createMonitorViewFromQML()
- return self._monitor_item
-
- @pyqtProperty(QObject, constant = True)
- def controlItem(self) -> QObject:
- if not self._control_component:
- self._createControlViewFromQML()
- return self._control_item
-
- def _createControlViewFromQML(self) -> None:
- if not self._control_view_qml_path:
- return
- if self._control_item is None:
- self._control_item = QtApplication.getInstance().createQmlComponent(self._control_view_qml_path, {"OutputDevice": self})
-
- def _createMonitorViewFromQML(self) -> None:
- if not self._monitor_view_qml_path:
- return
-
- if self._monitor_item is None:
- self._monitor_item = QtApplication.getInstance().createQmlComponent(self._monitor_view_qml_path, {"OutputDevice": self})
-
- ## Attempt to establish connection
- def connect(self) -> None:
- self.setConnectionState(ConnectionState.Connecting)
- self._update_timer.start()
-
- ## Attempt to close the connection
- def close(self) -> None:
- self._update_timer.stop()
- self.setConnectionState(ConnectionState.Closed)
-
- ## Ensure that close gets called when object is destroyed
- def __del__(self) -> None:
- self.close()
-
- @pyqtProperty(bool, notify = acceptsCommandsChanged)
- def acceptsCommands(self) -> bool:
- return self._accepts_commands
-
- @deprecated("Please use the protected function instead", "3.2")
- def setAcceptsCommands(self, accepts_commands: bool) -> None:
- self._setAcceptsCommands(accepts_commands)
-
- ## Set a flag to signal the UI that the printer is not (yet) ready to receive commands
- def _setAcceptsCommands(self, accepts_commands: bool) -> None:
- if self._accepts_commands != accepts_commands:
- self._accepts_commands = accepts_commands
-
- self.acceptsCommandsChanged.emit()
-
- # Returns the unique configurations of the printers within this output device
- @pyqtProperty("QVariantList", notify = uniqueConfigurationsChanged)
- def uniqueConfigurations(self) -> List["ConfigurationModel"]:
- return self._unique_configurations
-
- def _updateUniqueConfigurations(self) -> None:
- self._unique_configurations = sorted(
- {printer.printerConfiguration for printer in self._printers if printer.printerConfiguration is not None},
- key=lambda config: config.printerType,
- )
- self.uniqueConfigurationsChanged.emit()
-
- # Returns the unique configurations of the printers within this output device
- @pyqtProperty("QStringList", notify = uniqueConfigurationsChanged)
- def uniquePrinterTypes(self) -> List[str]:
- return list(sorted(set([configuration.printerType for configuration in self._unique_configurations])))
-
- def _onPrintersChanged(self) -> None:
- for printer in self._printers:
- printer.configurationChanged.connect(self._updateUniqueConfigurations)
-
- # At this point there may be non-updated configurations
- self._updateUniqueConfigurations()
-
- ## Set the device firmware name
- #
- # \param name The name of the firmware.
- def _setFirmwareName(self, name: str) -> None:
- self._firmware_name = name
-
- ## Get the name of device firmware
- #
- # This name can be used to define device type
- def getFirmwareName(self) -> Optional[str]:
- return self._firmware_name
-
- def getFirmwareUpdater(self) -> Optional["FirmwareUpdater"]:
- return self._firmware_updater
-
- @pyqtSlot(str)
- def updateFirmware(self, firmware_file: Union[str, QUrl]) -> None:
- if not self._firmware_updater:
- return
-
- self._firmware_updater.updateFirmware(firmware_file)
+import warnings
+warnings.warn("Importing cura.PrinterOutputDevice has been deprecated since 4.1, use cura.PrinterOutput.PrinterOutputDevice inststad", DeprecationWarning, stacklevel=2)
+# We moved the PrinterOutput device to it's own submodule.
+from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice, ConnectionState
\ No newline at end of file
diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py
index da71f6920e..1aae97942a 100644
--- a/cura/Scene/ConvexHullDecorator.py
+++ b/cura/Scene/ConvexHullDecorator.py
@@ -60,13 +60,11 @@ class ConvexHullDecorator(SceneNodeDecorator):
previous_node = self._node
# Disconnect from previous node signals
if previous_node is not None and node is not previous_node:
- previous_node.transformationChanged.disconnect(self._onChanged)
- previous_node.parentChanged.disconnect(self._onChanged)
+ previous_node.boundingBoxChanged.disconnect(self._onChanged)
super().setNode(node)
- # Mypy doesn't understand that self._node is no longer optional, so just use the node.
- node.transformationChanged.connect(self._onChanged)
- node.parentChanged.connect(self._onChanged)
+
+ node.boundingBoxChanged.connect(self._onChanged)
self._onChanged()
diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py
index 9f26ea7cc3..91ff26cadc 100644
--- a/cura/Scene/CuraSceneController.py
+++ b/cura/Scene/CuraSceneController.py
@@ -4,7 +4,7 @@ from PyQt5.QtCore import Qt, pyqtSlot, QObject
from PyQt5.QtWidgets import QApplication
from UM.Scene.Camera import Camera
-from cura.ObjectsModel import ObjectsModel
+from cura.UI.ObjectsModel import ObjectsModel
from cura.Machines.Models.MultiBuildPlateModel import MultiBuildPlateModel
from UM.Application import Application
diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py
index 259c273329..1983bc6008 100644
--- a/cura/Scene/CuraSceneNode.py
+++ b/cura/Scene/CuraSceneNode.py
@@ -112,21 +112,21 @@ class CuraSceneNode(SceneNode):
## Override of SceneNode._calculateAABB to exclude non-printing-meshes from bounding box
def _calculateAABB(self) -> None:
+ self._aabb = None
if self._mesh_data:
- aabb = self._mesh_data.getExtents(self.getWorldTransformation())
- else: # If there is no mesh_data, use a boundingbox that encompasses the local (0,0,0)
- position = self.getWorldPosition()
- aabb = AxisAlignedBox(minimum = position, maximum = position)
+ self._aabb = self._mesh_data.getExtents(self.getWorldTransformation())
- for child in self._children:
+ for child in self.getAllChildren():
if child.callDecoration("isNonPrintingMesh"):
# Non-printing-meshes inside a group should not affect push apart or drop to build plate
continue
- if aabb is None:
- aabb = child.getBoundingBox()
+ if not child.getMeshData():
+ # Nodes without mesh data should not affect bounding boxes of their parents.
+ continue
+ if self._aabb is None:
+ self._aabb = child.getBoundingBox()
else:
- aabb = aabb + child.getBoundingBox()
- self._aabb = aabb
+ self._aabb = self._aabb + child.getBoundingBox()
## Taken from SceneNode, but replaced SceneNode with CuraSceneNode
def __deepcopy__(self, memo: Dict[int, object]) -> "CuraSceneNode":
diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py
index 133e04e8fc..2422fa3b21 100644
--- a/cura/Settings/ContainerManager.py
+++ b/cura/Settings/ContainerManager.py
@@ -47,8 +47,10 @@ class ContainerManager(QObject):
if ContainerManager.__instance is not None:
raise RuntimeError("Try to create singleton '%s' more than once" % self.__class__.__name__)
ContainerManager.__instance = self
-
- super().__init__(parent = application)
+ try:
+ super().__init__(parent = application)
+ except TypeError:
+ super().__init__()
self._application = application # type: CuraApplication
self._plugin_registry = self._application.getPluginRegistry() # type: PluginRegistry
diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py
index a9f79d63d3..dd7ed625d6 100644
--- a/cura/Settings/CuraContainerRegistry.py
+++ b/cura/Settings/CuraContainerRegistry.py
@@ -1,11 +1,11 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import os
import re
import configparser
-from typing import cast, Dict, Optional
+from typing import Any, cast, Dict, Optional
from PyQt5.QtWidgets import QMessageBox
from UM.Decorators import override
@@ -327,6 +327,23 @@ class CuraContainerRegistry(ContainerRegistry):
self._registerSingleExtrusionMachinesExtruderStacks()
self._connectUpgradedExtruderStacksToMachines()
+ ## Check if the metadata for a container is okay before adding it.
+ #
+ # This overrides the one from UM.Settings.ContainerRegistry because we
+ # also require that the setting_version is correct.
+ @override(ContainerRegistry)
+ def _isMetadataValid(self, metadata: Optional[Dict[str, Any]]) -> bool:
+ if metadata is None:
+ return False
+ if "setting_version" not in metadata:
+ return False
+ try:
+ if int(metadata["setting_version"]) != cura.CuraApplication.CuraApplication.SettingVersion:
+ return False
+ except ValueError: #Not parsable as int.
+ return False
+ return True
+
## Update an imported profile to match the current machine configuration.
#
# \param profile The profile to configure.
diff --git a/cura/Settings/CuraFormulaFunctions.py b/cura/Settings/CuraFormulaFunctions.py
index 9ef80bd3d4..a8b416eeb5 100644
--- a/cura/Settings/CuraFormulaFunctions.py
+++ b/cura/Settings/CuraFormulaFunctions.py
@@ -42,7 +42,14 @@ class CuraFormulaFunctions:
try:
extruder_stack = global_stack.extruders[str(extruder_position)]
except KeyError:
- Logger.log("w", "Value for %s of extruder %s was requested, but that extruder is not available" % (property_key, extruder_position))
+ if extruder_position != 0:
+ Logger.log("w", "Value for %s of extruder %s was requested, but that extruder is not available. Returning the result form extruder 0 instead" % (property_key, extruder_position))
+ # This fixes a very specific fringe case; If a profile was created for a custom printer and one of the
+ # extruder settings has been set to non zero and the profile is loaded for a machine that has only a single extruder
+ # it would cause all kinds of issues (and eventually a crash).
+ # See https://github.com/Ultimaker/Cura/issues/5535
+ return self.getValueInExtruder(0, property_key, context)
+ Logger.log("w", "Value for %s of extruder %s was requested, but that extruder is not available. " % (property_key, extruder_position))
return None
value = extruder_stack.getRawProperty(property_key, "value", context = context)
diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py
index c98c63f529..d20e686279 100644
--- a/cura/Settings/CuraStackBuilder.py
+++ b/cura/Settings/CuraStackBuilder.py
@@ -125,7 +125,12 @@ class CuraStackBuilder:
extruder_definition_dict = global_stack.getMetaDataEntry("machine_extruder_trains")
extruder_definition_id = extruder_definition_dict[str(extruder_position)]
- extruder_definition = registry.findDefinitionContainers(id = extruder_definition_id)[0]
+ try:
+ extruder_definition = registry.findDefinitionContainers(id = extruder_definition_id)[0]
+ except IndexError as e:
+ # It still needs to break, but we want to know what extruder ID made it break.
+ Logger.log("e", "Unable to find extruder with the id %s", extruder_definition_id)
+ raise e
# get material container for extruders
material_container = application.empty_material_container
diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py
index f8dccb4ba6..5ef308c779 100755
--- a/cura/Settings/ExtruderManager.py
+++ b/cura/Settings/ExtruderManager.py
@@ -224,7 +224,16 @@ class ExtruderManager(QObject):
# Get the extruders of all printable meshes in the scene
meshes = [node for node in DepthFirstIterator(scene_root) if isinstance(node, SceneNode) and node.isSelectable()] #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+
+ # Exclude anti-overhang meshes
+ mesh_list = []
for mesh in meshes:
+ stack = mesh.callDecoration("getStack")
+ if stack is not None and (stack.getProperty("anti_overhang_mesh", "value") or stack.getProperty("support_mesh", "value")):
+ continue
+ mesh_list.append(mesh)
+
+ for mesh in mesh_list:
extruder_stack_id = mesh.callDecoration("getActiveExtruder")
if not extruder_stack_id:
# No per-object settings for this node
@@ -338,7 +347,7 @@ class ExtruderManager(QObject):
extruder_train.setNextStack(global_stack)
extruders_changed = True
- self._fixSingleExtrusionMachineExtruderDefinition(global_stack)
+ self.fixSingleExtrusionMachineExtruderDefinition(global_stack)
if extruders_changed:
self.extrudersChanged.emit(global_stack_id)
self.setActiveExtruderIndex(0)
@@ -346,7 +355,7 @@ class ExtruderManager(QObject):
# After 3.4, all single-extrusion machines have their own extruder definition files instead of reusing
# "fdmextruder". We need to check a machine here so its extruder definition is correct according to this.
- def _fixSingleExtrusionMachineExtruderDefinition(self, global_stack: "GlobalStack") -> None:
+ def fixSingleExtrusionMachineExtruderDefinition(self, global_stack: "GlobalStack") -> None:
container_registry = ContainerRegistry.getInstance()
expected_extruder_definition_0_id = global_stack.getMetaDataEntry("machine_extruder_trains")["0"]
extruder_stack_0 = global_stack.extruders.get("0")
diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py
index 3940af7ecc..f6c739a08e 100755
--- a/cura/Settings/GlobalStack.py
+++ b/cura/Settings/GlobalStack.py
@@ -4,6 +4,8 @@
from collections import defaultdict
import threading
from typing import Any, Dict, Optional, Set, TYPE_CHECKING, List
+import uuid
+
from PyQt5.QtCore import pyqtProperty, pyqtSlot, pyqtSignal
from UM.Decorators import override
@@ -34,6 +36,12 @@ class GlobalStack(CuraContainerStack):
self.setMetaDataEntry("type", "machine") # For backward compatibility
+ # TL;DR: If Cura is looking for printers that belong to the same group, it should use "group_id".
+ # Each GlobalStack by default belongs to a group which is identified via "group_id". This group_id is used to
+ # figure out which GlobalStacks are in the printer cluster for example without knowing the implementation
+ # details such as the um_network_key or some other identifier that's used by the underlying device plugin.
+ self.setMetaDataEntry("group_id", str(uuid.uuid4())) # Assign a new GlobalStack to a unique group by default
+
self._extruders = {} # type: Dict[str, "ExtruderStack"]
# This property is used to track which settings we are calculating the "resolve" for
@@ -64,6 +72,14 @@ class GlobalStack(CuraContainerStack):
machine_extruder_count = self.getProperty("machine_extruder_count", "value")
return result_list[:machine_extruder_count]
+ @pyqtProperty(int, constant = True)
+ def maxExtruderCount(self):
+ return len(self.getMetaDataEntry("machine_extruder_trains"))
+
+ @pyqtProperty(bool, notify=configuredConnectionTypesChanged)
+ def supportsNetworkConnection(self):
+ return self.getMetaDataEntry("supports_network_connection", False)
+
@classmethod
def getLoadingPriority(cls) -> int:
return 2
@@ -81,7 +97,15 @@ class GlobalStack(CuraContainerStack):
# Requesting it from the metadata actually gets them as strings (as that's what you get from serializing).
# But we do want them returned as a list of ints (so the rest of the code can directly compare)
connection_types = self.getMetaDataEntry("connection_type", "").split(",")
- return [int(connection_type) for connection_type in connection_types if connection_type != ""]
+ result = []
+ for connection_type in connection_types:
+ if connection_type != "":
+ try:
+ result.append(int(connection_type))
+ except ValueError:
+ # We got invalid data, probably a None.
+ pass
+ return result
## \sa configuredConnectionTypes
def addConfiguredConnectionType(self, connection_type: int) -> None:
@@ -200,7 +224,7 @@ class GlobalStack(CuraContainerStack):
# Determine whether or not we should try to get the "resolve" property instead of the
# requested property.
def _shouldResolve(self, key: str, property_name: str, context: Optional[PropertyEvaluationContext] = None) -> bool:
- if property_name is not "value":
+ if property_name != "value":
# Do not try to resolve anything but the "value" property
return False
@@ -246,6 +270,9 @@ class GlobalStack(CuraContainerStack):
def getHasVariants(self) -> bool:
return parseBool(self.getMetaDataEntry("has_variants", False))
+ def getHasVariantsBuildPlates(self) -> bool:
+ return parseBool(self.getMetaDataEntry("has_variant_buildplates", False))
+
def getHasMachineQuality(self) -> bool:
return parseBool(self.getMetaDataEntry("has_machine_quality", False))
diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py
index 3416f0a321..cd6c7cd191 100755
--- a/cura/Settings/MachineManager.py
+++ b/cura/Settings/MachineManager.py
@@ -6,13 +6,14 @@ import re
import unicodedata
from typing import Any, List, Dict, TYPE_CHECKING, Optional, cast
+from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal, QTimer
+
from UM.ConfigurationErrorMessage import ConfigurationErrorMessage
+from UM.Decorators import deprecated
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
from UM.Settings.InstanceContainer import InstanceContainer
from UM.Settings.Interfaces import ContainerInterface
from UM.Signal import Signal
-
-from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal, QTimer
from UM.FlameProfiler import pyqtSlot
from UM import Util
from UM.Logger import Logger
@@ -22,10 +23,10 @@ from UM.Settings.SettingFunction import SettingFunction
from UM.Signal import postponeSignals, CompressTechnique
from cura.Machines.QualityManager import getMachineDefinitionIDForQualitySearch
-from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionType
-from cura.PrinterOutput.ConfigurationModel import ConfigurationModel
-from cura.PrinterOutput.ExtruderConfigurationModel import ExtruderConfigurationModel
-from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel
+from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice, ConnectionType
+from cura.PrinterOutput.Models.PrinterConfigurationModel import PrinterConfigurationModel
+from cura.PrinterOutput.Models.ExtruderConfigurationModel import ExtruderConfigurationModel
+from cura.PrinterOutput.Models.MaterialOutputModel import MaterialOutputModel
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
from cura.Settings.ExtruderManager import ExtruderManager
from cura.Settings.ExtruderStack import ExtruderStack
@@ -106,7 +107,7 @@ class MachineManager(QObject):
# There might already be some output devices by the time the signal is connected
self._onOutputDevicesChanged()
- self._current_printer_configuration = ConfigurationModel() # Indicates the current configuration setup in this printer
+ self._current_printer_configuration = PrinterConfigurationModel() # Indicates the current configuration setup in this printer
self.activeMaterialChanged.connect(self._onCurrentConfigurationChanged)
self.activeVariantChanged.connect(self._onCurrentConfigurationChanged)
# Force to compute the current configuration
@@ -157,6 +158,7 @@ class MachineManager(QObject):
printerConnectedStatusChanged = pyqtSignal() # Emitted every time the active machine change or the outputdevices change
rootMaterialChanged = pyqtSignal()
+ discoveredPrintersChanged = pyqtSignal()
def setInitialActiveMachine(self) -> None:
active_machine_id = self._application.getPreferences().getValue("cura/active_machine")
@@ -171,10 +173,9 @@ class MachineManager(QObject):
self._printer_output_devices.append(printer_output_device)
self.outputDevicesChanged.emit()
- self.printerConnectedStatusChanged.emit()
@pyqtProperty(QObject, notify = currentConfigurationChanged)
- def currentConfiguration(self) -> ConfigurationModel:
+ def currentConfiguration(self) -> PrinterConfigurationModel:
return self._current_printer_configuration
def _onCurrentConfigurationChanged(self) -> None:
@@ -205,7 +206,7 @@ class MachineManager(QObject):
self.currentConfigurationChanged.emit()
@pyqtSlot(QObject, result = bool)
- def matchesConfiguration(self, configuration: ConfigurationModel) -> bool:
+ def matchesConfiguration(self, configuration: PrinterConfigurationModel) -> bool:
return self._current_printer_configuration == configuration
@pyqtProperty("QVariantList", notify = outputDevicesChanged)
@@ -357,12 +358,11 @@ class MachineManager(QObject):
# Make sure that the default machine actions for this machine have been added
self._application.getMachineActionManager().addDefaultMachineActions(global_stack)
- ExtruderManager.getInstance()._fixSingleExtrusionMachineExtruderDefinition(global_stack)
+ ExtruderManager.getInstance().fixSingleExtrusionMachineExtruderDefinition(global_stack)
if not global_stack.isValid():
# Mark global stack as invalid
ConfigurationErrorMessage.getInstance().addFaultyContainers(global_stack.getId())
return # We're done here
- ExtruderManager.getInstance().setActiveExtruderIndex(0) # Switch to first extruder
self._global_container_stack = global_stack
self._application.setGlobalContainerStack(global_stack)
@@ -370,6 +370,11 @@ class MachineManager(QObject):
self._initMachineState(global_stack)
self._onGlobalContainerChanged()
+ # Switch to the first enabled extruder
+ self.updateDefaultExtruder()
+ default_extruder_position = int(self.defaultExtruderPosition)
+ ExtruderManager.getInstance().setActiveExtruderIndex(default_extruder_position)
+
self.__emitChangedSignals()
## Given a definition id, return the machine with this id.
@@ -386,9 +391,17 @@ class MachineManager(QObject):
return machine
return None
+ @pyqtSlot(str)
@pyqtSlot(str, str)
- def addMachine(self, name: str, definition_id: str) -> None:
- new_stack = CuraStackBuilder.createMachine(name, definition_id)
+ def addMachine(self, definition_id: str, name: Optional[str] = None) -> None:
+ if name is None:
+ definitions = CuraContainerRegistry.getInstance().findDefinitionContainers(id = definition_id)
+ if definitions:
+ name = definitions[0].getName()
+ else:
+ name = definition_id
+
+ new_stack = CuraStackBuilder.createMachine(cast(str, name), definition_id)
if new_stack:
# Instead of setting the global container stack here, we set the active machine and so the signals are emitted
self.setActiveMachine(new_stack.getId())
@@ -486,18 +499,21 @@ class MachineManager(QObject):
return bool(self._stacks_have_errors)
@pyqtProperty(str, notify = globalContainerChanged)
+ @deprecated("use Cura.MachineManager.activeMachine.definition.name instead", "4.1")
def activeMachineDefinitionName(self) -> str:
if self._global_container_stack:
return self._global_container_stack.definition.getName()
return ""
@pyqtProperty(str, notify = globalContainerChanged)
+ @deprecated("use Cura.MachineManager.activeMachine.name instead", "4.1")
def activeMachineName(self) -> str:
if self._global_container_stack:
return self._global_container_stack.getMetaDataEntry("group_name", self._global_container_stack.getName())
return ""
@pyqtProperty(str, notify = globalContainerChanged)
+ @deprecated("use Cura.MachineManager.activeMachine.id instead", "4.1")
def activeMachineId(self) -> str:
if self._global_container_stack:
return self._global_container_stack.getId()
@@ -531,6 +547,7 @@ class MachineManager(QObject):
return False
@pyqtProperty("QVariantList", notify=globalContainerChanged)
+ @deprecated("use Cura.MachineManager.activeMachine.configuredConnectionTypes instead", "4.1")
def activeMachineConfiguredConnectionTypes(self):
if self._global_container_stack:
return self._global_container_stack.configuredConnectionTypes
@@ -675,11 +692,6 @@ class MachineManager(QObject):
return False
return True
- ## Check if a container is read_only
- @pyqtSlot(str, result = bool)
- def isReadOnly(self, container_id: str) -> bool:
- return CuraContainerRegistry.getInstance().isReadOnly(container_id)
-
## Copy the value of the setting of the current extruder to all other extruders as well as the global container.
@pyqtSlot(str)
def copyValueToExtruders(self, key: str) -> None:
@@ -708,6 +720,7 @@ class MachineManager(QObject):
extruder_stack.userChanges.setProperty(key, "value", new_value)
@pyqtProperty(str, notify = activeVariantChanged)
+ @deprecated("use Cura.MachineManager.activeStack.variant.name instead", "4.1")
def activeVariantName(self) -> str:
if self._active_container_stack:
variant = self._active_container_stack.variant
@@ -717,6 +730,7 @@ class MachineManager(QObject):
return ""
@pyqtProperty(str, notify = activeVariantChanged)
+ @deprecated("use Cura.MachineManager.activeStack.variant.id instead", "4.1")
def activeVariantId(self) -> str:
if self._active_container_stack:
variant = self._active_container_stack.variant
@@ -726,6 +740,7 @@ class MachineManager(QObject):
return ""
@pyqtProperty(str, notify = activeVariantChanged)
+ @deprecated("use Cura.MachineManager.activeMachine.variant.name instead", "4.1")
def activeVariantBuildplateName(self) -> str:
if self._global_container_stack:
variant = self._global_container_stack.variant
@@ -735,6 +750,7 @@ class MachineManager(QObject):
return ""
@pyqtProperty(str, notify = globalContainerChanged)
+ @deprecated("use Cura.MachineManager.activeMachine.definition.id instead", "4.1")
def activeDefinitionId(self) -> str:
if self._global_container_stack:
return self._global_container_stack.definition.id
@@ -781,7 +797,6 @@ class MachineManager(QObject):
self.setActiveMachine(other_machine_stacks[0]["id"])
metadata = CuraContainerRegistry.getInstance().findContainerStacksMetadata(id = machine_id)[0]
- network_key = metadata.get("um_network_key", None)
ExtruderManager.getInstance().removeMachineExtruders(machine_id)
containers = CuraContainerRegistry.getInstance().findInstanceContainersMetadata(type = "user", machine = machine_id)
for container in containers:
@@ -789,8 +804,9 @@ class MachineManager(QObject):
CuraContainerRegistry.getInstance().removeContainer(machine_id)
# If the printer that is being removed is a network printer, the hidden printers have to be also removed
- if network_key:
- metadata_filter = {"um_network_key": network_key}
+ group_id = metadata.get("group_id", None)
+ if group_id:
+ metadata_filter = {"group_id": group_id}
hidden_containers = CuraContainerRegistry.getInstance().findContainerStacks(type = "machine", **metadata_filter)
if hidden_containers:
# This reuses the method and remove all printers recursively
@@ -799,19 +815,19 @@ class MachineManager(QObject):
@pyqtProperty(bool, notify = globalContainerChanged)
def hasMaterials(self) -> bool:
if self._global_container_stack:
- return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_materials", False))
+ return self._global_container_stack.getHasMaterials()
return False
@pyqtProperty(bool, notify = globalContainerChanged)
def hasVariants(self) -> bool:
if self._global_container_stack:
- return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_variants", False))
+ return self._global_container_stack.getHasVariants()
return False
@pyqtProperty(bool, notify = globalContainerChanged)
def hasVariantBuildplates(self) -> bool:
if self._global_container_stack:
- return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_variant_buildplates", False))
+ return self._global_container_stack.getHasVariantsBuildPlates()
return False
## The selected buildplate is compatible if it is compatible with all the materials in all the extruders
@@ -1057,9 +1073,6 @@ class MachineManager(QObject):
def _onMaterialNameChanged(self) -> None:
self.activeMaterialChanged.emit()
- def _onQualityNameChanged(self) -> None:
- self.activeQualityChanged.emit()
-
def _getContainerChangedSignals(self) -> List[Signal]:
if self._global_container_stack is None:
return []
@@ -1347,27 +1360,30 @@ class MachineManager(QObject):
# Get the definition id corresponding to this machine name
machine_definition_id = CuraContainerRegistry.getInstance().findDefinitionContainers(name = machine_name)[0].getId()
# Try to find a machine with the same network key
- new_machine = self.getMachine(machine_definition_id, metadata_filter = {"um_network_key": self.activeMachineNetworkKey()})
+ metadata_filter = {"group_id": self._global_container_stack.getMetaDataEntry("group_id"),
+ "um_network_key": self.activeMachineNetworkKey(),
+ }
+ new_machine = self.getMachine(machine_definition_id, metadata_filter = metadata_filter)
# If there is no machine, then create a new one and set it to the non-hidden instance
if not new_machine:
new_machine = CuraStackBuilder.createMachine(machine_definition_id + "_sync", machine_definition_id)
if not new_machine:
return
+ new_machine.setMetaDataEntry("group_id", self._global_container_stack.getMetaDataEntry("group_id"))
new_machine.setMetaDataEntry("um_network_key", self.activeMachineNetworkKey())
new_machine.setMetaDataEntry("group_name", self.activeMachineNetworkGroupName)
- new_machine.setMetaDataEntry("hidden", False)
new_machine.setMetaDataEntry("connection_type", self._global_container_stack.getMetaDataEntry("connection_type"))
else:
Logger.log("i", "Found a %s with the key %s. Let's use it!", machine_name, self.activeMachineNetworkKey())
- new_machine.setMetaDataEntry("hidden", False)
# Set the current printer instance to hidden (the metadata entry must exist)
+ new_machine.setMetaDataEntry("hidden", False)
self._global_container_stack.setMetaDataEntry("hidden", True)
self.setActiveMachine(new_machine.getId())
@pyqtSlot(QObject)
- def applyRemoteConfiguration(self, configuration: ConfigurationModel) -> None:
+ def applyRemoteConfiguration(self, configuration: PrinterConfigurationModel) -> None:
if self._global_container_stack is None:
return
self.blurSettings.emit()
@@ -1382,8 +1398,9 @@ class MachineManager(QObject):
need_to_show_message = False
for extruder_configuration in configuration.extruderConfigurations:
- extruder_has_hotend = extruder_configuration.hotendID != ""
- extruder_has_material = extruder_configuration.material.guid != ""
+ # We support "" or None, since the cloud uses None instead of empty strings
+ extruder_has_hotend = extruder_configuration.hotendID and extruder_configuration.hotendID != ""
+ extruder_has_material = extruder_configuration.material.guid and extruder_configuration.material.guid != ""
# If the machine doesn't have a hotend or material, disable this extruder
if not extruder_has_hotend or not extruder_has_material:
@@ -1423,6 +1440,7 @@ class MachineManager(QObject):
self._global_container_stack.extruders[position].setEnabled(True)
self.updateMaterialWithVariant(position)
+ self.updateDefaultExtruder()
self.updateNumberExtrudersEnabled()
if configuration.buildplateConfiguration is not None:
@@ -1454,31 +1472,6 @@ class MachineManager(QObject):
if self.hasUserSettings and self._application.getPreferences().getValue("cura/active_mode") == 1:
self._application.discardOrKeepProfileChanges()
- ## Find all container stacks that has the pair 'key = value' in its metadata and replaces the value with 'new_value'
- def replaceContainersMetadata(self, key: str, value: str, new_value: str) -> None:
- machines = CuraContainerRegistry.getInstance().findContainerStacks(type = "machine")
- for machine in machines:
- if machine.getMetaDataEntry(key) == value:
- machine.setMetaDataEntry(key, new_value)
-
- ## This method checks if the name of the group stored in the definition container is correct.
- # After updating from 3.2 to 3.3 some group names may be temporary. If there is a mismatch in the name of the group
- # then all the container stacks are updated, both the current and the hidden ones.
- def checkCorrectGroupName(self, device_id: str, group_name: str) -> None:
- if self._global_container_stack and device_id == self.activeMachineNetworkKey():
- # Check if the group_name is correct. If not, update all the containers connected to the same printer
- if self.activeMachineNetworkGroupName != group_name:
- metadata_filter = {"um_network_key": self.activeMachineNetworkKey()}
- containers = CuraContainerRegistry.getInstance().findContainerStacks(type = "machine", **metadata_filter)
- for container in containers:
- container.setMetaDataEntry("group_name", group_name)
-
- ## This method checks if there is an instance connected to the given network_key
- def existNetworkInstances(self, network_key: str) -> bool:
- metadata_filter = {"um_network_key": network_key}
- containers = CuraContainerRegistry.getInstance().findContainerStacks(type = "machine", **metadata_filter)
- return bool(containers)
-
@pyqtSlot("QVariant")
def setGlobalVariant(self, container_node: "ContainerNode") -> None:
self.blurSettings.emit()
@@ -1649,3 +1642,22 @@ class MachineManager(QObject):
abbr_machine += stripped_word
return abbr_machine
+
+ # Checks if the given machine type name in the available machine list.
+ # The machine type is a code name such as "ultimaker_3", while the machine type name is the human-readable name of
+ # the machine type, which is "Ultimaker 3" for "ultimaker_3".
+ def hasHumanReadableMachineTypeName(self, machine_type_name: str) -> bool:
+ results = self._container_registry.findDefinitionContainersMetadata(name = machine_type_name)
+ return len(results) > 0
+
+ @pyqtSlot(str, result = str)
+ def getMachineTypeNameFromId(self, machine_type_id: str) -> str:
+ machine_type_name = ""
+ results = self._container_registry.findDefinitionContainersMetadata(id = machine_type_id)
+ if results:
+ machine_type_name = results[0]["name"]
+ return machine_type_name
+
+ # Gets all machines that belong to the given group_id.
+ def getMachinesInGroup(self, group_id: str) -> List["GlobalStack"]:
+ return self._container_registry.findContainerStacks(type = "machine", group_id = group_id)
diff --git a/cura/Settings/PerObjectContainerStack.py b/cura/Settings/PerObjectContainerStack.py
index 3589029517..7ed9eb6fb7 100644
--- a/cura/Settings/PerObjectContainerStack.py
+++ b/cura/Settings/PerObjectContainerStack.py
@@ -34,7 +34,7 @@ class PerObjectContainerStack(CuraContainerStack):
if limit_to_extruder is not None:
limit_to_extruder = str(limit_to_extruder)
- # if this stack has the limit_to_extruder "not overriden", use the original limit_to_extruder as the current
+ # if this stack has the limit_to_extruder "not overridden", use the original limit_to_extruder as the current
# limit_to_extruder, so the values retrieved will be from the perspective of the original limit_to_extruder
# stack.
if limit_to_extruder == "-1":
@@ -42,7 +42,7 @@ class PerObjectContainerStack(CuraContainerStack):
limit_to_extruder = context.context["original_limit_to_extruder"]
if limit_to_extruder is not None and limit_to_extruder != "-1" and limit_to_extruder in global_stack.extruders:
- # set the original limit_to_extruder if this is the first stack that has a non-overriden limit_to_extruder
+ # set the original limit_to_extruder if this is the first stack that has a non-overridden limit_to_extruder
if "original_limit_to_extruder" not in context.context:
context.context["original_limit_to_extruder"] = limit_to_extruder
diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py
index 429e6d16ec..f2a465242e 100644
--- a/cura/Settings/SettingOverrideDecorator.py
+++ b/cura/Settings/SettingOverrideDecorator.py
@@ -73,8 +73,8 @@ class SettingOverrideDecorator(SceneNodeDecorator):
# use value from the stack because there can be a delay in signal triggering and "_is_non_printing_mesh"
# has not been updated yet.
- deep_copy._is_non_printing_mesh = self.evaluateIsNonPrintingMesh()
- deep_copy._is_non_thumbnail_visible_mesh = self.evaluateIsNonThumbnailVisibleMesh()
+ deep_copy._is_non_printing_mesh = self._evaluateIsNonPrintingMesh()
+ deep_copy._is_non_thumbnail_visible_mesh = self._evaluateIsNonThumbnailVisibleMesh()
return deep_copy
@@ -102,21 +102,26 @@ class SettingOverrideDecorator(SceneNodeDecorator):
def isNonPrintingMesh(self):
return self._is_non_printing_mesh
- def evaluateIsNonPrintingMesh(self):
+ def _evaluateIsNonPrintingMesh(self):
return any(bool(self._stack.getProperty(setting, "value")) for setting in self._non_printing_mesh_settings)
def isNonThumbnailVisibleMesh(self):
return self._is_non_thumbnail_visible_mesh
- def evaluateIsNonThumbnailVisibleMesh(self):
+ def _evaluateIsNonThumbnailVisibleMesh(self):
return any(bool(self._stack.getProperty(setting, "value")) for setting in self._non_thumbnail_visible_settings)
- def _onSettingChanged(self, instance, property_name): # Reminder: 'property' is a built-in function
+ def _onSettingChanged(self, setting_key, property_name): # Reminder: 'property' is a built-in function
+ # We're only interested in a few settings and only if it's value changed.
if property_name == "value":
- # Trigger slice/need slicing if the value has changed.
- self._is_non_printing_mesh = self.evaluateIsNonPrintingMesh()
- self._is_non_thumbnail_visible_mesh = self.evaluateIsNonThumbnailVisibleMesh()
+ if setting_key in self._non_printing_mesh_settings or setting_key in self._non_thumbnail_visible_settings:
+ # Trigger slice/need slicing if the value has changed.
+ new_is_non_printing_mesh = self._evaluateIsNonPrintingMesh()
+ self._is_non_thumbnail_visible_mesh = self._evaluateIsNonThumbnailVisibleMesh()
+ if self._is_non_printing_mesh != new_is_non_printing_mesh:
+ self._is_non_printing_mesh = new_is_non_printing_mesh
+
Application.getInstance().getBackend().needsSlicing()
Application.getInstance().getBackend().tickle()
diff --git a/cura/Settings/cura_empty_instance_containers.py b/cura/Settings/cura_empty_instance_containers.py
index d76407ed79..534e6f4199 100644
--- a/cura/Settings/cura_empty_instance_containers.py
+++ b/cura/Settings/cura_empty_instance_containers.py
@@ -41,6 +41,22 @@ empty_quality_changes_container.setMetaDataEntry("type", "quality_changes")
empty_quality_changes_container.setMetaDataEntry("quality_type", "not_supported")
+# All empty container IDs set
+ALL_EMPTY_CONTAINER_ID_SET = {
+ EMPTY_CONTAINER_ID,
+ EMPTY_DEFINITION_CHANGES_CONTAINER_ID,
+ EMPTY_VARIANT_CONTAINER_ID,
+ EMPTY_MATERIAL_CONTAINER_ID,
+ EMPTY_QUALITY_CONTAINER_ID,
+ EMPTY_QUALITY_CHANGES_CONTAINER_ID,
+}
+
+
+# Convenience function to check if a container ID represents an empty container.
+def isEmptyContainer(container_id: str) -> bool:
+ return container_id in ALL_EMPTY_CONTAINER_ID_SET
+
+
__all__ = ["EMPTY_CONTAINER_ID",
"empty_container", # For convenience
"EMPTY_DEFINITION_CHANGES_CONTAINER_ID",
@@ -52,5 +68,7 @@ __all__ = ["EMPTY_CONTAINER_ID",
"EMPTY_QUALITY_CHANGES_CONTAINER_ID",
"empty_quality_changes_container",
"EMPTY_QUALITY_CONTAINER_ID",
- "empty_quality_container"
+ "empty_quality_container",
+ "ALL_EMPTY_CONTAINER_ID_SET",
+ "isEmptyContainer",
]
diff --git a/cura/Stages/CuraStage.py b/cura/Stages/CuraStage.py
index 844b0d0768..6c4d46dd72 100644
--- a/cura/Stages/CuraStage.py
+++ b/cura/Stages/CuraStage.py
@@ -1,29 +1,32 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-from PyQt5.QtCore import pyqtProperty, QUrl
-
-from UM.Stage import Stage
-
-
-# Since Cura has a few pre-defined "space claims" for the locations of certain components, we've provided some structure
-# to indicate this.
-# * The StageMenuComponent is the horizontal area below the stage bar. This should be used to show stage specific
-# buttons and elements. This component will be drawn over the bar & main component.
-# * The MainComponent is the component that will be drawn starting from the bottom of the stageBar and fills the rest
-# of the screen.
-class CuraStage(Stage):
- def __init__(self, parent = None) -> None:
- super().__init__(parent)
-
- @pyqtProperty(str, constant = True)
- def stageId(self) -> str:
- return self.getPluginId()
-
- @pyqtProperty(QUrl, constant = True)
- def mainComponent(self) -> QUrl:
- return self.getDisplayComponent("main")
-
- @pyqtProperty(QUrl, constant = True)
- def stageMenuComponent(self) -> QUrl:
- return self.getDisplayComponent("menu")
\ No newline at end of file
+# Copyright (c) 2018 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from PyQt5.QtCore import pyqtProperty, QUrl
+
+from UM.Stage import Stage
+
+
+# Since Cura has a few pre-defined "space claims" for the locations of certain components, we've provided some structure
+# to indicate this.
+# * The StageMenuComponent is the horizontal area below the stage bar. This should be used to show stage specific
+# buttons and elements. This component will be drawn over the bar & main component.
+# * The MainComponent is the component that will be drawn starting from the bottom of the stageBar and fills the rest
+# of the screen.
+class CuraStage(Stage):
+ def __init__(self, parent = None) -> None:
+ super().__init__(parent)
+
+ @pyqtProperty(str, constant = True)
+ def stageId(self) -> str:
+ return self.getPluginId()
+
+ @pyqtProperty(QUrl, constant = True)
+ def mainComponent(self) -> QUrl:
+ return self.getDisplayComponent("main")
+
+ @pyqtProperty(QUrl, constant = True)
+ def stageMenuComponent(self) -> QUrl:
+ return self.getDisplayComponent("menu")
+
+
+__all__ = ["CuraStage"]
diff --git a/cura/Stages/__init__.py b/cura/Stages/__init__.py
index 2977645166..e69de29bb2 100644
--- a/cura/Stages/__init__.py
+++ b/cura/Stages/__init__.py
@@ -1,2 +0,0 @@
-# Copyright (c) 2017 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
diff --git a/cura/UI/AddPrinterPagesModel.py b/cura/UI/AddPrinterPagesModel.py
new file mode 100644
index 0000000000..d40da59b2a
--- /dev/null
+++ b/cura/UI/AddPrinterPagesModel.py
@@ -0,0 +1,31 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from .WelcomePagesModel import WelcomePagesModel
+
+
+#
+# This Qt ListModel is more or less the same the WelcomePagesModel, except that this model is only for adding a printer,
+# so only the steps for adding a printer is included.
+#
+class AddPrinterPagesModel(WelcomePagesModel):
+
+ def initialize(self) -> None:
+ self._pages.append({"id": "add_network_or_local_printer",
+ "page_url": self._getBuiltinWelcomePagePath("AddNetworkOrLocalPrinterContent.qml"),
+ "next_page_id": "machine_actions",
+ "next_page_button_text": self._catalog.i18nc("@action:button", "Add"),
+ "previous_page_button_text": self._catalog.i18nc("@action:button", "Cancel"),
+ })
+ self._pages.append({"id": "add_printer_by_ip",
+ "page_url": self._getBuiltinWelcomePagePath("AddPrinterByIpContent.qml"),
+ "next_page_id": "machine_actions",
+ })
+ self._pages.append({"id": "machine_actions",
+ "page_url": self._getBuiltinWelcomePagePath("FirstStartMachineActionsContent.qml"),
+ "should_show_function": self.shouldShowMachineActions,
+ })
+ self.setItems(self._pages)
+
+
+__all__ = ["AddPrinterPagesModel"]
diff --git a/cura/CuraSplashScreen.py b/cura/UI/CuraSplashScreen.py
similarity index 100%
rename from cura/CuraSplashScreen.py
rename to cura/UI/CuraSplashScreen.py
diff --git a/cura/MachineActionManager.py b/cura/UI/MachineActionManager.py
similarity index 98%
rename from cura/MachineActionManager.py
rename to cura/UI/MachineActionManager.py
index db0f7bfbff..aa90e909e2 100644
--- a/cura/MachineActionManager.py
+++ b/cura/UI/MachineActionManager.py
@@ -12,7 +12,7 @@ from UM.PluginRegistry import PluginRegistry # So MachineAction can be added as
if TYPE_CHECKING:
from cura.CuraApplication import CuraApplication
from cura.Settings.GlobalStack import GlobalStack
- from .MachineAction import MachineAction
+ from cura.MachineAction import MachineAction
## Raised when trying to add an unknown machine action as a required action
@@ -136,7 +136,7 @@ class MachineActionManager(QObject):
# action multiple times).
# \param definition_id The ID of the definition that you want to get the "on added" actions for.
# \returns List of actions.
- @pyqtSlot(str, result="QVariantList")
+ @pyqtSlot(str, result = "QVariantList")
def getFirstStartActions(self, definition_id: str) -> List["MachineAction"]:
if definition_id in self._first_start_actions:
return self._first_start_actions[definition_id]
diff --git a/cura/UI/MachineSettingsManager.py b/cura/UI/MachineSettingsManager.py
new file mode 100644
index 0000000000..7ecd9ed65f
--- /dev/null
+++ b/cura/UI/MachineSettingsManager.py
@@ -0,0 +1,82 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from typing import Optional, TYPE_CHECKING
+
+from PyQt5.QtCore import QObject, pyqtSlot
+
+from UM.i18n import i18nCatalog
+
+if TYPE_CHECKING:
+ from cura.CuraApplication import CuraApplication
+
+
+#
+# This manager provides (convenience) functions to the Machine Settings Dialog QML to update certain machine settings.
+#
+class MachineSettingsManager(QObject):
+
+ def __init__(self, application: "CuraApplication", parent: Optional["QObject"] = None) -> None:
+ super().__init__(parent)
+ self._i18n_catalog = i18nCatalog("cura")
+
+ self._application = application
+
+ # Force rebuilding the build volume by reloading the global container stack. This is a bit of a hack, but it seems
+ # quite enough.
+ @pyqtSlot()
+ def forceUpdate(self) -> None:
+ self._application.getMachineManager().globalContainerChanged.emit()
+
+ # Function for the Machine Settings panel (QML) to update the compatible material diameter after a user has changed
+ # an extruder's compatible material diameter. This ensures that after the modification, changes can be notified
+ # and updated right away.
+ @pyqtSlot(int)
+ def updateMaterialForDiameter(self, extruder_position: int) -> None:
+ # Updates the material container to a material that matches the material diameter set for the printer
+ self._application.getMachineManager().updateMaterialWithVariant(str(extruder_position))
+
+ @pyqtSlot(int)
+ def setMachineExtruderCount(self, extruder_count: int) -> None:
+ # Note: this method was in this class before, but since it's quite generic and other plugins also need it
+ # it was moved to the machine manager instead. Now this method just calls the machine manager.
+ self._application.getMachineManager().setActiveMachineExtruderCount(extruder_count)
+
+ # Function for the Machine Settings panel (QML) to update after the usre changes "Number of Extruders".
+ #
+ # fieldOfView: The Ultimaker 2 family (not 2+) does not have materials in Cura by default, because the material is
+ # to be set on the printer. But when switching to Marlin flavor, the printer firmware can not change/insert material
+ # settings on the fly so they need to be configured in Cura. So when switching between gcode flavors, materials may
+ # need to be enabled/disabled.
+ @pyqtSlot()
+ def updateHasMaterialsMetadata(self):
+ machine_manager = self._application.getMachineManager()
+ material_manager = self._application.getMaterialManager()
+
+ global_stack = machine_manager.activeMachine
+
+ definition = global_stack.definition
+ if definition.getProperty("machine_gcode_flavor", "value") != "UltiGCode" or definition.getMetaDataEntry(
+ "has_materials", False):
+ # In other words: only continue for the UM2 (extended), but not for the UM2+
+ return
+
+ extruder_positions = list(global_stack.extruders.keys())
+ has_materials = global_stack.getProperty("machine_gcode_flavor", "value") != "UltiGCode"
+
+ material_node = None
+ if has_materials:
+ global_stack.setMetaDataEntry("has_materials", True)
+ else:
+ # The metadata entry is stored in an ini, and ini files are parsed as strings only.
+ # Because any non-empty string evaluates to a boolean True, we have to remove the entry to make it False.
+ if "has_materials" in global_stack.getMetaData():
+ global_stack.removeMetaDataEntry("has_materials")
+
+ # set materials
+ for position in extruder_positions:
+ if has_materials:
+ material_node = material_manager.getDefaultMaterial(global_stack, position, None)
+ machine_manager.setMaterial(position, material_node)
+
+ self.forceUpdate()
diff --git a/cura/ObjectsModel.py b/cura/UI/ObjectsModel.py
similarity index 86%
rename from cura/ObjectsModel.py
rename to cura/UI/ObjectsModel.py
index 3432cf5f02..d1ca3353f5 100644
--- a/cura/ObjectsModel.py
+++ b/cura/UI/ObjectsModel.py
@@ -1,6 +1,9 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
+from collections import defaultdict
+from typing import Dict
+
from PyQt5.QtCore import QTimer, Qt
from UM.Application import Application
@@ -10,7 +13,6 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
from UM.Scene.SceneNode import SceneNode
from UM.Scene.Selection import Selection
from UM.i18n import i18nCatalog
-from collections import defaultdict
catalog = i18nCatalog("cura")
@@ -23,7 +25,7 @@ class ObjectsModel(ListModel):
BuilplateNumberRole = Qt.UserRole + 4
NodeRole = Qt.UserRole + 5
- def __init__(self, parent = None):
+ def __init__(self, parent = None) -> None:
super().__init__(parent)
self.addRoleName(self.NameRole, "name")
@@ -42,31 +44,33 @@ class ObjectsModel(ListModel):
self._build_plate_number = -1
- def setActiveBuildPlate(self, nr):
+ def setActiveBuildPlate(self, nr: int) -> None:
if self._build_plate_number != nr:
self._build_plate_number = nr
self._update()
- def _updateSceneDelayed(self, source):
+ def _updateSceneDelayed(self, source) -> None:
if not isinstance(source, Camera):
self._update_timer.start()
- def _updateDelayed(self, *args):
+ def _updateDelayed(self, *args) -> None:
self._update_timer.start()
- def _update(self, *args):
+ def _update(self, *args) -> None:
nodes = []
filter_current_build_plate = Application.getInstance().getPreferences().getValue("view/filter_current_build_plate")
active_build_plate_number = self._build_plate_number
group_nr = 1
- name_count_dict = defaultdict(int)
+ name_count_dict = defaultdict(int) # type: Dict[str, int]
- for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()):
+ for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): # type: ignore
if not isinstance(node, SceneNode):
continue
if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"):
continue
- if node.getParent() and node.getParent().callDecoration("isGroup"):
+
+ parent = node.getParent()
+ if parent and parent.callDecoration("isGroup"):
continue # Grouped nodes don't need resetting as their parent (the group) is resetted)
if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"):
continue
@@ -82,11 +86,11 @@ class ObjectsModel(ListModel):
group_nr += 1
if hasattr(node, "isOutsideBuildArea"):
- is_outside_build_area = node.isOutsideBuildArea()
+ is_outside_build_area = node.isOutsideBuildArea() # type: ignore
else:
is_outside_build_area = False
- #check if we already have an instance of the object based on name
+ # Check if we already have an instance of the object based on name
name_count_dict[name] += 1
name_count = name_count_dict[name]
diff --git a/cura/PrintInformation.py b/cura/UI/PrintInformation.py
similarity index 99%
rename from cura/PrintInformation.py
rename to cura/UI/PrintInformation.py
index ba7c74fd6d..3fafaaba12 100644
--- a/cura/PrintInformation.py
+++ b/cura/UI/PrintInformation.py
@@ -5,8 +5,7 @@ import json
import math
import os
import unicodedata
-import re # To create abbreviations for printer names.
-from typing import Dict, List, Optional
+from typing import Dict, List, Optional, TYPE_CHECKING
from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty, pyqtSlot
@@ -16,8 +15,6 @@ from UM.Scene.SceneNode import SceneNode
from UM.i18n import i18nCatalog
from UM.MimeTypeDatabase import MimeTypeDatabase, MimeTypeNotFoundError
-from typing import TYPE_CHECKING
-
if TYPE_CHECKING:
from cura.CuraApplication import CuraApplication
@@ -84,6 +81,7 @@ class PrintInformation(QObject):
"support_interface": catalog.i18nc("@tooltip", "Support Interface"),
"support": catalog.i18nc("@tooltip", "Support"),
"skirt": catalog.i18nc("@tooltip", "Skirt"),
+ "prime_tower": catalog.i18nc("@tooltip", "Prime Tower"),
"travel": catalog.i18nc("@tooltip", "Travel"),
"retract": catalog.i18nc("@tooltip", "Retractions"),
"none": catalog.i18nc("@tooltip", "Other")
diff --git a/cura/UI/TextManager.py b/cura/UI/TextManager.py
new file mode 100644
index 0000000000..86838a0b48
--- /dev/null
+++ b/cura/UI/TextManager.py
@@ -0,0 +1,69 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+import collections
+from typing import Optional, Dict, List, cast
+
+from PyQt5.QtCore import QObject, pyqtSlot
+
+from UM.Resources import Resources
+from UM.Version import Version
+
+
+#
+# This manager provides means to load texts to QML.
+#
+class TextManager(QObject):
+
+ def __init__(self, parent: Optional["QObject"] = None) -> None:
+ super().__init__(parent)
+
+ self._change_log_text = ""
+
+ @pyqtSlot(result = str)
+ def getChangeLogText(self) -> str:
+ if not self._change_log_text:
+ self._change_log_text = self._loadChangeLogText()
+ return self._change_log_text
+
+ def _loadChangeLogText(self) -> str:
+ # Load change log texts and organize them with a dict
+ file_path = Resources.getPath(Resources.Texts, "change_log.txt")
+ change_logs_dict = {} # type: Dict[Version, Dict[str, List[str]]]
+ with open(file_path, "r", encoding = "utf-8") as f:
+ open_version = None # type: Optional[Version]
+ open_header = "" # Initialise to an empty header in case there is no "*" in the first line of the changelog
+ for line in f:
+ line = line.replace("\n", "")
+ if "[" in line and "]" in line:
+ line = line.replace("[", "")
+ line = line.replace("]", "")
+ open_version = Version(line)
+ if open_version > Version([14, 99, 99]): # Bit of a hack: We released the 15.x.x versions before 2.x
+ open_version = Version([0, open_version.getMinor(), open_version.getRevision(), open_version.getPostfixVersion()])
+ open_header = ""
+ change_logs_dict[open_version] = collections.OrderedDict()
+ elif line.startswith("*"):
+ open_header = line.replace("*", "")
+ change_logs_dict[cast(Version, open_version)][open_header] = []
+ elif line != "":
+ if open_header not in change_logs_dict[cast(Version, open_version)]:
+ change_logs_dict[cast(Version, open_version)][open_header] = []
+ change_logs_dict[cast(Version, open_version)][open_header].append(line)
+
+ # Format changelog text
+ content = ""
+ for version in sorted(change_logs_dict.keys(), reverse = True):
+ text_version = version
+ if version < Version([1, 0, 0]): # Bit of a hack: We released the 15.x.x versions before 2.x
+ text_version = Version([15, version.getMinor(), version.getRevision(), version.getPostfixVersion()])
+ content += "
" + str(text_version) + "
"
+ content += ""
+ for change in change_logs_dict[version]:
+ if str(change) != "":
+ content += "" + str(change) + " "
+ for line in change_logs_dict[version][change]:
+ content += str(line) + " "
+ content += " "
+
+ return content
diff --git a/cura/UI/WelcomePagesModel.py b/cura/UI/WelcomePagesModel.py
new file mode 100644
index 0000000000..c16ec3763e
--- /dev/null
+++ b/cura/UI/WelcomePagesModel.py
@@ -0,0 +1,294 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from collections import deque
+import os
+from typing import TYPE_CHECKING, Optional, List, Dict, Any
+
+from PyQt5.QtCore import QUrl, Qt, pyqtSlot, pyqtProperty, pyqtSignal
+
+from UM.i18n import i18nCatalog
+from UM.Logger import Logger
+from UM.Qt.ListModel import ListModel
+from UM.Resources import Resources
+
+if TYPE_CHECKING:
+ from PyQt5.QtCore import QObject
+ from cura.CuraApplication import CuraApplication
+
+
+#
+# This is the Qt ListModel that contains all welcome pages data. Each page is a page that can be shown as a step in the
+# welcome wizard dialog. Each item in this ListModel represents a page, which contains the following fields:
+#
+# - id : A unique page_id which can be used in function goToPage(page_id)
+# - page_url : The QUrl to the QML file that contains the content of this page
+# - next_page_id : (OPTIONAL) The next page ID to go to when this page finished. This is optional. If this is not
+# provided, it will go to the page with the current index + 1
+# - next_page_button_text: (OPTIONAL) The text to show for the "next" button, by default it's the translated text of
+# "Next". Note that each step QML can decide whether to use this text or not, so it's not
+# mandatory.
+# - should_show_function : (OPTIONAL) An optional function that returns True/False indicating if this page should be
+# shown. By default all pages should be shown. If a function returns False, that page will
+# be skipped and its next page will be shown.
+#
+# Note that in any case, a page that has its "should_show_function" == False will ALWAYS be skipped.
+#
+class WelcomePagesModel(ListModel):
+
+ IdRole = Qt.UserRole + 1 # Page ID
+ PageUrlRole = Qt.UserRole + 2 # URL to the page's QML file
+ NextPageIdRole = Qt.UserRole + 3 # The next page ID it should go to
+ NextPageButtonTextRole = Qt.UserRole + 4 # The text for the next page button
+ PreviousPageButtonTextRole = Qt.UserRole + 5 # The text for the previous page button
+
+ def __init__(self, application: "CuraApplication", parent: Optional["QObject"] = None) -> None:
+ super().__init__(parent)
+
+ self.addRoleName(self.IdRole, "id")
+ self.addRoleName(self.PageUrlRole, "page_url")
+ self.addRoleName(self.NextPageIdRole, "next_page_id")
+ self.addRoleName(self.NextPageButtonTextRole, "next_page_button_text")
+ self.addRoleName(self.PreviousPageButtonTextRole, "previous_page_button_text")
+
+ self._application = application
+ self._catalog = i18nCatalog("cura")
+
+ self._default_next_button_text = self._catalog.i18nc("@action:button", "Next")
+
+ self._pages = [] # type: List[Dict[str, Any]]
+
+ self._current_page_index = 0
+ # Store all the previous page indices so it can go back.
+ self._previous_page_indices_stack = deque() # type: deque
+
+ # If the welcome flow should be shown. It can show the complete flow or just the changelog depending on the
+ # specific case. See initialize() for how this variable is set.
+ self._should_show_welcome_flow = False
+
+ allFinished = pyqtSignal() # emitted when all steps have been finished
+ currentPageIndexChanged = pyqtSignal()
+
+ @pyqtProperty(int, notify = currentPageIndexChanged)
+ def currentPageIndex(self) -> int:
+ return self._current_page_index
+
+ # Returns a float number in [0, 1] which indicates the current progress.
+ @pyqtProperty(float, notify = currentPageIndexChanged)
+ def currentProgress(self) -> float:
+ if len(self._items) == 0:
+ return 0
+ else:
+ return self._current_page_index / len(self._items)
+
+ # Indicates if the current page is the last page.
+ @pyqtProperty(bool, notify = currentPageIndexChanged)
+ def isCurrentPageLast(self) -> bool:
+ return self._current_page_index == len(self._items) - 1
+
+ def _setCurrentPageIndex(self, page_index: int) -> None:
+ if page_index != self._current_page_index:
+ self._previous_page_indices_stack.append(self._current_page_index)
+ self._current_page_index = page_index
+ self.currentPageIndexChanged.emit()
+
+ # Ends the Welcome-Pages. Put as a separate function for cases like the 'decline' in the User-Agreement.
+ @pyqtSlot()
+ def atEnd(self) -> None:
+ self.allFinished.emit()
+ self.resetState()
+
+ # Goes to the next page.
+ # If "from_index" is given, it will look for the next page to show starting from the "from_index" page instead of
+ # the "self._current_page_index".
+ @pyqtSlot()
+ def goToNextPage(self, from_index: Optional[int] = None) -> None:
+ # Look for the next page that should be shown
+ current_index = self._current_page_index if from_index is None else from_index
+ while True:
+ page_item = self._items[current_index]
+
+ # Check if there's a "next_page_id" assigned. If so, go to that page. Otherwise, go to the page with the
+ # current index + 1.
+ next_page_id = page_item.get("next_page_id")
+ next_page_index = current_index + 1
+ if next_page_id:
+ idx = self.getPageIndexById(next_page_id)
+ if idx is None:
+ # FIXME: If we cannot find the next page, we cannot do anything here.
+ Logger.log("e", "Cannot find page with ID [%s]", next_page_id)
+ return
+ next_page_index = idx
+
+ # If we have reached the last page, emit allFinished signal and reset.
+ if next_page_index == len(self._items):
+ self.atEnd()
+ return
+
+ # Check if the this page should be shown (default yes), if not, keep looking for the next one.
+ next_page_item = self.getItem(next_page_index)
+ if self._shouldPageBeShown(next_page_index):
+ break
+
+ Logger.log("d", "Page [%s] should not be displayed, look for the next page.", next_page_item["id"])
+ current_index = next_page_index
+
+ # Move to the next page
+ self._setCurrentPageIndex(next_page_index)
+
+ # Goes to the previous page. If there's no previous page, do nothing.
+ @pyqtSlot()
+ def goToPreviousPage(self) -> None:
+ if len(self._previous_page_indices_stack) == 0:
+ Logger.log("i", "No previous page, do nothing")
+ return
+
+ previous_page_index = self._previous_page_indices_stack.pop()
+ self._current_page_index = previous_page_index
+ self.currentPageIndexChanged.emit()
+
+ # Sets the current page to the given page ID. If the page ID is not found, do nothing.
+ @pyqtSlot(str)
+ def goToPage(self, page_id: str) -> None:
+ page_index = self.getPageIndexById(page_id)
+ if page_index is None:
+ # FIXME: If we cannot find the next page, we cannot do anything here.
+ Logger.log("e", "Cannot find page with ID [%s], go to the next page by default", page_index)
+ self.goToNextPage()
+ return
+
+ if self._shouldPageBeShown(page_index):
+ # Move to that page if it should be shown
+ self._setCurrentPageIndex(page_index)
+ else:
+ # Find the next page to show starting from the "page_index"
+ self.goToNextPage(from_index = page_index)
+
+ # Checks if the page with the given index should be shown by calling the "should_show_function" associated with it.
+ # If the function is not present, returns True (show page by default).
+ def _shouldPageBeShown(self, page_index: int) -> bool:
+ next_page_item = self.getItem(page_index)
+ should_show_function = next_page_item.get("should_show_function", lambda: True)
+ return should_show_function()
+
+ # Resets the state of the WelcomePagesModel. This functions does the following:
+ # - Resets current_page_index to 0
+ # - Clears the previous page indices stack
+ @pyqtSlot()
+ def resetState(self) -> None:
+ self._current_page_index = 0
+ self._previous_page_indices_stack.clear()
+
+ self.currentPageIndexChanged.emit()
+
+ shouldShowWelcomeFlowChanged = pyqtSignal()
+
+ @pyqtProperty(bool, notify = shouldShowWelcomeFlowChanged)
+ def shouldShowWelcomeFlow(self) -> bool:
+ return self._should_show_welcome_flow
+
+ # Gets the page index with the given page ID. If the page ID doesn't exist, returns None.
+ def getPageIndexById(self, page_id: str) -> Optional[int]:
+ page_idx = None
+ for idx, page_item in enumerate(self._items):
+ if page_item["id"] == page_id:
+ page_idx = idx
+ break
+ return page_idx
+
+ # Convenience function to get QUrl path to pages that's located in "resources/qml/WelcomePages".
+ def _getBuiltinWelcomePagePath(self, page_filename: str) -> "QUrl":
+ from cura.CuraApplication import CuraApplication
+ return QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles,
+ os.path.join("WelcomePages", page_filename)))
+
+ # FIXME: HACKs for optimization that we don't update the model every time the active machine gets changed.
+ def _onActiveMachineChanged(self) -> None:
+ self._application.getMachineManager().globalContainerChanged.disconnect(self._onActiveMachineChanged)
+ self._initialize(update_should_show_flag = False)
+
+ def initialize(self) -> None:
+ self._application.getMachineManager().globalContainerChanged.connect(self._onActiveMachineChanged)
+ self._initialize()
+
+ def _initialize(self, update_should_show_flag: bool = True) -> None:
+ show_whatsnew_only = False
+ if update_should_show_flag:
+ has_active_machine = self._application.getMachineManager().activeMachine is not None
+ has_app_just_upgraded = self._application.hasJustUpdatedFromOldVersion()
+
+ # Only show the what's new dialog if there's no machine and we have just upgraded
+ show_complete_flow = not has_active_machine
+ show_whatsnew_only = has_active_machine and has_app_just_upgraded
+
+ # FIXME: This is a hack. Because of the circular dependency between MachineManager, ExtruderManager, and
+ # possibly some others, setting the initial active machine is not done when the MachineManager gets initialized.
+ # So at this point, we don't know if there will be an active machine or not. It could be that the active machine
+ # files are corrupted so we cannot rely on Preferences either. This makes sure that once the active machine
+ # gets changed, this model updates the flags, so it can decide whether to show the welcome flow or not.
+ should_show_welcome_flow = show_complete_flow or show_whatsnew_only
+ if should_show_welcome_flow != self._should_show_welcome_flow:
+ self._should_show_welcome_flow = should_show_welcome_flow
+ self.shouldShowWelcomeFlowChanged.emit()
+
+ # All pages
+ all_pages_list = [{"id": "welcome",
+ "page_url": self._getBuiltinWelcomePagePath("WelcomeContent.qml"),
+ },
+ {"id": "user_agreement",
+ "page_url": self._getBuiltinWelcomePagePath("UserAgreementContent.qml"),
+ },
+ {"id": "whats_new",
+ "page_url": self._getBuiltinWelcomePagePath("WhatsNewContent.qml"),
+ },
+ {"id": "data_collections",
+ "page_url": self._getBuiltinWelcomePagePath("DataCollectionsContent.qml"),
+ },
+ {"id": "add_network_or_local_printer",
+ "page_url": self._getBuiltinWelcomePagePath("AddNetworkOrLocalPrinterContent.qml"),
+ "next_page_id": "machine_actions",
+ },
+ {"id": "add_printer_by_ip",
+ "page_url": self._getBuiltinWelcomePagePath("AddPrinterByIpContent.qml"),
+ "next_page_id": "machine_actions",
+ },
+ {"id": "machine_actions",
+ "page_url": self._getBuiltinWelcomePagePath("FirstStartMachineActionsContent.qml"),
+ "next_page_id": "cloud",
+ "should_show_function": self.shouldShowMachineActions,
+ },
+ {"id": "cloud",
+ "page_url": self._getBuiltinWelcomePagePath("CloudContent.qml"),
+ },
+ ]
+
+ pages_to_show = all_pages_list
+ if show_whatsnew_only:
+ pages_to_show = list(filter(lambda x: x["id"] == "whats_new", all_pages_list))
+
+ self._pages = pages_to_show
+ self.setItems(self._pages)
+
+ # For convenience, inject the default "next" button text to each item if it's not present.
+ def setItems(self, items: List[Dict[str, Any]]) -> None:
+ for item in items:
+ if "next_page_button_text" not in item:
+ item["next_page_button_text"] = self._default_next_button_text
+
+ super().setItems(items)
+
+ # Indicates if the machine action panel should be shown by checking if there's any first start machine actions
+ # available.
+ def shouldShowMachineActions(self) -> bool:
+ global_stack = self._application.getMachineManager().activeMachine
+ if global_stack is None:
+ return False
+
+ definition_id = global_stack.definition.getId()
+ first_start_actions = self._application.getMachineActionManager().getFirstStartActions(definition_id)
+ return len([action for action in first_start_actions if action.needsUserInteraction()]) > 0
+
+ def addPage(self) -> None:
+ pass
+
+
+__all__ = ["WelcomePagesModel"]
diff --git a/cura/UI/WhatsNewPagesModel.py b/cura/UI/WhatsNewPagesModel.py
new file mode 100644
index 0000000000..5b968ae574
--- /dev/null
+++ b/cura/UI/WhatsNewPagesModel.py
@@ -0,0 +1,22 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from .WelcomePagesModel import WelcomePagesModel
+
+
+#
+# This Qt ListModel is more or less the same the WelcomePagesModel, except that this model is only for showing the
+# "what's new" page. This is also used in the "Help" menu to show the changes log.
+#
+class WhatsNewPagesModel(WelcomePagesModel):
+
+ def initialize(self) -> None:
+ self._pages = []
+ self._pages.append({"id": "whats_new",
+ "page_url": self._getBuiltinWelcomePagePath("WhatsNewContent.qml"),
+ "next_page_button_text": self._catalog.i18nc("@action:button", "Close"),
+ })
+ self.setItems(self._pages)
+
+
+__all__ = ["WhatsNewPagesModel"]
diff --git a/cura/UI/__init__.py b/cura/UI/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/cura/Utils/NetworkingUtil.py b/cura/Utils/NetworkingUtil.py
new file mode 100644
index 0000000000..b13f7903b9
--- /dev/null
+++ b/cura/Utils/NetworkingUtil.py
@@ -0,0 +1,44 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+import socket
+from typing import Optional
+
+from PyQt5.QtCore import QObject, pyqtSlot
+
+
+#
+# This is a QObject because some of the functions can be used (and are useful) in QML.
+#
+class NetworkingUtil(QObject):
+
+ def __init__(self, parent: Optional["QObject"] = None) -> None:
+ super().__init__(parent = parent)
+
+ # Checks if the given string is a valid IPv4 address.
+ @pyqtSlot(str, result = bool)
+ def isIPv4(self, address: str) -> bool:
+ try:
+ socket.inet_pton(socket.AF_INET, address)
+ result = True
+ except:
+ result = False
+ return result
+
+ # Checks if the given string is a valid IPv6 address.
+ @pyqtSlot(str, result = bool)
+ def isIPv6(self, address: str) -> bool:
+ try:
+ socket.inet_pton(socket.AF_INET6, address)
+ result = True
+ except:
+ result = False
+ return result
+
+ # Checks if the given string is a valid IPv4 or IPv6 address.
+ @pyqtSlot(str, result = bool)
+ def isValidIP(self, address: str) -> bool:
+ return self.isIPv4(address) or self.isIPv6(address)
+
+
+__all__ = ["NetworkingUtil"]
diff --git a/cura_app.py b/cura_app.py
index 3224a5b99b..1978e0f5fd 100755
--- a/cura_app.py
+++ b/cura_app.py
@@ -23,7 +23,10 @@ known_args = vars(parser.parse_known_args()[0])
if not known_args["debug"]:
def get_cura_dir_path():
if Platform.isWindows():
- return os.path.expanduser("~/AppData/Roaming/" + CuraAppName)
+ appdata_path = os.getenv("APPDATA")
+ if not appdata_path: #Defensive against the environment variable missing (should never happen).
+ appdata_path = "."
+ return os.path.join(appdata_path, CuraAppName)
elif Platform.isLinux():
return os.path.expanduser("~/.local/share/" + CuraAppName)
elif Platform.isOSX():
diff --git a/docker/build.sh b/docker/build.sh
new file mode 100755
index 0000000000..eb20b18c0d
--- /dev/null
+++ b/docker/build.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+
+# Abort at the first error.
+set -e
+
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+PROJECT_DIR="$( cd "${SCRIPT_DIR}/.." && pwd )"
+
+# Make sure that environment variables are set properly
+source /opt/rh/devtoolset-7/enable
+export PATH="${CURA_BUILD_ENV_PATH}/bin:${PATH}"
+export PKG_CONFIG_PATH="${CURA_BUILD_ENV_PATH}/lib/pkgconfig:${PKG_CONFIG_PATH}"
+
+cd "${PROJECT_DIR}"
+
+#
+# Clone Uranium and set PYTHONPATH first
+#
+
+# Check the branch to use:
+# 1. Use the Uranium branch with the branch same if it exists.
+# 2. Otherwise, use the default branch name "master"
+URANIUM_BRANCH="${CI_COMMIT_REF_NAME:-master}"
+output="$(git ls-remote --heads https://github.com/Ultimaker/Uranium.git "${URANIUM_BRANCH}")"
+if [ -z "${output}" ]; then
+ echo "Could not find Uranium banch ${URANIUM_BRANCH}, fallback to use master."
+ URANIUM_BRANCH="master"
+fi
+
+echo "Using Uranium branch ${URANIUM_BRANCH} ..."
+git clone --depth=1 -b "${URANIUM_BRANCH}" https://github.com/Ultimaker/Uranium.git "${PROJECT_DIR}"/Uranium
+export PYTHONPATH="${PROJECT_DIR}/Uranium:.:${PYTHONPATH}"
+
+mkdir build
+cd build
+cmake3 \
+ -DCMAKE_BUILD_TYPE=Debug \
+ -DCMAKE_PREFIX_PATH="${CURA_BUILD_ENV_PATH}" \
+ -DURANIUM_DIR="${PROJECT_DIR}/Uranium" \
+ -DBUILD_TESTS=ON \
+ ..
+make
+ctest3 --output-on-failure -T Test
diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py
index 49c6995d18..b81d0858a4 100755
--- a/plugins/3MFReader/ThreeMFReader.py
+++ b/plugins/3MFReader/ThreeMFReader.py
@@ -1,7 +1,7 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-from typing import Optional
+from typing import List, Optional, Union, TYPE_CHECKING
import os.path
import zipfile
@@ -9,15 +9,16 @@ import numpy
import Savitar
-from UM.Application import Application
from UM.Logger import Logger
from UM.Math.Matrix import Matrix
from UM.Math.Vector import Vector
from UM.Mesh.MeshBuilder import MeshBuilder
from UM.Mesh.MeshReader import MeshReader
from UM.Scene.GroupDecorator import GroupDecorator
+from UM.Scene.SceneNode import SceneNode #For typing.
from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType
+from cura.CuraApplication import CuraApplication
from cura.Settings.ExtruderManager import ExtruderManager
from cura.Scene.CuraSceneNode import CuraSceneNode
from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
@@ -25,11 +26,9 @@ from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
from cura.Scene.ZOffsetDecorator import ZOffsetDecorator
from cura.Machines.QualityManager import getMachineDefinitionIDForQualitySearch
-MYPY = False
-
try:
- if not MYPY:
+ if not TYPE_CHECKING:
import xml.etree.cElementTree as ET
except ImportError:
Logger.log("w", "Unable to load cElementTree, switching to slower version")
@@ -55,7 +54,7 @@ class ThreeMFReader(MeshReader):
self._unit = None
self._object_count = 0 # Used to name objects as there is no node name yet.
- def _createMatrixFromTransformationString(self, transformation):
+ def _createMatrixFromTransformationString(self, transformation: str) -> Matrix:
if transformation == "":
return Matrix()
@@ -85,13 +84,13 @@ class ThreeMFReader(MeshReader):
return temp_mat
- ## Convenience function that converts a SceneNode object (as obtained from libSavitar) to a Uranium scene node.
- # \returns Uranium scene node.
- def _convertSavitarNodeToUMNode(self, savitar_node):
+ ## Convenience function that converts a SceneNode object (as obtained from libSavitar) to a scene node.
+ # \returns Scene node.
+ def _convertSavitarNodeToUMNode(self, savitar_node: Savitar.SceneNode) -> Optional[SceneNode]:
self._object_count += 1
node_name = "Object %s" % self._object_count
- active_build_plate = Application.getInstance().getMultiBuildPlateModel().activeBuildPlate
+ active_build_plate = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate
um_node = CuraSceneNode() # This adds a SettingOverrideDecorator
um_node.addDecorator(BuildPlateDecorator(active_build_plate))
@@ -122,7 +121,7 @@ class ThreeMFReader(MeshReader):
# Add the setting override decorator, so we can add settings to this node.
if settings:
- global_container_stack = Application.getInstance().getGlobalContainerStack()
+ global_container_stack = CuraApplication.getInstance().getGlobalContainerStack()
# Ensure the correct next container for the SettingOverride decorator is set.
if global_container_stack:
@@ -161,7 +160,7 @@ class ThreeMFReader(MeshReader):
um_node.addDecorator(sliceable_decorator)
return um_node
- def _read(self, file_name):
+ def _read(self, file_name: str) -> Union[SceneNode, List[SceneNode]]:
result = []
self._object_count = 0 # Used to name objects as there is no node name yet.
# The base object of 3mf is a zipped archive.
@@ -181,12 +180,13 @@ class ThreeMFReader(MeshReader):
mesh_data = um_node.getMeshData()
if mesh_data is not None:
extents = mesh_data.getExtents()
- center_vector = Vector(extents.center.x, extents.center.y, extents.center.z)
- transform_matrix.setByTranslation(center_vector)
+ if extents is not None:
+ center_vector = Vector(extents.center.x, extents.center.y, extents.center.z)
+ transform_matrix.setByTranslation(center_vector)
transform_matrix.multiply(um_node.getLocalTransformation())
um_node.setTransformation(transform_matrix)
- global_container_stack = Application.getInstance().getGlobalContainerStack()
+ global_container_stack = CuraApplication.getInstance().getGlobalContainerStack()
# Create a transformation Matrix to convert from 3mf worldspace into ours.
# First step: flip the y and z axis.
@@ -215,17 +215,20 @@ class ThreeMFReader(MeshReader):
um_node.setTransformation(um_node.getLocalTransformation().preMultiply(transformation_matrix))
# Check if the model is positioned below the build plate and honor that when loading project files.
- if um_node.getMeshData() is not None:
- minimum_z_value = um_node.getMeshData().getExtents(um_node.getWorldTransformation()).minimum.y # y is z in transformation coordinates
- if minimum_z_value < 0:
- um_node.addDecorator(ZOffsetDecorator())
- um_node.callDecoration("setZOffset", minimum_z_value)
+ node_meshdata = um_node.getMeshData()
+ if node_meshdata is not None:
+ aabb = node_meshdata.getExtents(um_node.getWorldTransformation())
+ if aabb is not None:
+ minimum_z_value = aabb.minimum.y # y is z in transformation coordinates
+ if minimum_z_value < 0:
+ um_node.addDecorator(ZOffsetDecorator())
+ um_node.callDecoration("setZOffset", minimum_z_value)
result.append(um_node)
except Exception:
Logger.logException("e", "An exception occurred in 3mf reader.")
- return None
+ return []
return result
diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py
index bf190f7e39..8a18d1b698 100755
--- a/plugins/3MFReader/ThreeMFWorkspaceReader.py
+++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py
@@ -26,6 +26,7 @@ from UM.Preferences import Preferences
from cura.Machines.VariantType import VariantType
from cura.Settings.CuraStackBuilder import CuraStackBuilder
+from cura.Settings.ExtruderManager import ExtruderManager
from cura.Settings.ExtruderStack import ExtruderStack
from cura.Settings.GlobalStack import GlobalStack
from cura.Settings.CuraContainerStack import _ContainerIndexes
@@ -258,7 +259,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
instance_container_files = [name for name in cura_file_names if name.endswith(self._instance_container_suffix)]
quality_name = ""
custom_quality_name = ""
- num_settings_overriden_by_quality_changes = 0 # How many settings are changed by the quality changes
+ num_settings_overridden_by_quality_changes = 0 # How many settings are changed by the quality changes
num_user_settings = 0
quality_changes_conflict = False
@@ -296,7 +297,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
custom_quality_name = parser["general"]["name"]
values = parser["values"] if parser.has_section("values") else dict()
- num_settings_overriden_by_quality_changes += len(values)
+ num_settings_overridden_by_quality_changes += len(values)
# Check if quality changes already exists.
quality_changes = self._container_registry.findInstanceContainers(name = custom_quality_name,
type = "quality_changes")
@@ -514,7 +515,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._dialog.setNumVisibleSettings(num_visible_settings)
self._dialog.setQualityName(quality_name)
self._dialog.setQualityType(quality_type)
- self._dialog.setNumSettingsOverridenByQualityChanges(num_settings_overriden_by_quality_changes)
+ self._dialog.setNumSettingsOverriddenByQualityChanges(num_settings_overridden_by_quality_changes)
self._dialog.setNumUserSettings(num_user_settings)
self._dialog.setActiveMode(active_mode)
self._dialog.setMachineName(machine_name)
@@ -781,6 +782,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
if not quality_changes_info.extruder_info_dict:
container_info = ContainerInfo(None, None, None)
quality_changes_info.extruder_info_dict["0"] = container_info
+ # If the global stack we're "targeting" has never been active, but was updated from Cura 3.4,
+ # it might not have it's extruders set properly.
+ if not global_stack.extruders:
+ ExtruderManager.getInstance().fixSingleExtrusionMachineExtruderDefinition(global_stack)
extruder_stack = global_stack.extruders["0"]
container = quality_manager._createQualityChanges(quality_changes_quality_type, quality_changes_name,
@@ -815,6 +820,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
container = quality_manager._createQualityChanges(quality_changes_quality_type, quality_changes_name,
global_stack, extruder_stack)
container_info.container = container
+ container.setDirty(True)
+ self._container_registry.addContainer(container)
for key, value in container_info.parser["values"].items():
container_info.container.setProperty(key, "value", value)
diff --git a/plugins/3MFReader/WorkspaceDialog.py b/plugins/3MFReader/WorkspaceDialog.py
index 6e1cbb2019..332c57ceb1 100644
--- a/plugins/3MFReader/WorkspaceDialog.py
+++ b/plugins/3MFReader/WorkspaceDialog.py
@@ -41,7 +41,7 @@ class WorkspaceDialog(QObject):
self._num_user_settings = 0
self._active_mode = ""
self._quality_name = ""
- self._num_settings_overriden_by_quality_changes = 0
+ self._num_settings_overridden_by_quality_changes = 0
self._quality_type = ""
self._machine_name = ""
self._machine_type = ""
@@ -151,10 +151,10 @@ class WorkspaceDialog(QObject):
@pyqtProperty(int, notify=numSettingsOverridenByQualityChangesChanged)
def numSettingsOverridenByQualityChanges(self):
- return self._num_settings_overriden_by_quality_changes
+ return self._num_settings_overridden_by_quality_changes
- def setNumSettingsOverridenByQualityChanges(self, num_settings_overriden_by_quality_changes):
- self._num_settings_overriden_by_quality_changes = num_settings_overriden_by_quality_changes
+ def setNumSettingsOverriddenByQualityChanges(self, num_settings_overridden_by_quality_changes):
+ self._num_settings_overridden_by_quality_changes = num_settings_overridden_by_quality_changes
self.numSettingsOverridenByQualityChangesChanged.emit()
@pyqtProperty(str, notify=qualityNameChanged)
diff --git a/plugins/AMFReader/AMFReader.py b/plugins/AMFReader/AMFReader.py
new file mode 100644
index 0000000000..d35fbe3d40
--- /dev/null
+++ b/plugins/AMFReader/AMFReader.py
@@ -0,0 +1,173 @@
+# Copyright (c) 2019 fieldOfView
+# Cura is released under the terms of the LGPLv3 or higher.
+
+# This AMF parser is based on the AMF parser in legacy cura:
+# https://github.com/daid/LegacyCura/blob/ad7641e059048c7dcb25da1f47c0a7e95e7f4f7c/Cura/util/meshLoaders/amf.py
+from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType
+from cura.CuraApplication import CuraApplication
+from UM.Logger import Logger
+
+from UM.Mesh.MeshData import MeshData, calculateNormalsFromIndexedVertices
+from UM.Mesh.MeshReader import MeshReader
+
+from cura.Scene.CuraSceneNode import CuraSceneNode
+from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
+from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
+from cura.Scene.ConvexHullDecorator import ConvexHullDecorator
+from UM.Scene.GroupDecorator import GroupDecorator
+
+import numpy
+import trimesh
+import os.path
+import zipfile
+
+MYPY = False
+try:
+ if not MYPY:
+ import xml.etree.cElementTree as ET
+except ImportError:
+ import xml.etree.ElementTree as ET
+
+from typing import Dict
+
+
+class AMFReader(MeshReader):
+ def __init__(self) -> None:
+ super().__init__()
+ self._supported_extensions = [".amf"]
+ self._namespaces = {} # type: Dict[str, str]
+
+ MimeTypeDatabase.addMimeType(
+ MimeType(
+ name="application/x-amf",
+ comment="AMF",
+ suffixes=["amf"]
+ )
+ )
+
+ # Main entry point
+ # Reads the file, returns a SceneNode (possibly with nested ones), or None
+ def _read(self, file_name):
+ base_name = os.path.basename(file_name)
+ try:
+ zipped_file = zipfile.ZipFile(file_name)
+ xml_document = zipped_file.read(zipped_file.namelist()[0])
+ zipped_file.close()
+ except zipfile.BadZipfile:
+ raw_file = open(file_name, "r")
+ xml_document = raw_file.read()
+ raw_file.close()
+
+ try:
+ amf_document = ET.fromstring(xml_document)
+ except ET.ParseError:
+ Logger.log("e", "Could not parse XML in file %s" % base_name)
+ return None
+
+ if "unit" in amf_document.attrib:
+ unit = amf_document.attrib["unit"].lower()
+ else:
+ unit = "millimeter"
+ if unit == "millimeter":
+ scale = 1.0
+ elif unit == "meter":
+ scale = 1000.0
+ elif unit == "inch":
+ scale = 25.4
+ elif unit == "feet":
+ scale = 304.8
+ elif unit == "micron":
+ scale = 0.001
+ else:
+ Logger.log("w", "Unknown unit in amf: %s. Using mm instead." % unit)
+ scale = 1.0
+
+ nodes = []
+ for amf_object in amf_document.iter("object"):
+ for amf_mesh in amf_object.iter("mesh"):
+ amf_mesh_vertices = []
+ for vertices in amf_mesh.iter("vertices"):
+ for vertex in vertices.iter("vertex"):
+ for coordinates in vertex.iter("coordinates"):
+ v = [0.0, 0.0, 0.0]
+ for t in coordinates:
+ if t.tag == "x":
+ v[0] = float(t.text) * scale
+ elif t.tag == "y":
+ v[2] = float(t.text) * scale
+ elif t.tag == "z":
+ v[1] = float(t.text) * scale
+ amf_mesh_vertices.append(v)
+ if not amf_mesh_vertices:
+ continue
+
+ indices = []
+ for volume in amf_mesh.iter("volume"):
+ for triangle in volume.iter("triangle"):
+ f = [0, 0, 0]
+ for t in triangle:
+ if t.tag == "v1":
+ f[0] = int(t.text)
+ elif t.tag == "v2":
+ f[1] = int(t.text)
+ elif t.tag == "v3":
+ f[2] = int(t.text)
+ indices.append(f)
+
+ mesh = trimesh.base.Trimesh(vertices=numpy.array(amf_mesh_vertices, dtype=numpy.float32), faces=numpy.array(indices, dtype=numpy.int32))
+ mesh.merge_vertices()
+ mesh.remove_unreferenced_vertices()
+ mesh.fix_normals()
+ mesh_data = self._toMeshData(mesh)
+
+ new_node = CuraSceneNode()
+ new_node.setSelectable(True)
+ new_node.setMeshData(mesh_data)
+ new_node.setName(base_name if len(nodes)==0 else "%s %d" % (base_name, len(nodes)))
+ new_node.addDecorator(BuildPlateDecorator(CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate))
+ new_node.addDecorator(SliceableObjectDecorator())
+
+ nodes.append(new_node)
+
+ if not nodes:
+ Logger.log("e", "No meshes in file %s" % base_name)
+ return None
+
+ if len(nodes) == 1:
+ return nodes[0]
+
+ # Add all scenenodes to a group so they stay together
+ group_node = CuraSceneNode()
+ group_node.addDecorator(GroupDecorator())
+ group_node.addDecorator(ConvexHullDecorator())
+ group_node.addDecorator(BuildPlateDecorator(CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate))
+
+ for node in nodes:
+ node.setParent(group_node)
+
+ return group_node
+
+ def _toMeshData(self, tri_node: trimesh.base.Trimesh) -> MeshData:
+ tri_faces = tri_node.faces
+ tri_vertices = tri_node.vertices
+
+ indices = []
+ vertices = []
+
+ index_count = 0
+ face_count = 0
+ for tri_face in tri_faces:
+ face = []
+ for tri_index in tri_face:
+ vertices.append(tri_vertices[tri_index])
+ face.append(index_count)
+ index_count += 1
+ indices.append(face)
+ face_count += 1
+
+ vertices = numpy.asarray(vertices, dtype=numpy.float32)
+ indices = numpy.asarray(indices, dtype=numpy.int32)
+ normals = calculateNormalsFromIndexedVertices(vertices, indices, face_count)
+
+ mesh_data = MeshData(vertices=vertices, indices=indices, normals=normals)
+ return mesh_data
diff --git a/plugins/AMFReader/__init__.py b/plugins/AMFReader/__init__.py
new file mode 100644
index 0000000000..c974a92d11
--- /dev/null
+++ b/plugins/AMFReader/__init__.py
@@ -0,0 +1,21 @@
+# Copyright (c) 2019 fieldOfView
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from . import AMFReader
+
+from UM.i18n import i18nCatalog
+i18n_catalog = i18nCatalog("uranium")
+
+
+def getMetaData():
+ return {
+ "mesh_reader": [
+ {
+ "extension": "amf",
+ "description": i18n_catalog.i18nc("@item:inlistbox", "AMF File")
+ }
+ ]
+ }
+
+def register(app):
+ return {"mesh_reader": AMFReader.AMFReader()}
diff --git a/plugins/AMFReader/plugin.json b/plugins/AMFReader/plugin.json
new file mode 100644
index 0000000000..599dc03c76
--- /dev/null
+++ b/plugins/AMFReader/plugin.json
@@ -0,0 +1,7 @@
+{
+ "name": "AMF Reader",
+ "author": "fieldOfView",
+ "version": "1.0.0",
+ "description": "Provides support for reading AMF files.",
+ "api": "6.0.0"
+}
diff --git a/plugins/ChangeLogPlugin/ChangeLog.py b/plugins/ChangeLogPlugin/ChangeLog.py
deleted file mode 100644
index eeec5edf9b..0000000000
--- a/plugins/ChangeLogPlugin/ChangeLog.py
+++ /dev/null
@@ -1,109 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-from UM.i18n import i18nCatalog
-from UM.Extension import Extension
-from UM.Application import Application
-from UM.PluginRegistry import PluginRegistry
-from UM.Version import Version
-
-from PyQt5.QtCore import pyqtSlot, QObject
-
-import os.path
-import collections
-
-catalog = i18nCatalog("cura")
-
-class ChangeLog(Extension, QObject,):
- def __init__(self, parent = None):
- QObject.__init__(self, parent)
- Extension.__init__(self)
- self._changelog_window = None
- self._changelog_context = None
- version_string = Application.getInstance().getVersion()
- if version_string is not "master":
- self._current_app_version = Version(version_string)
- else:
- self._current_app_version = None
-
- self._change_logs = None
- Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated)
- Application.getInstance().getPreferences().addPreference("general/latest_version_changelog_shown", "2.0.0") #First version of CURA with uranium
- self.setMenuName(catalog.i18nc("@item:inmenu", "Changelog"))
- self.addMenuItem(catalog.i18nc("@item:inmenu", "Show Changelog"), self.showChangelog)
-
- def getChangeLogs(self):
- if not self._change_logs:
- self.loadChangeLogs()
- return self._change_logs
-
- @pyqtSlot(result = str)
- def getChangeLogString(self):
- logs = self.getChangeLogs()
- result = ""
- for version in logs:
- result += "
" + str(version) + "
"
- result += ""
- for change in logs[version]:
- if str(change) != "":
- result += "" + str(change) + " "
- for line in logs[version][change]:
- result += str(line) + " "
- result += " "
-
- pass
- return result
-
- def loadChangeLogs(self):
- self._change_logs = collections.OrderedDict()
- with open(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "ChangeLog.txt"), "r", encoding = "utf-8") as f:
- open_version = None
- open_header = "" # Initialise to an empty header in case there is no "*" in the first line of the changelog
- for line in f:
- line = line.replace("\n","")
- if "[" in line and "]" in line:
- line = line.replace("[","")
- line = line.replace("]","")
- open_version = Version(line)
- open_header = ""
- self._change_logs[open_version] = collections.OrderedDict()
- elif line.startswith("*"):
- open_header = line.replace("*","")
- self._change_logs[open_version][open_header] = []
- elif line != "":
- if open_header not in self._change_logs[open_version]:
- self._change_logs[open_version][open_header] = []
- self._change_logs[open_version][open_header].append(line)
-
- def _onEngineCreated(self):
- if not self._current_app_version:
- return #We're on dev branch.
-
- if Application.getInstance().getPreferences().getValue("general/latest_version_changelog_shown") == "master":
- latest_version_shown = Version("0.0.0")
- else:
- latest_version_shown = Version(Application.getInstance().getPreferences().getValue("general/latest_version_changelog_shown"))
-
- Application.getInstance().getPreferences().setValue("general/latest_version_changelog_shown", Application.getInstance().getVersion())
-
- # Do not show the changelog when there is no global container stack
- # This implies we are running Cura for the first time.
- if not Application.getInstance().getGlobalContainerStack():
- return
-
- if self._current_app_version > latest_version_shown:
- self.showChangelog()
-
- def showChangelog(self):
- if not self._changelog_window:
- self.createChangelogWindow()
-
- self._changelog_window.show()
-
- def hideChangelog(self):
- if self._changelog_window:
- self._changelog_window.hide()
-
- def createChangelogWindow(self):
- path = os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "ChangeLog.qml")
- self._changelog_window = Application.getInstance().createQmlComponent(path, {"manager": self})
diff --git a/plugins/ChangeLogPlugin/ChangeLog.qml b/plugins/ChangeLogPlugin/ChangeLog.qml
deleted file mode 100644
index 512687f15a..0000000000
--- a/plugins/ChangeLogPlugin/ChangeLog.qml
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2015 Ultimaker B.V.
-// Cura is released under the terms of the LGPLv3 or higher.
-
-import QtQuick 2.1
-import QtQuick.Controls 1.3
-import QtQuick.Layouts 1.1
-import QtQuick.Window 2.1
-
-import UM 1.1 as UM
-
-UM.Dialog
-{
- id: base
- minimumWidth: (UM.Theme.getSize("modal_window_minimum").width * 0.75) | 0
- minimumHeight: (UM.Theme.getSize("modal_window_minimum").height * 0.75) | 0
- width: minimumWidth
- height: minimumHeight
- title: catalog.i18nc("@label", "Changelog")
-
- TextArea
- {
- anchors.fill: parent
- text: manager.getChangeLogString()
- readOnly: true;
- textFormat: TextEdit.RichText
- }
-
- rightButtons: [
- Button
- {
- UM.I18nCatalog
- {
- id: catalog
- name: "cura"
- }
-
- text: catalog.i18nc("@action:button", "Close")
- onClicked: base.hide()
- }
- ]
-}
diff --git a/plugins/ChangeLogPlugin/__init__.py b/plugins/ChangeLogPlugin/__init__.py
deleted file mode 100644
index a5452b60c8..0000000000
--- a/plugins/ChangeLogPlugin/__init__.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (c) 2015 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-from . import ChangeLog
-
-
-def getMetaData():
- return {}
-
-def register(app):
- return {"extension": ChangeLog.ChangeLog()}
diff --git a/plugins/ChangeLogPlugin/plugin.json b/plugins/ChangeLogPlugin/plugin.json
deleted file mode 100644
index 92041d1543..0000000000
--- a/plugins/ChangeLogPlugin/plugin.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "name": "Changelog",
- "author": "Ultimaker B.V.",
- "version": "1.0.1",
- "description": "Shows changes since latest checked version.",
- "api": "6.0",
- "i18n-catalog": "cura"
-}
diff --git a/plugins/CuraDrive/src/DriveApiService.py b/plugins/CuraDrive/src/DriveApiService.py
index 49e242d851..d8349ccc29 100644
--- a/plugins/CuraDrive/src/DriveApiService.py
+++ b/plugins/CuraDrive/src/DriveApiService.py
@@ -45,7 +45,7 @@ class DriveApiService:
"Authorization": "Bearer {}".format(access_token)
})
except requests.exceptions.ConnectionError:
- Logger.log("w", "Unable to connect with the server.")
+ Logger.logException("w", "Unable to connect with the server.")
return []
# HTTP status 300s mean redirection. 400s and 500s are errors.
@@ -98,7 +98,12 @@ class DriveApiService:
# If there is no download URL, we can't restore the backup.
return self._emitRestoreError()
- download_package = requests.get(download_url, stream = True)
+ try:
+ download_package = requests.get(download_url, stream = True)
+ except requests.exceptions.ConnectionError:
+ Logger.logException("e", "Unable to connect with the server")
+ return self._emitRestoreError()
+
if download_package.status_code >= 300:
# Something went wrong when attempting to download the backup.
Logger.log("w", "Could not download backup from url %s: %s", download_url, download_package.text)
@@ -142,9 +147,14 @@ class DriveApiService:
Logger.log("w", "Could not get access token.")
return False
- delete_backup = requests.delete("{}/{}".format(self.BACKUP_URL, backup_id), headers = {
- "Authorization": "Bearer {}".format(access_token)
- })
+ try:
+ delete_backup = requests.delete("{}/{}".format(self.BACKUP_URL, backup_id), headers = {
+ "Authorization": "Bearer {}".format(access_token)
+ })
+ except requests.exceptions.ConnectionError:
+ Logger.logException("e", "Unable to connect with the server")
+ return False
+
if delete_backup.status_code >= 300:
Logger.log("w", "Could not delete backup: %s", delete_backup.text)
return False
@@ -159,15 +169,19 @@ class DriveApiService:
if not access_token:
Logger.log("w", "Could not get access token.")
return None
-
- backup_upload_request = requests.put(self.BACKUP_URL, json = {
- "data": {
- "backup_size": backup_size,
- "metadata": backup_metadata
- }
- }, headers = {
- "Authorization": "Bearer {}".format(access_token)
- })
+ try:
+ backup_upload_request = requests.put(
+ self.BACKUP_URL,
+ json = {"data": {"backup_size": backup_size,
+ "metadata": backup_metadata
+ }
+ },
+ headers = {
+ "Authorization": "Bearer {}".format(access_token)
+ })
+ except requests.exceptions.ConnectionError:
+ Logger.logException("e", "Unable to connect with the server")
+ return None
# Any status code of 300 or above indicates an error.
if backup_upload_request.status_code >= 300:
diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py
index ceba5f3006..9cdd9678a8 100755
--- a/plugins/CuraEngineBackend/CuraEngineBackend.py
+++ b/plugins/CuraEngineBackend/CuraEngineBackend.py
@@ -10,20 +10,17 @@ from time import time
from typing import Any, cast, Dict, List, Optional, Set, TYPE_CHECKING
from UM.Backend.Backend import Backend, BackendState
-from UM.Scene.Camera import Camera
from UM.Scene.SceneNode import SceneNode
from UM.Signal import Signal
from UM.Logger import Logger
from UM.Message import Message
from UM.PluginRegistry import PluginRegistry
-from UM.Resources import Resources
from UM.Platform import Platform
from UM.Qt.Duration import DurationFormat
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
from UM.Settings.Interfaces import DefinitionContainerInterface
from UM.Settings.SettingInstance import SettingInstance #For typing.
from UM.Tool import Tool #For typing.
-from UM.Mesh.MeshData import MeshData #For typing.
from cura.CuraApplication import CuraApplication
from cura.Settings.ExtruderManager import ExtruderManager
@@ -738,6 +735,7 @@ class CuraEngineBackend(QObject, Backend):
"support_interface": message.time_support_interface,
"support": message.time_support,
"skirt": message.time_skirt,
+ "prime_tower": message.time_prime_tower,
"travel": message.time_travel,
"retract": message.time_retract,
"none": message.time_none
diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py
index 3cc23130ea..ed4f556cc9 100644
--- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py
+++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py
@@ -24,7 +24,7 @@ from cura import LayerPolygon
import numpy
from time import time
-from cura.Settings.ExtrudersModel import ExtrudersModel
+from cura.Machines.Models.ExtrudersModel import ExtrudersModel
catalog = i18nCatalog("cura")
diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py
index d3882a1209..8ce3110a93 100644
--- a/plugins/CuraEngineBackend/StartSliceJob.py
+++ b/plugins/CuraEngineBackend/StartSliceJob.py
@@ -196,10 +196,7 @@ class StartSliceJob(Job):
has_printing_mesh = False
for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
if node.callDecoration("isSliceable") and node.getMeshData() and node.getMeshData().getVertices() is not None:
- per_object_stack = node.callDecoration("getStack")
- is_non_printing_mesh = False
- if per_object_stack:
- is_non_printing_mesh = any(per_object_stack.getProperty(key, "value") for key in NON_PRINTING_MESH_SETTINGS)
+ is_non_printing_mesh = bool(node.callDecoration("isNonPrintingMesh"))
# Find a reason not to add the node
if node.callDecoration("getBuildPlateNumber") != self._build_plate_number:
@@ -259,10 +256,7 @@ class StartSliceJob(Job):
self._buildGlobalInheritsStackMessage(stack)
# Build messages for extruder stacks
- # Send the extruder settings in the order of extruder positions. Somehow, if you send e.g. extruder 3 first,
- # then CuraEngine can slice with the wrong settings. This I think should be fixed in CuraEngine as well.
- extruder_stack_list = sorted(list(global_stack.extruders.items()), key = lambda item: int(item[0]))
- for _, extruder_stack in extruder_stack_list:
+ for extruder_stack in global_stack.extruderList:
self._buildExtruderMessage(extruder_stack)
for group in filtered_object_groups:
@@ -323,9 +317,10 @@ class StartSliceJob(Job):
value = stack.getProperty(key, "value")
result[key] = value
Job.yieldThread()
-
+
result["print_bed_temperature"] = result["material_bed_temperature"] # Renamed settings.
result["print_temperature"] = result["material_print_temperature"]
+ result["travel_speed"] = result["speed_travel"]
result["time"] = time.strftime("%H:%M:%S") #Some extra settings.
result["date"] = time.strftime("%d-%m-%Y")
result["day"] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][int(time.strftime("%w"))]
@@ -336,25 +331,29 @@ class StartSliceJob(Job):
return result
+ def _cacheAllExtruderSettings(self):
+ global_stack = cast(ContainerStack, CuraApplication.getInstance().getGlobalContainerStack())
+
+ # NB: keys must be strings for the string formatter
+ self._all_extruders_settings = {
+ "-1": self._buildReplacementTokens(global_stack)
+ }
+ for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks():
+ extruder_nr = extruder_stack.getProperty("extruder_nr", "value")
+ self._all_extruders_settings[str(extruder_nr)] = self._buildReplacementTokens(extruder_stack)
+
## Replace setting tokens in a piece of g-code.
# \param value A piece of g-code to replace tokens in.
# \param default_extruder_nr Stack nr to use when no stack nr is specified, defaults to the global stack
def _expandGcodeTokens(self, value: str, default_extruder_nr: int = -1) -> str:
if not self._all_extruders_settings:
- global_stack = cast(ContainerStack, CuraApplication.getInstance().getGlobalContainerStack())
-
- # NB: keys must be strings for the string formatter
- self._all_extruders_settings = {
- "-1": self._buildReplacementTokens(global_stack)
- }
-
- for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks():
- extruder_nr = extruder_stack.getProperty("extruder_nr", "value")
- self._all_extruders_settings[str(extruder_nr)] = self._buildReplacementTokens(extruder_stack)
+ self._cacheAllExtruderSettings()
try:
# any setting can be used as a token
fmt = GcodeStartEndFormatter(default_extruder_nr = default_extruder_nr)
+ if self._all_extruders_settings is None:
+ return ""
settings = self._all_extruders_settings.copy()
settings["default_extruder_nr"] = default_extruder_nr
return str(fmt.format(value, **settings))
@@ -366,8 +365,14 @@ class StartSliceJob(Job):
def _buildExtruderMessage(self, stack: ContainerStack) -> None:
message = self._slice_message.addRepeatedMessage("extruders")
message.id = int(stack.getMetaDataEntry("position"))
+ if not self._all_extruders_settings:
+ self._cacheAllExtruderSettings()
- settings = self._buildReplacementTokens(stack)
+ if self._all_extruders_settings is None:
+ return
+
+ extruder_nr = stack.getProperty("extruder_nr", "value")
+ settings = self._all_extruders_settings[str(extruder_nr)].copy()
# Also send the material GUID. This is a setting in fdmprinter, but we have no interface for it.
settings["material_guid"] = stack.material.getMetaDataEntry("GUID", "")
@@ -391,7 +396,13 @@ class StartSliceJob(Job):
# The settings are taken from the global stack. This does not include any
# per-extruder settings or per-object settings.
def _buildGlobalSettingsMessage(self, stack: ContainerStack) -> None:
- settings = self._buildReplacementTokens(stack)
+ if not self._all_extruders_settings:
+ self._cacheAllExtruderSettings()
+
+ if self._all_extruders_settings is None:
+ return
+
+ settings = self._all_extruders_settings["-1"].copy()
# Pre-compute material material_bed_temp_prepend and material_print_temp_prepend
start_gcode = settings["machine_start_gcode"]
diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py
index f8618712a1..12bed210d2 100644
--- a/plugins/GCodeReader/FlavorParser.py
+++ b/plugins/GCodeReader/FlavorParser.py
@@ -1,31 +1,33 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
+import math
+import re
+from typing import Dict, List, NamedTuple, Optional, Union
+
+import numpy
+
from UM.Backend import Backend
from UM.Job import Job
from UM.Logger import Logger
from UM.Math.Vector import Vector
from UM.Message import Message
-from cura.Scene.CuraSceneNode import CuraSceneNode
from UM.i18n import i18nCatalog
-catalog = i18nCatalog("cura")
-
from cura.CuraApplication import CuraApplication
from cura.LayerDataBuilder import LayerDataBuilder
from cura.LayerDataDecorator import LayerDataDecorator
from cura.LayerPolygon import LayerPolygon
+from cura.Scene.CuraSceneNode import CuraSceneNode
from cura.Scene.GCodeListDecorator import GCodeListDecorator
from cura.Settings.ExtruderManager import ExtruderManager
-import numpy
-import math
-import re
-from typing import Dict, List, NamedTuple, Optional, Union
+catalog = i18nCatalog("cura")
PositionOptional = NamedTuple("Position", [("x", Optional[float]), ("y", Optional[float]), ("z", Optional[float]), ("f", Optional[float]), ("e", Optional[float])])
Position = NamedTuple("Position", [("x", float), ("y", float), ("z", float), ("f", float), ("e", List[float])])
+
## This parser is intended to interpret the common firmware codes among all the
# different flavors
class FlavorParser:
@@ -33,7 +35,7 @@ class FlavorParser:
def __init__(self) -> None:
CuraApplication.getInstance().hideMessageSignal.connect(self._onHideMessage)
self._cancelled = False
- self._message = None
+ self._message = None # type: Optional[Message]
self._layer_number = 0
self._extruder_number = 0
self._clearValues()
@@ -368,6 +370,8 @@ class FlavorParser:
self._layer_type = LayerPolygon.InfillType
elif type == "SUPPORT-INTERFACE":
self._layer_type = LayerPolygon.SupportInterfaceType
+ elif type == "PRIME-TOWER":
+ self._layer_type = LayerPolygon.PrimeTowerType
else:
Logger.log("w", "Encountered a unknown type (%s) while parsing g-code.", type)
@@ -425,7 +429,8 @@ class FlavorParser:
if line.startswith("M"):
M = self._getInt(line, "M")
- self.processMCode(M, line, current_position, current_path)
+ if M is not None:
+ self.processMCode(M, line, current_position, current_path)
# "Flush" leftovers. Last layer paths are still stored
if len(current_path) > 1:
@@ -463,7 +468,7 @@ class FlavorParser:
Logger.log("w", "File doesn't contain any valid layers")
settings = CuraApplication.getInstance().getGlobalContainerStack()
- if not settings.getProperty("machine_center_is_zero", "value"):
+ if settings is not None and not settings.getProperty("machine_center_is_zero", "value"):
machine_width = settings.getProperty("machine_width", "value")
machine_depth = settings.getProperty("machine_depth", "value")
scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2))
diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py
index 1bc22a3e62..b9e948dfea 100755
--- a/plugins/GCodeReader/GCodeReader.py
+++ b/plugins/GCodeReader/GCodeReader.py
@@ -12,9 +12,6 @@ catalog = i18nCatalog("cura")
from . import MarlinFlavorParser, RepRapFlavorParser
-
-
-
# Class for loading and parsing G-code files
class GCodeReader(MeshReader):
_flavor_default = "Marlin"
diff --git a/plugins/ImageReader/ConfigUI.qml b/plugins/ImageReader/ConfigUI.qml
index b9ff2e4453..47ba10778c 100644
--- a/plugins/ImageReader/ConfigUI.qml
+++ b/plugins/ImageReader/ConfigUI.qml
@@ -123,7 +123,7 @@ UM.Dialog
UM.TooltipArea {
Layout.fillWidth:true
height: childrenRect.height
- text: catalog.i18nc("@info:tooltip","By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low points on the mesh.")
+ text: catalog.i18nc("@info:tooltip","For lithophanes dark pixels should correspond to thicker locations in order to block more light coming through. For height maps lighter pixels signify higher terrain, so lighter pixels should correspond to thicker locations in the generated 3D model.")
Row {
width: parent.width
@@ -134,9 +134,9 @@ UM.Dialog
anchors.verticalCenter: parent.verticalCenter
}
ComboBox {
- id: image_color_invert
- objectName: "Image_Color_Invert"
- model: [ catalog.i18nc("@item:inlistbox","Lighter is higher"), catalog.i18nc("@item:inlistbox","Darker is higher") ]
+ id: lighter_is_higher
+ objectName: "Lighter_Is_Higher"
+ model: [ catalog.i18nc("@item:inlistbox","Darker is higher"), catalog.i18nc("@item:inlistbox","Lighter is higher") ]
width: 180 * screenScaleFactor
onCurrentIndexChanged: { manager.onImageColorInvertChanged(currentIndex) }
}
diff --git a/plugins/ImageReader/ImageReader.py b/plugins/ImageReader/ImageReader.py
index 5195b61595..e720ce4854 100644
--- a/plugins/ImageReader/ImageReader.py
+++ b/plugins/ImageReader/ImageReader.py
@@ -46,9 +46,9 @@ class ImageReader(MeshReader):
def _read(self, file_name):
size = max(self._ui.getWidth(), self._ui.getDepth())
- return self._generateSceneNode(file_name, size, self._ui.peak_height, self._ui.base_height, self._ui.smoothing, 512, self._ui.image_color_invert)
+ return self._generateSceneNode(file_name, size, self._ui.peak_height, self._ui.base_height, self._ui.smoothing, 512, self._ui.lighter_is_higher)
- def _generateSceneNode(self, file_name, xz_size, peak_height, base_height, blur_iterations, max_size, image_color_invert):
+ def _generateSceneNode(self, file_name, xz_size, peak_height, base_height, blur_iterations, max_size, lighter_is_higher):
scene_node = SceneNode()
mesh = MeshBuilder()
@@ -104,7 +104,7 @@ class ImageReader(MeshReader):
Job.yieldThread()
- if image_color_invert:
+ if not lighter_is_higher:
height_data = 1 - height_data
for _ in range(0, blur_iterations):
diff --git a/plugins/ImageReader/ImageReaderUI.py b/plugins/ImageReader/ImageReaderUI.py
index cb45afa4ad..213468a2ab 100644
--- a/plugins/ImageReader/ImageReaderUI.py
+++ b/plugins/ImageReader/ImageReaderUI.py
@@ -30,10 +30,10 @@ class ImageReaderUI(QObject):
self._width = self.default_width
self._depth = self.default_depth
- self.base_height = 1
- self.peak_height = 10
+ self.base_height = 0.4
+ self.peak_height = 2.5
self.smoothing = 1
- self.image_color_invert = False;
+ self.lighter_is_higher = False;
self._ui_lock = threading.Lock()
self._cancelled = False
@@ -143,4 +143,4 @@ class ImageReaderUI(QObject):
@pyqtSlot(int)
def onImageColorInvertChanged(self, value):
- self.image_color_invert = (value == 1)
+ self.lighter_is_higher = (value == 1)
diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py
index afd7aac86d..cddc4e5fe8 100755
--- a/plugins/MachineSettingsAction/MachineSettingsAction.py
+++ b/plugins/MachineSettingsAction/MachineSettingsAction.py
@@ -1,16 +1,21 @@
-# Copyright (c) 2017 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-from PyQt5.QtCore import pyqtProperty, pyqtSignal
+from typing import Optional, TYPE_CHECKING
+
+from PyQt5.QtCore import pyqtProperty
import UM.i18n
from UM.FlameProfiler import pyqtSlot
-from UM.Application import Application
from UM.Settings.ContainerRegistry import ContainerRegistry
from UM.Settings.DefinitionContainer import DefinitionContainer
from cura.MachineAction import MachineAction
from cura.Settings.CuraStackBuilder import CuraStackBuilder
+from cura.Settings.cura_empty_instance_containers import isEmptyContainer
+
+if TYPE_CHECKING:
+ from PyQt5.QtCore import QObject
catalog = UM.i18n.i18nCatalog("cura")
@@ -18,139 +23,102 @@ catalog = UM.i18n.i18nCatalog("cura")
## This action allows for certain settings that are "machine only") to be modified.
# It automatically detects machine definitions that it knows how to change and attaches itself to those.
class MachineSettingsAction(MachineAction):
- def __init__(self, parent = None):
+ def __init__(self, parent: Optional["QObject"] = None) -> None:
super().__init__("MachineSettingsAction", catalog.i18nc("@action", "Machine Settings"))
self._qml_url = "MachineSettingsAction.qml"
- self._application = Application.getInstance()
-
- self._global_container_stack = None
+ from cura.CuraApplication import CuraApplication
+ self._application = CuraApplication.getInstance()
from cura.Settings.CuraContainerStack import _ContainerIndexes
- self._container_index = _ContainerIndexes.DefinitionChanges
+ self._store_container_index = _ContainerIndexes.DefinitionChanges
self._container_registry = ContainerRegistry.getInstance()
self._container_registry.containerAdded.connect(self._onContainerAdded)
- self._container_registry.containerRemoved.connect(self._onContainerRemoved)
- self._application.globalContainerStackChanged.connect(self._onGlobalContainerChanged)
+ # The machine settings dialog blocks auto-slicing when it's shown, and re-enables it when it's finished.
self._backend = self._application.getBackend()
+ self.onFinished.connect(self._onFinished)
- self._empty_definition_container_id_list = []
-
- def _isEmptyDefinitionChanges(self, container_id: str):
- if not self._empty_definition_container_id_list:
- self._empty_definition_container_id_list = [self._application.empty_container.getId(),
- self._application.empty_definition_changes_container.getId()]
- return container_id in self._empty_definition_container_id_list
+ # Which container index in a stack to store machine setting changes.
+ @pyqtProperty(int, constant = True)
+ def storeContainerIndex(self) -> int:
+ return self._store_container_index
def _onContainerAdded(self, container):
# Add this action as a supported action to all machine definitions
if isinstance(container, DefinitionContainer) and container.getMetaDataEntry("type") == "machine":
self._application.getMachineActionManager().addSupportedAction(container.getId(), self.getKey())
- def _onContainerRemoved(self, container):
- # Remove definition_changes containers when a stack is removed
- if container.getMetaDataEntry("type") in ["machine", "extruder_train"]:
- definition_changes_id = container.definitionChanges.getId()
- if self._isEmptyDefinitionChanges(definition_changes_id):
- return
-
def _reset(self):
- if not self._global_container_stack:
+ global_stack = self._application.getMachineManager().activeMachine
+ if not global_stack:
return
# Make sure there is a definition_changes container to store the machine settings
- definition_changes_id = self._global_container_stack.definitionChanges.getId()
- if self._isEmptyDefinitionChanges(definition_changes_id):
- CuraStackBuilder.createDefinitionChangesContainer(self._global_container_stack,
- self._global_container_stack.getName() + "_settings")
-
- # Notify the UI in which container to store the machine settings data
- from cura.Settings.CuraContainerStack import _ContainerIndexes
-
- container_index = _ContainerIndexes.DefinitionChanges
- if container_index != self._container_index:
- self._container_index = container_index
- self.containerIndexChanged.emit()
+ definition_changes_id = global_stack.definitionChanges.getId()
+ if isEmptyContainer(definition_changes_id):
+ CuraStackBuilder.createDefinitionChangesContainer(global_stack,
+ global_stack.getName() + "_settings")
# Disable auto-slicing while the MachineAction is showing
if self._backend: # This sometimes triggers before backend is loaded.
self._backend.disableTimer()
- @pyqtSlot()
- def onFinishAction(self):
- # Restore autoslicing when the machineaction is dismissed
+ def _onFinished(self):
+ # Restore auto-slicing when the machine action is dismissed
if self._backend and self._backend.determineAutoSlicing():
+ self._backend.enableTimer()
self._backend.tickle()
- containerIndexChanged = pyqtSignal()
-
- @pyqtProperty(int, notify = containerIndexChanged)
- def containerIndex(self):
- return self._container_index
-
- def _onGlobalContainerChanged(self):
- self._global_container_stack = Application.getInstance().getGlobalContainerStack()
-
- # This additional emit is needed because we cannot connect a UM.Signal directly to a pyqtSignal
- self.globalContainerChanged.emit()
-
- globalContainerChanged = pyqtSignal()
-
- @pyqtProperty(int, notify = globalContainerChanged)
- def definedExtruderCount(self):
- if not self._global_container_stack:
- return 0
-
- return len(self._global_container_stack.getMetaDataEntry("machine_extruder_trains"))
-
@pyqtSlot(int)
- def setMachineExtruderCount(self, extruder_count):
+ def setMachineExtruderCount(self, extruder_count: int) -> None:
# Note: this method was in this class before, but since it's quite generic and other plugins also need it
# it was moved to the machine manager instead. Now this method just calls the machine manager.
self._application.getMachineManager().setActiveMachineExtruderCount(extruder_count)
@pyqtSlot()
- def forceUpdate(self):
+ def forceUpdate(self) -> None:
# Force rebuilding the build volume by reloading the global container stack.
# This is a bit of a hack, but it seems quick enough.
- self._application.globalContainerStackChanged.emit()
+ self._application.getMachineManager().globalContainerChanged.emit()
@pyqtSlot()
- def updateHasMaterialsMetadata(self):
+ def updateHasMaterialsMetadata(self) -> None:
+ global_stack = self._application.getMachineManager().activeMachine
+
# Updates the has_materials metadata flag after switching gcode flavor
- if not self._global_container_stack:
+ if not global_stack:
return
- definition = self._global_container_stack.getBottom()
+ definition = global_stack.getDefinition()
if definition.getProperty("machine_gcode_flavor", "value") != "UltiGCode" or definition.getMetaDataEntry("has_materials", False):
# In other words: only continue for the UM2 (extended), but not for the UM2+
return
machine_manager = self._application.getMachineManager()
material_manager = self._application.getMaterialManager()
- extruder_positions = list(self._global_container_stack.extruders.keys())
- has_materials = self._global_container_stack.getProperty("machine_gcode_flavor", "value") != "UltiGCode"
+ extruder_positions = list(global_stack.extruders.keys())
+ has_materials = global_stack.getProperty("machine_gcode_flavor", "value") != "UltiGCode"
material_node = None
if has_materials:
- self._global_container_stack.setMetaDataEntry("has_materials", True)
+ global_stack.setMetaDataEntry("has_materials", True)
else:
# The metadata entry is stored in an ini, and ini files are parsed as strings only.
# Because any non-empty string evaluates to a boolean True, we have to remove the entry to make it False.
- if "has_materials" in self._global_container_stack.getMetaData():
- self._global_container_stack.removeMetaDataEntry("has_materials")
+ if "has_materials" in global_stack.getMetaData():
+ global_stack.removeMetaDataEntry("has_materials")
# set materials
for position in extruder_positions:
if has_materials:
- material_node = material_manager.getDefaultMaterial(self._global_container_stack, position, None)
+ material_node = material_manager.getDefaultMaterial(global_stack, position, None)
machine_manager.setMaterial(position, material_node)
self._application.globalContainerStackChanged.emit()
@pyqtSlot(int)
- def updateMaterialForDiameter(self, extruder_position: int):
+ def updateMaterialForDiameter(self, extruder_position: int) -> None:
# Updates the material container to a material that matches the material diameter set for the printer
self._application.getMachineManager().updateMaterialWithVariant(str(extruder_position))
diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml
index ef8fda224a..a1540c22ab 100644
--- a/plugins/MachineSettingsAction/MachineSettingsAction.qml
+++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml
@@ -1,939 +1,103 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2019 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
-import QtQuick 2.2
-import QtQuick.Controls 1.1
-import QtQuick.Layouts 1.1
-import QtQuick.Window 2.1
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+import QtQuick.Layouts 1.3
-import UM 1.2 as UM
-import Cura 1.0 as Cura
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+//
+// This component contains the content for the "Welcome" page of the welcome on-boarding process.
+//
Cura.MachineAction
{
- id: base
- property var extrudersModel: Cura.ExtrudersModel{} // Do not retrieve the Model from a backend. Otherwise the tabs
- // in tabView will not removed/updated. Probably QML bug
- property int extruderTabsCount: 0
+ UM.I18nCatalog { id: catalog; name: "cura" }
- property var activeMachineId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.id : ""
+ anchors.fill: parent
+ property var extrudersModel: Cura.ExtrudersModel {}
+
+ // If we create a TabButton for "Printer" and use Repeater for extruders, for some reason, once the component
+ // finishes it will automatically change "currentIndex = 1", and it is VERY difficult to change "currentIndex = 0"
+ // after that. Using a model and a Repeater to create both "Printer" and extruder TabButtons seem to solve this
+ // problem.
Connections
{
- target: base.extrudersModel
- onModelChanged:
- {
- var extruderCount = base.extrudersModel.count;
- base.extruderTabsCount = extruderCount;
- }
+ target: extrudersModel
+ onItemsChanged: tabNameModel.update()
}
- Connections
+ ListModel
{
- target: dialog ? dialog : null
- ignoreUnknownSignals: true
- // Any which way this action dialog is dismissed, make sure it is properly finished
- onNextClicked: finishAction()
- onBackClicked: finishAction()
- onAccepted: finishAction()
- onRejected: finishAction()
- onClosing: finishAction()
- }
+ id: tabNameModel
- function finishAction()
- {
- forceActiveFocus();
- manager.onFinishAction();
- }
+ Component.onCompleted: update()
- anchors.fill: parent;
- Item
- {
- id: machineSettingsAction
- anchors.fill: parent;
-
- UM.I18nCatalog { id: catalog; name: "cura"; }
-
- Label
+ function update()
{
- id: pageTitle
- width: parent.width
- text: catalog.i18nc("@title", "Machine Settings")
- wrapMode: Text.WordWrap
- font.pointSize: 18;
- }
-
- TabView
- {
- id: settingsTabs
- height: parent.height - y
- width: parent.width
- anchors.left: parent.left
- anchors.top: pageTitle.bottom
- anchors.topMargin: UM.Theme.getSize("default_margin").height
-
- property real columnWidth: Math.round((width - 3 * UM.Theme.getSize("default_margin").width) / 2)
- property real labelColumnWidth: Math.round(columnWidth / 2)
-
- Tab
+ clear()
+ append({ name: catalog.i18nc("@title:tab", "Printer") })
+ for (var i = 0; i < extrudersModel.count; i++)
{
- title: catalog.i18nc("@title:tab", "Printer");
- anchors.margins: UM.Theme.getSize("default_margin").width
-
- Column
- {
- spacing: UM.Theme.getSize("default_margin").height
-
- Row
- {
- width: parent.width
- spacing: UM.Theme.getSize("default_margin").height
-
- Column
- {
- width: settingsTabs.columnWidth
- spacing: UM.Theme.getSize("default_lining").height
-
- Label
- {
- text: catalog.i18nc("@label", "Printer Settings")
- font.bold: true
- }
-
- Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
-
- Loader
- {
- id: buildAreaWidthField
- sourceComponent: numericTextFieldWithUnit
- property string settingKey: "machine_width"
- property string label: catalog.i18nc("@label", "X (Width)")
- property string unit: catalog.i18nc("@label", "mm")
- property bool forceUpdateOnChange: true
- }
-
- Loader
- {
- id: buildAreaDepthField
- sourceComponent: numericTextFieldWithUnit
- property string settingKey: "machine_depth"
- property string label: catalog.i18nc("@label", "Y (Depth)")
- property string unit: catalog.i18nc("@label", "mm")
- property bool forceUpdateOnChange: true
- }
-
- Loader
- {
- id: buildAreaHeightField
- sourceComponent: numericTextFieldWithUnit
- property string settingKey: "machine_height"
- property string label: catalog.i18nc("@label", "Z (Height)")
- property string unit: catalog.i18nc("@label", "mm")
- property bool forceUpdateOnChange: true
- }
-
- Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
-
- Loader
- {
- id: shapeComboBox
- sourceComponent: comboBoxWithOptions
- property string settingKey: "machine_shape"
- property string label: catalog.i18nc("@label", "Build plate shape")
- property bool forceUpdateOnChange: true
- }
-
- Loader
- {
- id: centerIsZeroCheckBox
- sourceComponent: simpleCheckBox
- property string settingKey: "machine_center_is_zero"
- property string label: catalog.i18nc("@option:check", "Origin at center")
- property bool forceUpdateOnChange: true
- }
- Loader
- {
- id: heatedBedCheckBox
- sourceComponent: simpleCheckBox
- property var settingKey: "machine_heated_bed"
- property string label: catalog.i18nc("@option:check", "Heated bed")
- property bool forceUpdateOnChange: true
- }
-
- Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
-
- Loader
- {
- id: gcodeFlavorComboBox
- sourceComponent: comboBoxWithOptions
- property string settingKey: "machine_gcode_flavor"
- property string label: catalog.i18nc("@label", "G-code flavor")
- property bool forceUpdateOnChange: true
- property var afterOnActivate: manager.updateHasMaterialsMetadata
- }
- }
-
- Column
- {
- width: settingsTabs.columnWidth
- spacing: UM.Theme.getSize("default_lining").height
-
- Label
- {
- text: catalog.i18nc("@label", "Printhead Settings")
- font.bold: true
- }
-
- Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
-
- Loader
- {
- id: printheadXMinField
- sourceComponent: headPolygonTextField
- property string label: catalog.i18nc("@label", "X min")
- property string tooltip: catalog.i18nc("@tooltip", "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".")
- property string axis: "x"
- property string side: "min"
- }
-
- Loader
- {
- id: printheadYMinField
- sourceComponent: headPolygonTextField
- property string label: catalog.i18nc("@label", "Y min")
- property string tooltip: catalog.i18nc("@tooltip", "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".")
- property string axis: "y"
- property string side: "min"
- }
-
- Loader
- {
- id: printheadXMaxField
- sourceComponent: headPolygonTextField
- property string label: catalog.i18nc("@label", "X max")
- property string tooltip: catalog.i18nc("@tooltip", "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".")
- property string axis: "x"
- property string side: "max"
- }
-
- Loader
- {
- id: printheadYMaxField
- sourceComponent: headPolygonTextField
- property string label: catalog.i18nc("@label", "Y max")
- property string tooltip: catalog.i18nc("@tooltip", "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".")
- property string axis: "y"
- property string side: "max"
- }
-
- Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
-
- Loader
- {
- id: gantryHeightField
- sourceComponent: numericTextFieldWithUnit
- property string settingKey: "gantry_height"
- property string label: catalog.i18nc("@label", "Gantry height")
- property string unit: catalog.i18nc("@label", "mm")
- property string tooltip: catalog.i18nc("@tooltip", "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\".")
- property bool forceUpdateOnChange: true
- }
-
- Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
-
- UM.TooltipArea
- {
- height: childrenRect.height
- width: childrenRect.width
- text: machineExtruderCountProvider.properties.description
- visible: extruderCountModel.count >= 2
-
- Row
- {
- spacing: UM.Theme.getSize("default_margin").width
-
- Label
- {
- text: catalog.i18nc("@label", "Number of Extruders")
- elide: Text.ElideRight
- width: Math.max(0, settingsTabs.labelColumnWidth)
- anchors.verticalCenter: extruderCountComboBox.verticalCenter
- }
- ComboBox
- {
- id: extruderCountComboBox
- model: ListModel
- {
- id: extruderCountModel
- Component.onCompleted:
- {
- for(var i = 0; i < manager.definedExtruderCount; i++)
- {
- extruderCountModel.append({text: String(i + 1), value: i});
- }
- }
- }
-
- Connections
- {
- target: manager
- onDefinedExtruderCountChanged:
- {
- extruderCountModel.clear();
- for(var i = 0; i < manager.definedExtruderCount; ++i)
- {
- extruderCountModel.append({text: String(i + 1), value: i});
- }
- }
- }
-
- currentIndex: machineExtruderCountProvider.properties.value - 1
- onActivated:
- {
- manager.setMachineExtruderCount(index + 1);
- }
- }
- }
- }
- }
- }
-
- Row
- {
- spacing: UM.Theme.getSize("default_margin").width
- anchors.left: parent.left
- anchors.right: parent.right
- height: parent.height - y
- Column
- {
- height: parent.height
- width: settingsTabs.columnWidth
- Label
- {
- text: catalog.i18nc("@label", "Start G-code")
- font.bold: true
- }
- Loader
- {
- id: machineStartGcodeField
- sourceComponent: gcodeTextArea
- property int areaWidth: parent.width
- property int areaHeight: parent.height - y
- property string settingKey: "machine_start_gcode"
- property string tooltip: catalog.i18nc("@tooltip", "G-code commands to be executed at the very start.")
- }
- }
-
- Column {
- height: parent.height
- width: settingsTabs.columnWidth
- Label
- {
- text: catalog.i18nc("@label", "End G-code")
- font.bold: true
- }
- Loader
- {
- id: machineEndGcodeField
- sourceComponent: gcodeTextArea
- property int areaWidth: parent.width
- property int areaHeight: parent.height - y
- property string settingKey: "machine_end_gcode"
- property string tooltip: catalog.i18nc("@tooltip", "G-code commands to be executed at the very end.")
- }
- }
- }
- }
+ const m = extrudersModel.getItem(i)
+ append({ name: m.name })
}
+ }
+ }
- onCurrentIndexChanged:
+ Cura.RoundedRectangle
+ {
+ anchors
+ {
+ top: tabBar.bottom
+ topMargin: -UM.Theme.getSize("default_lining").height
+ bottom: parent.bottom
+ left: parent.left
+ right: parent.right
+ }
+ cornerSide: Cura.RoundedRectangle.Direction.Down
+ border.color: UM.Theme.getColor("lining")
+ border.width: UM.Theme.getSize("default_lining").width
+ radius: UM.Theme.getSize("default_radius").width
+ color: UM.Theme.getColor("main_background")
+ StackLayout
+ {
+ id: tabStack
+ anchors.fill: parent
+
+ currentIndex: tabBar.currentIndex
+
+ MachineSettingsPrinterTab
{
- if(currentIndex > 0)
- {
- contentItem.forceActiveFocus();
- }
+ id: printerTab
}
Repeater
{
- id: extruderTabsRepeater
- model: base.extruderTabsCount
-
- Tab
+ model: extrudersModel
+ delegate: MachineSettingsExtruderTab
{
- title: base.extrudersModel.getItem(index).name
- anchors.margins: UM.Theme.getSize("default_margin").width
-
- Column
- {
- spacing: UM.Theme.getSize("default_lining").width
-
- Label
- {
- text: catalog.i18nc("@label", "Nozzle Settings")
- font.bold: true
- }
-
- Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
-
- Loader
- {
- id: extruderNozzleSizeField
- visible: !Cura.MachineManager.hasVariants
- sourceComponent: numericTextFieldWithUnit
- property string settingKey: "machine_nozzle_size"
- property string label: catalog.i18nc("@label", "Nozzle size")
- property string unit: catalog.i18nc("@label", "mm")
- function afterOnEditingFinished()
- {
- // Somehow the machine_nozzle_size dependent settings are not updated otherwise
- Cura.MachineManager.forceUpdateAllSettings()
- }
- property bool isExtruderSetting: true
- }
-
- Loader
- {
- id: materialDiameterField
- visible: Cura.MachineManager.hasMaterials
- sourceComponent: numericTextFieldWithUnit
- property string settingKey: "material_diameter"
- property string label: catalog.i18nc("@label", "Compatible material diameter")
- property string unit: catalog.i18nc("@label", "mm")
- property string tooltip: catalog.i18nc("@tooltip", "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile.")
- function afterOnEditingFinished()
- {
- if (settingsTabs.currentIndex > 0)
- {
- manager.updateMaterialForDiameter(settingsTabs.currentIndex - 1)
- }
- }
- function setValueFunction(value)
- {
- if (settingsTabs.currentIndex > 0)
- {
- const extruderIndex = index.toString()
- Cura.MachineManager.activeMachine.extruders[extruderIndex].compatibleMaterialDiameter = value
- }
- }
- property bool isExtruderSetting: true
- }
-
- Loader
- {
- id: extruderOffsetXField
- sourceComponent: numericTextFieldWithUnit
- property string settingKey: "machine_nozzle_offset_x"
- property string label: catalog.i18nc("@label", "Nozzle offset X")
- property string unit: catalog.i18nc("@label", "mm")
- property bool isExtruderSetting: true
- property bool forceUpdateOnChange: true
- property bool allowNegative: true
- }
-
- Loader
- {
- id: extruderOffsetYField
- sourceComponent: numericTextFieldWithUnit
- property string settingKey: "machine_nozzle_offset_y"
- property string label: catalog.i18nc("@label", "Nozzle offset Y")
- property string unit: catalog.i18nc("@label", "mm")
- property bool isExtruderSetting: true
- property bool forceUpdateOnChange: true
- property bool allowNegative: true
- }
-
- Loader
- {
- id: extruderCoolingFanNumberField
- sourceComponent: numericTextFieldWithUnit
- property string settingKey: "machine_extruder_cooling_fan_number"
- property string label: catalog.i18nc("@label", "Cooling Fan Number")
- property string unit: catalog.i18nc("@label", "")
- property bool isExtruderSetting: true
- property bool forceUpdateOnChange: true
- property bool allowNegative: false
- }
-
- Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
-
- Row
- {
- spacing: UM.Theme.getSize("default_margin").width
- anchors.left: parent.left
- anchors.right: parent.right
- height: parent.height - y
- Column
- {
- height: parent.height
- width: settingsTabs.columnWidth
- Label
- {
- text: catalog.i18nc("@label", "Extruder Start G-code")
- font.bold: true
- }
- Loader
- {
- id: extruderStartGcodeField
- sourceComponent: gcodeTextArea
- property int areaWidth: parent.width
- property int areaHeight: parent.height - y
- property string settingKey: "machine_extruder_start_code"
- property bool isExtruderSetting: true
- }
- }
- Column {
- height: parent.height
- width: settingsTabs.columnWidth
- Label
- {
- text: catalog.i18nc("@label", "Extruder End G-code")
- font.bold: true
- }
- Loader
- {
- id: extruderEndGcodeField
- sourceComponent: gcodeTextArea
- property int areaWidth: parent.width
- property int areaHeight: parent.height - y
- property string settingKey: "machine_extruder_end_code"
- property bool isExtruderSetting: true
- }
- }
- }
- }
+ id: discoverTab
+ extruderPosition: model.index
+ extruderStackId: model.id
}
}
}
}
-
- Component
+ UM.TabRow
{
- id: simpleCheckBox
- UM.TooltipArea
+ id: tabBar
+ width: parent.width
+ Repeater
{
- height: checkBox.height
- width: checkBox.width
- text: _tooltip
-
- property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting
- property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange
- property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip
-
- UM.SettingPropertyProvider
+ model: tabNameModel
+ delegate: UM.TabRowButton
{
- id: propertyProvider
-
- containerStackId: {
- if(_isExtruderSetting)
- {
- if(settingsTabs.currentIndex > 0)
- {
- return Cura.ExtruderManager.extruderIds[String(settingsTabs.currentIndex - 1)];
- }
- return "";
- }
- return base.activeMachineId
- }
- key: settingKey
- watchedProperties: [ "value", "description" ]
- storeIndex: manager.containerIndex
- }
-
- CheckBox
- {
- id: checkBox
- text: label
- checked: String(propertyProvider.properties.value).toLowerCase() != 'false'
- onClicked:
- {
- propertyProvider.setPropertyValue("value", checked);
- if(_forceUpdateOnChange)
- {
- manager.forceUpdate();
- }
- }
+ text: model.name
}
}
}
-
- Component
- {
- id: numericTextFieldWithUnit
- UM.TooltipArea
- {
- height: childrenRect.height
- width: childrenRect.width
- text: _tooltip
-
- property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting
- property bool _allowNegative: (typeof(allowNegative) === 'undefined') ? false : allowNegative
- property var _afterOnEditingFinished: (typeof(afterOnEditingFinished) === 'undefined') ? undefined : afterOnEditingFinished
- property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false : forceUpdateOnChange
- property string _label: (typeof(label) === 'undefined') ? "" : label
- property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip
- property var _setValueFunction: (typeof(setValueFunction) === 'undefined') ? undefined : setValueFunction
-
- UM.SettingPropertyProvider
- {
- id: propertyProvider
-
- containerStackId: {
- if(_isExtruderSetting)
- {
- if(settingsTabs.currentIndex > 0)
- {
- return Cura.ExtruderManager.extruderIds[String(settingsTabs.currentIndex - 1)];
- }
- return "";
- }
- return base.activeMachineId
- }
- key: settingKey
- watchedProperties: [ "value", "description" ]
- storeIndex: manager.containerIndex
- }
-
- Row
- {
- spacing: UM.Theme.getSize("default_margin").width
-
- Label
- {
- text: _label
- visible: _label != ""
- elide: Text.ElideRight
- width: Math.max(0, settingsTabs.labelColumnWidth)
- anchors.verticalCenter: textFieldWithUnit.verticalCenter
- }
-
- Item
- {
- width: textField.width
- height: textField.height
-
- id: textFieldWithUnit
- TextField
- {
- id: textField
- text: {
- const value = propertyProvider.properties.value;
- return value ? value : "";
- }
- validator: RegExpValidator { regExp: _allowNegative ? /-?[0-9\.,]{0,6}/ : /[0-9\.,]{0,6}/ }
- onEditingFinished:
- {
- if (propertyProvider && text != propertyProvider.properties.value)
- {
- // For some properties like the extruder-compatible material diameter, they need to
- // trigger many updates, such as the available materials, the current material may
- // need to be switched, etc. Although setting the diameter can be done directly via
- // the provider, all the updates that need to be triggered then need to depend on
- // the metadata update, a signal that can be fired way too often. The update functions
- // can have if-checks to filter out the irrelevant updates, but still it incurs unnecessary
- // overhead.
- // The ExtruderStack class has a dedicated function for this call "setCompatibleMaterialDiameter()",
- // and it triggers the diameter update signals only when it is needed. Here it is optionally
- // choose to use setCompatibleMaterialDiameter() or other more specific functions that
- // are available.
- if (_setValueFunction !== undefined)
- {
- _setValueFunction(text)
- }
- else
- {
- propertyProvider.setPropertyValue("value", text)
- }
- if(_forceUpdateOnChange)
- {
- manager.forceUpdate()
- }
- if(_afterOnEditingFinished)
- {
- _afterOnEditingFinished()
- }
- }
- }
- }
-
- Label
- {
- text: unit
- anchors.right: textField.right
- anchors.rightMargin: y - textField.y
- anchors.verticalCenter: textField.verticalCenter
- }
- }
- }
- }
- }
-
- Component
- {
- id: comboBoxWithOptions
- UM.TooltipArea
- {
- height: childrenRect.height
- width: childrenRect.width
- text: _tooltip
-
- property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false : isExtruderSetting
- property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false : forceUpdateOnChange
- property var _afterOnActivate: (typeof(afterOnActivate) === 'undefined') ? undefined : afterOnActivate
- property string _label: (typeof(label) === 'undefined') ? "" : label
- property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip
-
- UM.SettingPropertyProvider
- {
- id: propertyProvider
-
- containerStackId: {
- if(_isExtruderSetting)
- {
- if(settingsTabs.currentIndex > 0)
- {
- return Cura.ExtruderManager.extruderIds[String(settingsTabs.currentIndex - 1)];
- }
- return "";
- }
- return base.activeMachineId
- }
- key: settingKey
- watchedProperties: [ "value", "options", "description" ]
- storeIndex: manager.containerIndex
- }
-
- Row
- {
- spacing: UM.Theme.getSize("default_margin").width
-
- Label
- {
- text: _label
- visible: _label != ""
- elide: Text.ElideRight
- width: Math.max(0, settingsTabs.labelColumnWidth)
- anchors.verticalCenter: comboBox.verticalCenter
- }
- ComboBox
- {
- id: comboBox
- model: ListModel
- {
- id: optionsModel
- Component.onCompleted:
- {
- // Options come in as a string-representation of an OrderedDict
- var options = propertyProvider.properties.options.match(/^OrderedDict\(\[\((.*)\)\]\)$/);
- if(options)
- {
- options = options[1].split("), (")
- for(var i = 0; i < options.length; i++)
- {
- var option = options[i].substring(1, options[i].length - 1).split("', '")
- optionsModel.append({text: option[1], value: option[0]});
- }
- }
- }
- }
- currentIndex:
- {
- var currentValue = propertyProvider.properties.value;
- var index = 0;
- for(var i = 0; i < optionsModel.count; i++)
- {
- if(optionsModel.get(i).value == currentValue) {
- index = i;
- break;
- }
- }
- return index
- }
- onActivated:
- {
- if(propertyProvider.properties.value != optionsModel.get(index).value)
- {
- propertyProvider.setPropertyValue("value", optionsModel.get(index).value);
- if(_forceUpdateOnChange)
- {
- manager.forceUpdate();
- }
- if(_afterOnActivate)
- {
- _afterOnActivate();
- }
- }
- }
- }
- }
- }
- }
-
- Component
- {
- id: gcodeTextArea
-
- UM.TooltipArea
- {
- height: gcodeArea.height
- width: gcodeArea.width
- text: _tooltip
-
- property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false : isExtruderSetting
- property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip
-
- UM.SettingPropertyProvider
- {
- id: propertyProvider
-
- containerStackId: {
- if(_isExtruderSetting)
- {
- if(settingsTabs.currentIndex > 0)
- {
- return Cura.ExtruderManager.extruderIds[String(settingsTabs.currentIndex - 1)];
- }
- return "";
- }
- return base.activeMachineId
- }
- key: settingKey
- watchedProperties: [ "value", "description" ]
- storeIndex: manager.containerIndex
- }
-
- TextArea
- {
- id: gcodeArea
- width: areaWidth
- height: areaHeight
- font: UM.Theme.getFont("fixed")
- text: (propertyProvider.properties.value) ? propertyProvider.properties.value : ""
- onActiveFocusChanged:
- {
- if(!activeFocus)
- {
- propertyProvider.setPropertyValue("value", gcodeArea.text)
- }
- }
- Component.onCompleted:
- {
- wrapMode = TextEdit.NoWrap;
- }
- }
- }
- }
-
- Component
- {
- id: headPolygonTextField
- UM.TooltipArea
- {
- height: textField.height
- width: textField.width
- text: tooltip
-
- property string _label: (typeof(label) === 'undefined') ? "" : label
-
- Row
- {
- spacing: UM.Theme.getSize("default_margin").width
-
- Label
- {
- text: _label
- visible: _label != ""
- elide: Text.ElideRight
- width: Math.max(0, settingsTabs.labelColumnWidth)
- anchors.verticalCenter: textFieldWithUnit.verticalCenter
- }
-
- Item
- {
- id: textFieldWithUnit
- width: textField.width
- height: textField.height
-
- TextField
- {
- id: textField
- text:
- {
- var polygon = JSON.parse(machineHeadPolygonProvider.properties.value);
- var item = (axis == "x") ? 0 : 1
- var result = polygon[0][item];
- for(var i = 1; i < polygon.length; i++) {
- if (side == "min") {
- result = Math.min(result, polygon[i][item]);
- } else {
- result = Math.max(result, polygon[i][item]);
- }
- }
- result = Math.abs(result);
- printHeadPolygon[axis][side] = result;
- return result;
- }
- validator: RegExpValidator { regExp: /[0-9\.,]{0,6}/ }
- onEditingFinished:
- {
- printHeadPolygon[axis][side] = parseFloat(textField.text.replace(',','.'));
- var polygon = [];
- polygon.push([-printHeadPolygon["x"]["min"], printHeadPolygon["y"]["max"]]);
- polygon.push([-printHeadPolygon["x"]["min"],-printHeadPolygon["y"]["min"]]);
- polygon.push([ printHeadPolygon["x"]["max"], printHeadPolygon["y"]["max"]]);
- polygon.push([ printHeadPolygon["x"]["max"],-printHeadPolygon["y"]["min"]]);
- var polygon_string = JSON.stringify(polygon);
- if(polygon_string != machineHeadPolygonProvider.properties.value)
- {
- machineHeadPolygonProvider.setPropertyValue("value", polygon_string);
- manager.forceUpdate();
- }
- }
- }
-
- Label
- {
- text: catalog.i18nc("@label", "mm")
- anchors.right: textField.right
- anchors.rightMargin: y - textField.y
- anchors.verticalCenter: textField.verticalCenter
- }
- }
- }
- }
- }
-
- property var printHeadPolygon:
- {
- "x": {
- "min": 0,
- "max": 0,
- },
- "y": {
- "min": 0,
- "max": 0,
- },
- }
-
-
- UM.SettingPropertyProvider
- {
- id: machineExtruderCountProvider
-
- containerStackId: base.activeMachineId
- key: "machine_extruder_count"
- watchedProperties: [ "value", "description" ]
- storeIndex: manager.containerIndex
- }
-
- UM.SettingPropertyProvider
- {
- id: machineHeadPolygonProvider
-
- containerStackId: base.activeMachineId
- key: "machine_head_with_fans_polygon"
- watchedProperties: [ "value" ]
- storeIndex: manager.containerIndex
- }
}
diff --git a/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml b/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml
new file mode 100644
index 0000000000..65f1e8a57a
--- /dev/null
+++ b/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml
@@ -0,0 +1,180 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// This component contains the content for the "Welcome" page of the welcome on-boarding process.
+//
+Item
+{
+ id: base
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+
+ property int labelWidth: 210 * screenScaleFactor
+ property int controlWidth: (UM.Theme.getSize("setting_control").width * 3 / 4) | 0
+ property var labelFont: UM.Theme.getFont("medium")
+
+ property int columnWidth: ((parent.width - 2 * UM.Theme.getSize("default_margin").width) / 2) | 0
+ property int columnSpacing: 3 * screenScaleFactor
+ property int propertyStoreIndex: manager ? manager.storeContainerIndex : 1 // definition_changes
+
+ property string extruderStackId: ""
+ property int extruderPosition: 0
+ property var forceUpdateFunction: manager.forceUpdate
+
+ function updateMaterialDiameter()
+ {
+ manager.updateMaterialForDiameter(extruderPosition)
+ }
+
+ Item
+ {
+ id: upperBlock
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: UM.Theme.getSize("default_margin").width
+
+ height: childrenRect.height
+
+ // =======================================
+ // Left-side column "Nozzle Settings"
+ // =======================================
+ Column
+ {
+ anchors.top: parent.top
+ anchors.left: parent.left
+ width: parent.width * 2 / 3
+
+ spacing: base.columnSpacing
+
+ Label // Title Label
+ {
+ text: catalog.i18nc("@title:label", "Nozzle Settings")
+ font: UM.Theme.getFont("medium_bold")
+ renderType: Text.NativeRendering
+ }
+
+ Cura.NumericTextFieldWithUnit // "Nozzle size"
+ {
+ id: extruderNozzleSizeField
+ visible: !Cura.MachineManager.hasVariants
+ containerStackId: base.extruderStackId
+ settingKey: "machine_nozzle_size"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "Nozzle size")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ unitText: catalog.i18nc("@label", "mm")
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.NumericTextFieldWithUnit // "Compatible material diameter"
+ {
+ id: extruderCompatibleMaterialDiameterField
+ containerStackId: base.extruderStackId
+ settingKey: "material_diameter"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "Compatible material diameter")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ unitText: catalog.i18nc("@label", "mm")
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ // Other modules won't automatically respond after the user changes the value, so we need to force it.
+ afterOnEditingFinishedFunction: updateMaterialDiameter
+ }
+
+ Cura.NumericTextFieldWithUnit // "Nozzle offset X"
+ {
+ id: extruderNozzleOffsetXField
+ containerStackId: base.extruderStackId
+ settingKey: "machine_nozzle_offset_x"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "Nozzle offset X")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ unitText: catalog.i18nc("@label", "mm")
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.NumericTextFieldWithUnit // "Nozzle offset Y"
+ {
+ id: extruderNozzleOffsetYField
+ containerStackId: base.extruderStackId
+ settingKey: "machine_nozzle_offset_y"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "Nozzle offset Y")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ unitText: catalog.i18nc("@label", "mm")
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.NumericTextFieldWithUnit // "Cooling Fan Number"
+ {
+ id: extruderNozzleCoolingFanNumberField
+ containerStackId: base.extruderStackId
+ settingKey: "machine_extruder_cooling_fan_number"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "Cooling Fan Number")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ unitText: ""
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+ }
+ }
+
+ Item // Extruder Start and End G-code
+ {
+ id: lowerBlock
+ anchors.top: upperBlock.bottom
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: UM.Theme.getSize("default_margin").width
+
+ Cura.GcodeTextArea // "Extruder Start G-code"
+ {
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: UM.Theme.getSize("default_margin").height
+ anchors.left: parent.left
+ width: base.columnWidth - UM.Theme.getSize("default_margin").width
+
+ labelText: catalog.i18nc("@title:label", "Extruder Start G-code")
+ containerStackId: base.extruderStackId
+ settingKey: "machine_extruder_start_code"
+ settingStoreIndex: propertyStoreIndex
+ }
+
+ Cura.GcodeTextArea // "Extruder End G-code"
+ {
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: UM.Theme.getSize("default_margin").height
+ anchors.right: parent.right
+ width: base.columnWidth - UM.Theme.getSize("default_margin").width
+
+ labelText: catalog.i18nc("@title:label", "Extruder End G-code")
+ containerStackId: base.extruderStackId
+ settingKey: "machine_extruder_end_code"
+ settingStoreIndex: propertyStoreIndex
+ }
+ }
+}
diff --git a/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml b/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml
new file mode 100644
index 0000000000..4ba0d19390
--- /dev/null
+++ b/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml
@@ -0,0 +1,353 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// This the content in the "Printer" tab in the Machine Settings dialog.
+//
+Item
+{
+ id: base
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+
+ property int labelWidth: 120 * screenScaleFactor
+ property int controlWidth: (UM.Theme.getSize("setting_control").width * 3 / 4) | 0
+ property var labelFont: UM.Theme.getFont("default")
+
+ property int columnWidth: ((parent.width - 2 * UM.Theme.getSize("default_margin").width) / 2) | 0
+ property int columnSpacing: 3 * screenScaleFactor
+ property int propertyStoreIndex: manager ? manager.storeContainerIndex : 1 // definition_changes
+
+ property string machineStackId: Cura.MachineManager.activeMachineId
+
+ property var forceUpdateFunction: manager.forceUpdate
+
+ Item
+ {
+ id: upperBlock
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: UM.Theme.getSize("default_margin").width
+
+ height: childrenRect.height
+
+ // =======================================
+ // Left-side column for "Printer Settings"
+ // =======================================
+ Column
+ {
+ anchors.top: parent.top
+ anchors.left: parent.left
+ width: base.columnWidth
+
+ spacing: base.columnSpacing
+
+ Label // Title Label
+ {
+ text: catalog.i18nc("@title:label", "Printer Settings")
+ font: UM.Theme.getFont("medium_bold")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+
+ Cura.NumericTextFieldWithUnit // "X (Width)"
+ {
+ id: machineXWidthField
+ containerStackId: machineStackId
+ settingKey: "machine_width"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "X (Width)")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ unitText: catalog.i18nc("@label", "mm")
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.NumericTextFieldWithUnit // "Y (Depth)"
+ {
+ id: machineYDepthField
+ containerStackId: machineStackId
+ settingKey: "machine_depth"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "Y (Depth)")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ unitText: catalog.i18nc("@label", "mm")
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.NumericTextFieldWithUnit // "Z (Height)"
+ {
+ id: machineZHeightField
+ containerStackId: machineStackId
+ settingKey: "machine_height"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "Z (Height)")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ unitText: catalog.i18nc("@label", "mm")
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.ComboBoxWithOptions // "Build plate shape"
+ {
+ id: buildPlateShapeComboBox
+ containerStackId: machineStackId
+ settingKey: "machine_shape"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "Build plate shape")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.SimpleCheckBox // "Origin at center"
+ {
+ id: originAtCenterCheckBox
+ containerStackId: machineStackId
+ settingKey: "machine_center_is_zero"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "Origin at center")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.SimpleCheckBox // "Heated bed"
+ {
+ id: heatedBedCheckBox
+ containerStackId: machineStackId
+ settingKey: "machine_heated_bed"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "Heated bed")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.ComboBoxWithOptions // "G-code flavor"
+ {
+ id: gcodeFlavorComboBox
+ containerStackId: machineStackId
+ settingKey: "machine_gcode_flavor"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "G-code flavor")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ // FIXME(Lipu): better document this.
+ // This has something to do with UM2 and UM2+ regarding "has_material" and the gcode flavor settings.
+ // I don't remember exactly what.
+ afterOnEditingFinishedFunction: manager.updateHasMaterialsMetadata
+ }
+ }
+
+ // =======================================
+ // Right-side column for "Printhead Settings"
+ // =======================================
+ Column
+ {
+ anchors.top: parent.top
+ anchors.right: parent.right
+ width: base.columnWidth
+
+ spacing: base.columnSpacing
+
+ Label // Title Label
+ {
+ text: catalog.i18nc("@title:label", "Printhead Settings")
+ font: UM.Theme.getFont("medium_bold")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+
+ Cura.PrintHeadMinMaxTextField // "X min"
+ {
+ id: machineXMinField
+
+ settingStoreIndex: propertyStoreIndex
+
+ labelText: catalog.i18nc("@label", "X min")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ unitText: catalog.i18nc("@label", "mm")
+
+ axisName: "x"
+ axisMinOrMax: "min"
+
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.PrintHeadMinMaxTextField // "Y min"
+ {
+ id: machineYMinField
+
+ settingStoreIndex: propertyStoreIndex
+
+ labelText: catalog.i18nc("@label", "Y min")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ unitText: catalog.i18nc("@label", "mm")
+
+ axisName: "y"
+ axisMinOrMax: "min"
+
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.PrintHeadMinMaxTextField // "X max"
+ {
+ id: machineXMaxField
+
+ settingStoreIndex: propertyStoreIndex
+
+ labelText: catalog.i18nc("@label", "X max")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ unitText: catalog.i18nc("@label", "mm")
+
+ axisName: "x"
+ axisMinOrMax: "max"
+
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.PrintHeadMinMaxTextField // "Y max"
+ {
+ id: machineYMaxField
+
+ containerStackId: machineStackId
+ settingKey: "machine_head_with_fans_polygon"
+ settingStoreIndex: propertyStoreIndex
+
+ labelText: catalog.i18nc("@label", "Y max")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ unitText: catalog.i18nc("@label", "mm")
+
+ axisName: "y"
+ axisMinOrMax: "max"
+
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.NumericTextFieldWithUnit // "Gantry Height"
+ {
+ id: machineGantryHeightField
+ containerStackId: machineStackId
+ settingKey: "gantry_height"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "Gantry Height")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ unitText: catalog.i18nc("@label", "mm")
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ }
+
+ Cura.ComboBoxWithOptions // "Number of Extruders"
+ {
+ id: numberOfExtrudersComboBox
+ containerStackId: machineStackId
+ settingKey: "machine_extruder_count"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "Number of Extruders")
+ labelFont: base.labelFont
+ labelWidth: base.labelWidth
+ controlWidth: base.controlWidth
+ forceUpdateOnChangeFunction: forceUpdateFunction
+ // FIXME(Lipu): better document this.
+ // This has something to do with UM2 and UM2+ regarding "has_material" and the gcode flavor settings.
+ // I don't remember exactly what.
+ afterOnEditingFinishedFunction: manager.updateHasMaterialsMetadata
+ setValueFunction: manager.setMachineExtruderCount
+
+ optionModel: ListModel
+ {
+ id: extruderCountModel
+
+ Component.onCompleted:
+ {
+ update()
+ }
+
+ function update()
+ {
+ clear()
+ for (var i = 1; i <= Cura.MachineManager.activeMachine.maxExtruderCount; i++)
+ {
+ // Use String as value. JavaScript only has Number. PropertyProvider.setPropertyValue()
+ // takes a QVariant as value, and Number gets translated into a float. This will cause problem
+ // for integer settings such as "Number of Extruders".
+ append({ text: String(i), value: String(i) })
+ }
+ }
+ }
+
+ Connections
+ {
+ target: Cura.MachineManager
+ onGlobalContainerChanged: extruderCountModel.update()
+ }
+ }
+ }
+ }
+
+ Item // Start and End G-code
+ {
+ id: lowerBlock
+ anchors.top: upperBlock.bottom
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: UM.Theme.getSize("default_margin").width
+
+ Cura.GcodeTextArea // "Start G-code"
+ {
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: UM.Theme.getSize("default_margin").height
+ anchors.left: parent.left
+ width: base.columnWidth - UM.Theme.getSize("default_margin").width
+
+ labelText: catalog.i18nc("@title:label", "Start G-code")
+ containerStackId: machineStackId
+ settingKey: "machine_start_gcode"
+ settingStoreIndex: propertyStoreIndex
+ }
+
+ Cura.GcodeTextArea // "End G-code"
+ {
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: UM.Theme.getSize("default_margin").height
+ anchors.right: parent.right
+ width: base.columnWidth - UM.Theme.getSize("default_margin").width
+
+ labelText: catalog.i18nc("@title:label", "End G-code")
+ containerStackId: machineStackId
+ settingKey: "machine_end_gcode"
+ settingStoreIndex: propertyStoreIndex
+ }
+ }
+}
diff --git a/plugins/MonitorStage/MonitorMain.qml b/plugins/MonitorStage/MonitorMain.qml
index 88193737bb..9e719ddb43 100644
--- a/plugins/MonitorStage/MonitorMain.qml
+++ b/plugins/MonitorStage/MonitorMain.qml
@@ -12,7 +12,15 @@ Rectangle
id: viewportOverlay
property bool isConnected: Cura.MachineManager.activeMachineHasNetworkConnection || Cura.MachineManager.activeMachineHasCloudConnection
- property bool isNetworkConfigurable: ["Ultimaker 3", "Ultimaker 3 Extended", "Ultimaker S5"].indexOf(Cura.MachineManager.activeMachineDefinitionName) > -1
+ property bool isNetworkConfigurable:
+ {
+ if(Cura.MachineManager.activeMachine === null)
+ {
+ return false
+ }
+ return Cura.MachineManager.activeMachine.supportsNetworkConnection
+ }
+
property bool isNetworkConfigured:
{
// Readability:
@@ -98,7 +106,6 @@ Rectangle
width: contentWidth
}
- // CASE 3: CAN NOT MONITOR
Label
{
id: noNetworkLabel
@@ -106,24 +113,8 @@ Rectangle
{
horizontalCenter: parent.horizontalCenter
}
- visible: !isNetworkConfigured
- text: catalog.i18nc("@info", "Please select a network connected printer to monitor.")
- font: UM.Theme.getFont("medium")
- color: UM.Theme.getColor("monitor_text_primary")
- wrapMode: Text.WordWrap
- width: contentWidth
- lineHeight: UM.Theme.getSize("monitor_text_line_large").height
- lineHeightMode: Text.FixedHeight
- }
- Label
- {
- id: noNetworkUltimakerLabel
- anchors
- {
- horizontalCenter: parent.horizontalCenter
- }
visible: !isNetworkConfigured && isNetworkConfigurable
- text: catalog.i18nc("@info", "Please connect your Ultimaker printer to your local network.")
+ text: catalog.i18nc("@info", "Please connect your printer to the network.")
font: UM.Theme.getFont("medium")
color: UM.Theme.getColor("monitor_text_primary")
wrapMode: Text.WordWrap
@@ -135,7 +126,7 @@ Rectangle
{
anchors
{
- left: noNetworkUltimakerLabel.left
+ left: noNetworkLabel.left
}
visible: !isNetworkConfigured && isNetworkConfigurable
height: UM.Theme.getSize("monitor_text_line").height
@@ -160,7 +151,7 @@ Rectangle
verticalCenter: externalLinkIcon.verticalCenter
}
color: UM.Theme.getColor("monitor_text_link")
- font: UM.Theme.getFont("medium") // 14pt, regular
+ font: UM.Theme.getFont("medium")
linkColor: UM.Theme.getColor("monitor_text_link")
text: catalog.i18nc("@label link to technical assistance", "View user manuals online")
renderType: Text.NativeRendering
@@ -170,14 +161,8 @@ Rectangle
anchors.fill: parent
hoverEnabled: true
onClicked: Qt.openUrlExternally("https://ultimaker.com/en/resources/manuals/ultimaker-3d-printers")
- onEntered:
- {
- manageQueueText.font.underline = true
- }
- onExited:
- {
- manageQueueText.font.underline = false
- }
+ onEntered: manageQueueText.font.underline = true
+ onExited: manageQueueText.font.underline = false
}
}
}
diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py
index 69b7f20f4e..3d2a1c3f37 100644
--- a/plugins/MonitorStage/MonitorStage.py
+++ b/plugins/MonitorStage/MonitorStage.py
@@ -2,8 +2,6 @@
# Cura is released under the terms of the LGPLv3 or higher.
import os.path
from UM.Application import Application
-from UM.PluginRegistry import PluginRegistry
-from UM.Resources import Resources
from cura.Stages.CuraStage import CuraStage
diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.py b/plugins/PostProcessingPlugin/PostProcessingPlugin.py
index 78f9cc0516..123733b863 100644
--- a/plugins/PostProcessingPlugin/PostProcessingPlugin.py
+++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.py
@@ -162,7 +162,7 @@ class PostProcessingPlugin(QObject, Extension):
loaded_script = importlib.util.module_from_spec(spec)
if spec.loader is None:
continue
- spec.loader.exec_module(loaded_script)
+ spec.loader.exec_module(loaded_script) # type: ignore
sys.modules[script_name] = loaded_script #TODO: This could be a security risk. Overwrite any module with a user-provided name?
loaded_class = getattr(loaded_script, script_name)
diff --git a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py
index 9fd9e08d7d..3ab20b8297 100644
--- a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py
+++ b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py
@@ -36,7 +36,7 @@ class DisplayFilenameAndLayerOnLCD(Script):
name = self.getSettingValueByKey("name")
else:
name = Application.getInstance().getPrintInformation().jobName
- lcd_text = "M117 " + name + " layer: "
+ lcd_text = "M117 " + name + " layer "
i = 0
for layer in data:
display_text = lcd_text + str(i)
diff --git a/plugins/PostProcessingPlugin/scripts/FilamentChange.py b/plugins/PostProcessingPlugin/scripts/FilamentChange.py
index febb93be4c..7bece3d7e0 100644
--- a/plugins/PostProcessingPlugin/scripts/FilamentChange.py
+++ b/plugins/PostProcessingPlugin/scripts/FilamentChange.py
@@ -1,9 +1,7 @@
# Copyright (c) 2019 Ultimaker B.V.
# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher.
-from typing import Optional, Tuple
-
-from UM.Logger import Logger
+from typing import List
from ..Script import Script
class FilamentChange(Script):
@@ -65,9 +63,10 @@ class FilamentChange(Script):
}
}"""
- def execute(self, data: list):
-
- """data is a list. Each index contains a layer"""
+ ## Inserts the filament change g-code at specific layer numbers.
+ # \param data A list of layers of g-code.
+ # \return A similar list, with filament change commands inserted.
+ def execute(self, data: List[str]):
layer_nums = self.getSettingValueByKey("layer_number")
initial_retract = self.getSettingValueByKey("initial_retract")
later_retract = self.getSettingValueByKey("later_retract")
@@ -88,32 +87,13 @@ class FilamentChange(Script):
if y_pos is not None:
color_change = color_change + (" Y%.2f" % y_pos)
- color_change = color_change + " ; Generated by FilamentChange plugin"
+ color_change = color_change + " ; Generated by FilamentChange plugin\n"
layer_targets = layer_nums.split(",")
if len(layer_targets) > 0:
for layer_num in layer_targets:
- layer_num = int(layer_num.strip())
+ layer_num = int(layer_num.strip()) + 1
if layer_num <= len(data):
- index, layer_data = self._searchLayerData(data, layer_num - 1)
- if layer_data is None:
- Logger.log("e", "Could not found the layer")
- continue
- lines = layer_data.split("\n")
- lines.insert(2, color_change)
- final_line = "\n".join(lines)
- data[index] = final_line
+ data[layer_num] = color_change + data[layer_num]
- return data
-
- ## This method returns the data corresponding with the indicated layer number, looking in the gcode for
- # the occurrence of this layer number.
- def _searchLayerData(self, data: list, layer_num: int) -> Tuple[int, Optional[str]]:
- for index, layer_data in enumerate(data):
- first_line = layer_data.split("\n")[0]
- # The first line should contain the layer number at the beginning.
- if first_line[:len(self._layer_keyword)] == self._layer_keyword:
- # If found the layer that we are looking for, then return the data
- if first_line[len(self._layer_keyword):] == str(layer_num):
- return index, layer_data
- return 0, None
\ No newline at end of file
+ return data
\ No newline at end of file
diff --git a/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py b/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py
new file mode 100644
index 0000000000..c21993aad1
--- /dev/null
+++ b/plugins/PostProcessingPlugin/scripts/InsertAtLayerChange.py
@@ -0,0 +1,50 @@
+# Created by Wayne Porter
+
+from ..Script import Script
+
+class InsertAtLayerChange(Script):
+ def __init__(self):
+ super().__init__()
+
+ def getSettingDataString(self):
+ return """{
+ "name": "Insert at layer change",
+ "key": "InsertAtLayerChange",
+ "metadata": {},
+ "version": 2,
+ "settings":
+ {
+ "insert_location":
+ {
+ "label": "When to insert",
+ "description": "Whether to insert code before or after layer change.",
+ "type": "enum",
+ "options": {"before": "Before", "after": "After"},
+ "default_value": "before"
+ },
+ "gcode_to_add":
+ {
+ "label": "GCODE to insert.",
+ "description": "GCODE to add before or after layer change.",
+ "type": "str",
+ "default_value": ""
+ }
+ }
+ }"""
+
+ def execute(self, data):
+ gcode_to_add = self.getSettingValueByKey("gcode_to_add") + "\n"
+ for layer in data:
+ # Check that a layer is being printed
+ lines = layer.split("\n")
+ for line in lines:
+ if ";LAYER:" in line:
+ index = data.index(layer)
+ if self.getSettingValueByKey("insert_location") == "before":
+ layer = gcode_to_add + layer
+ else:
+ layer = layer + gcode_to_add
+
+ data[index] = layer
+ break
+ return data
diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py
new file mode 100644
index 0000000000..36d0f6a058
--- /dev/null
+++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py
@@ -0,0 +1,95 @@
+# Created by Wayne Porter
+
+from ..Script import Script
+
+class TimeLapse(Script):
+ def __init__(self):
+ super().__init__()
+
+ def getSettingDataString(self):
+ return """{
+ "name": "Time Lapse",
+ "key": "TimeLapse",
+ "metadata": {},
+ "version": 2,
+ "settings":
+ {
+ "trigger_command":
+ {
+ "label": "Trigger camera command",
+ "description": "Gcode command used to trigger camera.",
+ "type": "str",
+ "default_value": "M240"
+ },
+ "pause_length":
+ {
+ "label": "Pause length",
+ "description": "How long to wait (in ms) after camera was triggered.",
+ "type": "int",
+ "default_value": 700,
+ "minimum_value": 0,
+ "unit": "ms"
+ },
+ "park_print_head":
+ {
+ "label": "Park Print Head",
+ "description": "Park the print head out of the way. Assumes absolute positioning.",
+ "type": "bool",
+ "default_value": true
+ },
+ "head_park_x":
+ {
+ "label": "Park Print Head X",
+ "description": "What X location does the head move to for photo.",
+ "unit": "mm",
+ "type": "float",
+ "default_value": 0,
+ "enabled": "park_print_head"
+ },
+ "head_park_y":
+ {
+ "label": "Park Print Head Y",
+ "description": "What Y location does the head move to for photo.",
+ "unit": "mm",
+ "type": "float",
+ "default_value": 190,
+ "enabled": "park_print_head"
+ },
+ "park_feed_rate":
+ {
+ "label": "Park Feed Rate",
+ "description": "How fast does the head move to the park coordinates.",
+ "unit": "mm/s",
+ "type": "float",
+ "default_value": 9000,
+ "enabled": "park_print_head"
+ }
+ }
+ }"""
+
+ def execute(self, data):
+ feed_rate = self.getSettingValueByKey("park_feed_rate")
+ park_print_head = self.getSettingValueByKey("park_print_head")
+ x_park = self.getSettingValueByKey("head_park_x")
+ y_park = self.getSettingValueByKey("head_park_y")
+ trigger_command = self.getSettingValueByKey("trigger_command")
+ pause_length = self.getSettingValueByKey("pause_length")
+ gcode_to_append = ";TimeLapse Begin\n"
+
+ if park_print_head:
+ gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Park print head\n"
+ gcode_to_append += self.putValue(M = 400) + ";Wait for moves to finish\n"
+ gcode_to_append += trigger_command + ";Snap Photo\n"
+ gcode_to_append += self.putValue(G = 4, P = pause_length) + ";Wait for camera\n"
+ gcode_to_append += ";TimeLapse End\n"
+ for layer in data:
+ # Check that a layer is being printed
+ lines = layer.split("\n")
+ for line in lines:
+ if ";LAYER:" in line:
+ index = data.index(layer)
+ layer += gcode_to_append
+
+ data[index] = layer
+ break
+ return data
diff --git a/plugins/PostProcessingPlugin/scripts/UsePreviousProbeMeasurements.py b/plugins/PostProcessingPlugin/scripts/UsePreviousProbeMeasurements.py
new file mode 100644
index 0000000000..271cb57100
--- /dev/null
+++ b/plugins/PostProcessingPlugin/scripts/UsePreviousProbeMeasurements.py
@@ -0,0 +1,46 @@
+# Cura PostProcessingPlugin
+# Author: Amanda de Castilho
+# Date: January 5,2019
+
+# Description: This plugin overrides probing command and inserts code to ensure
+# previous probe measurements are loaded and bed leveling enabled
+# (searches for G29 and replaces it with M501 & M420 S1)
+# *** Assumes G29 is in the start code, will do nothing if it isn't ***
+
+from ..Script import Script
+
+class UsePreviousProbeMeasurements(Script):
+ def __init__(self):
+ super().__init__()
+
+ def getSettingDataString(self):
+ return """{
+ "name": "Use Previous Probe Measurements",
+ "key": "UsePreviousProbeMeasurements",
+ "metadata": {},
+ "version": 2,
+ "settings":
+ {
+ "use_previous_measurements":
+ {
+ "label": "Use last measurement?",
+ "description": "Selecting this will remove the G29 probing command and instead ensure previous measurements are loaded and enabled",
+ "type": "bool",
+ "default_value": false
+ }
+ }
+ }"""
+
+ def execute(self, data):
+ text = "M501 ;load bed level data\nM420 S1 ;enable bed leveling"
+ if self.getSettingValueByKey("use_previous_measurements"):
+ for layer in data:
+ layer_index = data.index(layer)
+ lines = layer.split("\n")
+ for line in lines:
+ if line.startswith("G29"):
+ line_index = lines.index(line)
+ lines[line_index] = text
+ final_lines = "\n".join(lines)
+ data[layer_index] = final_lines
+ return data
diff --git a/plugins/PrepareStage/PrepareMenu.qml b/plugins/PrepareStage/PrepareMenu.qml
index d8953d7661..87d7c5f35c 100644
--- a/plugins/PrepareStage/PrepareMenu.qml
+++ b/plugins/PrepareStage/PrepareMenu.qml
@@ -20,11 +20,19 @@ Item
name: "cura"
}
+ anchors
+ {
+ left: parent.left
+ right: parent.right
+ leftMargin: UM.Theme.getSize("wide_margin").width
+ rightMargin: UM.Theme.getSize("wide_margin").width
+ }
+
// Item to ensure that all of the buttons are nicely centered.
Item
{
anchors.horizontalCenter: parent.horizontalCenter
- width: openFileButton.width + itemRow.width + UM.Theme.getSize("default_margin").width
+ width: parent.width - 2 * UM.Theme.getSize("wide_margin").width
height: parent.height
RowLayout
@@ -32,9 +40,9 @@ Item
id: itemRow
anchors.left: openFileButton.right
+ anchors.right: parent.right
anchors.leftMargin: UM.Theme.getSize("default_margin").width
- width: Math.round(0.9 * prepareMenu.width)
height: parent.height
spacing: 0
diff --git a/plugins/PreviewStage/PreviewMenu.qml b/plugins/PreviewStage/PreviewMenu.qml
index 62f814aac9..ff1ccff75f 100644
--- a/plugins/PreviewStage/PreviewMenu.qml
+++ b/plugins/PreviewStage/PreviewMenu.qml
@@ -20,15 +20,21 @@ Item
name: "cura"
}
+ anchors
+ {
+ left: parent.left
+ right: parent.right
+ leftMargin: UM.Theme.getSize("wide_margin").width
+ rightMargin: UM.Theme.getSize("wide_margin").width
+ }
+
Row
{
id: stageMenuRow
- anchors.centerIn: parent
- height: parent.height
- width: childrenRect.width
- // We want this row to have a preferred with equals to the 85% of the parent
- property int preferredWidth: Math.round(0.85 * previewMenu.width)
+ anchors.horizontalCenter: parent.horizontalCenter
+ width: parent.width - 2 * UM.Theme.getSize("wide_margin").width
+ height: parent.height
Cura.ViewsSelector
{
@@ -49,12 +55,12 @@ Item
color: UM.Theme.getColor("lining")
}
- // This component will grow freely up to complete the preferredWidth of the row.
+ // This component will grow freely up to complete the width of the row.
Loader
{
id: viewPanel
height: parent.height
- width: source != "" ? (stageMenuRow.preferredWidth - viewsSelector.width - printSetupSelectorItem.width - 2 * UM.Theme.getSize("default_lining").width) : 0
+ width: source != "" ? (previewMenu.width - viewsSelector.width - printSetupSelectorItem.width - 2 * (UM.Theme.getSize("wide_margin").width + UM.Theme.getSize("default_lining").width)) : 0
source: UM.Controller.activeView != null && UM.Controller.activeView.stageMenuComponent != null ? UM.Controller.activeView.stageMenuComponent : ""
}
diff --git a/plugins/SimulationView/SimulationViewMenuComponent.qml b/plugins/SimulationView/SimulationViewMenuComponent.qml
index 957d8170cf..b94cf029f0 100644
--- a/plugins/SimulationView/SimulationViewMenuComponent.qml
+++ b/plugins/SimulationView/SimulationViewMenuComponent.qml
@@ -15,6 +15,8 @@ Cura.ExpandableComponent
{
id: base
+ dragPreferencesNamePrefix: "view/colorscheme"
+
contentHeaderTitle: catalog.i18nc("@label", "Color scheme")
Connections
@@ -177,7 +179,6 @@ Cura.ExpandableComponent
height: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height
width: parent.width
visible: !UM.SimulationView.compatibilityMode
- enabled: index < 4
onClicked:
{
diff --git a/plugins/SliceInfoPlugin/MoreInfoWindow.qml b/plugins/SliceInfoPlugin/MoreInfoWindow.qml
index e00ad6730d..50276ec25c 100644
--- a/plugins/SliceInfoPlugin/MoreInfoWindow.qml
+++ b/plugins/SliceInfoPlugin/MoreInfoWindow.qml
@@ -1,150 +1,156 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2019 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
-import QtQuick 2.7
+import QtQuick 2.10
+import QtQuick.Controls 2.3
import QtQuick.Window 2.2
-import QtQuick.Controls 1.4
-import QtQuick.Controls.Styles 1.4
import UM 1.3 as UM
-import Cura 1.0 as Cura
+import Cura 1.1 as Cura
-UM.Dialog
+Window
{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
id: baseDialog
title: catalog.i18nc("@title:window", "More information on anonymous data collection")
visible: false
+ modality: Qt.ApplicationModal
+
minimumWidth: 500 * screenScaleFactor
minimumHeight: 400 * screenScaleFactor
width: minimumWidth
height: minimumHeight
- property bool allowSendData: true // for saving the user's choice
+ color: UM.Theme.getColor("main_background")
- onAccepted: manager.setSendSliceInfo(allowSendData)
+ property bool allowSendData: true // for saving the user's choice
onVisibilityChanged:
{
if (visible)
{
- baseDialog.allowSendData = UM.Preferences.getValue("info/send_slice_info");
+ baseDialog.allowSendData = UM.Preferences.getValue("info/send_slice_info")
if (baseDialog.allowSendData)
{
- allowSendButton.checked = true;
+ allowSendButton.checked = true
}
else
{
- dontSendButton.checked = true;
+ dontSendButton.checked = true
}
}
}
+ // Main content area
Item
{
- id: textRow
- anchors
- {
- top: parent.top
- bottom: radioButtonsRow.top
- bottomMargin: UM.Theme.getSize("default_margin").height
- left: parent.left
- right: parent.right
- }
+ anchors.fill: parent
+ anchors.margins: UM.Theme.getSize("default_margin").width
- Label
+ Item // Text part
{
- id: headerText
+ id: textRow
anchors
{
top: parent.top
- left: parent.left
- right: parent.right
- }
-
- text: catalog.i18nc("@text:window", "Cura sends anonymous data to Ultimaker in order to improve the print quality and user experience. Below is an example of all the data that is sent.")
- wrapMode: Text.WordWrap
- }
-
- TextArea
- {
- id: exampleData
- anchors
- {
- top: headerText.bottom
- topMargin: UM.Theme.getSize("default_margin").height
- bottom: parent.bottom
+ bottom: radioButtonsRow.top
bottomMargin: UM.Theme.getSize("default_margin").height
left: parent.left
right: parent.right
}
- text: manager.getExampleData()
- readOnly: true
- textFormat: TextEdit.PlainText
- }
- }
-
- Column
- {
- id: radioButtonsRow
- width: parent.width
- anchors.bottom: buttonRow.top
- anchors.bottomMargin: UM.Theme.getSize("default_margin").height
-
- ExclusiveGroup { id: group }
-
- RadioButton
- {
- id: dontSendButton
- text: catalog.i18nc("@text:window", "I don't want to send this data")
- exclusiveGroup: group
- onClicked:
+ Label
{
- baseDialog.allowSendData = !checked;
+ id: headerText
+ anchors
+ {
+ top: parent.top
+ left: parent.left
+ right: parent.right
+ }
+ text: catalog.i18nc("@text:window", "Ultimaker Cura collects anonymous data in order to improve the print quality and user experience. Below is an example of all the data that is shared:")
+ wrapMode: Text.WordWrap
+ renderType: Text.NativeRendering
}
- }
- RadioButton
- {
- id: allowSendButton
- text: catalog.i18nc("@text:window", "Allow sending this data to Ultimaker and help us improve Cura")
- exclusiveGroup: group
- onClicked:
+
+ Cura.ScrollableTextArea
{
- baseDialog.allowSendData = checked;
- }
- }
- }
+ anchors
+ {
+ top: headerText.bottom
+ topMargin: UM.Theme.getSize("default_margin").height
+ bottom: parent.bottom
+ bottomMargin: UM.Theme.getSize("default_margin").height
+ left: parent.left
+ right: parent.right
+ }
- Item
- {
- id: buttonRow
- anchors.bottom: parent.bottom
- width: parent.width
- anchors.bottomMargin: UM.Theme.getSize("default_margin").height
-
- UM.I18nCatalog { id: catalog; name: "cura" }
-
- Button
- {
- anchors.right: parent.right
- text: catalog.i18nc("@action:button", "OK")
- onClicked:
- {
- baseDialog.accepted()
- baseDialog.hide()
+ textArea.text: manager.getExampleData()
+ textArea.textFormat: Text.RichText
+ textArea.wrapMode: Text.Wrap
+ textArea.readOnly: true
}
}
- Button
+ Column // Radio buttons for agree and disagree
{
+ id: radioButtonsRow
anchors.left: parent.left
- text: catalog.i18nc("@action:button", "Cancel")
- onClicked:
+ anchors.right: parent.right
+ anchors.bottom: buttonRow.top
+ anchors.bottomMargin: UM.Theme.getSize("default_margin").height
+
+ Cura.RadioButton
{
- baseDialog.rejected()
- baseDialog.hide()
+ id: dontSendButton
+ text: catalog.i18nc("@text:window", "I don't want to send anonymous data")
+ onClicked:
+ {
+ baseDialog.allowSendData = !checked
+ }
+ }
+ Cura.RadioButton
+ {
+ id: allowSendButton
+ text: catalog.i18nc("@text:window", "Allow sending anonymous data")
+ onClicked:
+ {
+ baseDialog.allowSendData = checked
+ }
+ }
+ }
+
+ Item // Bottom buttons
+ {
+ id: buttonRow
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+
+ height: childrenRect.height
+
+ Cura.PrimaryButton
+ {
+ anchors.right: parent.right
+ text: catalog.i18nc("@action:button", "OK")
+ onClicked:
+ {
+ manager.setSendSliceInfo(allowSendData)
+ baseDialog.hide()
+ }
+ }
+
+ Cura.SecondaryButton
+ {
+ anchors.left: parent.left
+ text: catalog.i18nc("@action:button", "Cancel")
+ onClicked:
+ {
+ baseDialog.hide()
+ }
}
}
}
diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py
index 5149b6a6a6..7501429796 100755
--- a/plugins/SliceInfoPlugin/SliceInfo.py
+++ b/plugins/SliceInfoPlugin/SliceInfo.py
@@ -48,20 +48,6 @@ class SliceInfo(QObject, Extension):
def _onAppInitialized(self):
# DO NOT read any preferences values in the constructor because at the time plugins are created, no version
# upgrade has been performed yet because version upgrades are plugins too!
- if not self._application.getPreferences().getValue("info/asked_send_slice_info"):
- self.send_slice_info_message = Message(catalog.i18nc("@info", "Cura collects anonymized usage statistics."),
- lifetime = 0,
- dismissable = False,
- title = catalog.i18nc("@info:title", "Collecting Data"))
-
- self.send_slice_info_message.addAction("MoreInfo", name = catalog.i18nc("@action:button", "More info"), icon = None,
- description = catalog.i18nc("@action:tooltip", "See more information on what data Cura sends."), button_style = Message.ActionButtonStyle.LINK)
-
- self.send_slice_info_message.addAction("Dismiss", name = catalog.i18nc("@action:button", "Allow"), icon = None,
- description = catalog.i18nc("@action:tooltip", "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing."))
- self.send_slice_info_message.actionTriggered.connect(self.messageActionTriggered)
- self.send_slice_info_message.show()
-
if self._more_info_dialog is None:
self._more_info_dialog = self._createDialog("MoreInfoWindow.qml")
@@ -76,7 +62,7 @@ class SliceInfo(QObject, Extension):
def showMoreInfoDialog(self):
if self._more_info_dialog is None:
self._more_info_dialog = self._createDialog("MoreInfoWindow.qml")
- self._more_info_dialog.open()
+ self._more_info_dialog.show()
def _createDialog(self, qml_name):
Logger.log("d", "Creating dialog [%s]", qml_name)
@@ -91,7 +77,7 @@ class SliceInfo(QObject, Extension):
if not plugin_path:
Logger.log("e", "Could not get plugin path!", self.getPluginId())
return None
- file_path = os.path.join(plugin_path, "example_data.json")
+ file_path = os.path.join(plugin_path, "example_data.html")
if file_path:
with open(file_path, "r", encoding = "utf-8") as f:
self._example_data_content = f.read()
@@ -195,6 +181,8 @@ class SliceInfo(QObject, Extension):
model = dict()
model["hash"] = node.getMeshData().getHash()
bounding_box = node.getBoundingBox()
+ if not bounding_box:
+ continue
model["bounding_box"] = {"minimum": {"x": bounding_box.minimum.x,
"y": bounding_box.minimum.y,
"z": bounding_box.minimum.z},
diff --git a/plugins/SliceInfoPlugin/example_data.html b/plugins/SliceInfoPlugin/example_data.html
new file mode 100644
index 0000000000..4294b0af6d
--- /dev/null
+++ b/plugins/SliceInfoPlugin/example_data.html
@@ -0,0 +1,64 @@
+
+
+ Cura Version: 4.0
+ Operating System: Windows 10
+ Language: en_US
+ Machine Type: Ultimaker S5
+ Quality Profile: Fast
+ Using Custom Settings: No
+
+
Extruder 1:
+
+
Material Type: PLA
+
Print Core: AA 0.4
+
Material Used: 1240 mm
+
+
+
Extruder 2:
+
+
Material Type: PVA
+
Print Core: BB 0.4
+
Material Used: 432 mm
+
+
+
Print Settings:
+
+
Layer Height: 0.15
+
Wall Line Count: 3
+
Enable Retraction: no
+
Infill Density: 20%
+
Infill Pattern: triangles
+
Gradual Infill Steps: 0
+
Printing Temperature: 220 °C
+
Generate Support: yes
+
Support Extruder: 1
+
Build Plate Adhesion Type: brim
+
Enable Prime Tower: yes
+
Print Sequence: All at once
+
...
+
+
+
Model Information:
+
+
+ Model 1
+
+
Hash: b72789b9b...
+
Transformation: [transformation matrix]
+
Bounding Box: [minimum x, y, z; maximum x, y, z]
+
Is Helper Mesh: no
+
Helper Mesh Type: support mesh
+
+
+
+
+
Print Times:
+
+
Infill: 61200 sec.
+
Support: 25480 sec.
+
Travel: 6224 sec.
+
Walls: 10225 sec.
+
Total: 103129 sec.
+
+
+
diff --git a/plugins/SliceInfoPlugin/example_data.json b/plugins/SliceInfoPlugin/example_data.json
deleted file mode 100644
index 5fc4175e60..0000000000
--- a/plugins/SliceInfoPlugin/example_data.json
+++ /dev/null
@@ -1,114 +0,0 @@
-{
- "time_stamp": 1523973715.486928,
- "schema_version": 0,
- "cura_version": "3.3",
- "active_mode": "custom",
- "machine_settings_changed_by_user": true,
- "language": "en_US",
- "os": {
- "type": "Linux",
- "version": "#43~16.04.1-Ubuntu SMP Wed Mar 14 17:48:43 UTC 2018"
- },
- "active_machine": {
- "definition_id": "ultimaker3",
- "manufacturer": "Ultimaker B.V."
- },
- "extruders": [
- {
- "active": true,
- "material": {
- "GUID": "506c9f0d-e3aa-4bd4-b2d2-23e2425b1aa9",
- "type": "PLA",
- "brand": "Generic"
- },
- "material_used": 0.84,
- "variant": "AA 0.4",
- "nozzle_size": 0.4,
- "extruder_settings": {
- "wall_line_count": 3,
- "retraction_enable": true,
- "infill_sparse_density": 30,
- "infill_pattern": "triangles",
- "gradual_infill_steps": 0,
- "default_material_print_temperature": 200,
- "material_print_temperature": 200
- }
- },
- {
- "active": false,
- "material": {
- "GUID": "86a89ceb-4159-47f6-ab97-e9953803d70f",
- "type": "PVA",
- "brand": "Generic"
- },
- "material_used": 0.5,
- "variant": "BB 0.4",
- "nozzle_size": 0.4,
- "extruder_settings": {
- "wall_line_count": 3,
- "retraction_enable": true,
- "infill_sparse_density": 20,
- "infill_pattern": "triangles",
- "gradual_infill_steps": 0,
- "default_material_print_temperature": 215,
- "material_print_temperature": 220
- }
- }
- ],
- "quality_profile": "fast",
- "user_modified_setting_keys": ["layer_height", "wall_line_width", "infill_sparse_density"],
- "models": [
- {
- "hash": "b72789b9beb5366dff20b1cf501020c3d4d4df7dc2295ecd0fddd0a6436df070",
- "bounding_box": {
- "minimum": {
- "x": -10.0,
- "y": 0.0,
- "z": -5.0
- },
- "maximum": {
- "x": 9.999999046325684,
- "y": 40.0,
- "z": 5.0
- }
- },
- "transformation": {
- "data": "[[ 1. 0. 0. 0.] [ 0. 1. 0. 20.] [ 0. 0. 1. 0.] [ 0. 0. 0. 1.]]"
- },
- "extruder": 0,
- "model_settings": {
- "support_enabled": true,
- "support_extruder_nr": 1,
- "infill_mesh": false,
- "cutting_mesh": false,
- "support_mesh": false,
- "anti_overhang_mesh": false,
- "wall_line_count": 3,
- "retraction_enable": true,
- "infill_sparse_density": 30,
- "infill_pattern": "triangles",
- "gradual_infill_steps": 0
- }
- }
- ],
- "print_times": {
- "travel": 187,
- "support": 825,
- "infill": 351,
- "total": 7234
- },
- "print_settings": {
- "layer_height": 0.15,
- "support_enabled": true,
- "support_extruder_nr": 1,
- "adhesion_type": "brim",
- "wall_line_count": 3,
- "retraction_enable": true,
- "prime_tower_enable": true,
- "infill_sparse_density": 20,
- "infill_pattern": "triangles",
- "gradual_infill_steps": 0,
- "print_sequence": "all_at_once"
- },
- "output_to": "LocalFileOutputDevice"
-}
diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py
index ec00329f86..4ce8ae7bc4 100644
--- a/plugins/SolidView/SolidView.py
+++ b/plugins/SolidView/SolidView.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from UM.View.View import View
@@ -7,7 +7,6 @@ from UM.Scene.Selection import Selection
from UM.Resources import Resources
from UM.Application import Application
from UM.View.RenderBatch import RenderBatch
-from UM.Settings.Validator import ValidatorState
from UM.Math.Color import Color
from UM.View.GL.OpenGL import OpenGL
@@ -20,9 +19,9 @@ import math
class SolidView(View):
def __init__(self):
super().__init__()
-
- Application.getInstance().getPreferences().addPreference("view/show_overhang", True)
-
+ application = Application.getInstance()
+ application.getPreferences().addPreference("view/show_overhang", True)
+ application.globalContainerStackChanged.connect(self._onGlobalContainerChanged)
self._enabled_shader = None
self._disabled_shader = None
self._non_printing_shader = None
@@ -30,6 +29,38 @@ class SolidView(View):
self._extruders_model = None
self._theme = None
+ self._support_angle = 90
+
+ self._global_stack = None
+
+ Application.getInstance().engineCreatedSignal.connect(self._onGlobalContainerChanged)
+
+ def _onGlobalContainerChanged(self) -> None:
+ if self._global_stack:
+ try:
+ self._global_stack.propertyChanged.disconnect(self._onPropertyChanged)
+ except TypeError:
+ pass
+ for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks():
+ extruder_stack.propertyChanged.disconnect(self._onPropertyChanged)
+
+ self._global_stack = Application.getInstance().getGlobalContainerStack()
+ if self._global_stack:
+ self._global_stack.propertyChanged.connect(self._onPropertyChanged)
+ for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks():
+ extruder_stack.propertyChanged.connect(self._onPropertyChanged)
+ self._onPropertyChanged("support_angle", "value") # Force an re-evaluation
+
+ def _onPropertyChanged(self, key: str, property_name: str) -> None:
+ if key != "support_angle" or property_name != "value":
+ return
+ # As the rendering is called a *lot* we really, dont want to re-evaluate the property every time. So we store em!
+ global_container_stack = Application.getInstance().getGlobalContainerStack()
+ if global_container_stack:
+ support_extruder_nr = global_container_stack.getExtruderPositionValueWithDefault("support_extruder_nr")
+ support_angle_stack = global_container_stack.extruders.get(str(support_extruder_nr))
+ if support_angle_stack:
+ self._support_angle = support_angle_stack.getProperty("support_angle", "value")
def beginRendering(self):
scene = self.getController().getScene()
@@ -63,14 +94,10 @@ class SolidView(View):
global_container_stack = Application.getInstance().getGlobalContainerStack()
if global_container_stack:
- support_extruder_nr = global_container_stack.getExtruderPositionValueWithDefault("support_extruder_nr")
- support_angle_stack = Application.getInstance().getExtruderManager().getExtruderStack(support_extruder_nr)
-
- if support_angle_stack is not None and Application.getInstance().getPreferences().getValue("view/show_overhang"):
- angle = support_angle_stack.getProperty("support_angle", "value")
+ if Application.getInstance().getPreferences().getValue("view/show_overhang"):
# Make sure the overhang angle is valid before passing it to the shader
- if angle is not None and angle >= 0 and angle <= 90:
- self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - angle)))
+ if self._support_angle is not None and self._support_angle >= 0 and self._support_angle <= 90:
+ self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - self._support_angle)))
else:
self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) #Overhang angle of 0 causes no area at all to be marked as overhang.
else:
diff --git a/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml b/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml
index b653f1a73b..08ac1f83a5 100644
--- a/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml
@@ -65,6 +65,7 @@ Item
{
id: description
text: details.description || ""
+ font: UM.Theme.getFont("default")
anchors
{
top: title.bottom
@@ -108,6 +109,8 @@ Item
top: description.bottom
left: properties.right
leftMargin: UM.Theme.getSize("default_margin").width
+ right: parent.right
+ rightMargin: UM.Theme.getSize("default_margin").width
topMargin: UM.Theme.getSize("default_margin").height
}
spacing: Math.floor(UM.Theme.getSize("narrow_margin").height)
@@ -122,6 +125,8 @@ Item
}
return ""
}
+ width: parent.width
+ elide: Text.ElideRight
font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text")
linkColor: UM.Theme.getColor("text_link")
diff --git a/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml b/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml
index e238132680..81649fdfef 100644
--- a/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml
@@ -26,7 +26,7 @@ UM.Dialog
minimumWidth: 450 * screenScaleFactor
minimumHeight: 150 * screenScaleFactor
- modality: UM.Application.platform == "linux" ? Qt.NonModal : Qt.WindowModal
+ modality: Qt.WindowModal
Column
{
diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml b/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml
index 60fe095537..2b86aacefc 100644
--- a/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml
@@ -10,7 +10,7 @@ import Cura 1.1 as Cura
Column
{
property bool installed: toolbox.isInstalled(model.id)
- property bool canUpdate: toolbox.canUpdate(model.id)
+ property bool canUpdate: CuraApplication.getPackageManager().packagesWithUpdate.indexOf(model.id) != -1
property bool loginRequired: model.login_required && !Cura.API.account.isLoggedIn
property var packageData
@@ -40,6 +40,7 @@ Column
Cura.SecondaryButton
{
+ id: installedButton
visible: installed
onClicked: toolbox.viewCategory = "installed"
text: catalog.i18nc("@action:button", "Installed")
@@ -112,11 +113,9 @@ Column
{
target: toolbox
onInstallChanged: installed = toolbox.isInstalled(model.id)
- onMetadataChanged: canUpdate = toolbox.canUpdate(model.id)
onFilterChanged:
{
installed = toolbox.isInstalled(model.id)
- canUpdate = toolbox.canUpdate(model.id)
}
}
}
diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml
index 7844a5c394..73dd593336 100644
--- a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml
@@ -76,7 +76,7 @@ Item
height: (parent.height * 0.4) | 0
anchors
{
- bottom: parent.bottomcommi
+ bottom: parent.bottom
right: parent.right
}
sourceSize.height: height
diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcase.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcase.qml
index 795622cf82..72dd6f91a2 100644
--- a/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcase.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcase.qml
@@ -14,7 +14,7 @@ Rectangle
Column
{
height: childrenRect.height + 2 * padding
- spacing: UM.Theme.getSize("toolbox_showcase_spacing").width
+ spacing: UM.Theme.getSize("default_margin").width
width: parent.width
padding: UM.Theme.getSize("wide_margin").height
Label
diff --git a/plugins/Toolbox/resources/qml/ToolboxHeader.qml b/plugins/Toolbox/resources/qml/ToolboxHeader.qml
index 087402d564..491567eb5f 100644
--- a/plugins/Toolbox/resources/qml/ToolboxHeader.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxHeader.qml
@@ -1,9 +1,11 @@
// Copyright (c) 2018 Ultimaker B.V.
// Toolbox is released under the terms of the LGPLv3 or higher.
-import QtQuick 2.2
+import QtQuick 2.10
import QtQuick.Controls 1.4
-import UM 1.1 as UM
+
+import UM 1.4 as UM
+import Cura 1.0 as Cura
Item
{
@@ -50,6 +52,7 @@ Item
}
}
}
+
ToolboxTabButton
{
id: installedTabButton
@@ -62,7 +65,25 @@ Item
rightMargin: UM.Theme.getSize("default_margin").width
}
onClicked: toolbox.viewCategory = "installed"
+ width: UM.Theme.getSize("toolbox_header_tab").width + marketplaceNotificationIcon.width - UM.Theme.getSize("default_margin").width
}
+
+ Cura.NotificationIcon
+ {
+ id: marketplaceNotificationIcon
+
+ visible: CuraApplication.getPackageManager().packagesWithUpdate.length > 0
+
+ anchors.right: installedTabButton.right
+ anchors.verticalCenter: installedTabButton.verticalCenter
+
+ labelText:
+ {
+ const itemCount = CuraApplication.getPackageManager().packagesWithUpdate.length
+ return itemCount > 9 ? "9+" : itemCount
+ }
+ }
+
ToolboxShadow
{
anchors.top: bar.bottom
diff --git a/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml b/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml
index 61af84fbe5..db30b1caf5 100644
--- a/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml
@@ -10,7 +10,7 @@ import Cura 1.1 as Cura
Column
{
- property bool canUpdate: false
+ property bool canUpdate: CuraApplication.getPackageManager().packagesWithUpdate.indexOf(model.id) != -1
property bool canDowngrade: false
property bool loginRequired: model.login_required && !Cura.API.account.isLoggedIn
width: UM.Theme.getSize("toolbox_action_button").width
@@ -83,7 +83,6 @@ Column
target: toolbox
onMetadataChanged:
{
- canUpdate = toolbox.canUpdate(model.id)
canDowngrade = toolbox.canDowngrade(model.id)
}
}
diff --git a/plugins/Toolbox/resources/qml/ToolboxTabButton.qml b/plugins/Toolbox/resources/qml/ToolboxTabButton.qml
index 5e1aeaa636..7a7d2be48a 100644
--- a/plugins/Toolbox/resources/qml/ToolboxTabButton.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxTabButton.qml
@@ -9,14 +9,17 @@ Button
{
id: control
property bool active: false
- hoverEnabled: true
+
+ implicitWidth: UM.Theme.getSize("toolbox_header_tab").width
+ implicitHeight: UM.Theme.getSize("toolbox_header_tab").height
background: Item
{
- implicitWidth: UM.Theme.getSize("toolbox_header_tab").width
- implicitHeight: UM.Theme.getSize("toolbox_header_tab").height
+ id: backgroundItem
Rectangle
{
+ id: highlight
+
visible: control.active
color: UM.Theme.getColor("primary")
anchors.bottom: parent.bottom
@@ -24,28 +27,42 @@ Button
height: UM.Theme.getSize("toolbox_header_highlight").height
}
}
+
contentItem: Label
{
id: label
text: control.text
- color:
- {
- if(control.hovered)
- {
- return UM.Theme.getColor("toolbox_header_button_text_hovered");
- }
- if(control.active)
- {
- return UM.Theme.getColor("toolbox_header_button_text_active");
- }
- else
- {
- return UM.Theme.getColor("toolbox_header_button_text_inactive");
- }
- }
- font: control.enabled ? (control.active ? UM.Theme.getFont("medium_bold") : UM.Theme.getFont("medium")) : UM.Theme.getFont("default_italic")
+ color: UM.Theme.getColor("toolbox_header_button_text_inactive")
+ font: UM.Theme.getFont("medium")
+
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
+
renderType: Text.NativeRendering
}
+
+ states:
+ [
+ State
+ {
+ name: "disabled"
+ when: !control.enabled
+ PropertyChanges
+ {
+ target: label
+ font: UM.Theme.getFont("default_italic")
+ }
+ },
+ State
+ {
+ name: "active"
+ when: control.active
+ PropertyChanges
+ {
+ target: label
+ font: UM.Theme.getFont("medium_bold")
+ color: UM.Theme.getColor("action_button_text")
+ }
+ }
+ ]
}
\ No newline at end of file
diff --git a/plugins/Toolbox/src/AuthorsModel.py b/plugins/Toolbox/src/AuthorsModel.py
index 877f8256ee..7bfc58df04 100644
--- a/plugins/Toolbox/src/AuthorsModel.py
+++ b/plugins/Toolbox/src/AuthorsModel.py
@@ -53,7 +53,7 @@ class AuthorsModel(ListModel):
# Filter on all the key-word arguments.
for key, value in self._filter.items():
- if key is "package_types":
+ if key == "package_types":
key_filter = lambda item, value = value: value in item["package_types"] # type: ignore
elif "*" in value:
key_filter = lambda item, key = key, value = value: self._matchRegExp(item, key, value) # type: ignore
diff --git a/plugins/Toolbox/src/PackagesModel.py b/plugins/Toolbox/src/PackagesModel.py
index d94fdf6bb7..1cf87790bc 100644
--- a/plugins/Toolbox/src/PackagesModel.py
+++ b/plugins/Toolbox/src/PackagesModel.py
@@ -112,7 +112,7 @@ class PackagesModel(ListModel):
# Filter on all the key-word arguments.
for key, value in self._filter.items():
- if key is "tags":
+ if key == "tags":
key_filter = lambda item, v = value: v in item["tags"]
elif "*" in value:
key_filter = lambda candidate, k = key, v = value: self._matchRegExp(candidate, k, v)
diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py
index 7d8d359831..82ee60f70b 100644
--- a/plugins/Toolbox/src/Toolbox.py
+++ b/plugins/Toolbox/src/Toolbox.py
@@ -50,7 +50,6 @@ class Toolbox(QObject, Extension):
self._request_headers = [] # type: List[Tuple[bytes, bytes]]
self._updateRequestHeader()
-
self._request_urls = {} # type: Dict[str, QUrl]
self._to_update = [] # type: List[str] # Package_ids that are waiting to be updated
self._old_plugin_ids = set() # type: Set[str]
@@ -106,6 +105,7 @@ class Toolbox(QObject, Extension):
self._application.initializationFinished.connect(self._onAppInitialized)
self._application.getCuraAPI().account.loginStateChanged.connect(self._updateRequestHeader)
+ self._application.getCuraAPI().account.accessTokenChanged.connect(self._updateRequestHeader)
# Signals:
# --------------------------------------------------------------------------
@@ -190,8 +190,10 @@ class Toolbox(QObject, Extension):
"packages": QUrl("{base_url}/packages".format(base_url = self._api_url))
}
- @pyqtSlot()
- def browsePackages(self) -> None:
+ # Request the latest and greatest!
+ self._fetchPackageData()
+
+ def _fetchPackageData(self):
# Create the network manager:
# This was formerly its own function but really had no reason to be as
# it was never called more than once ever.
@@ -209,6 +211,10 @@ class Toolbox(QObject, Extension):
# Gather installed packages:
self._updateInstalledModels()
+ @pyqtSlot()
+ def browsePackages(self) -> None:
+ self._fetchPackageData()
+
if not self._dialog:
self._dialog = self._createDialog("Toolbox.qml")
@@ -455,36 +461,6 @@ class Toolbox(QObject, Extension):
break
return remote_package
- # Checks
- # --------------------------------------------------------------------------
- @pyqtSlot(str, result = bool)
- def canUpdate(self, package_id: str) -> bool:
- local_package = self._package_manager.getInstalledPackageInfo(package_id)
- if local_package is None:
- local_package = self.getOldPluginPackageMetadata(package_id)
- if local_package is None:
- return False
-
- remote_package = self.getRemotePackage(package_id)
- if remote_package is None:
- return False
-
- local_version = Version(local_package["package_version"])
- remote_version = Version(remote_package["package_version"])
- can_upgrade = False
- if remote_version > local_version:
- can_upgrade = True
- # A package with the same version can be built to have different SDK versions. So, for a package with the same
- # version, we also need to check if the current one has a lower SDK version. If so, this package should also
- # be upgradable.
- elif remote_version == local_version:
- # First read sdk_version_semver. If that doesn't exist, read just sdk_version (old version system).
- remote_sdk_version = Version(remote_package.get("sdk_version_semver", remote_package.get("sdk_version", 0)))
- local_sdk_version = Version(local_package.get("sdk_version_semver", local_package.get("sdk_version", 0)))
- can_upgrade = local_sdk_version < remote_sdk_version
-
- return can_upgrade
-
@pyqtSlot(str, result = bool)
def canDowngrade(self, package_id: str) -> bool:
# If the currently installed version is higher than the bundled version (if present), the we can downgrade
@@ -584,9 +560,15 @@ class Toolbox(QObject, Extension):
if self._download_reply:
try:
self._download_reply.downloadProgress.disconnect(self._onDownloadProgress)
- except TypeError: # Raised when the method is not connected to the signal yet.
+ except (TypeError, RuntimeError): # Raised when the method is not connected to the signal yet.
pass # Don't need to disconnect.
- self._download_reply.abort()
+ try:
+ self._download_reply.abort()
+ except RuntimeError:
+ # In some cases the garbage collector is a bit to agressive, which causes the dowload_reply
+ # to be deleted (especially if the machine has been put to sleep). As we don't know what exactly causes
+ # this (The issue probably lives in the bowels of (py)Qt somewhere), we can only catch and ignore it.
+ pass
self._download_reply = None
self._download_request = None
self.setDownloadProgress(0)
@@ -632,11 +614,12 @@ class Toolbox(QObject, Extension):
self._server_response_data[response_type] = json_data["data"]
self._models[response_type].setMetadata(self._server_response_data[response_type])
- if response_type is "packages":
+ if response_type == "packages":
self._models[response_type].setFilter({"type": "plugin"})
self.reBuildMaterialsModels()
self.reBuildPluginsModels()
- elif response_type is "authors":
+ self._notifyPackageManager()
+ elif response_type == "authors":
self._models[response_type].setFilter({"package_types": "material"})
self._models[response_type].setFilter({"tags": "generic"})
@@ -656,6 +639,11 @@ class Toolbox(QObject, Extension):
# Ignore any operation that is not a get operation
pass
+ # This function goes through all known remote versions of a package and notifies the package manager of this change
+ def _notifyPackageManager(self):
+ for package in self._server_response_data["packages"]:
+ self._package_manager.addAvailablePackageVersion(package["package_id"], Version(package["package_version"]))
+
def _onDownloadProgress(self, bytes_sent: int, bytes_total: int) -> None:
if bytes_total > 0:
new_progress = bytes_sent / bytes_total * 100
diff --git a/plugins/UFPReader/UFPReader.py b/plugins/UFPReader/UFPReader.py
new file mode 100644
index 0000000000..18527e6450
--- /dev/null
+++ b/plugins/UFPReader/UFPReader.py
@@ -0,0 +1,42 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from typing import TYPE_CHECKING
+
+from Charon.VirtualFile import VirtualFile
+
+from UM.Mesh.MeshReader import MeshReader
+from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase
+from UM.PluginRegistry import PluginRegistry
+
+if TYPE_CHECKING:
+ from cura.Scene.CuraSceneNode import CuraSceneNode
+
+
+class UFPReader(MeshReader):
+
+ def __init__(self) -> None:
+ super().__init__()
+
+ MimeTypeDatabase.addMimeType(
+ MimeType(
+ name = "application/x-ufp",
+ comment = "Ultimaker Format Package",
+ suffixes = ["ufp"]
+ )
+ )
+ self._supported_extensions = [".ufp"]
+
+ def _read(self, file_name: str) -> "CuraSceneNode":
+ # Open the file
+ archive = VirtualFile()
+ archive.open(file_name)
+ # Get the gcode data from the file
+ gcode_data = archive.getData("/3D/model.gcode")
+ # Convert the bytes stream to string
+ gcode_stream = gcode_data["/3D/model.gcode"].decode("utf-8")
+
+ # Open the GCodeReader to parse the data
+ gcode_reader = PluginRegistry.getInstance().getPluginObject("GCodeReader") # type: ignore
+ gcode_reader.preReadFromStream(gcode_stream) # type: ignore
+ return gcode_reader.readFromStream(gcode_stream) # type: ignore
diff --git a/plugins/UFPReader/__init__.py b/plugins/UFPReader/__init__.py
new file mode 100644
index 0000000000..cfea4b9882
--- /dev/null
+++ b/plugins/UFPReader/__init__.py
@@ -0,0 +1,34 @@
+#Copyright (c) 2019 Ultimaker B.V.
+#Cura is released under the terms of the LGPLv3 or higher.
+
+import sys
+
+from UM.Logger import Logger
+try:
+ from . import UFPReader
+except ImportError:
+ Logger.log("w", "Could not import UFPReader; libCharon may be missing")
+
+from UM.i18n import i18nCatalog
+i18n_catalog = i18nCatalog("cura")
+
+
+def getMetaData():
+ return {
+ "mesh_reader": [
+ {
+ "mime_type": "application/x-ufp",
+ "extension": "ufp",
+ "description": i18n_catalog.i18nc("@item:inlistbox", "Ultimaker Format Package")
+ }
+ ]
+ }
+
+
+def register(app):
+ if "UFPReader.UFPReader" not in sys.modules:
+ return {}
+
+ app.addNonSliceableExtension(".ufp")
+ return {"mesh_reader": UFPReader.UFPReader()}
+
diff --git a/plugins/UFPReader/plugin.json b/plugins/UFPReader/plugin.json
new file mode 100644
index 0000000000..b56b555b36
--- /dev/null
+++ b/plugins/UFPReader/plugin.json
@@ -0,0 +1,8 @@
+{
+ "name": "UFP Reader",
+ "author": "Ultimaker B.V.",
+ "version": "1.0.0",
+ "description": "Provides support for reading Ultimaker Format Packages.",
+ "supported_sdk_versions": ["6.0.0"],
+ "i18n-catalog": "cura"
+}
\ No newline at end of file
diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py
index c0db104c82..2aece1092a 100644
--- a/plugins/UFPWriter/UFPWriter.py
+++ b/plugins/UFPWriter/UFPWriter.py
@@ -28,7 +28,7 @@ class UFPWriter(MeshWriter):
MimeTypeDatabase.addMimeType(
MimeType(
name = "application/x-ufp",
- comment = "Cura UFP File",
+ comment = "Ultimaker Format Package",
suffixes = ["ufp"]
)
)
diff --git a/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml
index 3883a7e285..ecec87ef02 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml
@@ -1,8 +1,8 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2019 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import UM 1.2 as UM
-import Cura 1.0 as Cura
+import Cura 1.5 as Cura
import QtQuick 2.2
import QtQuick.Controls 1.1
@@ -14,9 +14,13 @@ Cura.MachineAction
{
id: base
anchors.fill: parent;
+ property alias currentItemIndex: listview.currentIndex
property var selectedDevice: null
property bool completeProperties: true
+ // For validating IP addresses
+ property var networkingUtil: Cura.NetworkingUtil {}
+
function connectToPrinter()
{
if(base.selectedDevice && base.completeProperties)
@@ -342,6 +346,17 @@ Cura.MachineAction
}
}
+ MessageDialog
+ {
+ id: invalidIPAddressMessageDialog
+ x: (parent.x + (parent.width) / 2) | 0
+ y: (parent.y + (parent.height) / 2) | 0
+ title: catalog.i18nc("@title:window", "Invalid IP address")
+ text: catalog.i18nc("@text", "Please enter a valid IP address.")
+ icon: StandardIcon.Warning
+ standardButtons: StandardButton.Ok
+ }
+
UM.Dialog
{
id: manualPrinterDialog
@@ -371,7 +386,7 @@ Cura.MachineAction
Label
{
- text: catalog.i18nc("@alabel", "Enter the IP address or hostname of your printer on the network.")
+ text: catalog.i18nc("@label", "Enter the IP address or hostname of your printer on the network.")
width: parent.width
wrapMode: Text.WordWrap
renderType: Text.NativeRendering
@@ -404,6 +419,26 @@ Cura.MachineAction
text: catalog.i18nc("@action:button", "OK")
onClicked:
{
+ // Validate the input first
+ if (!networkingUtil.isValidIP(manualPrinterDialog.addressText))
+ {
+ invalidIPAddressMessageDialog.open()
+ return
+ }
+
+ // if the entered IP address has already been discovered, switch the current item to that item
+ // and do nothing else.
+ for (var i = 0; i < manager.foundDevices.length; i++)
+ {
+ var device = manager.foundDevices[i]
+ if (device.address == manualPrinterDialog.addressText)
+ {
+ currentItemIndex = i
+ manualPrinterDialog.hide()
+ return
+ }
+ }
+
manager.setManualDevice(manualPrinterDialog.printerKey, manualPrinterDialog.addressText)
manualPrinterDialog.hide()
}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml
index d1a0c207c5..619658a7eb 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml
@@ -69,6 +69,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
}
\ No newline at end of file
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml
index 1718994d83..cba36412b6 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml
@@ -52,6 +52,7 @@ UM.Dialog
bottomMargin: 56 * screenScaleFactor // TODO: Theme!
}
wrapMode: Text.WordWrap
+ renderType: Text.NativeRendering
text:
{
if (!printer || !printer.activePrintJob)
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenuButton.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenuButton.qml
index ba85802809..e91e8b04d2 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenuButton.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenuButton.qml
@@ -23,6 +23,7 @@ Button
horizontalAlignment: Text.AlignHCenter
text: base.text
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering;
}
height: width
hoverEnabled: enabled
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml
index 4079f23b0a..deed3ac5e6 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml
@@ -66,6 +66,7 @@ Item
// FIXED-LINE-HEIGHT:
height: parent.height
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
@@ -95,6 +96,7 @@ Item
// FIXED-LINE-HEIGHT:
height: parent.height
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
}
\ No newline at end of file
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml
index c3e78317c5..f6b84d69b2 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml
@@ -48,5 +48,6 @@ Item
x: Math.round(size * 0.25)
y: Math.round(size * 0.15625)
visible: position >= 0
+ renderType: Text.NativeRendering
}
}
\ No newline at end of file
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorInfoBlurb.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorInfoBlurb.qml
index 21000b8bff..0d2c7f8beb 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorInfoBlurb.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorInfoBlurb.qml
@@ -40,6 +40,7 @@ Item
width: 240 * screenScaleFactor // TODO: Theme!
color: UM.Theme.getColor("monitor_tooltip_text")
font: UM.Theme.getFont("default")
+ renderType: Text.NativeRendering
}
}
}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml
index a23b8ab0d3..d80f2e5b9f 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml
@@ -71,6 +71,7 @@ Item
// FIXED-LINE-HEIGHT:
height: parent.height
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
@@ -98,6 +99,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
@@ -143,6 +145,7 @@ Item
// FIXED-LINE-HEIGHT:
height: parent.height
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
Row
@@ -158,14 +161,9 @@ Item
spacing: 6 // TODO: Theme!
visible: printJob
- Repeater
+ MonitorPrinterPill
{
- id: compatiblePills
- delegate: MonitorPrinterPill
- {
- text: modelData
- }
- model: printJob ? printJob.compatibleMachineFamilies : []
+ text: printJob.configuration.printerType
}
}
}
@@ -202,6 +200,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml
index 2ba70268b2..bcc7f9a358 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml
@@ -22,7 +22,7 @@ Item
width: childrenRect.width
height: 18 * screenScaleFactor // TODO: Theme!
- ProgressBar
+ UM.ProgressBar
{
id: progressBar
anchors
@@ -30,22 +30,6 @@ Item
verticalCenter: parent.verticalCenter
}
value: printJob ? printJob.progress : 0
- style: ProgressBarStyle
- {
- background: Rectangle
- {
- color: UM.Theme.getColor("monitor_progress_bar_empty")
- implicitHeight: visible ? 12 * screenScaleFactor : 0 // TODO: Theme!
- implicitWidth: 180 * screenScaleFactor // TODO: Theme!
- radius: 2 * screenScaleFactor // TODO: Theme!
- }
- progress: Rectangle
- {
- id: progressItem;
- color: printJob && printJob.isActive ? UM.Theme.getColor("monitor_progress_bar_fill") : UM.Theme.getColor("monitor_progress_bar_deactive")
- radius: 2 * screenScaleFactor // TODO: Theme!
- }
- }
}
Label
{
@@ -63,6 +47,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
Label
{
@@ -115,5 +100,6 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
\ No newline at end of file
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml
index 8c63e1ef1a..f4295ee18d 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml
@@ -112,6 +112,7 @@ Item
// FIXED-LINE-HEIGHT:
height: parent.height
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
@@ -140,7 +141,7 @@ Item
{
id: printerConfiguration
anchors.verticalCenter: parent.verticalCenter
- buildplate: printer ? "Glass" : null // 'Glass' as a default
+ buildplate: printer ? catalog.i18nc("@label", "Glass") : null // 'Glass' as a default
configurations:
{
var configs = []
@@ -315,6 +316,7 @@ Item
return ""
}
visible: text !== ""
+ renderType: Text.NativeRendering
}
Item
@@ -356,6 +358,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
Label
@@ -376,6 +379,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
@@ -403,6 +407,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
@@ -437,6 +442,7 @@ Item
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
height: 18 * screenScaleFactor // TODO: Theme!
+ renderType: Text.NativeRendering
}
implicitHeight: 32 * screenScaleFactor // TODO: Theme!
implicitWidth: 96 * screenScaleFactor // TODO: Theme!
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml
index 2aeecd5a92..584e336a80 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml
@@ -43,5 +43,6 @@ Item
text: tagText
font.pointSize: 10 // TODO: Theme!
visible: text !== ""
+ renderType: Text.NativeRendering
}
}
\ No newline at end of file
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml
index ce08f78226..6025d7acfe 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml
@@ -29,6 +29,7 @@ Item
color: UM.Theme.getColor("monitor_text_primary")
font: UM.Theme.getFont("large")
text: catalog.i18nc("@label", "Queued")
+ renderType: Text.NativeRendering
}
Item
@@ -109,6 +110,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
Label
@@ -123,6 +125,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
Label
@@ -137,6 +140,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
@@ -210,9 +214,10 @@ Item
Label
{
- text: "All jobs are printed."
+ text: i18n.i18nc("@info", "All jobs are printed.")
color: UM.Theme.getColor("monitor_text_primary")
font: UM.Theme.getFont("medium") // 14pt, regular
+ renderType: Text.NativeRendering
}
Item
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml
index 59cbda7172..e68418c21a 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml
@@ -50,7 +50,17 @@ Component
MonitorCarousel
{
id: carousel
- printers: OutputDevice.receivedPrintJobs ? OutputDevice.printers : [null]
+ printers:
+ {
+ // When printing over the cloud we don't recieve print jobs until there is one, so
+ // unless there's at least one print job we'll be stuck with skeleton loading
+ // indefinitely.
+ if (Cura.MachineManager.activeMachineIsUsingCloudConnection || OutputDevice.receivedPrintJobs)
+ {
+ return OutputDevice.printers
+ }
+ return [null]
+ }
}
}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenuItem.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenuItem.qml
index 67c82db320..ff5635e45d 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenuItem.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenuItem.qml
@@ -16,6 +16,7 @@ Button {
text: parent.text
horizontalAlignment: Text.AlignLeft;
verticalAlignment: Text.AlignVCenter;
+ renderType: Text.NativeRendering;
}
height: visible ? 39 * screenScaleFactor : 0; // TODO: Theme!
hoverEnabled: true;
diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml
index c2590e99a8..548e5ce1ea 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml
@@ -78,6 +78,7 @@ UM.Dialog {
height: 20 * screenScaleFactor;
text: catalog.i18nc("@label", "Printer selection");
wrapMode: Text.Wrap;
+ renderType: Text.NativeRendering;
}
ComboBox {
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py
index 7b5add276a..4f89513e1e 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py
@@ -12,12 +12,14 @@ from UM.Backend.Backend import BackendState
from UM.FileHandler.FileHandler import FileHandler
from UM.Logger import Logger
from UM.Message import Message
+from UM.PluginRegistry import PluginRegistry
from UM.Qt.Duration import Duration, DurationFormat
from UM.Scene.SceneNode import SceneNode
+
from cura.CuraApplication import CuraApplication
from cura.PrinterOutput.NetworkedPrinterOutputDevice import AuthState, NetworkedPrinterOutputDevice
-from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
-from cura.PrinterOutputDevice import ConnectionType
+from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel
+from cura.PrinterOutput.PrinterOutputDevice import ConnectionType
from .CloudOutputController import CloudOutputController
from ..MeshFormatHandler import MeshFormatHandler
@@ -56,6 +58,14 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
# Therefore we create a private signal used to trigger the printersChanged signal.
_clusterPrintersChanged = pyqtSignal()
+ # Map of Cura Connect machine_variant field to Cura machine types.
+ # Needed for printer discovery stack creation.
+ _host_machine_variant_to_machine_type_map = {
+ "Ultimaker 3": "ultimaker3",
+ "Ultimaker 3 Extended": "ultimaker3_extended",
+ "Ultimaker S5": "ultimaker_s5"
+ }
+
## Creates a new cloud output device
# \param api_client: The client that will run the API calls
# \param cluster: The device response received from the cloud API.
@@ -66,10 +76,10 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
# Because the cloud connection does not off all of these, we manually construct this version here.
# An example of why this is needed is the selection of the compatible file type when exporting the tool path.
properties = {
- b"address": b"",
- b"name": cluster.host_name.encode() if cluster.host_name else b"",
+ b"address": cluster.host_internal_ip.encode() if cluster.host_internal_ip else b"",
+ b"name": cluster.friendly_name.encode() if cluster.friendly_name else b"",
b"firmware_version": cluster.host_version.encode() if cluster.host_version else b"",
- b"printer_type": b""
+ b"cluster_size": b"1" # cloud devices are always clusters of at least one
}
super().__init__(device_id = cluster.cluster_id, address = "",
@@ -82,14 +92,19 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
self._account = api_client.account
# We use the Cura Connect monitor tab to get most functionality right away.
- self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
- "../../resources/qml/MonitorStage.qml")
+ if PluginRegistry.getInstance() is not None:
+ plugin_path = PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting")
+ if plugin_path is None:
+ Logger.log("e", "Cloud not find plugin path for plugin UM3NetworkPrnting")
+ raise RuntimeError("Cloud not find plugin path for plugin UM3NetworkPrnting")
+ self._monitor_view_qml_path = os.path.join(plugin_path, "resources", "qml", "MonitorStage.qml")
# Trigger the printersChanged signal when the private signal is triggered.
self.printersChanged.connect(self._clusterPrintersChanged)
# We keep track of which printer is visible in the monitor page.
self._active_printer = None # type: Optional[PrinterOutputModel]
+ self._host_machine_type = ""
# Properties to populate later on with received cloud data.
self._print_jobs = [] # type: List[UM3PrintJobOutputModel]
@@ -140,9 +155,17 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
## Checks whether the given network key is found in the cloud's host name
def matchesNetworkKey(self, network_key: str) -> bool:
- # A network key looks like "ultimakersystem-aabbccdd0011._ultimaker._tcp.local."
+ # Typically, a network key looks like "ultimakersystem-aabbccdd0011._ultimaker._tcp.local."
# the host name should then be "ultimakersystem-aabbccdd0011"
- return network_key.startswith(self.clusterData.host_name)
+ if network_key.startswith(self.clusterData.host_name):
+ return True
+
+ # However, for manually added printers, the local IP address is used in lieu of a proper
+ # network key, so check for that as well
+ if self.clusterData.host_internal_ip is not None and network_key.find(self.clusterData.host_internal_ip):
+ return True
+
+ return False
## Set all the interface elements and texts for this output device.
def _setInterfaceElements(self) -> None:
@@ -222,6 +245,10 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
previous = {p.key: p for p in self._printers} # type: Dict[str, PrinterOutputModel]
received = {p.uuid: p for p in printers} # type: Dict[str, CloudClusterPrinterStatus]
+ if len(printers) > 0:
+ # We need the machine type of the host (1st list entry) to allow discovery to work.
+ self._host_machine_type = printers[0].machine_variant
+
removed_printers, added_printers, updated_printers = findChanges(previous, received)
for removed_printer in removed_printers:
@@ -345,6 +372,19 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
).show()
self.writeFinished.emit()
+ ## Gets the printer type of the cluster host. Falls back to the printer type in the device properties.
+ @pyqtProperty(str, notify=_clusterPrintersChanged)
+ def printerType(self) -> str:
+ if self._printers and self._host_machine_type in self._host_machine_variant_to_machine_type_map:
+ return self._host_machine_variant_to_machine_type_map[self._host_machine_type]
+ return super().printerType
+
+ ## Gets the number of printers in the cluster.
+ # We use a minimum of 1 because cloud devices are always a cluster and printer discovery needs it.
+ @pyqtProperty(int, notify = _clusterPrintersChanged)
+ def clusterSize(self) -> int:
+ return max(1, len(self._printers))
+
## Gets the remote printers.
@pyqtProperty("QVariantList", notify=_clusterPrintersChanged)
def printers(self) -> List[PrinterOutputModel]:
@@ -362,10 +402,6 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
self._active_printer = printer
self.activePrinterChanged.emit()
- @pyqtProperty(int, notify = _clusterPrintersChanged)
- def clusterSize(self) -> int:
- return len(self._printers)
-
## Get remote print jobs.
@pyqtProperty("QVariantList", notify = printJobsChanged)
def printJobs(self) -> List[UM3PrintJobOutputModel]:
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py
index e081beb99c..498e141b73 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py
@@ -7,7 +7,7 @@ from PyQt5.QtCore import QTimer
from UM import i18nCatalog
from UM.Logger import Logger
from UM.Message import Message
-from UM.Signal import Signal, signalemitter
+from UM.Signal import Signal
from cura.API import Account
from cura.CuraApplication import CuraApplication
from cura.Settings.GlobalStack import GlobalStack
@@ -81,25 +81,61 @@ class CloudOutputDeviceManager:
Logger.log("d", "Removed: %s, added: %s, updates: %s", len(removed_devices), len(added_clusters), len(updates))
# Remove output devices that are gone
- for removed_cluster in removed_devices:
- if removed_cluster.isConnected():
- removed_cluster.disconnect()
- removed_cluster.close()
- self._output_device_manager.removeOutputDevice(removed_cluster.key)
- self.removedCloudCluster.emit()
- del self._remote_clusters[removed_cluster.key]
+ for device in removed_devices:
+ if device.isConnected():
+ device.disconnect()
+ device.close()
+ self._output_device_manager.removeOutputDevice(device.key)
+ self._application.getDiscoveredPrintersModel().removeDiscoveredPrinter(device.key)
+ self.removedCloudCluster.emit(device)
+ del self._remote_clusters[device.key]
# Add an output device for each new remote cluster.
# We only add when is_online as we don't want the option in the drop down if the cluster is not online.
- for added_cluster in added_clusters:
- device = CloudOutputDevice(self._api, added_cluster)
- self._remote_clusters[added_cluster.cluster_id] = device
- self.addedCloudCluster.emit()
+ for cluster in added_clusters:
+ device = CloudOutputDevice(self._api, cluster)
+ self._remote_clusters[cluster.cluster_id] = device
+ self._application.getDiscoveredPrintersModel().addDiscoveredPrinter(
+ cluster.cluster_id,
+ device.key,
+ cluster.friendly_name,
+ self._createMachineFromDiscoveredPrinter,
+ device.printerType,
+ device
+ )
+ self.addedCloudCluster.emit(cluster)
+ # Update the output devices
for device, cluster in updates:
device.clusterData = cluster
+ self._application.getDiscoveredPrintersModel().updateDiscoveredPrinter(
+ cluster.cluster_id,
+ cluster.friendly_name,
+ device.printerType,
+ )
self._connectToActiveMachine()
+
+ def _createMachineFromDiscoveredPrinter(self, key: str) -> None:
+ device = self._remote_clusters[key] # type: CloudOutputDevice
+ if not device:
+ Logger.log("e", "Could not find discovered device with key [%s]", key)
+ return
+
+ group_name = device.clusterData.friendly_name
+ machine_type_id = device.printerType
+
+ Logger.log("i", "Creating machine from cloud device with key = [%s], group name = [%s], printer type = [%s]",
+ key, group_name, machine_type_id)
+
+ # The newly added machine is automatically activated.
+ self._application.getMachineManager().addMachine(machine_type_id, group_name)
+ active_machine = CuraApplication.getInstance().getGlobalContainerStack()
+ if not active_machine:
+ return
+
+ active_machine.setMetaDataEntry(self.META_CLUSTER_ID, device.key)
+ self._connectToOutputDevice(device, active_machine)
## Callback for when the active machine was changed by the user or a new remote cluster was found.
def _connectToActiveMachine(self) -> None:
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py
index d85f49c1a0..943bef2bc1 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py
@@ -11,8 +11,8 @@ I18N_CATALOG = i18nCatalog("cura")
class CloudProgressMessage(Message):
def __init__(self):
super().__init__(
- text = I18N_CATALOG.i18nc("@info:status", "Sending data to remote cluster"),
- title = I18N_CATALOG.i18nc("@info:status", "Sending data to remote cluster"),
+ title = I18N_CATALOG.i18nc("@info:status", "Sending Print Job"),
+ text = I18N_CATALOG.i18nc("@info:status", "Uploading via Ultimaker Cloud"),
progress = -1,
lifetime = 0,
dismissable = False,
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintCoreConfiguration.py b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintCoreConfiguration.py
index 7454401d09..aba1cdb755 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintCoreConfiguration.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintCoreConfiguration.py
@@ -2,8 +2,8 @@
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Union, Dict, Optional, Any
-from cura.PrinterOutput.ExtruderConfigurationModel import ExtruderConfigurationModel
-from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel
+from cura.PrinterOutput.Models.ExtruderConfigurationModel import ExtruderConfigurationModel
+from cura.PrinterOutput.Models.ExtruderOutputModel import ExtruderOutputModel
from .CloudClusterPrinterConfigurationMaterial import CloudClusterPrinterConfigurationMaterial
from .BaseCloudModel import BaseCloudModel
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py
index 45b7d838a5..79050521af 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py
@@ -2,7 +2,7 @@
# Cura is released under the terms of the LGPLv3 or higher.
from typing import List, Optional, Union, Dict, Any
-from cura.PrinterOutput.ConfigurationModel import ConfigurationModel
+from cura.PrinterOutput.Models.PrinterConfigurationModel import PrinterConfigurationModel
from ...UM3PrintJobOutputModel import UM3PrintJobOutputModel
from ...ConfigurationChangeModel import ConfigurationChangeModel
from ..CloudOutputController import CloudOutputController
@@ -95,9 +95,9 @@ class CloudClusterPrintJobStatus(BaseCloudModel):
return model
## Creates a new configuration model
- def _createConfigurationModel(self) -> ConfigurationModel:
+ def _createConfigurationModel(self) -> PrinterConfigurationModel:
extruders = [extruder.createConfigurationModel() for extruder in self.configuration or ()]
- configuration = ConfigurationModel()
+ configuration = PrinterConfigurationModel()
configuration.setExtruderConfigurations(extruders)
return configuration
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterConfigurationMaterial.py b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterConfigurationMaterial.py
index 652cbdabda..db09133a14 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterConfigurationMaterial.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterConfigurationMaterial.py
@@ -2,7 +2,7 @@ from typing import Optional
from UM.Logger import Logger
from cura.CuraApplication import CuraApplication
-from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel
+from cura.PrinterOutput.Models.MaterialOutputModel import MaterialOutputModel
from .BaseCloudModel import BaseCloudModel
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterStatus.py b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterStatus.py
index bd3e482bde..0b76ba1bce 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterStatus.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterStatus.py
@@ -3,7 +3,7 @@
from typing import List, Union, Dict, Optional, Any
from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
-from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
+from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel
from .CloudClusterBuildPlate import CloudClusterBuildPlate
from .CloudClusterPrintCoreConfiguration import CloudClusterPrintCoreConfiguration
from .BaseCloudModel import BaseCloudModel
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterResponse.py b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterResponse.py
index 9c0853e7c9..5549da02aa 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterResponse.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterResponse.py
@@ -16,13 +16,16 @@ class CloudClusterResponse(BaseCloudModel):
# \param status: The status of the cluster authentication (active or inactive).
# \param host_version: The firmware version of the cluster host. This is where the Stardust client is running on.
def __init__(self, cluster_id: str, host_guid: str, host_name: str, is_online: bool, status: str,
- host_version: Optional[str] = None, **kwargs) -> None:
+ host_internal_ip: Optional[str] = None, host_version: Optional[str] = None,
+ friendly_name: Optional[str] = None, **kwargs) -> None:
self.cluster_id = cluster_id
self.host_guid = host_guid
self.host_name = host_name
self.status = status
self.is_online = is_online
self.host_version = host_version
+ self.host_internal_ip = host_internal_ip
+ self.friendly_name = friendly_name
super().__init__(**kwargs)
# Validates the model, raising an exception if the model is invalid.
diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py
index c1a6362455..3f3cd4cdd6 100644
--- a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py
+++ b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py
@@ -10,21 +10,21 @@ import os
from UM.FileHandler.FileHandler import FileHandler
from UM.FileHandler.WriteFileJob import WriteFileJob # To call the file writer asynchronously.
-from UM.Logger import Logger
-from UM.Settings.ContainerRegistry import ContainerRegistry
from UM.i18n import i18nCatalog
-from UM.Qt.Duration import Duration, DurationFormat
-
+from UM.Logger import Logger
from UM.Message import Message
+from UM.PluginRegistry import PluginRegistry
+from UM.Qt.Duration import Duration, DurationFormat
from UM.Scene.SceneNode import SceneNode # For typing.
+from UM.Settings.ContainerRegistry import ContainerRegistry
from cura.CuraApplication import CuraApplication
-from cura.PrinterOutput.ConfigurationModel import ConfigurationModel
-from cura.PrinterOutput.ExtruderConfigurationModel import ExtruderConfigurationModel
+from cura.PrinterOutput.Models.PrinterConfigurationModel import PrinterConfigurationModel
+from cura.PrinterOutput.Models.ExtruderConfigurationModel import ExtruderConfigurationModel
from cura.PrinterOutput.NetworkedPrinterOutputDevice import AuthState, NetworkedPrinterOutputDevice
-from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
-from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel
-from cura.PrinterOutputDevice import ConnectionType
+from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel
+from cura.PrinterOutput.Models.MaterialOutputModel import MaterialOutputModel
+from cura.PrinterOutput.PrinterOutputDevice import ConnectionType
from .Cloud.Utils import formatTimeCompleted, formatDateCompleted
from .ClusterUM3PrinterOutputController import ClusterUM3PrinterOutputController
@@ -65,7 +65,12 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
self._print_jobs = [] # type: List[UM3PrintJobOutputModel]
self._received_print_jobs = False # type: bool
- self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../resources/qml/MonitorStage.qml")
+ if PluginRegistry.getInstance() is not None:
+ plugin_path = PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting")
+ if plugin_path is None:
+ Logger.log("e", "Cloud not find plugin path for plugin UM3NetworkPrnting")
+ raise RuntimeError("Cloud not find plugin path for plugin UM3NetworkPrnting")
+ self._monitor_view_qml_path = os.path.join(plugin_path, "resources", "qml", "MonitorStage.qml")
# Trigger the printersChanged signal when the private signal is triggered
self.printersChanged.connect(self._clusterPrintersChanged)
@@ -126,8 +131,12 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
def _spawnPrinterSelectionDialog(self):
if self._printer_selection_dialog is None:
- path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../resources/qml/PrintWindow.qml")
- self._printer_selection_dialog = self._application.createQmlComponent(path, {"OutputDevice": self})
+ if PluginRegistry.getInstance() is not None:
+ path = os.path.join(
+ PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"),
+ "resources", "qml", "PrintWindow.qml"
+ )
+ self._printer_selection_dialog = self._application.createQmlComponent(path, {"OutputDevice": self})
if self._printer_selection_dialog is not None:
self._printer_selection_dialog.show()
@@ -387,9 +396,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
newly_finished_jobs = [job for job in finished_jobs if job not in self._finished_jobs and job.owner == username]
for job in newly_finished_jobs:
if job.assignedPrinter:
- job_completed_text = i18n_catalog.i18nc("@info:status", "Printer '{printer_name}' has finished printing '{job_name}'.".format(printer_name=job.assignedPrinter.name, job_name = job.name))
+ job_completed_text = i18n_catalog.i18nc("@info:status", "Printer '{printer_name}' has finished printing '{job_name}'.").format(printer_name=job.assignedPrinter.name, job_name = job.name)
else:
- job_completed_text = i18n_catalog.i18nc("@info:status", "The print job '{job_name}' was finished.".format(job_name = job.name))
+ job_completed_text = i18n_catalog.i18nc("@info:status", "The print job '{job_name}' was finished.").format(job_name = job.name)
job_completed_message = Message(text=job_completed_text, title = i18n_catalog.i18nc("@info:status", "Print finished"))
job_completed_message.show()
@@ -514,7 +523,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
print_job = UM3PrintJobOutputModel(output_controller=ClusterUM3PrinterOutputController(self),
key=data["uuid"], name= data["name"])
- configuration = ConfigurationModel()
+ configuration = PrinterConfigurationModel()
extruders = [ExtruderConfigurationModel(position = idx) for idx in range(0, self._number_of_extruders)]
for index in range(0, self._number_of_extruders):
try:
@@ -526,6 +535,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
extruder.setMaterial(self._createMaterialOutputModel(extruder_data.get("material", {})))
configuration.setExtruderConfigurations(extruders)
+ configuration.setPrinterType(data.get("machine_variant", ""))
print_job.updateConfiguration(configuration)
print_job.setCompatibleMachineFamilies(data.get("compatible_machine_families", []))
print_job.stateChanged.connect(self._printJobStateChanged)
@@ -625,6 +635,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
printer.updateKey(data["uuid"])
printer.updateType(data["machine_variant"])
+ if data["status"] != "unreachable":
+ self._application.getDiscoveredPrintersModel().updateDiscoveredPrinter(data["ip_address"],
+ name = data["friendly_name"],
+ machine_type = data["machine_variant"])
+
# Do not store the build plate information that comes from connect if the current printer has not build plate information
if "build_plate" in data and machine_definition.getMetaDataEntry("has_variant_buildplates", False):
printer.updateBuildplate(data["build_plate"]["type"])
diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/src/ClusterUM3PrinterOutputController.py
index fc6798386a..370cfc9008 100644
--- a/plugins/UM3NetworkPrinting/src/ClusterUM3PrinterOutputController.py
+++ b/plugins/UM3NetworkPrinting/src/ClusterUM3PrinterOutputController.py
@@ -5,7 +5,7 @@ from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
MYPY = False
if MYPY:
- from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
+ from cura.PrinterOutput.Models.PrintJobOutputModel import PrintJobOutputModel
class ClusterUM3PrinterOutputController(PrinterOutputController):
def __init__(self, output_device):
diff --git a/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py b/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py
index ecc89b3948..b67f4d7185 100644
--- a/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py
+++ b/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py
@@ -18,7 +18,7 @@ from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
from .UM3OutputDevicePlugin import UM3OutputDevicePlugin
if TYPE_CHECKING:
- from cura.PrinterOutputDevice import PrinterOutputDevice
+ from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice
catalog = i18nCatalog("cura")
@@ -41,6 +41,11 @@ class DiscoverUM3Action(MachineAction):
# Time to wait after a zero-conf service change before allowing a zeroconf reset
self._zero_conf_change_grace_period = 0.25 #type: float
+ # Overrides the one in MachineAction.
+ # This requires not attention from the user (any more), so we don't need to show any 'upgrade screens'.
+ def needsUserInteraction(self) -> bool:
+ return False
+
@pyqtSlot()
def startDiscovery(self):
if not self._network_plugin:
@@ -105,62 +110,25 @@ class DiscoverUM3Action(MachineAction):
Logger.log("d", "Attempting to set the group name of the active machine to %s", group_name)
global_container_stack = CuraApplication.getInstance().getGlobalContainerStack()
if global_container_stack:
- meta_data = global_container_stack.getMetaData()
- if "group_name" in meta_data:
- previous_connect_group_name = meta_data["group_name"]
- global_container_stack.setMetaDataEntry("group_name", group_name)
- # Find all the places where there is the same group name and change it accordingly
- CuraApplication.getInstance().getMachineManager().replaceContainersMetadata(key = "group_name", value = previous_connect_group_name, new_value = group_name)
- else:
- global_container_stack.setMetaDataEntry("group_name", group_name)
+ # Update a GlobalStacks in the same group with the new group name.
+ group_id = global_container_stack.getMetaDataEntry("group_id")
+ machine_manager = CuraApplication.getInstance().getMachineManager()
+ for machine in machine_manager.getMachinesInGroup(group_id):
+ machine.setMetaDataEntry("group_name", group_name)
+
# Set the default value for "hidden", which is used when you have a group with multiple types of printers
global_container_stack.setMetaDataEntry("hidden", False)
if self._network_plugin:
# Ensure that the connection states are refreshed.
- self._network_plugin.reCheckConnections()
+ self._network_plugin.refreshConnections()
# Associates the currently active machine with the given printer device. The network connection information will be
# stored into the metadata of the currently active machine.
@pyqtSlot(QObject)
def associateActiveMachineWithPrinterDevice(self, printer_device: Optional["PrinterOutputDevice"]) -> None:
- if not printer_device:
- return
-
- Logger.log("d", "Attempting to set the network key of the active machine to %s", printer_device.key)
-
- global_container_stack = CuraApplication.getInstance().getGlobalContainerStack()
- if not global_container_stack:
- return
-
- meta_data = global_container_stack.getMetaData()
-
- if "um_network_key" in meta_data: # Global stack already had a connection, but it's changed.
- old_network_key = meta_data["um_network_key"]
- # Since we might have a bunch of hidden stacks, we also need to change it there.
- metadata_filter = {"um_network_key": old_network_key}
- containers = CuraContainerRegistry.getInstance().findContainerStacks(type="machine", **metadata_filter)
-
- for container in containers:
- container.setMetaDataEntry("um_network_key", printer_device.key)
-
- # Delete old authentication data.
- Logger.log("d", "Removing old authentication id %s for device %s",
- global_container_stack.getMetaDataEntry("network_authentication_id", None), printer_device.key)
-
- container.removeMetaDataEntry("network_authentication_id")
- container.removeMetaDataEntry("network_authentication_key")
-
- # Ensure that these containers do know that they are configured for network connection
- container.addConfiguredConnectionType(printer_device.connectionType.value)
-
- else: # Global stack didn't have a connection yet, configure it.
- global_container_stack.setMetaDataEntry("um_network_key", printer_device.key)
- global_container_stack.addConfiguredConnectionType(printer_device.connectionType.value)
-
if self._network_plugin:
- # Ensure that the connection states are refreshed.
- self._network_plugin.reCheckConnections()
+ self._network_plugin.associateActiveMachineWithPrinterDevice(printer_device)
@pyqtSlot(result = str)
def getStoredKey(self) -> str:
@@ -180,7 +148,9 @@ class DiscoverUM3Action(MachineAction):
@pyqtSlot(str, result = bool)
def existsKey(self, key: str) -> bool:
- return CuraApplication.getInstance().getMachineManager().existNetworkInstances(network_key = key)
+ metadata_filter = {"um_network_key": key}
+ containers = CuraContainerRegistry.getInstance().findContainerStacks(type="machine", **metadata_filter)
+ return bool(containers)
@pyqtSlot()
def loadConfigurationFromPrinter(self) -> None:
diff --git a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py
index 3ce0460d6b..5c1948b977 100644
--- a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py
+++ b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py
@@ -1,21 +1,22 @@
from typing import List, Optional
-from UM.FileHandler.FileHandler import FileHandler
-from UM.Scene.SceneNode import SceneNode
from cura.CuraApplication import CuraApplication
from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice, AuthState
-from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
-from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
-from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel
-from cura.PrinterOutputDevice import ConnectionType
+from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel
+from cura.PrinterOutput.Models.PrintJobOutputModel import PrintJobOutputModel
+from cura.PrinterOutput.Models.MaterialOutputModel import MaterialOutputModel
+from cura.PrinterOutput.PrinterOutputDevice import ConnectionType
from cura.Settings.ContainerManager import ContainerManager
from cura.Settings.ExtruderManager import ExtruderManager
-from UM.Logger import Logger
-from UM.Settings.ContainerRegistry import ContainerRegistry
+from UM.FileHandler.FileHandler import FileHandler
from UM.i18n import i18nCatalog
+from UM.Logger import Logger
from UM.Message import Message
+from UM.PluginRegistry import PluginRegistry
+from UM.Scene.SceneNode import SceneNode
+from UM.Settings.ContainerRegistry import ContainerRegistry
from PyQt5.QtNetwork import QNetworkRequest
from PyQt5.QtCore import QTimer, QUrl
@@ -76,10 +77,16 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice):
self.setIconName("print")
- self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../resources/qml/MonitorItem.qml")
-
self._output_controller = LegacyUM3PrinterOutputController(self)
+ def _createMonitorViewFromQML(self) -> None:
+ if self._monitor_view_qml_path is None and PluginRegistry.getInstance() is not None:
+ self._monitor_view_qml_path = os.path.join(
+ PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"),
+ "resources", "qml", "MonitorStage.qml"
+ )
+ super()._createMonitorViewFromQML()
+
def _onAuthenticationStateChanged(self):
# We only accept commands if we are authenticated.
self._setAcceptsCommands(self._authentication_state == AuthState.Authenticated)
diff --git a/plugins/UM3NetworkPrinting/src/LegacyUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/src/LegacyUM3PrinterOutputController.py
index 63167b4ffb..9e372d4113 100644
--- a/plugins/UM3NetworkPrinting/src/LegacyUM3PrinterOutputController.py
+++ b/plugins/UM3NetworkPrinting/src/LegacyUM3PrinterOutputController.py
@@ -7,8 +7,8 @@ from UM.Version import Version
MYPY = False
if MYPY:
- from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
- from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
+ from cura.PrinterOutput.Models.PrintJobOutputModel import PrintJobOutputModel
+ from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel
class LegacyUM3PrinterOutputController(PrinterOutputController):
diff --git a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py
index 723bcf2b7c..41c76dc4c0 100644
--- a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py
+++ b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py
@@ -1,40 +1,67 @@
# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import json
+import os
from queue import Queue
from threading import Event, Thread
from time import time
-import os
+from typing import Optional, TYPE_CHECKING, Dict, Callable
from zeroconf import Zeroconf, ServiceBrowser, ServiceStateChange, ServiceInfo
-from PyQt5.QtNetwork import QNetworkRequest, QNetworkAccessManager
-from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QObject
+
+from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply, QNetworkAccessManager
+from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QDesktopServices
from cura.CuraApplication import CuraApplication
-from cura.PrinterOutputDevice import ConnectionType
-from cura.Settings.GlobalStack import GlobalStack # typing
-from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin
+from cura.PrinterOutput.PrinterOutputDevice import ConnectionType
+
+from UM.i18n import i18nCatalog
from UM.Logger import Logger
+from UM.Message import Message
+from UM.OutputDevice.OutputDeviceManager import ManualDeviceAdditionAttempt
+from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin
+from UM.PluginRegistry import PluginRegistry
from UM.Signal import Signal, signalemitter
from UM.Version import Version
-from UM.Message import Message
-from UM.i18n import i18nCatalog
from . import ClusterUM3OutputDevice, LegacyUM3OutputDevice
from .Cloud.CloudOutputDeviceManager import CloudOutputDeviceManager
+from .Cloud.CloudOutputDevice import CloudOutputDevice # typing
+
+if TYPE_CHECKING:
+ from PyQt5.QtNetwork import QNetworkReply
+ from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin
+ from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice
+ from cura.Settings.GlobalStack import GlobalStack
-from typing import Optional
i18n_catalog = i18nCatalog("cura")
+
+#
+# Represents a request for adding a manual printer. It has the following fields:
+# - address: The string of the (IP) address of the manual printer
+# - callback: (Optional) Once the HTTP request to the printer to get printer information is done, whether successful
+# or not, this callback will be invoked to notify about the result. The callback must have a signature of
+# func(success: bool, address: str) -> None
+# - network_reply: This is the QNetworkReply instance for this request if the request has been issued and still in
+# progress. It is kept here so we can cancel a request when needed.
+#
+class ManualPrinterRequest:
+ def __init__(self, address: str, callback: Optional[Callable[[bool, str], None]] = None) -> None:
+ self.address = address
+ self.callback = callback
+ self.network_reply = None # type: Optional["QNetworkReply"]
+
+
## This plugin handles the connection detection & creation of output device objects for the UM3 printer.
# Zero-Conf is used to detect printers, which are saved in a dict.
# If we discover a printer that has the same key as the active machine instance a connection is made.
@signalemitter
class UM3OutputDevicePlugin(OutputDevicePlugin):
- addDeviceSignal = Signal()
- removeDeviceSignal = Signal()
+ addDeviceSignal = Signal() # Called '...Signal' to avoid confusion with function-names.
+ removeDeviceSignal = Signal() # Ditto ^^^.
discoveredDevicesChanged = Signal()
cloudFlowIsPossible = Signal()
@@ -53,7 +80,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
self.addDeviceSignal.connect(self._onAddDevice)
self.removeDeviceSignal.connect(self._onRemoveDevice)
- self._application.globalContainerStackChanged.connect(self.reCheckConnections)
+ self._application.globalContainerStackChanged.connect(self.refreshConnections)
self._discovered_devices = {}
@@ -73,10 +100,12 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
self._preferences.addPreference("um3networkprinting/manual_instances",
"") # A comma-separated list of ip adresses or hostnames
- self._manual_instances = self._preferences.getValue("um3networkprinting/manual_instances").split(",")
+ manual_instances = self._preferences.getValue("um3networkprinting/manual_instances").split(",")
+ self._manual_instances = {address: ManualPrinterRequest(address)
+ for address in manual_instances} # type: Dict[str, ManualPrinterRequest]
# Store the last manual entry key
- self._last_manual_entry_key = "" # type: str
+ self._last_manual_entry_key = "" # type: str
# The zero-conf service changed requests are handled in a separate thread, so we can re-schedule the requests
# which fail to get detailed service info.
@@ -140,7 +169,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
self.addManualDevice(address)
self.resetLastManualDevice()
- def reCheckConnections(self):
+ def refreshConnections(self):
active_machine = CuraApplication.getInstance().getGlobalContainerStack()
if not active_machine:
return
@@ -171,7 +200,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
um_network_key = CuraApplication.getInstance().getGlobalContainerStack().getMetaDataEntry("um_network_key")
if key == um_network_key:
self.getOutputDeviceManager().addOutputDevice(self._discovered_devices[key])
- self.checkCloudFlowIsPossible()
+ self.checkCloudFlowIsPossible(None)
else:
self.getOutputDeviceManager().removeOutputDevice(key)
@@ -181,7 +210,14 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
self._zero_conf.close()
self._cloud_output_device_manager.stop()
- def removeManualDevice(self, key, address = None):
+ def canAddManualDevice(self, address: str = "") -> ManualDeviceAdditionAttempt:
+ # This plugin should always be the fallback option (at least try it):
+ return ManualDeviceAdditionAttempt.POSSIBLE
+
+ def removeManualDevice(self, key: str, address: Optional[str] = None) -> None:
+ if key not in self._discovered_devices and address is not None:
+ key = "manual:%s" % address
+
if key in self._discovered_devices:
if not address:
address = self._discovered_devices[key].ipAddress
@@ -189,13 +225,22 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
self.resetLastManualDevice()
if address in self._manual_instances:
- self._manual_instances.remove(address)
- self._preferences.setValue("um3networkprinting/manual_instances", ",".join(self._manual_instances))
+ manual_printer_request = self._manual_instances.pop(address)
+ self._preferences.setValue("um3networkprinting/manual_instances", ",".join(self._manual_instances.keys()))
- def addManualDevice(self, address):
- if address not in self._manual_instances:
- self._manual_instances.append(address)
- self._preferences.setValue("um3networkprinting/manual_instances", ",".join(self._manual_instances))
+ if manual_printer_request.network_reply is not None:
+ manual_printer_request.network_reply.abort()
+
+ if manual_printer_request.callback is not None:
+ self._application.callLater(manual_printer_request.callback, False, address)
+
+ def addManualDevice(self, address: str, callback: Optional[Callable[[bool, str], None]] = None) -> None:
+ if address in self._manual_instances:
+ Logger.log("i", "Manual printer with address [%s] has already been added, do nothing", address)
+ return
+
+ self._manual_instances[address] = ManualPrinterRequest(address, callback = callback)
+ self._preferences.setValue("um3networkprinting/manual_instances", ",".join(self._manual_instances.keys()))
instance_name = "manual:%s" % address
properties = {
@@ -211,31 +256,92 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
self._onAddDevice(instance_name, address, properties)
self._last_manual_entry_key = instance_name
- self._checkManualDevice(address)
+ reply = self._checkManualDevice(address)
+ self._manual_instances[address].network_reply = reply
- def _checkManualDevice(self, address):
+ def _createMachineFromDiscoveredPrinter(self, key: str) -> None:
+ discovered_device = self._discovered_devices.get(key)
+ if discovered_device is None:
+ Logger.log("e", "Could not find discovered device with key [%s]", key)
+ return
+
+ group_name = discovered_device.getProperty("name")
+ machine_type_id = discovered_device.getProperty("printer_type")
+
+ Logger.log("i", "Creating machine from network device with key = [%s], group name = [%s], printer type = [%s]",
+ key, group_name, machine_type_id)
+
+ self._application.getMachineManager().addMachine(machine_type_id, group_name)
+ # connect the new machine to that network printer
+ self.associateActiveMachineWithPrinterDevice(discovered_device)
+ # ensure that the connection states are refreshed.
+ self.refreshConnections()
+
+ def associateActiveMachineWithPrinterDevice(self, printer_device: Optional["PrinterOutputDevice"]) -> None:
+ if not printer_device:
+ return
+
+ Logger.log("d", "Attempting to set the network key of the active machine to %s", printer_device.key)
+
+ machine_manager = CuraApplication.getInstance().getMachineManager()
+ global_container_stack = machine_manager.activeMachine
+ if not global_container_stack:
+ return
+
+ for machine in machine_manager.getMachinesInGroup(global_container_stack.getMetaDataEntry("group_id")):
+ machine.setMetaDataEntry("um_network_key", printer_device.key)
+ machine.setMetaDataEntry("group_name", printer_device.name)
+
+ # Delete old authentication data.
+ Logger.log("d", "Removing old authentication id %s for device %s",
+ global_container_stack.getMetaDataEntry("network_authentication_id", None), printer_device.key)
+
+ machine.removeMetaDataEntry("network_authentication_id")
+ machine.removeMetaDataEntry("network_authentication_key")
+
+ # Ensure that these containers do know that they are configured for network connection
+ machine.addConfiguredConnectionType(printer_device.connectionType.value)
+
+ self.refreshConnections()
+
+ def _checkManualDevice(self, address: str) -> "QNetworkReply":
# Check if a UM3 family device exists at this address.
# If a printer responds, it will replace the preliminary printer created above
# origin=manual is for tracking back the origin of the call
url = QUrl("http://" + address + self._api_prefix + "system")
name_request = QNetworkRequest(url)
- self._network_manager.get(name_request)
+ return self._network_manager.get(name_request)
- def _onNetworkRequestFinished(self, reply):
+ def _onNetworkRequestFinished(self, reply: "QNetworkReply") -> None:
reply_url = reply.url().toString()
- if "system" in reply_url:
- if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200:
- # Something went wrong with checking the firmware version!
- return
+ address = reply.url().host()
+ device = None
+ properties = {} # type: Dict[bytes, bytes]
+ if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200:
+ # Either:
+ # - Something went wrong with checking the firmware version!
+ # - Something went wrong with checking the amount of printers the cluster has!
+ # - Couldn't find printer at the address when trying to add it manually.
+ if address in self._manual_instances:
+ key = "manual:" + address
+ self.removeManualDevice(key, address)
+ return
+
+ if "system" in reply_url:
try:
system_info = json.loads(bytes(reply.readAll()).decode("utf-8"))
except:
Logger.log("e", "Something went wrong converting the JSON.")
return
- address = reply.url().host()
+ if address in self._manual_instances:
+ manual_printer_request = self._manual_instances[address]
+ manual_printer_request.network_reply = None
+ if manual_printer_request.callback is not None:
+ self._application.callLater(manual_printer_request.callback, True, address)
+
has_cluster_capable_firmware = Version(system_info["firmware"]) > self._min_cluster_version
instance_name = "manual:%s" % address
properties = {
@@ -263,27 +369,23 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
self._network_manager.get(cluster_request)
elif "printers" in reply_url:
- if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200:
- # Something went wrong with checking the amount of printers the cluster has!
- return
# So we confirmed that the device is in fact a cluster printer, and we should now know how big it is.
try:
cluster_printers_list = json.loads(bytes(reply.readAll()).decode("utf-8"))
except:
Logger.log("e", "Something went wrong converting the JSON.")
return
- address = reply.url().host()
instance_name = "manual:%s" % address
if instance_name in self._discovered_devices:
device = self._discovered_devices[instance_name]
properties = device.getProperties().copy()
if b"incomplete" in properties:
del properties[b"incomplete"]
- properties[b"cluster_size"] = len(cluster_printers_list)
+ properties[b"cluster_size"] = str(len(cluster_printers_list)).encode("utf-8")
self._onRemoveDevice(instance_name)
self._onAddDevice(instance_name, address, properties)
- def _onRemoveDevice(self, device_id):
+ def _onRemoveDevice(self, device_id: str) -> None:
device = self._discovered_devices.pop(device_id, None)
if device:
if device.isConnected():
@@ -293,7 +395,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
except TypeError:
# Disconnect already happened.
pass
-
+ self._application.getDiscoveredPrintersModel().removeDiscoveredPrinter(device.address)
self.discoveredDevicesChanged.emit()
def _onAddDevice(self, name, address, properties):
@@ -318,7 +420,9 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
device = ClusterUM3OutputDevice.ClusterUM3OutputDevice(name, address, properties)
else:
device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties)
-
+ self._application.getDiscoveredPrintersModel().addDiscoveredPrinter(
+ address, device.getId(), properties[b"name"].decode("utf-8"), self._createMachineFromDiscoveredPrinter,
+ properties[b"printer_type"].decode("utf-8"), device)
self._discovered_devices[device.getId()] = device
self.discoveredDevicesChanged.emit()
@@ -406,13 +510,12 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
return True
## Check if the prerequsites are in place to start the cloud flow
- def checkCloudFlowIsPossible(self) -> None:
+ def checkCloudFlowIsPossible(self, cluster: Optional[CloudOutputDevice]) -> None:
Logger.log("d", "Checking if cloud connection is possible...")
# Pre-Check: Skip if active machine already has been cloud connected or you said don't ask again
- active_machine = self._application.getMachineManager().activeMachine # type: Optional["GlobalStack"]
+ active_machine = self._application.getMachineManager().activeMachine # type: Optional[GlobalStack]
if active_machine:
-
# Check 1A: Printer isn't already configured for cloud
if ConnectionType.CloudConnection.value in active_machine.configuredConnectionTypes:
Logger.log("d", "Active machine was already configured for cloud.")
@@ -452,49 +555,39 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
def _onCloudFlowPossible(self) -> None:
# Cloud flow is possible, so show the message
if not self._start_cloud_flow_message:
- self._start_cloud_flow_message = Message(
- text = i18n_catalog.i18nc("@info:status", "Send and monitor print jobs from anywhere using your Ultimaker account."),
- lifetime = 0,
- image_source = QUrl.fromLocalFile(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..",
- "resources", "svg", "cloud-flow-start.svg")),
- image_caption = i18n_catalog.i18nc("@info:status", "Connect to Ultimaker Cloud"),
- option_text = i18n_catalog.i18nc("@action", "Don't ask me again for this printer."),
- option_state = False
- )
- self._start_cloud_flow_message.addAction("", i18n_catalog.i18nc("@action", "Get started"), "", "")
- self._start_cloud_flow_message.optionToggled.connect(self._onDontAskMeAgain)
- self._start_cloud_flow_message.actionTriggered.connect(self._onCloudFlowStarted)
- self._start_cloud_flow_message.show()
- return
+ self._createCloudFlowStartMessage()
+ if self._start_cloud_flow_message and not self._start_cloud_flow_message.visible:
+ self._start_cloud_flow_message.show()
- def _onCloudPrintingConfigured(self) -> None:
- if self._start_cloud_flow_message:
+ def _onCloudPrintingConfigured(self, device) -> None:
+ # Hide the cloud flow start message if it was hanging around already
+ # For example: if the user already had the browser openen and made the association themselves
+ if self._start_cloud_flow_message and self._start_cloud_flow_message.visible:
self._start_cloud_flow_message.hide()
- self._start_cloud_flow_message = None
- # Show the successful pop-up
- if not self._start_cloud_flow_message:
- self._cloud_flow_complete_message = Message(
- text = i18n_catalog.i18nc("@info:status", "You can now send and monitor print jobs from anywhere using your Ultimaker account."),
- lifetime = 30,
- image_source = QUrl.fromLocalFile(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..",
- "resources", "svg", "cloud-flow-completed.svg")),
- image_caption = i18n_catalog.i18nc("@info:status", "Connected!")
- )
- # Don't show the review connection link if we're not on the local network
- if self._application.getMachineManager().activeMachineHasNetworkConnection:
- self._cloud_flow_complete_message.addAction("", i18n_catalog.i18nc("@action", "Review your connection"), "", "", 1) # TODO: Icon
- self._cloud_flow_complete_message.actionTriggered.connect(self._onReviewCloudConnection)
+ # Cloud flow is complete, so show the message
+ if not self._cloud_flow_complete_message:
+ self._createCloudFlowCompleteMessage()
+ if self._cloud_flow_complete_message and not self._cloud_flow_complete_message.visible:
self._cloud_flow_complete_message.show()
+
+ # Set the machine's cloud flow as complete so we don't ask the user again and again for cloud connected printers
+ active_machine = self._application.getMachineManager().activeMachine
+ if active_machine:
- # Set the machine's cloud flow as complete so we don't ask the user again and again for cloud connected printers
- active_machine = self._application.getMachineManager().activeMachine
- if active_machine:
+ # The active machine _might_ not be the machine that was in the added cloud cluster and
+ # then this will hide the cloud message for the wrong machine. So we only set it if the
+ # host names match between the active machine and the newly added cluster
+ saved_host_name = active_machine.getMetaDataEntry("um_network_key", "").split('.')[0]
+ added_host_name = device.toDict()["host_name"]
+
+ if added_host_name == saved_host_name:
active_machine.setMetaDataEntry("do_not_show_cloud_message", True)
- return
+
+ return
def _onDontAskMeAgain(self, checked: bool) -> None:
- active_machine = self._application.getMachineManager().activeMachine # type: Optional["GlobalStack"]
+ active_machine = self._application.getMachineManager().activeMachine # type: Optional[GlobalStack]
if active_machine:
active_machine.setMetaDataEntry("do_not_show_cloud_message", checked)
if checked:
@@ -517,11 +610,40 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
return
def _onMachineSwitched(self) -> None:
- if self._start_cloud_flow_message is not None:
+ # Hide any left over messages
+ if self._start_cloud_flow_message is not None and self._start_cloud_flow_message.visible:
self._start_cloud_flow_message.hide()
- self._start_cloud_flow_message = None
- if self._cloud_flow_complete_message is not None:
+ if self._cloud_flow_complete_message is not None and self._cloud_flow_complete_message.visible:
self._cloud_flow_complete_message.hide()
- self._cloud_flow_complete_message = None
- self.checkCloudFlowIsPossible()
+ # Check for cloud flow again with newly selected machine
+ self.checkCloudFlowIsPossible(None)
+
+ def _createCloudFlowStartMessage(self):
+ self._start_cloud_flow_message = Message(
+ text = i18n_catalog.i18nc("@info:status", "Send and monitor print jobs from anywhere using your Ultimaker account."),
+ lifetime = 0,
+ image_source = QUrl.fromLocalFile(os.path.join(
+ PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"),
+ "resources", "svg", "cloud-flow-start.svg"
+ )),
+ image_caption = i18n_catalog.i18nc("@info:status Ultimaker Cloud is a brand name and shouldn't be translated.", "Connect to Ultimaker Cloud"),
+ option_text = i18n_catalog.i18nc("@action", "Don't ask me again for this printer."),
+ option_state = False
+ )
+ self._start_cloud_flow_message.addAction("", i18n_catalog.i18nc("@action", "Get started"), "", "")
+ self._start_cloud_flow_message.optionToggled.connect(self._onDontAskMeAgain)
+ self._start_cloud_flow_message.actionTriggered.connect(self._onCloudFlowStarted)
+
+ def _createCloudFlowCompleteMessage(self):
+ self._cloud_flow_complete_message = Message(
+ text = i18n_catalog.i18nc("@info:status", "You can now send and monitor print jobs from anywhere using your Ultimaker account."),
+ lifetime = 30,
+ image_source = QUrl.fromLocalFile(os.path.join(
+ PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"),
+ "resources", "svg", "cloud-flow-completed.svg"
+ )),
+ image_caption = i18n_catalog.i18nc("@info:status", "Connected!")
+ )
+ self._cloud_flow_complete_message.addAction("", i18n_catalog.i18nc("@action", "Review your connection"), "", "", 1) # TODO: Icon
+ self._cloud_flow_complete_message.actionTriggered.connect(self._onReviewCloudConnection)
\ No newline at end of file
diff --git a/plugins/UM3NetworkPrinting/src/UM3PrintJobOutputModel.py b/plugins/UM3NetworkPrinting/src/UM3PrintJobOutputModel.py
index 4f44ca4af8..b627b6e9c8 100644
--- a/plugins/UM3NetworkPrinting/src/UM3PrintJobOutputModel.py
+++ b/plugins/UM3NetworkPrinting/src/UM3PrintJobOutputModel.py
@@ -5,7 +5,7 @@ from typing import List
from PyQt5.QtCore import pyqtProperty, pyqtSignal
-from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
+from cura.PrinterOutput.Models.PrintJobOutputModel import PrintJobOutputModel
from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
from .ConfigurationChangeModel import ConfigurationChangeModel
diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py b/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py
index c4d891302e..d11cfa8a0e 100644
--- a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py
+++ b/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py
@@ -6,7 +6,7 @@ from unittest.mock import patch, MagicMock
from UM.Scene.SceneNode import SceneNode
from cura.UltimakerCloudAuthentication import CuraCloudAPIRoot
-from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
+from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel
from ...src.Cloud import CloudApiClient
from ...src.Cloud.CloudOutputDevice import CloudOutputDevice
from ...src.Cloud.Models.CloudClusterResponse import CloudClusterResponse
@@ -22,6 +22,7 @@ class TestCloudOutputDevice(TestCase):
HOST_NAME = "ultimakersystem-ccbdd30044ec"
HOST_GUID = "e90ae0ac-1257-4403-91ee-a44c9b7e8050"
HOST_VERSION = "5.2.0"
+ FRIENDLY_NAME = "My Friendly Printer"
STATUS_URL = "{}/connect/v1/clusters/{}/status".format(CuraCloudAPIRoot, CLUSTER_ID)
PRINT_URL = "{}/connect/v1/clusters/{}/print/{}".format(CuraCloudAPIRoot, CLUSTER_ID, JOB_ID)
@@ -37,7 +38,8 @@ class TestCloudOutputDevice(TestCase):
patched_method.start()
self.cluster = CloudClusterResponse(self.CLUSTER_ID, self.HOST_GUID, self.HOST_NAME, is_online=True,
- status="active", host_version=self.HOST_VERSION)
+ status="active", host_version=self.HOST_VERSION,
+ friendly_name=self.FRIENDLY_NAME)
self.network = NetworkManagerMock()
self.account = MagicMock(isLoggedIn=True, accessToken="TestAccessToken")
@@ -60,7 +62,7 @@ class TestCloudOutputDevice(TestCase):
# We test for these in order to make sure the correct file type is selected depending on the firmware version.
def test_properties(self):
self.assertEqual(self.device.firmwareVersion, self.HOST_VERSION)
- self.assertEqual(self.device.name, self.HOST_NAME)
+ self.assertEqual(self.device.name, self.FRIENDLY_NAME)
def test_status(self):
self.device._update()
diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDeviceManager.py
index e24ca1694e..869b39440c 100644
--- a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDeviceManager.py
+++ b/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDeviceManager.py
@@ -7,6 +7,7 @@ from UM.OutputDevice.OutputDeviceManager import OutputDeviceManager
from cura.UltimakerCloudAuthentication import CuraCloudAPIRoot
from ...src.Cloud import CloudApiClient
from ...src.Cloud import CloudOutputDeviceManager
+from ...src.Cloud.Models.CloudClusterResponse import CloudClusterResponse
from .Fixtures import parseFixture, readFixture
from .NetworkManagerMock import NetworkManagerMock, FakeSignal
@@ -55,7 +56,9 @@ class TestCloudOutputDeviceManager(TestCase):
devices = self.device_manager.getOutputDevices()
# TODO: Check active device
- response_clusters = self.clusters_response.get("data", [])
+ response_clusters = []
+ for cluster in self.clusters_response.get("data", []):
+ response_clusters.append(CloudClusterResponse(**cluster).toDict())
manager_clusters = sorted([device.clusterData.toDict() for device in self.manager._remote_clusters.values()],
key=lambda cluster: cluster['cluster_id'], reverse=True)
self.assertEqual(response_clusters, manager_clusters)
@@ -97,7 +100,7 @@ class TestCloudOutputDeviceManager(TestCase):
self.assertTrue(self.device_manager.getOutputDevice(cluster1["cluster_id"]).isConnected())
self.assertIsNone(self.device_manager.getOutputDevice(cluster2["cluster_id"]))
- self.assertEquals([], active_machine_mock.setMetaDataEntry.mock_calls)
+ self.assertEqual([], active_machine_mock.setMetaDataEntry.mock_calls)
def test_device_connects_by_network_key(self):
active_machine_mock = self.app.getGlobalContainerStack.return_value
diff --git a/plugins/UM3NetworkPrinting/tests/TestSendMaterialJob.py b/plugins/UM3NetworkPrinting/tests/TestSendMaterialJob.py
index 952d38dcf4..2cab110861 100644
--- a/plugins/UM3NetworkPrinting/tests/TestSendMaterialJob.py
+++ b/plugins/UM3NetworkPrinting/tests/TestSendMaterialJob.py
@@ -208,7 +208,7 @@ class TestSendMaterialJob(TestCase):
self.assertEqual(1, device_mock.createFormPart.call_count)
self.assertEqual(1, device_mock.postFormWithParts.call_count)
- self.assertEquals(
+ self.assertEqual(
[call.createFormPart("name=\"file\"; filename=\"generic_pla_white.xml.fdm_material\"", ""),
call.postFormWithParts(target = "materials/", parts = ["_xXx_"], on_finished = job.sendingFinished)],
device_mock.method_calls)
@@ -238,7 +238,7 @@ class TestSendMaterialJob(TestCase):
self.assertEqual(1, device_mock.createFormPart.call_count)
self.assertEqual(1, device_mock.postFormWithParts.call_count)
- self.assertEquals(
+ self.assertEqual(
[call.createFormPart("name=\"file\"; filename=\"generic_pla_white.xml.fdm_material\"", ""),
call.postFormWithParts(target = "materials/", parts = ["_xXx_"], on_finished = job.sendingFinished)],
device_mock.method_calls)
diff --git a/plugins/USBPrinting/AvrFirmwareUpdater.py b/plugins/USBPrinting/AvrFirmwareUpdater.py
index 56e3f99c23..0f7146560d 100644
--- a/plugins/USBPrinting/AvrFirmwareUpdater.py
+++ b/plugins/USBPrinting/AvrFirmwareUpdater.py
@@ -13,7 +13,7 @@ from time import sleep
MYPY = False
if MYPY:
- from cura.PrinterOutputDevice import PrinterOutputDevice
+ from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice
class AvrFirmwareUpdater(FirmwareUpdater):
diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py
index 752773723e..6ce042f32d 100644
--- a/plugins/USBPrinting/USBPrinterOutputDevice.py
+++ b/plugins/USBPrinting/USBPrinterOutputDevice.py
@@ -1,24 +1,28 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
+
import os
-from UM.Logger import Logger
from UM.i18n import i18nCatalog
+from UM.Logger import Logger
+from UM.Mesh.MeshWriter import MeshWriter #To get the g-code output.
+from UM.PluginRegistry import PluginRegistry #To get the g-code output.
from UM.Qt.Duration import DurationFormat
from cura.CuraApplication import CuraApplication
-from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState, ConnectionType
-from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
-from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
+from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice, ConnectionState, ConnectionType
+from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel
+from cura.PrinterOutput.Models.PrintJobOutputModel import PrintJobOutputModel
from cura.PrinterOutput.GenericOutputController import GenericOutputController
from .AutoDetectBaudJob import AutoDetectBaudJob
from .AvrFirmwareUpdater import AvrFirmwareUpdater
+from io import StringIO #To write the g-code output.
+from queue import Queue
from serial import Serial, SerialException, SerialTimeoutException
from threading import Thread, Event
from time import time
-from queue import Queue
from typing import Union, Optional, List, cast
import re
@@ -114,28 +118,29 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
# \param kwargs Keyword arguments.
def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None, **kwargs):
if self._is_printing:
- return # Aleady printing
+ return # Already printing
self.writeStarted.emit(self)
# cancel any ongoing preheat timer before starting a print
self._printers[0].getController().stopPreheatTimers()
CuraApplication.getInstance().getController().setActiveStage("MonitorStage")
- # find the G-code for the active build plate to print
- active_build_plate_id = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate
- gcode_dict = getattr(CuraApplication.getInstance().getController().getScene(), "gcode_dict")
- gcode_list = gcode_dict[active_build_plate_id]
+ #Find the g-code to print.
+ gcode_textio = StringIO()
+ gcode_writer = cast(MeshWriter, PluginRegistry.getInstance().getPluginObject("GCodeWriter"))
+ success = gcode_writer.write(gcode_textio, None)
+ if not success:
+ return
- self._printGCode(gcode_list)
+ self._printGCode(gcode_textio.getvalue())
## Start a print based on a g-code.
- # \param gcode_list List with gcode (strings).
- def _printGCode(self, gcode_list: List[str]):
+ # \param gcode The g-code to print.
+ def _printGCode(self, gcode: str):
self._gcode.clear()
self._paused = False
- for layer in gcode_list:
- self._gcode.extend(layer.split("\n"))
+ self._gcode.extend(gcode.split("\n"))
# Reset line number. If this is not done, first line is sometimes ignored
self._gcode.insert(0, "M110")
@@ -221,6 +226,9 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
except SerialTimeoutException:
Logger.log("w", "Timeout when sending command to printer via USB.")
self._command_received.set()
+ except SerialException:
+ Logger.logException("w", "An unexpected exception occurred while writing to the serial.")
+ self.setConnectionState(ConnectionState.Error)
def _update(self):
while self._connection_state == ConnectionState.Connected and self._serial is not None:
@@ -243,7 +251,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
self._last_temperature_request = time()
if re.search(b"[B|T\d*]: ?\d+\.?\d*", line): # Temperature message. 'T:' for extruder and 'B:' for bed
- extruder_temperature_matches = re.findall(b"T(\d*): ?(\d+\.?\d*) ?\/?(\d+\.?\d*)?", line)
+ extruder_temperature_matches = re.findall(b"T(\d*): ?(\d+\.?\d*)\s*\/?(\d+\.?\d*)?", line)
# Update all temperature values
matched_extruder_nrs = []
for match in extruder_temperature_matches:
@@ -265,7 +273,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
if match[2]:
extruder.updateTargetHotendTemperature(float(match[2]))
- bed_temperature_matches = re.findall(b"B: ?(\d+\.?\d*) ?\/?(\d+\.?\d*) ?", line)
+ bed_temperature_matches = re.findall(b"B: ?(\d+\.?\d*)\s*\/?(\d+\.?\d*)?", line)
if bed_temperature_matches:
match = bed_temperature_matches[0]
if match[0]:
@@ -366,10 +374,17 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
self._sendCommand("N%d%s*%d" % (self._gcode_position, line, checksum))
- progress = (self._gcode_position / len(self._gcode))
+ print_job = self._printers[0].activePrintJob
+ try:
+ progress = self._gcode_position / len(self._gcode)
+ except ZeroDivisionError:
+ # There is nothing to send!
+ if print_job is not None:
+ print_job.updateState("error")
+ return
elapsed_time = int(time() - self._print_start_time)
- print_job = self._printers[0].activePrintJob
+
if print_job is None:
controller = GenericOutputController(self)
controller.setCanUpdateFirmware(True)
diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py
index d4c0d1828e..f84a1bb175 100644
--- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py
+++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py
@@ -5,15 +5,13 @@ import threading
import time
import serial.tools.list_ports
-from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal
+from PyQt5.QtCore import QObject, pyqtSignal
-from UM.Logger import Logger
from UM.Signal import Signal, signalemitter
from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin
from UM.i18n import i18nCatalog
-from cura.PrinterOutputDevice import ConnectionState
-from cura.CuraApplication import CuraApplication
+from cura.PrinterOutput.PrinterOutputDevice import ConnectionState
from . import USBPrinterOutputDevice
diff --git a/plugins/UltimakerMachineActions/BedLevelMachineAction.py b/plugins/UltimakerMachineActions/BedLevelMachineAction.py
index d6de21c89b..818ad0e4f0 100644
--- a/plugins/UltimakerMachineActions/BedLevelMachineAction.py
+++ b/plugins/UltimakerMachineActions/BedLevelMachineAction.py
@@ -4,7 +4,7 @@
from typing import List
from cura.MachineAction import MachineAction
-from cura.PrinterOutputDevice import PrinterOutputDevice
+from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice
from UM.FlameProfiler import pyqtSlot
diff --git a/plugins/UltimakerMachineActions/BedLevelMachineAction.qml b/plugins/UltimakerMachineActions/BedLevelMachineAction.qml
index 262d5df376..a9f7e93d44 100644
--- a/plugins/UltimakerMachineActions/BedLevelMachineAction.qml
+++ b/plugins/UltimakerMachineActions/BedLevelMachineAction.qml
@@ -1,24 +1,27 @@
-// Copyright (c) 2016 Ultimaker B.V.
+// Copyright (c) 2019 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
-import QtQuick 2.2
-import QtQuick.Controls 1.1
-import QtQuick.Layouts 1.1
-import QtQuick.Window 2.1
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+import QtQuick.Layouts 1.3
-import UM 1.2 as UM
-import Cura 1.0 as Cura
+import UM 1.3 as UM
+import Cura 1.1 as Cura
Cura.MachineAction
{
- anchors.fill: parent;
+ UM.I18nCatalog { id: catalog; name: "cura"; }
+
+ anchors.fill: parent
+
Item
{
id: bedLevelMachineAction
- anchors.fill: parent;
-
- UM.I18nCatalog { id: catalog; name: "cura"; }
+ anchors.top: parent.top
+ anchors.topMargin: UM.Theme.getSize("default_margin").height * 3
+ anchors.horizontalCenter: parent.horizontalCenter
+ width: parent.width * 3 / 4
Label
{
@@ -26,17 +29,24 @@ Cura.MachineAction
width: parent.width
text: catalog.i18nc("@title", "Build Plate Leveling")
wrapMode: Text.WordWrap
- font.pointSize: 18;
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
}
+
Label
{
id: pageDescription
anchors.top: pageTitle.bottom
- anchors.topMargin: UM.Theme.getSize("default_margin").height
+ anchors.topMargin: UM.Theme.getSize("default_margin").height * 3
width: parent.width
wrapMode: Text.WordWrap
text: catalog.i18nc("@label", "To make sure your prints will come out great, you can now adjust your buildplate. When you click 'Move to Next Position' the nozzle will move to the different positions that can be adjusted.")
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
}
+
Label
{
id: bedlevelingText
@@ -45,37 +55,40 @@ Cura.MachineAction
width: parent.width
wrapMode: Text.WordWrap
text: catalog.i18nc("@label", "For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build plate height is right when the paper is slightly gripped by the tip of the nozzle.")
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
}
Row
{
id: bedlevelingWrapper
anchors.top: bedlevelingText.bottom
- anchors.topMargin: UM.Theme.getSize("default_margin").height
+ anchors.topMargin: UM.Theme.getSize("default_margin").height * 3
anchors.horizontalCenter: parent.horizontalCenter
width: childrenRect.width
spacing: UM.Theme.getSize("default_margin").width
- Button
+ Cura.ActionButton
{
id: startBedLevelingButton
- text: catalog.i18nc("@action:button","Start Build Plate Leveling")
+ text: catalog.i18nc("@action:button", "Start Build Plate Leveling")
onClicked:
{
- startBedLevelingButton.visible = false;
- bedlevelingButton.visible = true;
- manager.startBedLeveling();
+ startBedLevelingButton.visible = false
+ bedlevelingButton.visible = true
+ manager.startBedLeveling()
}
}
- Button
+ Cura.ActionButton
{
id: bedlevelingButton
- text: catalog.i18nc("@action:button","Move to Next Position")
+ text: catalog.i18nc("@action:button", "Move to Next Position")
visible: false
onClicked:
{
- manager.moveToNextLevelPosition();
+ manager.moveToNextLevelPosition()
}
}
}
diff --git a/plugins/UltimakerMachineActions/UM2UpgradeSelection.py b/plugins/UltimakerMachineActions/UM2UpgradeSelection.py
index 6ff3f0b629..999cb1d35a 100644
--- a/plugins/UltimakerMachineActions/UM2UpgradeSelection.py
+++ b/plugins/UltimakerMachineActions/UM2UpgradeSelection.py
@@ -1,13 +1,15 @@
# Copyright (c) 2018 Ultimaker B.V.
# Uranium is released under the terms of the LGPLv3 or higher.
-from UM.Settings.ContainerRegistry import ContainerRegistry
-from cura.MachineAction import MachineAction
-from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty
+from PyQt5.QtCore import pyqtSignal, pyqtProperty
+from UM.Settings.ContainerRegistry import ContainerRegistry
from UM.i18n import i18nCatalog
from UM.Application import Application
from UM.Util import parseBool
+
+from cura.MachineAction import MachineAction
+
catalog = i18nCatalog("cura")
diff --git a/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml b/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml
index 793f3f00a8..13525f6eb3 100644
--- a/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml
+++ b/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml
@@ -1,49 +1,46 @@
-// Copyright (c) 2016 Ultimaker B.V.
+// Copyright (c) 2019 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
-import QtQuick 2.2
-import QtQuick.Controls 1.1
-import QtQuick.Layouts 1.1
-import QtQuick.Window 2.1
+import QtQuick 2.10
+import QtQuick.Controls 2.3
-import UM 1.2 as UM
-import Cura 1.0 as Cura
+import UM 1.3 as UM
+import Cura 1.1 as Cura
Cura.MachineAction
{
- anchors.fill: parent;
+ UM.I18nCatalog { id: catalog; name: "cura"; }
+ anchors.fill: parent
Item
{
id: upgradeSelectionMachineAction
anchors.fill: parent
-
- Label
- {
- id: pageTitle
- width: parent.width
- text: catalog.i18nc("@title", "Select Printer Upgrades")
- wrapMode: Text.WordWrap
- font.pointSize: 18;
- }
+ anchors.topMargin: UM.Theme.getSize("default_margin").width * 5
+ anchors.leftMargin: UM.Theme.getSize("default_margin").width * 4
Label
{
id: pageDescription
- anchors.top: pageTitle.bottom
+ anchors.top: parent.top
anchors.topMargin: UM.Theme.getSize("default_margin").height
width: parent.width
wrapMode: Text.WordWrap
- text: catalog.i18nc("@label","Please select any upgrades made to this Ultimaker 2.");
+ text: catalog.i18nc("@label", "Please select any upgrades made to this Ultimaker 2.")
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
}
- CheckBox
+ Cura.CheckBox
{
id: olssonBlockCheckBox
anchors.top: pageDescription.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height
+ height: UM.Theme.getSize("setting_control").height
+
text: catalog.i18nc("@label", "Olsson Block")
checked: manager.hasVariants
onClicked: manager.hasVariants = checked
@@ -54,7 +51,5 @@ Cura.MachineAction
onHasVariantsChanged: olssonBlockCheckBox.checked = manager.hasVariants
}
}
-
- UM.I18nCatalog { id: catalog; name: "cura"; }
}
-}
\ No newline at end of file
+}
diff --git a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py
deleted file mode 100644
index f9ad4789e5..0000000000
--- a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py
+++ /dev/null
@@ -1,193 +0,0 @@
-from cura.MachineAction import MachineAction
-from cura.PrinterOutputDevice import PrinterOutputDevice
-from UM.Application import Application
-from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty
-
-from UM.Logger import Logger
-from UM.i18n import i18nCatalog
-catalog = i18nCatalog("cura")
-
-
-## Action to check up if the self-built UMO was done correctly.
-class UMOCheckupMachineAction(MachineAction):
- def __init__(self):
- super().__init__("UMOCheckup", catalog.i18nc("@action", "Checkup"))
- self._qml_url = "UMOCheckupMachineAction.qml"
- self._hotend_target_temp = 180
- self._bed_target_temp = 60
- self._output_device = None
- self._bed_test_completed = False
- self._hotend_test_completed = False
-
- # Endstop tests
- self._x_min_endstop_test_completed = False
- self._y_min_endstop_test_completed = False
- self._z_min_endstop_test_completed = False
-
- self._check_started = False
-
- Application.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._onOutputDevicesChanged)
-
- onBedTestCompleted = pyqtSignal()
- onHotendTestCompleted = pyqtSignal()
-
- onXMinEndstopTestCompleted = pyqtSignal()
- onYMinEndstopTestCompleted = pyqtSignal()
- onZMinEndstopTestCompleted = pyqtSignal()
-
- bedTemperatureChanged = pyqtSignal()
- hotendTemperatureChanged = pyqtSignal()
-
- def _onOutputDevicesChanged(self):
- # Check if this action was started, but no output device was found the first time.
- # If so, re-try now that an output device has been added/removed.
- if self._output_device is None and self._check_started:
- self.startCheck()
-
- def _getPrinterOutputDevices(self):
- return [printer_output_device for printer_output_device in
- Application.getInstance().getOutputDeviceManager().getOutputDevices() if
- isinstance(printer_output_device, PrinterOutputDevice)]
-
- def _reset(self):
- if self._output_device:
- self._output_device.bedTemperatureChanged.disconnect(self.bedTemperatureChanged)
- self._output_device.hotendTemperaturesChanged.disconnect(self.hotendTemperatureChanged)
- self._output_device.bedTemperatureChanged.disconnect(self._onBedTemperatureChanged)
- self._output_device.hotendTemperaturesChanged.disconnect(self._onHotendTemperatureChanged)
- self._output_device.endstopStateChanged.disconnect(self._onEndstopStateChanged)
- try:
- self._output_device.stopPollEndstop()
- except AttributeError as e: # Connection is probably not a USB connection. Something went pretty wrong if this happens.
- Logger.log("e", "An exception occurred while stopping end stop polling: %s" % str(e))
-
- self._output_device = None
-
- self._check_started = False
- self.checkStartedChanged.emit()
-
- # Ensure everything is reset (and right signals are emitted again)
- self._bed_test_completed = False
- self.onBedTestCompleted.emit()
- self._hotend_test_completed = False
- self.onHotendTestCompleted.emit()
-
- self._x_min_endstop_test_completed = False
- self.onXMinEndstopTestCompleted.emit()
- self._y_min_endstop_test_completed = False
- self.onYMinEndstopTestCompleted.emit()
- self._z_min_endstop_test_completed = False
- self.onZMinEndstopTestCompleted.emit()
-
- self.heatedBedChanged.emit()
-
- @pyqtProperty(bool, notify = onBedTestCompleted)
- def bedTestCompleted(self):
- return self._bed_test_completed
-
- @pyqtProperty(bool, notify = onHotendTestCompleted)
- def hotendTestCompleted(self):
- return self._hotend_test_completed
-
- @pyqtProperty(bool, notify = onXMinEndstopTestCompleted)
- def xMinEndstopTestCompleted(self):
- return self._x_min_endstop_test_completed
-
- @pyqtProperty(bool, notify=onYMinEndstopTestCompleted)
- def yMinEndstopTestCompleted(self):
- return self._y_min_endstop_test_completed
-
- @pyqtProperty(bool, notify=onZMinEndstopTestCompleted)
- def zMinEndstopTestCompleted(self):
- return self._z_min_endstop_test_completed
-
- @pyqtProperty(float, notify = bedTemperatureChanged)
- def bedTemperature(self):
- if not self._output_device:
- return 0
- return self._output_device.bedTemperature
-
- @pyqtProperty(float, notify=hotendTemperatureChanged)
- def hotendTemperature(self):
- if not self._output_device:
- return 0
- return self._output_device.hotendTemperatures[0]
-
- def _onHotendTemperatureChanged(self):
- if not self._output_device:
- return
- if not self._hotend_test_completed:
- if self._output_device.hotendTemperatures[0] + 10 > self._hotend_target_temp and self._output_device.hotendTemperatures[0] - 10 < self._hotend_target_temp:
- self._hotend_test_completed = True
- self.onHotendTestCompleted.emit()
-
- def _onBedTemperatureChanged(self):
- if not self._output_device:
- return
- if not self._bed_test_completed:
- if self._output_device.bedTemperature + 5 > self._bed_target_temp and self._output_device.bedTemperature - 5 < self._bed_target_temp:
- self._bed_test_completed = True
- self.onBedTestCompleted.emit()
-
- def _onEndstopStateChanged(self, switch_type, state):
- if state:
- if switch_type == "x_min":
- self._x_min_endstop_test_completed = True
- self.onXMinEndstopTestCompleted.emit()
- elif switch_type == "y_min":
- self._y_min_endstop_test_completed = True
- self.onYMinEndstopTestCompleted.emit()
- elif switch_type == "z_min":
- self._z_min_endstop_test_completed = True
- self.onZMinEndstopTestCompleted.emit()
-
- checkStartedChanged = pyqtSignal()
-
- @pyqtProperty(bool, notify = checkStartedChanged)
- def checkStarted(self):
- return self._check_started
-
- @pyqtSlot()
- def startCheck(self):
- self._check_started = True
- self.checkStartedChanged.emit()
- output_devices = self._getPrinterOutputDevices()
- if output_devices:
- self._output_device = output_devices[0]
- try:
- self._output_device.sendCommand("M18") # Turn off all motors so the user can move the axes
- self._output_device.startPollEndstop()
- self._output_device.bedTemperatureChanged.connect(self.bedTemperatureChanged)
- self._output_device.hotendTemperaturesChanged.connect(self.hotendTemperatureChanged)
- self._output_device.bedTemperatureChanged.connect(self._onBedTemperatureChanged)
- self._output_device.hotendTemperaturesChanged.connect(self._onHotendTemperatureChanged)
- self._output_device.endstopStateChanged.connect(self._onEndstopStateChanged)
- except AttributeError as e: # Connection is probably not a USB connection. Something went pretty wrong if this happens.
- Logger.log("e", "An exception occurred while starting end stop polling: %s" % str(e))
-
- @pyqtSlot()
- def cooldownHotend(self):
- if self._output_device is not None:
- self._output_device.setTargetHotendTemperature(0, 0)
-
- @pyqtSlot()
- def cooldownBed(self):
- if self._output_device is not None:
- self._output_device.setTargetBedTemperature(0)
-
- @pyqtSlot()
- def heatupHotend(self):
- if self._output_device is not None:
- self._output_device.setTargetHotendTemperature(0, self._hotend_target_temp)
-
- @pyqtSlot()
- def heatupBed(self):
- if self._output_device is not None:
- self._output_device.setTargetBedTemperature(self._bed_target_temp)
-
- heatedBedChanged = pyqtSignal()
-
- @pyqtProperty(bool, notify = heatedBedChanged)
- def hasHeatedBed(self):
- global_container_stack = Application.getInstance().getGlobalContainerStack()
- return global_container_stack.getProperty("machine_heated_bed", "value")
\ No newline at end of file
diff --git a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml
deleted file mode 100644
index 2a01cfaa40..0000000000
--- a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml
+++ /dev/null
@@ -1,288 +0,0 @@
-import UM 1.2 as UM
-import Cura 1.0 as Cura
-
-import QtQuick 2.2
-import QtQuick.Controls 1.1
-import QtQuick.Layouts 1.1
-import QtQuick.Window 2.1
-
-Cura.MachineAction
-{
- anchors.fill: parent;
- Item
- {
- id: checkupMachineAction
- anchors.fill: parent;
- property int leftRow: (checkupMachineAction.width * 0.40) | 0
- property int rightRow: (checkupMachineAction.width * 0.60) | 0
- property bool heatupHotendStarted: false
- property bool heatupBedStarted: false
- property bool printerConnected: Cura.MachineManager.printerConnected
-
- UM.I18nCatalog { id: catalog; name: "cura"}
- Label
- {
- id: pageTitle
- width: parent.width
- text: catalog.i18nc("@title", "Check Printer")
- wrapMode: Text.WordWrap
- font.pointSize: 18;
- }
-
- Label
- {
- id: pageDescription
- anchors.top: pageTitle.bottom
- anchors.topMargin: UM.Theme.getSize("default_margin").height
- width: parent.width
- wrapMode: Text.WordWrap
- text: catalog.i18nc("@label", "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional");
- }
-
- Row
- {
- id: startStopButtons
- anchors.top: pageDescription.bottom
- anchors.topMargin: UM.Theme.getSize("default_margin").height
- anchors.horizontalCenter: parent.horizontalCenter
- width: childrenRect.width
- spacing: UM.Theme.getSize("default_margin").width
- Button
- {
- id: startCheckButton
- text: catalog.i18nc("@action:button","Start Printer Check");
- onClicked:
- {
- checkupMachineAction.heatupHotendStarted = false;
- checkupMachineAction.heatupBedStarted = false;
- manager.startCheck();
- startCheckButton.visible = false;
- }
- }
- }
-
- Item
- {
- id: checkupContent
- anchors.top: startStopButtons.bottom
- anchors.topMargin: UM.Theme.getSize("default_margin").height
- visible: manager.checkStarted
- width: parent.width
- height: 250
- //////////////////////////////////////////////////////////
- Label
- {
- id: connectionLabel
- width: checkupMachineAction.leftRow
- anchors.left: parent.left
- anchors.top: parent.top
- wrapMode: Text.WordWrap
- text: catalog.i18nc("@label","Connection: ")
- }
- Label
- {
- id: connectionStatus
- width: checkupMachineAction.rightRow
- anchors.left: connectionLabel.right
- anchors.top: parent.top
- wrapMode: Text.WordWrap
- text: checkupMachineAction.printerConnected ? catalog.i18nc("@info:status","Connected"): catalog.i18nc("@info:status","Not connected")
- }
- //////////////////////////////////////////////////////////
- Label
- {
- id: endstopXLabel
- width: checkupMachineAction.leftRow
- anchors.left: parent.left
- anchors.top: connectionLabel.bottom
- wrapMode: Text.WordWrap
- text: catalog.i18nc("@label","Min endstop X: ")
- visible: checkupMachineAction.printerConnected
- }
- Label
- {
- id: endstopXStatus
- width: checkupMachineAction.rightRow
- anchors.left: endstopXLabel.right
- anchors.top: connectionLabel.bottom
- wrapMode: Text.WordWrap
- text: manager.xMinEndstopTestCompleted ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
- visible: checkupMachineAction.printerConnected
- }
- //////////////////////////////////////////////////////////////
- Label
- {
- id: endstopYLabel
- width: checkupMachineAction.leftRow
- anchors.left: parent.left
- anchors.top: endstopXLabel.bottom
- wrapMode: Text.WordWrap
- text: catalog.i18nc("@label","Min endstop Y: ")
- visible: checkupMachineAction.printerConnected
- }
- Label
- {
- id: endstopYStatus
- width: checkupMachineAction.rightRow
- anchors.left: endstopYLabel.right
- anchors.top: endstopXLabel.bottom
- wrapMode: Text.WordWrap
- text: manager.yMinEndstopTestCompleted ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
- visible: checkupMachineAction.printerConnected
- }
- /////////////////////////////////////////////////////////////////////
- Label
- {
- id: endstopZLabel
- width: checkupMachineAction.leftRow
- anchors.left: parent.left
- anchors.top: endstopYLabel.bottom
- wrapMode: Text.WordWrap
- text: catalog.i18nc("@label","Min endstop Z: ")
- visible: checkupMachineAction.printerConnected
- }
- Label
- {
- id: endstopZStatus
- width: checkupMachineAction.rightRow
- anchors.left: endstopZLabel.right
- anchors.top: endstopYLabel.bottom
- wrapMode: Text.WordWrap
- text: manager.zMinEndstopTestCompleted ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked")
- visible: checkupMachineAction.printerConnected
- }
- ////////////////////////////////////////////////////////////
- Label
- {
- id: nozzleTempLabel
- width: checkupMachineAction.leftRow
- height: nozzleTempButton.height
- anchors.left: parent.left
- anchors.top: endstopZLabel.bottom
- wrapMode: Text.WordWrap
- text: catalog.i18nc("@label","Nozzle temperature check: ")
- visible: checkupMachineAction.printerConnected
- }
- Label
- {
- id: nozzleTempStatus
- width: (checkupMachineAction.rightRow * 0.4) | 0
- anchors.top: nozzleTempLabel.top
- anchors.left: nozzleTempLabel.right
- wrapMode: Text.WordWrap
- text: catalog.i18nc("@info:status","Not checked")
- visible: checkupMachineAction.printerConnected
- }
- Item
- {
- id: nozzleTempButton
- width: (checkupMachineAction.rightRow * 0.3) | 0
- height: childrenRect.height
- anchors.top: nozzleTempLabel.top
- anchors.left: bedTempStatus.right
- anchors.leftMargin: Math.round(UM.Theme.getSize("default_margin").width/2)
- visible: checkupMachineAction.printerConnected
- Button
- {
- text: checkupMachineAction.heatupHotendStarted ? catalog.i18nc("@action:button","Stop Heating") : catalog.i18nc("@action:button","Start Heating")
- onClicked:
- {
- if (checkupMachineAction.heatupHotendStarted)
- {
- manager.cooldownHotend()
- checkupMachineAction.heatupHotendStarted = false
- } else
- {
- manager.heatupHotend()
- checkupMachineAction.heatupHotendStarted = true
- }
- }
- }
- }
- Label
- {
- id: nozzleTemp
- anchors.top: nozzleTempLabel.top
- anchors.left: nozzleTempButton.right
- anchors.leftMargin: UM.Theme.getSize("default_margin").width
- width: (checkupMachineAction.rightRow * 0.2) | 0
- wrapMode: Text.WordWrap
- text: manager.hotendTemperature + "°C"
- font.bold: true
- visible: checkupMachineAction.printerConnected
- }
- /////////////////////////////////////////////////////////////////////////////
- Label
- {
- id: bedTempLabel
- width: checkupMachineAction.leftRow
- height: bedTempButton.height
- anchors.left: parent.left
- anchors.top: nozzleTempLabel.bottom
- wrapMode: Text.WordWrap
- text: catalog.i18nc("@label","Build plate temperature check:")
- visible: checkupMachineAction.printerConnected && manager.hasHeatedBed
- }
-
- Label
- {
- id: bedTempStatus
- width: (checkupMachineAction.rightRow * 0.4) | 0
- anchors.top: bedTempLabel.top
- anchors.left: bedTempLabel.right
- wrapMode: Text.WordWrap
- text: manager.bedTestCompleted ? catalog.i18nc("@info:status","Not checked"): catalog.i18nc("@info:status","Checked")
- visible: checkupMachineAction.printerConnected && manager.hasHeatedBed
- }
- Item
- {
- id: bedTempButton
- width: (checkupMachineAction.rightRow * 0.3) | 0
- height: childrenRect.height
- anchors.top: bedTempLabel.top
- anchors.left: bedTempStatus.right
- anchors.leftMargin: Math.round(UM.Theme.getSize("default_margin").width/2)
- visible: checkupMachineAction.printerConnected && manager.hasHeatedBed
- Button
- {
- text: checkupMachineAction.heatupBedStarted ?catalog.i18nc("@action:button","Stop Heating") : catalog.i18nc("@action:button","Start Heating")
- onClicked:
- {
- if (checkupMachineAction.heatupBedStarted)
- {
- manager.cooldownBed()
- checkupMachineAction.heatupBedStarted = false
- } else
- {
- manager.heatupBed()
- checkupMachineAction.heatupBedStarted = true
- }
- }
- }
- }
- Label
- {
- id: bedTemp
- width: (checkupMachineAction.rightRow * 0.2) | 0
- anchors.top: bedTempLabel.top
- anchors.left: bedTempButton.right
- anchors.leftMargin: UM.Theme.getSize("default_margin").width
- wrapMode: Text.WordWrap
- text: manager.bedTemperature + "°C"
- font.bold: true
- visible: checkupMachineAction.printerConnected && manager.hasHeatedBed
- }
- Label
- {
- id: resultText
- visible: false
- anchors.top: bedTemp.bottom
- anchors.topMargin: UM.Theme.getSize("default_margin").height
- anchors.left: parent.left
- width: parent.width
- wrapMode: Text.WordWrap
- text: catalog.i18nc("@label", "Everything is in order! You're done with your CheckUp.")
- }
- }
- }
-}
\ No newline at end of file
diff --git a/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml b/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml
index 2b973ca1bb..565ba2fa0e 100644
--- a/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml
+++ b/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml
@@ -1,43 +1,39 @@
-// Copyright (c) 2016 Ultimaker B.V.
+// Copyright (c) 2019 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
-import QtQuick 2.2
-import QtQuick.Controls 1.1
-import QtQuick.Layouts 1.1
-import QtQuick.Window 2.1
+import QtQuick 2.10
+import QtQuick.Controls 2.3
-import UM 1.2 as UM
-import Cura 1.0 as Cura
+import UM 1.3 as UM
+import Cura 1.1 as Cura
Cura.MachineAction
{
- anchors.fill: parent;
+ UM.I18nCatalog { id: catalog; name: "cura"; }
+ anchors.fill: parent
+
Item
{
id: upgradeSelectionMachineAction
anchors.fill: parent
-
- Label
- {
- id: pageTitle
- width: parent.width
- text: catalog.i18nc("@title", "Select Printer Upgrades")
- wrapMode: Text.WordWrap
- font.pointSize: 18;
- }
+ anchors.topMargin: UM.Theme.getSize("default_margin").width * 5
+ anchors.leftMargin: UM.Theme.getSize("default_margin").width * 4
Label
{
id: pageDescription
- anchors.top: pageTitle.bottom
+ anchors.top: parent.top
anchors.topMargin: UM.Theme.getSize("default_margin").height
width: parent.width
wrapMode: Text.WordWrap
- text: catalog.i18nc("@label","Please select any upgrades made to this Ultimaker Original");
+ text: catalog.i18nc("@label","Please select any upgrades made to this Ultimaker Original")
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
}
- CheckBox
+ Cura.CheckBox
{
anchors.top: pageDescription.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height
@@ -46,7 +42,5 @@ Cura.MachineAction
checked: manager.hasHeatedBed
onClicked: manager.setHeatedBed(checked)
}
-
- UM.I18nCatalog { id: catalog; name: "cura"; }
}
-}
\ No newline at end of file
+}
diff --git a/plugins/UserAgreement/UserAgreement.py b/plugins/UserAgreement/UserAgreement.py
deleted file mode 100644
index 4ea1ccf9bb..0000000000
--- a/plugins/UserAgreement/UserAgreement.py
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright (c) 2017 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-import os
-
-from PyQt5.QtCore import QObject, pyqtSlot
-
-from UM.Extension import Extension
-from UM.Logger import Logger
-
-
-class UserAgreement(QObject, Extension):
- def __init__(self, application):
- super(UserAgreement, self).__init__()
- self._application = application
- self._user_agreement_window = None
- self._user_agreement_context = None
- self._application.engineCreatedSignal.connect(self._onEngineCreated)
-
- self._application.getPreferences().addPreference("general/accepted_user_agreement", False)
-
- def _onEngineCreated(self):
- if not self._application.getPreferences().getValue("general/accepted_user_agreement"):
- self.showUserAgreement()
-
- def showUserAgreement(self):
- if not self._user_agreement_window:
- self.createUserAgreementWindow()
-
- self._user_agreement_window.show()
-
- @pyqtSlot(bool)
- def didAgree(self, user_choice):
- if user_choice:
- Logger.log("i", "User agreed to the user agreement")
- self._application.getPreferences().setValue("general/accepted_user_agreement", True)
- self._user_agreement_window.hide()
- else:
- Logger.log("i", "User did NOT agree to the user agreement")
- self._application.getPreferences().setValue("general/accepted_user_agreement", False)
- self._application.quit()
- self._application.setNeedToShowUserAgreement(False)
-
- def createUserAgreementWindow(self):
- path = os.path.join(self._application.getPluginRegistry().getPluginPath(self.getPluginId()), "UserAgreement.qml")
- self._user_agreement_window = self._application.createQmlComponent(path, {"manager": self})
diff --git a/plugins/UserAgreement/UserAgreement.qml b/plugins/UserAgreement/UserAgreement.qml
deleted file mode 100644
index 2e5893fc41..0000000000
--- a/plugins/UserAgreement/UserAgreement.qml
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2017 Ultimaker B.V.
-// Cura is released under the terms of the LGPLv3 or higher.
-
-import QtQuick 2.2
-import QtQuick.Controls 1.4
-
-import UM 1.3 as UM
-
-UM.Dialog
-{
- id: baseDialog
- minimumWidth: Math.round(UM.Theme.getSize("modal_window_minimum").width * 0.75)
- minimumHeight: Math.round(UM.Theme.getSize("modal_window_minimum").height * 0.5)
- width: minimumWidth
- height: minimumHeight
- title: catalog.i18nc("@title:window", "User Agreement")
-
- TextArea
- {
- anchors.top: parent.top
- width: parent.width
- anchors.bottom: buttonRow.top
- text: '
DISCLAIMER BY ULTIMAKER
-
PLEASE READ THIS DISCLAIMER CAREFULLY.
-
EXCEPT WHEN OTHERWISE STATED IN WRITING, ULTIMAKER PROVIDES ANY ULTIMAKER SOFTWARE OR THIRD PARTY SOFTWARE “AS IS” WITHOUT WARRANTY OF ANY KIND. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF ULTIMAKER SOFTWARE IS WITH YOU.
-
UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, IN NO EVENT WILL ULTIMAKER BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE ANY ULTIMAKER SOFTWARE OR THIRD PARTY SOFTWARE.
- '
- readOnly: true;
- textFormat: TextEdit.RichText
- }
-
- Item
- {
- id: buttonRow
- anchors.bottom: parent.bottom
- width: parent.width
- anchors.bottomMargin: UM.Theme.getSize("default_margin").height
-
- UM.I18nCatalog { id: catalog; name: "cura" }
-
- Button
- {
- anchors.right: parent.right
- text: catalog.i18nc("@action:button", "I understand and agree")
- onClicked: {
- baseDialog.accepted()
- }
- }
-
- Button
- {
- anchors.left: parent.left
- text: catalog.i18nc("@action:button", "I don't agree")
- onClicked: {
- baseDialog.rejected()
- }
- }
- }
-
- onAccepted: manager.didAgree(true)
- onRejected: manager.didAgree(false)
- onClosing: manager.didAgree(false)
-}
diff --git a/plugins/UserAgreement/__init__.py b/plugins/UserAgreement/__init__.py
deleted file mode 100644
index 3cf81c64f4..0000000000
--- a/plugins/UserAgreement/__init__.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2017 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-from . import UserAgreement
-
-def getMetaData():
- return {}
-
-def register(app):
- return {"extension": UserAgreement.UserAgreement(app)}
diff --git a/plugins/UserAgreement/plugin.json b/plugins/UserAgreement/plugin.json
deleted file mode 100644
index b172d1f9a2..0000000000
--- a/plugins/UserAgreement/plugin.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "name": "UserAgreement",
- "author": "Ultimaker B.V.",
- "version": "1.0.1",
- "description": "Ask the user once if he/she agrees with our license.",
- "api": "6.0",
- "i18n-catalog": "cura"
-}
diff --git a/plugins/VersionUpgrade/VersionUpgrade35to40/VersionUpgrade35to40.py b/plugins/VersionUpgrade/VersionUpgrade35to40/VersionUpgrade35to40.py
index 900c0a7396..71ce2e4fd0 100644
--- a/plugins/VersionUpgrade/VersionUpgrade35to40/VersionUpgrade35to40.py
+++ b/plugins/VersionUpgrade/VersionUpgrade35to40/VersionUpgrade35to40.py
@@ -3,7 +3,7 @@ from typing import Tuple, List, Set, Dict
import io
from UM.VersionUpgrade import VersionUpgrade
-from cura.PrinterOutputDevice import ConnectionType
+from cura.PrinterOutput.PrinterOutputDevice import ConnectionType
deleted_settings = {"bridge_wall_max_overhang"} # type: Set[str]
renamed_configurations = {"connect_group_name": "group_name"} # type: Dict[str, str]
diff --git a/plugins/VersionUpgrade/VersionUpgrade40to41/VersionUpgrade40to41.py b/plugins/VersionUpgrade/VersionUpgrade40to41/VersionUpgrade40to41.py
index d80e0007aa..845e9cbb8c 100644
--- a/plugins/VersionUpgrade/VersionUpgrade40to41/VersionUpgrade40to41.py
+++ b/plugins/VersionUpgrade/VersionUpgrade40to41/VersionUpgrade40to41.py
@@ -1,8 +1,9 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import configparser
import io
+import uuid
from typing import Dict, List, Tuple
from UM.VersionUpgrade import VersionUpgrade
@@ -18,6 +19,7 @@ _renamed_quality_profiles = {
"gmax15plus_pla_very_thick": "gmax15plus_global_very_thick"
} # type: Dict[str, str]
+
## Upgrades configurations from the state they were in at version 4.0 to the
# state they should be in at version 4.1.
class VersionUpgrade40to41(VersionUpgrade):
@@ -49,6 +51,15 @@ class VersionUpgrade40to41(VersionUpgrade):
parser["general"]["version"] = "4"
parser["metadata"]["setting_version"] = "7"
+ # Limit Maximum Deviation instead of Maximum Resolution. This should have approximately the same effect as before the algorithm change, only more consistent.
+ if "meshfix_maximum_resolution" in parser["values"]:
+ resolution = parser["values"]["meshfix_maximum_resolution"]
+ if resolution.startswith("="):
+ resolution = resolution[1:]
+ deviation = "=(" + resolution + ") / 2"
+ parser["values"]["meshfix_maximum_deviation"] = deviation
+ del parser["values"]["meshfix_maximum_resolution"]
+
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]
@@ -62,6 +73,11 @@ class VersionUpgrade40to41(VersionUpgrade):
parser["general"]["version"] = "6"
if "metadata" not in parser:
parser["metadata"] = {}
+
+ # Remove changelog plugin
+ if "latest_version_changelog_shown" in parser["general"]:
+ del parser["general"]["latest_version_changelog_shown"]
+
parser["metadata"]["setting_version"] = "7"
result = io.StringIO()
@@ -81,6 +97,13 @@ class VersionUpgrade40to41(VersionUpgrade):
if parser["containers"]["4"] in _renamed_quality_profiles:
parser["containers"]["4"] = _renamed_quality_profiles[parser["containers"]["4"]]
+ # Assign a GlobalStack to a unique group_id. If the GlobalStack has a UM network connection, use the UM network
+ # key as the group_id.
+ if "um_network_key" in parser["metadata"]:
+ parser["metadata"]["group_id"] = parser["metadata"]["um_network_key"]
+ elif "group_id" not in parser["metadata"]:
+ parser["metadata"]["group_id"] = str(uuid.uuid4())
+
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]
diff --git a/plugins/XRayView/XRayView.py b/plugins/XRayView/XRayView.py
index 86533fe51c..88a5a441b8 100644
--- a/plugins/XRayView/XRayView.py
+++ b/plugins/XRayView/XRayView.py
@@ -10,21 +10,21 @@ from UM.Math.Color import Color
from UM.PluginRegistry import PluginRegistry
from UM.Platform import Platform
from UM.Event import Event
-from UM.View.View import View
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
from UM.View.RenderBatch import RenderBatch
from UM.View.GL.OpenGL import OpenGL
from cura.CuraApplication import CuraApplication
+from cura.CuraView import CuraView
from cura.Scene.ConvexHullNode import ConvexHullNode
from . import XRayPass
## View used to display a see-through version of objects with errors highlighted.
-class XRayView(View):
+class XRayView(CuraView):
def __init__(self):
- super().__init__()
+ super().__init__(parent = None, use_empty_menu_placeholder = True)
self._xray_shader = None
self._xray_pass = None
diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py
index b6dff65403..f057585cb5 100644
--- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py
+++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py
@@ -144,7 +144,7 @@ class XmlMaterialProfile(InstanceContainer):
# setting_version is derived from the "version" tag in the schema, so don't serialize it into a file
if ignored_metadata_keys is None:
ignored_metadata_keys = set()
- ignored_metadata_keys |= {"setting_version", "definition", "status", "variant", "type", "base_file", "approximate_diameter", "id", "container_type", "name"}
+ ignored_metadata_keys |= {"setting_version", "definition", "status", "variant", "type", "base_file", "approximate_diameter", "id", "container_type", "name", "compatible"}
# remove the keys that we want to ignore in the metadata
for key in ignored_metadata_keys:
if key in metadata:
@@ -945,11 +945,9 @@ class XmlMaterialProfile(InstanceContainer):
for machine in data.iterfind("./um:settings/um:machine", cls.__namespaces):
machine_compatibility = common_compatibility
- for entry in machine.iterfind("./um:setting", cls.__namespaces):
- key = entry.get("key")
- if key == "hardware compatible":
- if entry.text is not None:
- machine_compatibility = cls._parseCompatibleValue(entry.text)
+ for entry in machine.iterfind("./um:setting[@key='hardware compatible']", cls.__namespaces):
+ if entry.text is not None:
+ machine_compatibility = cls._parseCompatibleValue(entry.text)
for identifier in machine.iterfind("./um:machine_identifier", cls.__namespaces):
machine_id_list = product_id_map.get(identifier.get("product"), [])
@@ -1020,11 +1018,9 @@ class XmlMaterialProfile(InstanceContainer):
continue
hotend_compatibility = machine_compatibility
- for entry in hotend.iterfind("./um:setting", cls.__namespaces):
- key = entry.get("key")
- if key == "hardware compatible":
- if entry.text is not None:
- hotend_compatibility = cls._parseCompatibleValue(entry.text)
+ for entry in hotend.iterfind("./um:setting[@key='hardware compatible']", cls.__namespaces):
+ if entry.text is not None:
+ hotend_compatibility = cls._parseCompatibleValue(entry.text)
new_hotend_specific_material_id = container_id + "_" + machine_id + "_" + hotend_name.replace(" ", "_")
@@ -1183,6 +1179,7 @@ class XmlMaterialProfile(InstanceContainer):
"adhesion tendency": "material_adhesion_tendency",
"surface energy": "material_surface_energy",
"shrinkage percentage": "material_shrinkage_percentage",
+ "build volume temperature": "build_volume_temperature",
}
__unmapped_settings = [
"hardware compatible",
diff --git a/resources/bundled_packages/cura.json b/resources/bundled_packages/cura.json
index 9e126ee028..259ac05201 100644
--- a/resources/bundled_packages/cura.json
+++ b/resources/bundled_packages/cura.json
@@ -6,7 +6,7 @@
"display_name": "3MF Reader",
"description": "Provides support for reading 3MF files.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -23,7 +23,7 @@
"display_name": "3MF Writer",
"description": "Provides support for writing 3MF files.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -33,18 +33,18 @@
}
}
},
- "ChangeLogPlugin": {
+ "AMFReader": {
"package_info": {
- "package_id": "ChangeLogPlugin",
+ "package_id": "AMFReader",
"package_type": "plugin",
- "display_name": "Change Log",
- "description": "Shows changes since latest checked version.",
- "package_version": "1.0.1",
- "sdk_version": "6.0",
+ "display_name": "AMF Reader",
+ "description": "Provides support for reading AMF files.",
+ "package_version": "1.0.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
- "author_id": "UltimakerPackages",
- "display_name": "Ultimaker B.V.",
+ "author_id": "fieldOfView",
+ "display_name": "fieldOfView",
"email": "plugins@ultimaker.com",
"website": "https://ultimaker.com"
}
@@ -57,7 +57,7 @@
"display_name": "Cura Backups",
"description": "Backup and restore your configuration.",
"package_version": "1.2.0",
- "sdk_version": 6,
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -74,7 +74,7 @@
"display_name": "CuraEngine Backend",
"description": "Provides the link to the CuraEngine slicing backend.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -91,7 +91,7 @@
"display_name": "Cura Profile Reader",
"description": "Provides support for importing Cura profiles.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -108,7 +108,7 @@
"display_name": "Cura Profile Writer",
"description": "Provides support for exporting Cura profiles.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -125,7 +125,7 @@
"display_name": "Firmware Update Checker",
"description": "Checks for firmware updates.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -142,7 +142,7 @@
"display_name": "Firmware Updater",
"description": "Provides a machine actions for updating firmware.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -159,7 +159,7 @@
"display_name": "Compressed G-code Reader",
"description": "Reads g-code from a compressed archive.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -176,7 +176,7 @@
"display_name": "Compressed G-code Writer",
"description": "Writes g-code to a compressed archive.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -193,7 +193,7 @@
"display_name": "G-Code Profile Reader",
"description": "Provides support for importing profiles from g-code files.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -210,7 +210,7 @@
"display_name": "G-Code Reader",
"description": "Allows loading and displaying G-code files.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "VictorLarchenko",
@@ -227,7 +227,7 @@
"display_name": "G-Code Writer",
"description": "Writes g-code to a file.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -244,7 +244,7 @@
"display_name": "Image Reader",
"description": "Enables ability to generate printable geometry from 2D image files.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -261,7 +261,7 @@
"display_name": "Legacy Cura Profile Reader",
"description": "Provides support for importing profiles from legacy Cura versions.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -278,7 +278,7 @@
"display_name": "Machine Settings Action",
"description": "Provides a way to change machine settings (such as build volume, nozzle size, etc.).",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "fieldOfView",
@@ -295,7 +295,7 @@
"display_name": "Model Checker",
"description": "Checks models and print configuration for possible printing issues and give suggestions.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -312,7 +312,7 @@
"display_name": "Monitor Stage",
"description": "Provides a monitor stage in Cura.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -329,7 +329,7 @@
"display_name": "Per-Object Settings Tool",
"description": "Provides the per-model settings.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -346,7 +346,7 @@
"display_name": "Post Processing",
"description": "Extension that allows for user created scripts for post processing.",
"package_version": "2.2.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -363,7 +363,7 @@
"display_name": "Prepare Stage",
"description": "Provides a prepare stage in Cura.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -380,7 +380,7 @@
"display_name": "Preview Stage",
"description": "Provides a preview stage in Cura.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -397,7 +397,7 @@
"display_name": "Removable Drive Output Device",
"description": "Provides removable drive hotplugging and writing support.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -414,7 +414,7 @@
"display_name": "Simulation View",
"description": "Provides the Simulation view.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -431,7 +431,7 @@
"display_name": "Slice Info",
"description": "Submits anonymous slice info. Can be disabled through preferences.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -448,7 +448,7 @@
"display_name": "Solid View",
"description": "Provides a normal solid mesh view.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -465,7 +465,7 @@
"display_name": "Support Eraser Tool",
"description": "Creates an eraser mesh to block the printing of support in certain places.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -482,7 +482,24 @@
"display_name": "Toolbox",
"description": "Find, manage and install new Cura packages.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
+ "website": "https://ultimaker.com",
+ "author": {
+ "author_id": "UltimakerPackages",
+ "display_name": "Ultimaker B.V.",
+ "email": "plugins@ultimaker.com",
+ "website": "https://ultimaker.com"
+ }
+ }
+ },
+ "UFPReader": {
+ "package_info": {
+ "package_id": "UFPReader",
+ "package_type": "plugin",
+ "display_name": "UFP Reader",
+ "description": "Provides support for reading Ultimaker Format Packages.",
+ "package_version": "1.0.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -499,7 +516,7 @@
"display_name": "UFP Writer",
"description": "Provides support for writing Ultimaker Format Packages.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -516,7 +533,7 @@
"display_name": "Ultimaker Machine Actions",
"description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.).",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -533,7 +550,7 @@
"display_name": "UM3 Network Printing",
"description": "Manages network connections to Ultimaker 3 printers.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -550,24 +567,7 @@
"display_name": "USB Printing",
"description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.",
"package_version": "1.0.2",
- "sdk_version": "6.0",
- "website": "https://ultimaker.com",
- "author": {
- "author_id": "UltimakerPackages",
- "display_name": "Ultimaker B.V.",
- "email": "plugins@ultimaker.com",
- "website": "https://ultimaker.com"
- }
- }
- },
- "UserAgreement": {
- "package_info": {
- "package_id": "UserAgreement",
- "package_type": "plugin",
- "display_name": "User Agreement",
- "description": "Ask the user once if he/she agrees with our license.",
- "package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -584,7 +584,7 @@
"display_name": "Version Upgrade 2.1 to 2.2",
"description": "Upgrades configurations from Cura 2.1 to Cura 2.2.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -601,7 +601,7 @@
"display_name": "Version Upgrade 2.2 to 2.4",
"description": "Upgrades configurations from Cura 2.2 to Cura 2.4.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -618,7 +618,7 @@
"display_name": "Version Upgrade 2.5 to 2.6",
"description": "Upgrades configurations from Cura 2.5 to Cura 2.6.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -635,7 +635,7 @@
"display_name": "Version Upgrade 2.6 to 2.7",
"description": "Upgrades configurations from Cura 2.6 to Cura 2.7.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -652,7 +652,7 @@
"display_name": "Version Upgrade 2.7 to 3.0",
"description": "Upgrades configurations from Cura 2.7 to Cura 3.0.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -669,7 +669,7 @@
"display_name": "Version Upgrade 3.0 to 3.1",
"description": "Upgrades configurations from Cura 3.0 to Cura 3.1.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -686,7 +686,7 @@
"display_name": "Version Upgrade 3.2 to 3.3",
"description": "Upgrades configurations from Cura 3.2 to Cura 3.3.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -703,7 +703,7 @@
"display_name": "Version Upgrade 3.3 to 3.4",
"description": "Upgrades configurations from Cura 3.3 to Cura 3.4.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -720,7 +720,7 @@
"display_name": "Version Upgrade 3.4 to 3.5",
"description": "Upgrades configurations from Cura 3.4 to Cura 3.5.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -737,7 +737,7 @@
"display_name": "Version Upgrade 3.5 to 4.0",
"description": "Upgrades configurations from Cura 3.5 to Cura 4.0.",
"package_version": "1.0.0",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -754,7 +754,7 @@
"display_name": "Version Upgrade 4.0 to 4.1",
"description": "Upgrades configurations from Cura 4.0 to Cura 4.1.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -771,7 +771,7 @@
"display_name": "X3D Reader",
"description": "Provides support for reading X3D files.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "SevaAlekseyev",
@@ -788,7 +788,7 @@
"display_name": "XML Material Profiles",
"description": "Provides capabilities to read and write XML-based material profiles.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -805,7 +805,7 @@
"display_name": "X-Ray View",
"description": "Provides the X-Ray view.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@@ -822,7 +822,7 @@
"display_name": "Generic ABS",
"description": "The generic ABS profile which other profiles can be based upon.",
"package_version": "1.2.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -840,7 +840,7 @@
"display_name": "Generic BAM",
"description": "The generic BAM profile which other profiles can be based upon.",
"package_version": "1.2.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -858,7 +858,7 @@
"display_name": "Generic CFF CPE",
"description": "The generic CFF CPE profile which other profiles can be based upon.",
"package_version": "1.1.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -876,7 +876,7 @@
"display_name": "Generic CFF PA",
"description": "The generic CFF PA profile which other profiles can be based upon.",
"package_version": "1.1.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -894,7 +894,7 @@
"display_name": "Generic CPE",
"description": "The generic CPE profile which other profiles can be based upon.",
"package_version": "1.2.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -912,7 +912,7 @@
"display_name": "Generic CPE+",
"description": "The generic CPE+ profile which other profiles can be based upon.",
"package_version": "1.2.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -930,7 +930,7 @@
"display_name": "Generic GFF CPE",
"description": "The generic GFF CPE profile which other profiles can be based upon.",
"package_version": "1.1.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -948,7 +948,7 @@
"display_name": "Generic GFF PA",
"description": "The generic GFF PA profile which other profiles can be based upon.",
"package_version": "1.1.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -966,7 +966,7 @@
"display_name": "Generic HIPS",
"description": "The generic HIPS profile which other profiles can be based upon.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -984,7 +984,7 @@
"display_name": "Generic Nylon",
"description": "The generic Nylon profile which other profiles can be based upon.",
"package_version": "1.2.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -1002,7 +1002,7 @@
"display_name": "Generic PC",
"description": "The generic PC profile which other profiles can be based upon.",
"package_version": "1.2.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -1020,7 +1020,7 @@
"display_name": "Generic PETG",
"description": "The generic PETG profile which other profiles can be based upon.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -1038,7 +1038,7 @@
"display_name": "Generic PLA",
"description": "The generic PLA profile which other profiles can be based upon.",
"package_version": "1.2.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -1056,7 +1056,7 @@
"display_name": "Generic PP",
"description": "The generic PP profile which other profiles can be based upon.",
"package_version": "1.2.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -1074,7 +1074,7 @@
"display_name": "Generic PVA",
"description": "The generic PVA profile which other profiles can be based upon.",
"package_version": "1.2.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -1092,7 +1092,7 @@
"display_name": "Generic Tough PLA",
"description": "The generic Tough PLA profile which other profiles can be based upon.",
"package_version": "1.0.2",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -1110,7 +1110,7 @@
"display_name": "Generic TPU",
"description": "The generic TPU profile which other profiles can be based upon.",
"package_version": "1.2.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@@ -1128,7 +1128,7 @@
"display_name": "Dagoma Chromatik PLA",
"description": "Filament testé et approuvé pour les imprimantes 3D Dagoma. Chromatik est l'idéal pour débuter et suivre les tutoriels premiers pas. Il vous offre qualité et résistance pour chacune de vos impressions.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://dagoma.fr/boutique/filaments.html",
"author": {
"author_id": "Dagoma",
@@ -1145,7 +1145,7 @@
"display_name": "FABtotum ABS",
"description": "This material is easy to be extruded but it is not the simplest to use. It is one of the most used in 3D printing to get very well finished objects. It is not sustainable and its smoke can be dangerous if inhaled. The reason to prefer this filament to PLA is mainly because of its precision and mechanical specs. ABS (for plastic) stands for Acrylonitrile Butadiene Styrene and it is a thermoplastic which is widely used in everyday objects. It can be printed with any FFF 3D printer which can get to high temperatures as it must be extruded in a range between 220° and 245°, so it’s compatible with all versions of the FABtotum Personal fabricator.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=40",
"author": {
"author_id": "FABtotum",
@@ -1162,7 +1162,7 @@
"display_name": "FABtotum Nylon",
"description": "When 3D printing started this material was not listed among the extrudable filaments. It is flexible as well as resistant to tractions. It is well known for its uses in textile but also in industries which require a strong and flexible material. There are different kinds of Nylon: 3D printing mostly uses Nylon 6 and Nylon 6.6, which are the most common. It requires higher temperatures to be printed, so a 3D printer must be able to reach them (around 240°C): the FABtotum, of course, can.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=53",
"author": {
"author_id": "FABtotum",
@@ -1179,7 +1179,7 @@
"display_name": "FABtotum PLA",
"description": "It is the most common filament used for 3D printing. It is studied to be bio-degradable as it comes from corn starch’s sugar mainly. It is completely made of renewable sources and has no footprint on polluting. PLA stands for PolyLactic Acid and it is a thermoplastic that today is still considered the easiest material to be 3D printed. It can be extruded at lower temperatures: the standard range of FABtotum’s one is between 185° and 195°.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=39",
"author": {
"author_id": "FABtotum",
@@ -1196,7 +1196,7 @@
"display_name": "FABtotum TPU Shore 98A",
"description": "",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=66",
"author": {
"author_id": "FABtotum",
@@ -1213,7 +1213,7 @@
"display_name": "Fiberlogy HD PLA",
"description": "With our HD PLA you have many more options. You can use this material in two ways. Choose the one you like best. You can use it as a normal PLA and get prints characterized by a very good adhesion between the layers and high precision. You can also make your prints acquire similar properties to that of ABS – better impact resistance and high temperature resistance. All you need is an oven. Yes, an oven! By annealing our HD PLA in an oven, in accordance with the manual, you will avoid all the inconveniences of printing with ABS, such as unpleasant odour or hazardous fumes.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "http://fiberlogy.com/en/fiberlogy-filaments/filament-hd-pla/",
"author": {
"author_id": "Fiberlogy",
@@ -1230,7 +1230,7 @@
"display_name": "Filo3D PLA",
"description": "Fast, safe and reliable printing. PLA is ideal for the fast and reliable printing of parts and prototypes with a great surface quality.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://dagoma.fr",
"author": {
"author_id": "Dagoma",
@@ -1247,7 +1247,7 @@
"display_name": "IMADE3D JellyBOX PETG",
"description": "",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "http://shop.imade3d.com/filament.html",
"author": {
"author_id": "IMADE3D",
@@ -1264,7 +1264,7 @@
"display_name": "IMADE3D JellyBOX PLA",
"description": "",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "http://shop.imade3d.com/filament.html",
"author": {
"author_id": "IMADE3D",
@@ -1281,7 +1281,7 @@
"display_name": "Octofiber PLA",
"description": "PLA material from Octofiber.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://nl.octofiber.com/3d-printing-filament/pla.html",
"author": {
"author_id": "Octofiber",
@@ -1298,7 +1298,7 @@
"display_name": "PolyFlex™ PLA",
"description": "PolyFlex™ is a highly flexible yet easy to print 3D printing material. Featuring good elasticity and a large strain-to- failure, PolyFlex™ opens up a completely new realm of applications.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "http://www.polymaker.com/shop/polyflex/",
"author": {
"author_id": "Polymaker",
@@ -1315,7 +1315,7 @@
"display_name": "PolyMax™ PLA",
"description": "PolyMax™ PLA is a 3D printing material with excellent mechanical properties and printing quality. PolyMax™ PLA has an impact resistance of up to nine times that of regular PLA, and better overall mechanical properties than ABS.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "http://www.polymaker.com/shop/polymax/",
"author": {
"author_id": "Polymaker",
@@ -1332,7 +1332,7 @@
"display_name": "PolyPlus™ PLA True Colour",
"description": "PolyPlus™ PLA is a premium PLA designed for all desktop FDM/FFF 3D printers. It is produced with our patented Jam-Free™ technology that ensures consistent extrusion and prevents jams.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "http://www.polymaker.com/shop/polyplus-true-colour/",
"author": {
"author_id": "Polymaker",
@@ -1349,7 +1349,7 @@
"display_name": "PolyWood™ PLA",
"description": "PolyWood™ is a wood mimic printing material that contains no actual wood ensuring a clean Jam-Free™ printing experience.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "http://www.polymaker.com/shop/polywood/",
"author": {
"author_id": "Polymaker",
@@ -1366,7 +1366,7 @@
"display_name": "Ultimaker ABS",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com/products/materials/abs",
"author": {
"author_id": "UltimakerPackages",
@@ -1385,7 +1385,7 @@
"display_name": "Ultimaker Breakaway",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com/products/materials/breakaway",
"author": {
"author_id": "UltimakerPackages",
@@ -1404,7 +1404,7 @@
"display_name": "Ultimaker CPE",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com/products/materials/abs",
"author": {
"author_id": "UltimakerPackages",
@@ -1423,7 +1423,7 @@
"display_name": "Ultimaker CPE+",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com/products/materials/cpe",
"author": {
"author_id": "UltimakerPackages",
@@ -1442,7 +1442,7 @@
"display_name": "Ultimaker Nylon",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com/products/materials/abs",
"author": {
"author_id": "UltimakerPackages",
@@ -1461,7 +1461,7 @@
"display_name": "Ultimaker PC",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com/products/materials/pc",
"author": {
"author_id": "UltimakerPackages",
@@ -1480,7 +1480,7 @@
"display_name": "Ultimaker PLA",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com/products/materials/abs",
"author": {
"author_id": "UltimakerPackages",
@@ -1499,7 +1499,7 @@
"display_name": "Ultimaker PP",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com/products/materials/pp",
"author": {
"author_id": "UltimakerPackages",
@@ -1518,7 +1518,7 @@
"display_name": "Ultimaker PVA",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com/products/materials/abs",
"author": {
"author_id": "UltimakerPackages",
@@ -1537,7 +1537,7 @@
"display_name": "Ultimaker TPU 95A",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com/products/materials/tpu-95a",
"author": {
"author_id": "UltimakerPackages",
@@ -1556,7 +1556,7 @@
"display_name": "Ultimaker Tough PLA",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.0.3",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://ultimaker.com/products/materials/tough-pla",
"author": {
"author_id": "UltimakerPackages",
@@ -1575,7 +1575,7 @@
"display_name": "Vertex Delta ABS",
"description": "ABS material and quality files for the Delta Vertex K8800.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://vertex3dprinter.eu",
"author": {
"author_id": "Velleman",
@@ -1592,7 +1592,7 @@
"display_name": "Vertex Delta PET",
"description": "ABS material and quality files for the Delta Vertex K8800.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://vertex3dprinter.eu",
"author": {
"author_id": "Velleman",
@@ -1609,7 +1609,7 @@
"display_name": "Vertex Delta PLA",
"description": "ABS material and quality files for the Delta Vertex K8800.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://vertex3dprinter.eu",
"author": {
"author_id": "Velleman",
@@ -1626,7 +1626,7 @@
"display_name": "Vertex Delta TPU",
"description": "ABS material and quality files for the Delta Vertex K8800.",
"package_version": "1.0.1",
- "sdk_version": "6.0",
+ "sdk_version": "6.0.0",
"website": "https://vertex3dprinter.eu",
"author": {
"author_id": "Velleman",
@@ -1636,4 +1636,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/resources/definitions/Mark2_for_Ultimaker2.def.json b/resources/definitions/Mark2_for_Ultimaker2.def.json
new file mode 100644
index 0000000000..0379d3967c
--- /dev/null
+++ b/resources/definitions/Mark2_for_Ultimaker2.def.json
@@ -0,0 +1,235 @@
+{
+ "id": "Mark2_for_Ultimaker2",
+ "version": 2,
+ "name": "Mark2 for Ultimaker2",
+ "inherits": "ultimaker2_plus",
+ "metadata": {
+ "visible": true,
+ "author": "TheUltimakerCommunity",
+ "manufacturer": "Foehnsturm",
+ "category": "Other",
+ "has_variants": true,
+ "has_materials": true,
+ "has_machine_materials": false,
+ "has_machine_quality": false,
+ "has_variant_materials": false,
+ "weight": 2,
+ "file_formats": "text/x-gcode",
+ "icon": "icon_ultimaker.png",
+ "platform": "ultimaker2_platform.obj",
+ "platform_texture": "Mark2_for_Ultimaker2_backplate.png",
+ "machine_extruder_trains":
+ {
+ "0": "Mark2_extruder1",
+ "1": "Mark2_extruder2"
+ },
+ "supported_actions": ["MachineSettingsAction", "UpgradeFirmware"]
+ },
+ "overrides": {
+ "machine_name": { "default_value": "Mark2_for_Ultimaker2" },
+ "machine_width": {
+ "default_value": 223
+ },
+ "machine_depth": {
+ "default_value": 223
+ },
+ "machine_height": {
+ "default_value": 203
+ },
+ "gantry_height": {
+ "default_value": 52
+ },
+ "machine_center_is_zero": {
+ "default_value": false
+ },
+ "machine_nozzle_size": {
+ "default_value": 0.4
+ },
+ "machine_nozzle_heat_up_speed": {
+ "default_value": 3.5
+ },
+ "machine_nozzle_cool_down_speed": {
+ "default_value": 1.5
+ },
+ "machine_min_cool_heat_time_window":
+ {
+ "default_value": 15.0
+ },
+ "machine_show_variants": {
+ "default_value": true
+ },
+ "machine_nozzle_head_distance": {
+ "default_value": 5
+ },
+ "machine_nozzle_expansion_angle": {
+ "default_value": 45
+ },
+ "machine_heat_zone_length": {
+ "default_value": 20
+ },
+ "machine_heated_bed": {
+ "default_value": true
+ },
+ "speed_infill": {
+ "value": "speed_print"
+ },
+ "speed_wall_x": {
+ "value": "speed_wall"
+ },
+ "layer_height_0": {
+ "value": "round(machine_nozzle_size / 1.5, 2)"
+ },
+ "line_width": {
+ "value": "round(machine_nozzle_size * 0.875, 2)"
+ },
+ "speed_layer_0": {
+ "default_value": 20
+ },
+ "speed_support": {
+ "value": "speed_wall_0"
+ },
+ "machine_max_feedrate_x": {
+ "default_value": 250
+ },
+ "machine_max_feedrate_y": {
+ "default_value": 250
+ },
+ "machine_max_feedrate_z": {
+ "default_value": 40
+ },
+ "machine_max_feedrate_e": {
+ "default_value": 45
+ },
+ "machine_acceleration": {
+ "default_value": 3000
+ },
+ "retraction_amount": {
+ "default_value": 5.1
+ },
+ "retraction_speed": {
+ "default_value": 25
+ },
+ "switch_extruder_retraction_amount": {
+ "default_value": 0,
+ "value": "retraction_amount",
+ "enabled": false
+ },
+ "switch_extruder_retraction_speeds": {
+ "default_value": 25,
+ "value": "retraction_speed",
+ "enabled": false
+ },
+ "switch_extruder_retraction_speed": {
+ "default_value": 25,
+ "value": "retraction_retract_speed",
+ "enabled": false
+ },
+ "switch_extruder_prime_speed": {
+ "default_value": 25,
+ "value": "retraction_prime_speed",
+ "enabled": false
+ },
+ "machine_head_with_fans_polygon":
+ {
+ "default_value": [
+ [ -44, 14 ],
+ [ -44, -34 ],
+ [ 64, 14 ],
+ [ 64, -34 ]
+ ]
+ },
+ "machine_use_extruder_offset_to_offset_coords": {
+ "default_value": false
+ },
+ "machine_gcode_flavor": {
+ "default_value": "RepRap (Marlin/Sprinter)"
+ },
+ "machine_start_gcode" : {
+ "default_value": "",
+ "value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \"G21 ;metric values\\nG90 ;absolute positioning\\nM82 ;set extruder to absolute mode\\nM107 ;start with the fan off\\nM200 D0 T0 ;reset filament diameter\\nM200 D0 T1\\nG28 Z0; home all\\nG28 X0 Y0\\nG0 Z20 F2400 ;move the platform to 20mm\\nG92 E0\\nM190 S{material_bed_temperature_layer_0}\\nM109 T0 S{material_standby_temperature, 0}\\nM109 T1 S{material_print_temperature_layer_0, 1}\\nM104 T0 S{material_print_temperature_layer_0, 0}\\nT1 ; move to the 2th head\\nG0 Z20 F2400\\nG92 E-7.0 ;prime distance\\nG1 E0 F45 ;purge nozzle\\nG1 E-5.1 F1500 ; retract\\nG1 X90 Z0.01 F5000 ; move away from the prime poop\\nG1 X50 F9000\\nG0 Z20 F2400\\nT0 ; move to the first head\\nM104 T1 S{material_standby_temperature, 1}\\nG0 Z20 F2400\\nM104 T{initial_extruder_nr} S{material_print_temperature_layer_0, initial_extruder_nr}\\nG92 E-7.0\\nG1 E0 F45 ;purge nozzle\\nG1 X60 Z0.01 F5000 ; move away from the prime poop\\nG1 X20 F9000\\nM400 ;finish all moves\\nG92 E0\\n;end of startup sequence\\n\""
+ },
+ "machine_end_gcode" : {
+ "default_value": "",
+ "value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \"G90 ;absolute positioning\\nM104 S0 T0 ;extruder heater off\\nM104 S0 T1\\nM140 S0 ;turn off bed\\nT0 ; move to the first head\\nM107 ;fan off\""
+ },
+ "machine_extruder_count": {
+ "default_value": 2
+ },
+ "acceleration_enabled":
+ {
+ "default_value": true
+ },
+ "acceleration_print":
+ {
+ "default_value": 2000,
+ "value": "2000"
+ },
+ "acceleration_travel":
+ {
+ "default_value": 3000,
+ "value": "acceleration_print if magic_spiralize else 3000"
+ },
+ "acceleration_layer_0": { "value": "acceleration_topbottom" },
+ "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
+ "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
+ "acceleration_support_interface": { "value": "acceleration_topbottom" },
+ "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 500 / 4000)" },
+ "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 4000)" },
+ "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 500 / 1000)" },
+ "jerk_enabled":
+ {
+ "default_value": true
+ },
+ "jerk_print":
+ {
+ "default_value": 12
+ },
+ "jerk_travel":
+ {
+ "default_value": 20,
+ "value": "jerk_print if magic_spiralize else 20"
+ },
+ "jerk_layer_0": { "value": "jerk_topbottom" },
+ "jerk_prime_tower": { "value": "10 if jerk_print < 16 else math.ceil(jerk_print * 15 / 25)" },
+ "jerk_support": { "value": "10 if jerk_print < 16 else math.ceil(jerk_print * 15 / 25)" },
+ "jerk_support_interface": { "value": "jerk_topbottom" },
+ "jerk_topbottom": { "value": "10 if jerk_print < 25 else math.ceil(jerk_print * 10 / 25)" },
+ "jerk_wall": { "value": "10 if jerk_print < 16 else math.ceil(jerk_print * 15 / 25)" },
+ "jerk_wall_0": { "value": "10 if jerk_wall < 16 else math.ceil(jerk_wall * 6 / 10)" },
+ "jerk_travel_layer_0": { "value": "math.ceil(jerk_layer_0 * jerk_travel / jerk_print)" },
+ "extruder_prime_pos_abs": { "default_value": false },
+ "extruder_prime_pos_x": { "default_value": 0.0, "enabled": false },
+ "extruder_prime_pos_y": { "default_value": 0.0, "enabled": false },
+ "extruder_prime_pos_z": { "default_value": 0.0, "enabled": false },
+ "start_layers_at_same_position":
+ {
+ "default_value": false,
+ "enabled": false,
+ "value": false
+ },
+ "layer_start_x":
+ {
+ "default_value": 105.0,
+ "enabled": false
+ },
+ "layer_start_y":
+ {
+ "default_value": 27.0,
+ "enabled": false
+ },
+ "prime_tower_position_x": {
+ "default_value": 185
+ },
+ "prime_tower_position_y": {
+ "default_value": 160
+ },
+ "machine_disallowed_areas": {
+ "default_value": [
+ [[-115, 112.5], [ -10, 112.5], [ -10, 72.5], [-115, 72.5]],
+ [[ 115, 112.5], [ 115, 72.5], [ 15, 72.5], [ 15, 112.5]],
+ [[-115, -112.5], [-115, -87.5], [ 115, -87.5], [ 115, -112.5]],
+ [[-115, 72.5], [-97, 72.5], [-97, -112.5], [-115, -112.5]]
+ ]
+ }
+ }
+}
diff --git a/resources/definitions/alfawise_u30.def.json b/resources/definitions/alfawise_u30.def.json
index 65f6adcfe0..bba1c056af 100644
--- a/resources/definitions/alfawise_u30.def.json
+++ b/resources/definitions/alfawise_u30.def.json
@@ -14,80 +14,52 @@
}
},
"overrides": {
- "machine_name": {
- "default_value": "Alfawise U30"
- },
+ "machine_name": { "default_value": "Alfawise U30" },
"machine_start_gcode": {
"default_value": "; -- START GCODE --\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z1 F1000 ;move up slightly\nG1 Y60.0 Z0 E9.0 F1000.0;intro line\nG1 Y100.0 E21.5 F1000.0 ;continue line\nG92 E0 ;zero the extruded length again\nG1 F80\n;Put printing message on LCD screen\nM117 Printing...\n; -- end of START GCODE --"
},
"machine_end_gcode": {
"default_value": "; -- END GCODE --\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F80 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning\nM107 ;turn the fan off; -- end of END GCODE --"
},
- "machine_width": {
- "default_value": 220
- },
- "machine_height": {
- "default_value": 250
- },
- "machine_depth": {
- "default_value": 220
- },
- "machine_heated_bed": {
- "default_value": true
- },
- "machine_center_is_zero": {
- "default_value": false
- },
- "gantry_height": {
- "default_value": 10
- },
- "machine_gcode_flavor": {
- "default_value": "RepRap (Marlin/Sprinter)"
- },
- "material_diameter": {
- "default_value": 1.75
- },
- "material_print_temperature": {
- "default_value": 210
- },
- "material_bed_temperature": {
- "default_value": 50
- },
- "layer_height_0": {
- "default_value": 0.2
- },
- "wall_thickness": {
- "default_value": 1.2
- },
- "speed_print": {
- "default_value": 40
- },
- "speed_infill": {
- "default_value": 40
- },
- "speed_wall": {
- "default_value": 35
- },
- "speed_topbottom": {
- "default_value": 35
- },
- "speed_travel": {
- "default_value": 120
- },
- "speed_layer_0": {
- "default_value": 20
- },
- "support_enable": {
- "default_value": true
- },
- "retraction_enable": {
- "default_value": true
- },
- "retraction_amount": {
- "default_value": 5
- },
- "retraction_speed": {
- "default_value": 45
- }
+ "material_diameter": { "default_value": 1.75 },
+ "material_print_temperature": { "default_value": 210 },
+ "material_bed_temperature": { "default_value": 50 },
+ "layer_height_0": { "default_value": 0.2 },
+ "wall_thickness": { "default_value": 1.2 },
+ "speed_print": { "default_value": 40 },
+ "speed_infill": { "default_value": 50 },
+ "speed_wall": { "default_value": 35 },
+ "speed_topbottom": { "default_value": 35 },
+ "speed_travel": { "default_value": 120 },
+ "speed_layer_0": { "default_value": 20 },
+ "support_enable": { "default_value": true },
+ "retraction_enable": { "default_value": true },
+ "retraction_amount": { "default_value": 5 },
+ "retraction_speed": { "default_value": 45 },
+ "gantry_height": { "default_value": 25 },
+ "machine_width": { "default_value": 220 },
+ "machine_height": { "default_value": 250 },
+ "machine_depth": { "default_value": 220 },
+ "machine_center_is_zero": { "default_value": false },
+ "machine_heated_bed": { "default_value": true },
+ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
+ "machine_max_feedrate_x": { "default_value": 200 },
+ "machine_max_feedrate_y": { "default_value": 200 },
+ "machine_max_feedrate_z": { "default_value": 5 },
+ "machine_max_feedrate_e": { "default_value": 100 },
+ "machine_max_acceleration_x": { "default_value": 500 },
+ "machine_max_acceleration_y": { "default_value": 500 },
+ "machine_max_acceleration_z": { "default_value": 10 },
+ "machine_max_acceleration_e": { "default_value": 3000 },
+ "machine_acceleration": { "default_value": 300 },
+ "machine_max_jerk_xy": { "default_value": 20.0 },
+ "machine_max_jerk_z": { "default_value": 0.4 },
+ "machine_max_jerk_e": { "default_value": 5.0 },
+ "machine_steps_per_mm_x": { "default_value": 80 },
+ "machine_steps_per_mm_y": { "default_value": 80 },
+ "machine_steps_per_mm_z": { "default_value": 400 },
+ "machine_steps_per_mm_e": { "default_value": 93 },
+ "skirt_line_count": { "default_value": 1 },
+ "skirt_brim_minimal_length": { "default_value": 250 }
}
}
diff --git a/resources/definitions/alya3dp.def.json b/resources/definitions/alya3dp.def.json
index e918649097..7187048da0 100644
--- a/resources/definitions/alya3dp.def.json
+++ b/resources/definitions/alya3dp.def.json
@@ -1,12 +1,22 @@
{
- "name": "ALYA",
"version": 2,
+ "name": "ALYA",
"inherits": "fdmprinter",
- "metadata": {
+ "metadata":
+ {
"visible": true,
"author": "ALYA",
- "manufacturer": "ALYA",
+ "manufacturer": "Kati Hal ARGE",
+ "category": "Other",
"file_formats": "text/x-gcode",
+ "platform": "alya_platform.stl",
+ "platform_offset": [-60, -45, 75 ],
+ "exclude_materials": ["chromatik_pla", "dsm_arnitel2045_175", "dsm_novamid1070_175", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "generic_abs", "generic_abs_175", "generic_bam", "generic_cpe", "generic_cpe_175", "generic_cpe_plus", "generic_hips", "generic_hips_175", "generic_nylon", "generic_nylon_175", "generic_pc", "generic_pc_175", "generic_petg", "generic_petg_175", "generic_pp", "generic_pva", "generic_pva_175", "generic_tough_pla", "generic_tpu", "generic_tpu_175", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "ultimaker_abs_black", "ultimaker_abs_blue", "ultimaker_abs_green", "ultimaker_abs_grey", "ultimaker_abs_orange", "ultimaker_abs_pearl-gold", "ultimaker_abs_red", "ultimaker_abs_silver-metallic", "ultimaker_abs_white", "ultimaker_abs_yellow", "ultimaker_bam", "ultimaker_cpe_black", "ultimaker_cpe_blue", "ultimaker_cpe_dark-grey", "ultimaker_cpe_green", "ultimaker_cpe_light-grey", "ultimaker_cpe_plus_black", "ultimaker_cpe_plus_transparent", "ultimaker_cpe_plus_white", "ultimaker_cpe_red", "ultimaker_cpe_transparent", "ultimaker_cpe_white", "ultimaker_cpe_yellow", "ultimaker_nylon_black", "ultimaker_nylon_transparent", "ultimaker_pc_black", "ultimaker_pc_transparent", "ultimaker_pc_white", "ultimaker_pla_black", "ultimaker_pla_blue", "ultimaker_pla_green", "ultimaker_pla_magenta", "ultimaker_pla_orange", "ultimaker_pla_pearl-white", "ultimaker_pla_red", "ultimaker_pla_silver-metallic", "ultimaker_pla_transparent", "ultimaker_pla_white", "ultimaker_pla_yellow", "ultimaker_pp_transparent", "ultimaker_pva", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "ultimaker_tpu_black", "ultimaker_tpu_blue", "ultimaker_tpu_red", "ultimaker_tpu_white", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla","tizyx_pla","tizyx_abs","tizyx_pla_bois" ],
+ "preferred_material": "generic_pla",
+ "has_machine_quality": true,
+ "has_materials": true,
+ "has_variants": false,
+ "supports_usb_connection": false,
"machine_extruder_trains":
{
"0": "alya3dp_extruder_0"
@@ -14,37 +24,27 @@
},
"overrides": {
- "machine_width": {
- "default_value": 100
+ "machine_name": { "default_value": "ALYA 3DP" },
+ "machine_heated_bed": { "default_value": false },
+ "machine_width": { "default_value": 100 },
+ "machine_height": { "default_value": 133 },
+ "machine_depth": { "default_value": 100 },
+ "machine_center_is_zero": { "default_value": false },
+ "gantry_height": { "default_value": 55 },
+ "retraction_amount": { "default_value": 1.5 },
+ "support_enable": { "default_value": true},
+ "machine_head_with_fans_polygon": {
+ "default_value": [[75, 18],[18, 18],[18, 35],[75, 35]]
},
- "machine_height": {
- "default_value": 133
+ "adhesion_type": {"options": {"raft": "Raft" ,"none": "None", "brim": "Brim"}, "default_value": "raft"},
+ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
+ "machine_start_gcode":
+ {
+ "default_value": ";Sliced at: {day} {date} {time} \n ;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {fill_density} \n ;Print time: {print_time} \n ;Filament used: {filament_amount}m {filament_weight}g \n ;Filament cost: {filament_cost} \n G28 X0 Y0 ;move X Y to endstops \n G28 Z0 ;move Z to endstops \n ; M190 S{material_bed_temperature} ;bed temp \n M107 ; switch fan off \n M109 S{material_print_temperature} ;extruder temp set \n G1 F3000 \n G1 Z10 \n G92 E0 ;zero the extruded length \n G1 F200 E1 ;extrude 1mm of feed stock \n G92 E0 ;zero the extruded length again \n G4 P7000 ; wait 7000ms \n M117 Printing... ;Put printing message on LCD screen"
},
- "machine_depth": {
- "default_value": 100
- },
- "machine_center_is_zero": {
- "default_value": false
- },
- "machine_head_polygon": {
- "default_value": [
- [75, 18],
- [18, 18],
- [18, 35],
- [75, 35]
- ]
- },
- "gantry_height": {
- "default_value": 55
- },
- "machine_gcode_flavor": {
- "default_value": "RepRap"
- },
- "machine_start_gcode": {
- "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {fill_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to max endstops\nG1 Z115.0 F{speed_travel} ;move th e platform up 20mm\nG28 Z0 ;move Z to max endstop\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM301 H1 P26.38 I2.57 D67.78\n;Put printing message on LCD screen\nM117 Printing..."
- },
- "machine_end_gcode": {
- "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG28 Z0\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}"
+ "machine_end_gcode":
+ {
+ "default_value": ";End GCode\nM104 S0 ;extruder heater off \nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG28 Z0\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}"
}
}
}
\ No newline at end of file
diff --git a/resources/definitions/alyanx3dp.def.json b/resources/definitions/alyanx3dp.def.json
new file mode 100644
index 0000000000..085acc20c1
--- /dev/null
+++ b/resources/definitions/alyanx3dp.def.json
@@ -0,0 +1,50 @@
+{
+ "version": 2,
+ "name": "ALYA NX",
+ "inherits": "fdmprinter",
+ "metadata":
+ {
+ "visible": true,
+ "author": "ALYA",
+ "manufacturer": "Kati Hal ARGE",
+ "category": "Other",
+ "file_formats": "text/x-gcode",
+ "platform": "alya_nx_platform.stl",
+ "platform_offset": [-104, 0, 93 ],
+ "exclude_materials": ["chromatik_pla", "dsm_arnitel2045_175", "dsm_novamid1070_175", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "generic_abs", "generic_abs_175", "generic_bam", "generic_cpe", "generic_cpe_175", "generic_cpe_plus", "generic_hips", "generic_hips_175", "generic_nylon", "generic_nylon_175", "generic_pc", "generic_pc_175", "generic_petg", "generic_petg_175", "generic_pp", "generic_pva", "generic_pva_175", "generic_tough_pla", "generic_tpu", "generic_tpu_175", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "ultimaker_abs_black", "ultimaker_abs_blue", "ultimaker_abs_green", "ultimaker_abs_grey", "ultimaker_abs_orange", "ultimaker_abs_pearl-gold", "ultimaker_abs_red", "ultimaker_abs_silver-metallic", "ultimaker_abs_white", "ultimaker_abs_yellow", "ultimaker_bam", "ultimaker_cpe_black", "ultimaker_cpe_blue", "ultimaker_cpe_dark-grey", "ultimaker_cpe_green", "ultimaker_cpe_light-grey", "ultimaker_cpe_plus_black", "ultimaker_cpe_plus_transparent", "ultimaker_cpe_plus_white", "ultimaker_cpe_red", "ultimaker_cpe_transparent", "ultimaker_cpe_white", "ultimaker_cpe_yellow", "ultimaker_nylon_black", "ultimaker_nylon_transparent", "ultimaker_pc_black", "ultimaker_pc_transparent", "ultimaker_pc_white", "ultimaker_pla_black", "ultimaker_pla_blue", "ultimaker_pla_green", "ultimaker_pla_magenta", "ultimaker_pla_orange", "ultimaker_pla_pearl-white", "ultimaker_pla_red", "ultimaker_pla_silver-metallic", "ultimaker_pla_transparent", "ultimaker_pla_white", "ultimaker_pla_yellow", "ultimaker_pp_transparent", "ultimaker_pva", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "ultimaker_tpu_black", "ultimaker_tpu_blue", "ultimaker_tpu_red", "ultimaker_tpu_white", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla","tizyx_pla","tizyx_abs","tizyx_pla_bois" ],
+ "preferred_material": "generic_pla",
+ "has_machine_quality": true,
+ "has_materials": true,
+ "has_variants": false,
+ "supports_usb_connection": false,
+ "machine_extruder_trains":
+ {
+ "0": "alya3dp_extruder_0"
+ }
+ },
+
+ "overrides": {
+ "machine_name": { "default_value": "ALYA NX 3DP" },
+ "machine_heated_bed": { "default_value": false },
+ "machine_width": { "default_value": 180 },
+ "machine_height": { "default_value": 170 },
+ "machine_depth": { "default_value": 160 },
+ "machine_center_is_zero": { "default_value": false },
+ "gantry_height": { "default_value": 55 },
+ "retraction_amount": { "default_value": 1.5 },
+ "support_enable": { "default_value": true},
+ "machine_head_with_fans_polygon": {
+ "default_value": [[75, 18],[18, 18],[18, 35],[75, 35]]
+ },
+ "adhesion_type": {"options": {"raft": "Raft" ,"none": "None", "brim": "Brim"}, "default_value": "raft"},
+ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
+ "machine_start_gcode":
+ {
+ "default_value": ";Sliced at: {day} {date} {time} \n ;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {fill_density} \n ;Print time: {print_time} \n ;Filament used: {filament_amount}m {filament_weight}g \n ;Filament cost: {filament_cost} \n G28 X0 Y0 ;move X Y to endstops \n G28 Z0 ;move Z to endstops \n ; M190 S{material_bed_temperature} ;bed temp \n M107 ; switch fan off \n M109 S{material_print_temperature} ;extruder temp set \n G1 F3000 \n G1 Z10 \n G92 E0 ;zero the extruded length \n G1 F200 E1 ;extrude 1mm of feed stock \n G92 E0 ;zero the extruded length again \n G4 P7000 ; wait 7000ms \n M117 Printing... ;Put printing message on LCD screen"
+ },
+ "machine_end_gcode":
+ {
+ "default_value": ";End GCode\nM104 S0 ;extruder heater off \nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG28 Z0\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}"
+ }
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/anet_a6.def.json b/resources/definitions/anet_a6.def.json
new file mode 100644
index 0000000000..3643555e9e
--- /dev/null
+++ b/resources/definitions/anet_a6.def.json
@@ -0,0 +1,45 @@
+{
+ "version": 2,
+ "name": "Anet A6",
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "author": "Mark",
+ "manufacturer": "Anet",
+ "file_formats": "text/x-gcode",
+ "platform": "aneta6_platform.stl",
+ "platform_offset": [0, -3.4, 0],
+ "machine_extruder_trains":
+ {
+ "0": "anet_a6_extruder_0"
+ }
+ },
+
+ "overrides": {
+ "machine_name": { "default_value": "Anet A6" },
+ "machine_heated_bed": {
+ "default_value": true
+ },
+ "machine_width": {
+ "default_value": 220
+ },
+ "machine_height": {
+ "default_value": 250
+ },
+ "machine_depth": {
+ "default_value": 220
+ },
+ "machine_center_is_zero": {
+ "default_value": false
+ },
+ "gantry_height": {
+ "default_value": 55
+ },
+ "machine_start_gcode": {
+ "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM84 ;steppers off\nM0 S12 ;wait 12 seconds\nM17 ;turn steppers on\nG1 Z10.0 F300 ;move the platform down 10mm\nG92 E0 ;zero the extruded length\nG1 F200 E8 ;extrude 8mm of feed stock\nG92 E0 ;zero the extruded length again\nM0 S5 ;wait 5 seconds\nG1 F9000\nM117 Printing..."
+ },
+ "machine_end_gcode": {
+ "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+4 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y210 F9000 ;move out to get part off\nM84 ;steppers off\nG90 ;absolute positioning"
+ }
+ }
+}
diff --git a/resources/definitions/anycubic_4max.def.json b/resources/definitions/anycubic_4max.def.json
index c14ce1ac31..58cbaa3b22 100644
--- a/resources/definitions/anycubic_4max.def.json
+++ b/resources/definitions/anycubic_4max.def.json
@@ -83,6 +83,6 @@
"machine_gcode_flavor":{"default_value": "RepRap (Marlin/Sprinter)"},
"machine_start_gcode":{"default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM117 Printing...\nG5"},
- "machine_end_gcode":{"default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000"}
+ "machine_end_gcode":{"default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000"}
}
}
diff --git a/resources/definitions/anycubic_chiron.def.json b/resources/definitions/anycubic_chiron.def.json
new file mode 100644
index 0000000000..83c2056d76
--- /dev/null
+++ b/resources/definitions/anycubic_chiron.def.json
@@ -0,0 +1,80 @@
+{
+ "version": 2,
+ "name": "Anycubic Chiron",
+ "inherits": "fdmprinter",
+ "metadata":
+ {
+ "visible": true,
+ "author": "Patrick Glatt",
+ "manufacturer": "Anycubic",
+ "category": "Other",
+ "file_formats": "text/x-gcode",
+ "icon": "icon_ultimaker2",
+ "platform": "anycubic_chiron_platform.obj",
+ "platform_texture": "anycubic-chiron.png",
+ "has_materials": true,
+ "preferred_material": "generic_pla",
+ "has_machine_quality": true,
+ "quality_definition": "anycubic_chiron",
+ "preferred_quality_type": "normal",
+ "machine_extruder_trains":
+ {
+ "0": "anycubic_chiron_extruder_0"
+ },
+ "firmware_file": "MarlinChiron.hex"
+ },
+
+ "overrides":
+ {
+ "machine_name":
+ {
+ "default_value": "Anycubic Chiron"
+ },
+ "machine_heated_bed":
+ {
+ "default_value": true
+ },
+ "machine_width":
+ {
+ "default_value": 400
+ },
+ "machine_height":
+ {
+ "default_value": 450
+ },
+ "machine_depth":
+ {
+ "default_value": 400
+ },
+ "machine_center_is_zero":
+ {
+ "default_value": false
+ },
+ "gantry_height":
+ {
+ "default_value": 35
+ },
+ "machine_head_with_fans_polygon":
+ {
+ "default_value":
+ [
+ [-45, 50],
+ [-45, -45],
+ [45, 50],
+ [45, -45]
+ ]
+ },
+ "machine_gcode_flavor":
+ {
+ "default_value": "RepRap (Marlin/Sprinter)"
+ },
+ "machine_start_gcode":
+ {
+ "default_value": "M107 ;Start with the fan off\nG21 ;Set units to millimeters\nG91 ;Change to relative positioning mode for retract filament and nozzle lifting\nG1 F200 E-3 ;Retract 3mm filament for a clean start\nG92 E0 ;Zero the extruded length\nG1 F1000 Z5 ;Lift the nozzle 5mm before homing axes\nG90 ;Absolute positioning\nM82 ;Set extruder to absolute mode too\nG28 X0 Y0 ;First move X/Y to min endstops\nG28 Z0 ;Then move Z to min endstops\nG1 F1000 Z15 ;After homing lift the nozzle 15mm before start printing\n"
+ },
+ "machine_end_gcode":
+ {
+ "default_value": "G91 ;Change to relative positioning mode for filament retraction and nozzle lifting\nG1 F200 E-4;Retract the filament a bit before lifting the nozzle\nG1 F1000 Z5;Lift nozzle 5mm\nG90 ;Change to absolute positioning mode to prepare for part rermoval\nG1 X0 Y400 ;Move the print to max y pos for part rermoval\nM104 S0 ; Turn off hotend\nM106 S0 ; Turn off cooling fan\nM140 S0 ; Turn off bed\nM84 ; Disable motors\n"
+ }
+ }
+}
diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json
index 8a96d98023..6e81085fdd 100644
--- a/resources/definitions/anycubic_i3_mega.def.json
+++ b/resources/definitions/anycubic_i3_mega.def.json
@@ -58,7 +58,7 @@
},
"machine_end_gcode":
{
- "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000"
+ "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000"
}
}
}
diff --git a/resources/definitions/creality_ender3.def.json b/resources/definitions/creality_ender3.def.json
index 08d8e92b72..1af70fab63 100755
--- a/resources/definitions/creality_ender3.def.json
+++ b/resources/definitions/creality_ender3.def.json
@@ -51,16 +51,13 @@
"default_value": 500
},
"acceleration_travel": {
- "default_value": 500
+ "value": "acceleration_print"
},
"jerk_enabled": {
"default_value": true
},
"jerk_travel": {
- "default_value": 20
- },
- "layer_height": {
- "default_value": 0.10
+ "value": "jerk_print"
},
"layer_height_0": {
"default_value": 0.2
diff --git a/resources/definitions/deltacomb.def.json b/resources/definitions/deltacomb.def.json
index 8fec0f8950..026dfca9ed 100755
--- a/resources/definitions/deltacomb.def.json
+++ b/resources/definitions/deltacomb.def.json
@@ -1,61 +1,68 @@
{
- "version": 2,
- "name": "Deltacomb 3D",
- "inherits": "fdmprinter",
+ "version": 2,
+ "name": "Deltacomb 3D",
+ "inherits": "fdmprinter",
+
"metadata": {
- "author": "Gabriele Rossetti",
- "visible": true,
- "manufacturer": "Deltacomb 3D",
- "category": "Other",
- "file_formats": "text/x-gcode",
- "platform": "deltacomb.stl",
- "has_machine_quality": true,
- "machine_extruder_trains":
- {
- "0": "deltacomb_extruder_0"
- }
+ "author": "Gabriele Rossetti",
+ "visible": true,
+ "manufacturer": "Deltacomb 3D",
+ "category": "Other",
+ "file_formats": "text/x-gcode",
+ "icon": "icon_ultimaker2",
+ "platform": "deltacomb.stl",
+ "has_machine_quality": true,
+ "has_materials": true,
+ "has_machine_materials": false,
+ "has_variants": true,
+ "variants_name": "Head",
+ "preferred_variant_name": "E3D 0.40mm",
+ "preferred_material": "generic_pla",
+ "preferred_quality_type": "normal",
+ "machine_extruder_trains": { "0": "deltacomb_extruder_0", "1": "deltacomb_extruder_1" }
},
"overrides": {
- "machine_heated_bed": { "default_value": true },
- "machine_width": { "default_value": 190 },
- "machine_height": { "default_value": 250 },
- "machine_depth": { "default_value": 190 },
- "machine_center_is_zero": { "default_value": true },
- "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
- "machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home all axes (max endstops)\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."},
- "machine_end_gcode": { "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG28 ;Home all axes (max endstops)\nM84 ;steppers off\nG90 ;absolute positioning" },
- "machine_shape": { "default_value": "elliptic" },
- "retraction_hop_enabled": { "default_value": true },
- "retraction_amount" : { "default_value": 3.5 },
- "retraction_speed" : { "default_value": 50 },
- "material_final_print_temperature": { "value": "material_print_temperature - 5" },
- "material_initial_print_temperature": { "value": "material_print_temperature" },
- "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" },
- "material_diameter": { "default_value": 1.75 },
- "travel_avoid_distance": { "default_value": 1, "value": "1" },
- "speed_print" : { "default_value": 70 },
- "speed_travel": { "value": "150.0" },
- "speed_infill": { "value": "round(speed_print * 1.05, 0)" },
- "speed_topbottom": { "value": "round(speed_print * 0.95, 0)" },
- "speed_wall": { "value": "speed_print" },
- "speed_wall_0": { "value": "20" },
- "speed_wall_x": { "value": "speed_wall" },
- "speed_layer_0": { "value": "min(round(speed_print * 0.75, 0), 45.0)" },
- "speed_travel_layer_0": { "value": "round(speed_travel * 0.7, 0)" },
- "skirt_brim_speed": { "value": "speed_layer_0" },
- "skirt_line_count": { "default_value": 3 },
- "skirt_brim_minimal_length": { "default_value": 150 },
- "infill_sparse_density": { "default_value": 90 },
- "gradual_infill_steps": { "default_value": 2 },
- "infill_before_walls" : { "default_value": false },
- "top_bottom_thickness": { "default_value": 0.6 },
- "support_z_distance": { "value": "layer_height * 2" },
- "support_bottom_distance": { "value": "layer_height" },
- "support_use_towers" : { "default_value": false },
- "jerk_wall_0" : { "value": "30" },
- "jerk_travel" : { "default_value": 20 },
- "acceleration_travel" : { "value": 10000 },
- "machine_max_feedrate_z" : { "default_value": 150 }
+ "machine_extruder_count": { "default_value": 1 },
+ "machine_heated_bed": { "default_value": true },
+ "machine_width": { "default_value": 190 },
+ "machine_height": { "default_value": 250 },
+ "machine_depth": { "default_value": 190 },
+ "machine_center_is_zero": { "default_value": true },
+ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
+ "machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home all axes (max endstops)\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."},
+ "machine_end_gcode": { "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG28 ;Home all axes (max endstops)\nM84 ;steppers off\nG90 ;absolute positioning" },
+ "machine_shape": { "default_value": "elliptic" },
+ "retraction_hop_enabled": { "default_value": true },
+ "retraction_hop": { "default_value": 1 },
+ "retraction_amount" : { "default_value": 3.5 },
+ "retraction_speed" : { "default_value": 30 },
+ "retraction_combing" : { "default_value": "noskin" },
+ "travel_avoid_distance": { "default_value": 1, "value": "1" },
+ "speed_print" : { "default_value": 80 },
+ "speed_infill": { "value": "round(speed_print * 1.05, 0)" },
+ "speed_topbottom": { "value": "round(speed_print * 0.95, 0)" },
+ "speed_wall": { "value": "speed_print" },
+ "speed_wall_0": { "value": "30" },
+ "speed_wall_x": { "value": "speed_wall" },
+ "speed_layer_0": { "value": "min(round(speed_print * 0.75, 0), 45.0)" },
+ "speed_travel": { "default_value": 150, "value": 150 },
+ "speed_travel_layer_0": { "value": "round(speed_travel * 0.7, 0)" },
+ "skirt_brim_speed": { "value": "speed_layer_0" },
+ "skirt_line_count": { "default_value": 3 },
+ "skirt_brim_minimal_length": { "default_value": 150 },
+ "infill_sparse_density": { "default_value": 30 },
+ "infill_pattern": { "value": "'cubic'" },
+ "infill_before_walls" : { "default_value": false },
+ "top_bottom_thickness": { "default_value": 0.8 },
+ "support_z_distance": { "value": "layer_height * 2" },
+ "support_bottom_distance": { "value": "layer_height" },
+ "support_use_towers" : { "default_value": false },
+ "jerk_enabled": { "default_value": 1, "value": "1" },
+ "jerk_infill" : { "default_value": 5, "value": "5" },
+ "jerk_support" : { "default_value": 5, "value": "5" },
+ "acceleration_enabled": { "default_value": 1, "value": "1" },
+ "acceleration_travel" : { "value": 5000 },
+ "machine_max_feedrate_z" : { "default_value": 300 }
}
}
diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json
index 0af1e68075..ac50884888 100644
--- a/resources/definitions/fdmextruder.def.json
+++ b/resources/definitions/fdmextruder.def.json
@@ -6,7 +6,7 @@
"type": "extruder",
"author": "Ultimaker",
"manufacturer": "Unknown",
- "setting_version": 1,
+ "setting_version": 7,
"visible": false,
"position": "0"
},
diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json
index c82b4fb940..dd259ab62b 100644
--- a/resources/definitions/fdmprinter.def.json
+++ b/resources/definitions/fdmprinter.def.json
@@ -7,7 +7,7 @@
"author": "Ultimaker",
"category": "Other",
"manufacturer": "Unknown",
- "setting_version": 1,
+ "setting_version": 7,
"file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g",
"visible": false,
"has_materials": true,
@@ -17,7 +17,8 @@
{
"0": "fdmextruder"
},
- "supports_usb_connection": true
+ "supports_usb_connection": true,
+ "supports_network_connection": false
},
"settings":
{
@@ -227,7 +228,7 @@
},
"extruders_enabled_count":
{
- "label": "Number of Extruders that are enabled",
+ "label": "Number of Extruders That Are Enabled",
"description": "Number of extruder trains that are enabled; automatically set in software",
"value": "machine_extruder_count",
"default_value": 1,
@@ -240,7 +241,7 @@
},
"machine_nozzle_tip_outer_diameter":
{
- "label": "Outer nozzle diameter",
+ "label": "Outer Nozzle Diameter",
"description": "The outer diameter of the tip of the nozzle.",
"unit": "mm",
"default_value": 1,
@@ -252,7 +253,7 @@
},
"machine_nozzle_head_distance":
{
- "label": "Nozzle length",
+ "label": "Nozzle Length",
"description": "The height difference between the tip of the nozzle and the lowest part of the print head.",
"unit": "mm",
"default_value": 3,
@@ -263,7 +264,7 @@
},
"machine_nozzle_expansion_angle":
{
- "label": "Nozzle angle",
+ "label": "Nozzle Angle",
"description": "The angle between the horizontal plane and the conical part right above the tip of the nozzle.",
"unit": "°",
"type": "int",
@@ -276,7 +277,7 @@
},
"machine_heat_zone_length":
{
- "label": "Heat zone length",
+ "label": "Heat Zone Length",
"description": "The distance from the tip of the nozzle in which heat from the nozzle is transferred to the filament.",
"unit": "mm",
"default_value": 16,
@@ -310,7 +311,7 @@
},
"machine_nozzle_heat_up_speed":
{
- "label": "Heat up speed",
+ "label": "Heat Up Speed",
"description": "The speed (°C/s) by which the nozzle heats up averaged over the window of normal printing temperatures and the standby temperature.",
"default_value": 2.0,
"unit": "°C/s",
@@ -321,7 +322,7 @@
},
"machine_nozzle_cool_down_speed":
{
- "label": "Cool down speed",
+ "label": "Cool Down Speed",
"description": "The speed (°C/s) by which the nozzle cools down averaged over the window of normal printing temperatures and the standby temperature.",
"default_value": 2.0,
"unit": "°C/s",
@@ -343,7 +344,7 @@
},
"machine_gcode_flavor":
{
- "label": "G-code flavour",
+ "label": "G-code Flavour",
"description": "The type of g-code to be generated.",
"type": "enum",
"options":
@@ -376,7 +377,7 @@
},
"machine_disallowed_areas":
{
- "label": "Disallowed areas",
+ "label": "Disallowed Areas",
"description": "A list of polygons with areas the print head is not allowed to enter.",
"type": "polygons",
"default_value":
@@ -400,7 +401,7 @@
},
"machine_head_polygon":
{
- "label": "Machine head polygon",
+ "label": "Machine Head Polygon",
"description": "A 2D silhouette of the print head (fan caps excluded).",
"type": "polygon",
"default_value":
@@ -428,7 +429,7 @@
},
"machine_head_with_fans_polygon":
{
- "label": "Machine head & Fan polygon",
+ "label": "Machine Head & Fan Polygon",
"description": "A 2D silhouette of the print head (fan caps included).",
"type": "polygon",
"default_value":
@@ -456,9 +457,10 @@
},
"gantry_height":
{
- "label": "Gantry height",
+ "label": "Gantry Height",
"description": "The height difference between the tip of the nozzle and the gantry system (X and Y axes).",
"default_value": 99999999999,
+ "value": "machine_height",
"type": "float",
"settable_per_mesh": false,
"settable_per_extruder": false,
@@ -487,7 +489,7 @@
},
"machine_use_extruder_offset_to_offset_coords":
{
- "label": "Offset With Extruder",
+ "label": "Offset with Extruder",
"description": "Apply the extruder offset to the coordinate system.",
"type": "bool",
"default_value": true,
@@ -522,7 +524,7 @@
"description": "The maximum speed for the motor of the X-direction.",
"unit": "mm/s",
"type": "float",
- "default_value": 500,
+ "default_value": 299792458000,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
@@ -533,7 +535,7 @@
"description": "The maximum speed for the motor of the Y-direction.",
"unit": "mm/s",
"type": "float",
- "default_value": 500,
+ "default_value": 299792458000,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
@@ -544,7 +546,7 @@
"description": "The maximum speed for the motor of the Z-direction.",
"unit": "mm/s",
"type": "float",
- "default_value": 5,
+ "default_value": 299792458000,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
@@ -1315,8 +1317,7 @@
"default_value": 0,
"type": "float",
"enabled": "travel_compensate_overlapping_walls_0_enabled or travel_compensate_overlapping_walls_x_enabled",
- "settable_per_mesh": true,
- "settable_per_extruder": false
+ "settable_per_mesh": true
},
"wall_min_flow_retract":
{
@@ -1325,8 +1326,7 @@
"type": "bool",
"default_value": false,
"enabled": "(travel_compensate_overlapping_walls_0_enabled or travel_compensate_overlapping_walls_x_enabled) and wall_min_flow > 0",
- "settable_per_mesh": true,
- "settable_per_extruder": false
+ "settable_per_mesh": true
},
"fill_perimeter_gaps":
{
@@ -2056,6 +2056,21 @@
"settable_per_mesh": false,
"minimum_value": "-273.15"
},
+ "build_volume_temperature":
+ {
+ "label": "Build Volume Temperature",
+ "description": "The temperature used for build volume. If this is 0, the build volume temperature will not be adjusted.",
+ "unit": "°C",
+ "type": "float",
+ "default_value": 0,
+ "resolve": "max(extruderValues('build_volume_temperature'))",
+ "minimum_value": "-273.15",
+ "minimum_value_warning": "0",
+ "maximum_value_warning": "285",
+ "enabled": true,
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
"material_print_temperature":
{
"label": "Printing Temperature",
@@ -2750,7 +2765,7 @@
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)",
"maximum_value_warning": "300",
"value": "speed_layer_0",
- "enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim'",
+ "enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('draft_shield_enabled') or resolveOrValue('ooze_shield_enabled')",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "adhesion_extruder_nr"
@@ -3092,7 +3107,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
- "enabled": "resolveOrValue('acceleration_enabled')",
+ "enabled": "resolveOrValue('acceleration_enabled') and (resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('draft_shield_enabled') or resolveOrValue('ooze_shield_enabled'))",
"settable_per_mesh": false,
"limit_to_extruder": "adhesion_extruder_nr"
},
@@ -3367,7 +3382,7 @@
"minimum_value": "0",
"maximum_value_warning": "50",
"value": "jerk_layer_0",
- "enabled": "resolveOrValue('jerk_enabled')",
+ "enabled": "resolveOrValue('jerk_enabled') and (resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('draft_shield_enabled') or resolveOrValue('ooze_shield_enabled'))",
"settable_per_mesh": false,
"limit_to_extruder": "adhesion_extruder_nr"
}
@@ -3528,6 +3543,20 @@
"enabled": "retraction_hop_enabled and extruders_enabled_count > 1",
"settable_per_mesh": false,
"settable_per_extruder": true
+ },
+ "retraction_hop_after_extruder_switch_height":
+ {
+ "label": "Z Hop After Extruder Switch Height",
+ "description": "The height difference when performing a Z Hop after extruder switch.",
+ "unit": "mm",
+ "type": "float",
+ "default_value": 1,
+ "value": "retraction_hop",
+ "minimum_value_warning": "0",
+ "maximum_value_warning": "10",
+ "enabled": "retraction_enable and retraction_hop_after_extruder_switch",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
}
}
},
@@ -4091,7 +4120,7 @@
"description": "Amount of offset applied to all support polygons in each layer. Positive values can smooth out the support areas and result in more sturdy support.",
"unit": "mm",
"type": "float",
- "default_value": 0.2,
+ "default_value": 0,
"limit_to_extruder": "support_infill_extruder_nr",
"minimum_value_warning": "-1 * machine_nozzle_size",
"maximum_value_warning": "10 * machine_nozzle_size",
@@ -4579,7 +4608,7 @@
"description": "Whether to prime the filament with a blob before printing. Turning this setting on will ensure that the extruder will have material ready at the nozzle before printing. Printing Brim or Skirt can act like priming too, in which case turning this setting off saves some time.",
"type": "bool",
"resolve": "any(extruderValues('prime_blob_enable'))",
- "default_value": true,
+ "default_value": false,
"settable_per_mesh": false,
"settable_per_extruder": true,
"enabled": false
@@ -5220,7 +5249,7 @@
"type": "bool",
"enabled": "extruders_enabled_count > 1",
"default_value": false,
- "resolve": "any(extruderValues('prime_tower_enable'))",
+ "resolve": "any(extruderValues('prime_tower_enable')) or (adhesion_type in ('none', 'skirt'))",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@@ -5854,10 +5883,10 @@
"description": "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway.",
"type": "float",
"unit": "mm",
- "default_value": 0.01,
+ "default_value": 0.5,
"minimum_value": "0.001",
- "minimum_value_warning": "0.005",
- "maximum_value_warning": "0.1",
+ "minimum_value_warning": "0.01",
+ "maximum_value_warning": "3",
"settable_per_mesh": true
},
"meshfix_maximum_travel_resolution":
@@ -5866,14 +5895,26 @@
"description": "The minimum size of a travel line segment after slicing. If you increase this, the travel moves will have less smooth corners. This may allow the printer to keep up with the speed it has to process g-code, but it may cause model avoidance to become less accurate.",
"type": "float",
"unit": "mm",
- "default_value": 0.02,
- "value": "meshfix_maximum_resolution * speed_travel / speed_print",
+ "default_value": 1.0,
+ "value": "min(meshfix_maximum_resolution * speed_travel / speed_print, 2 * line_width)",
"minimum_value": "0.001",
- "minimum_value_warning": "0.005",
- "maximum_value_warning": "1",
+ "minimum_value_warning": "0.05",
+ "maximum_value_warning": "10",
"settable_per_mesh": false,
"settable_per_extruder": true
},
+ "meshfix_maximum_deviation":
+ {
+ "label": "Maximum Deviation",
+ "description": "The maximum deviation allowed when reducing the resolution for the Maximum Resolution setting. If you increase this, the print will be less accurate, but the g-code will be smaller.",
+ "type": "float",
+ "unit": "mm",
+ "default_value": 0.05,
+ "minimum_value": "0.001",
+ "minimum_value_warning": "0.01",
+ "maximum_value_warning": "0.3",
+ "settable_per_mesh": true
+ },
"support_skip_some_zags":
{
"label": "Break Up Support In Chunks",
@@ -6648,7 +6689,7 @@
},
"adaptive_layer_height_enabled":
{
- "label": "Use adaptive layers",
+ "label": "Use Adaptive Layers",
"description": "Adaptive layers computes the layer heights depending on the shape of the model.",
"type": "bool",
"default_value": false,
@@ -6658,7 +6699,7 @@
},
"adaptive_layer_height_variation":
{
- "label": "Adaptive layers maximum variation",
+ "label": "Adaptive Layers Maximum Variation",
"description": "The maximum allowed height different from the base layer height.",
"type": "float",
"enabled": "adaptive_layer_height_enabled",
@@ -6670,19 +6711,20 @@
},
"adaptive_layer_height_variation_step":
{
- "label": "Adaptive layers variation step size",
+ "label": "Adaptive Layers Variation Step Size",
"description": "The difference in height of the next layer height compared to the previous one.",
"type": "float",
"enabled": "adaptive_layer_height_enabled",
"default_value": 0.01,
"unit": "mm",
"settable_per_mesh": false,
+ "minimum_value": "0.0001",
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"adaptive_layer_height_threshold":
{
- "label": "Adaptive layers threshold",
+ "label": "Adaptive Layers Threshold",
"description": "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer.",
"type": "float",
"enabled": "adaptive_layer_height_enabled",
@@ -6953,44 +6995,247 @@
"type": "float",
"enabled": "bridge_settings_enabled and bridge_enable_more_layers",
"settable_per_mesh": true
+ },
+ "clean_between_layers":
+ {
+ "label": "Wipe Nozzle Between Layers",
+ "description": "Whether to include nozzle wipe G-Code between layers. Enabling this setting could influence behavior of retract at layer change. Please use Wipe Retraction settings to control retraction at layers where the wipe script will be working.",
+ "default_value": false,
+ "type": "bool",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "settable_per_meshgroup": false
+ },
+ "max_extrusion_before_wipe":
+ {
+ "label": "Material Volume Between Wipes",
+ "description": "Maximum material, that can be extruded before another nozzle wipe is initiated.",
+ "default_value": 10,
+ "type": "float",
+ "unit": "mm³",
+ "enabled": "clean_between_layers",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "settable_per_meshgroup": false
+ },
+ "wipe_retraction_enable":
+ {
+ "label": "Wipe Retraction Enable",
+ "description": "Retract the filament when the nozzle is moving over a non-printed area.",
+ "type": "bool",
+ "default_value": true,
+ "enabled": "clean_between_layers",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "settable_per_meshgroup": false
+ },
+ "wipe_retraction_amount":
+ {
+ "label": "Wipe Retraction Distance",
+ "description": "Amount to retract the filament so it does not ooze during the wipe sequence.",
+ "unit": "mm",
+ "type": "float",
+ "default_value": 1,
+ "minimum_value_warning": "-0.0001",
+ "maximum_value_warning": "10.0",
+ "enabled": "wipe_retraction_enable and clean_between_layers",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "settable_per_meshgroup": false
+ },
+ "wipe_retraction_extra_prime_amount":
+ {
+ "label": "Wipe Retraction Extra Prime Amount",
+ "description": "Some material can ooze away during a wipe travel moves, which can be compensated for here.",
+ "unit": "mm³",
+ "type": "float",
+ "default_value": 0,
+ "minimum_value_warning": "-0.0001",
+ "maximum_value_warning": "10.0",
+ "enabled": "wipe_retraction_enable and clean_between_layers",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
+ "wipe_retraction_speed":
+ {
+ "label": "Wipe Retraction Speed",
+ "description": "The speed at which the filament is retracted and primed during a wipe retraction move.",
+ "unit": "mm/s",
+ "type": "float",
+ "default_value": 5,
+ "minimum_value": "0",
+ "minimum_value_warning": "1",
+ "maximum_value": "machine_max_feedrate_e",
+ "maximum_value_warning": "70",
+ "enabled": "wipe_retraction_enable and clean_between_layers",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "children":
+ {
+ "wipe_retraction_retract_speed":
+ {
+ "label": "Wipe Retraction Retract Speed",
+ "description": "The speed at which the filament is retracted during a wipe retraction move.",
+ "unit": "mm/s",
+ "type": "float",
+ "default_value": 3,
+ "minimum_value": "0",
+ "maximum_value": "machine_max_feedrate_e",
+ "minimum_value_warning": "1",
+ "maximum_value_warning": "70",
+ "enabled": "wipe_retraction_enable and clean_between_layers",
+ "value": "retraction_speed",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
+ "wipe_retraction_prime_speed":
+ {
+ "label": "Retraction Prime Speed",
+ "description": "The speed at which the filament is primed during a wipe retraction move.",
+ "unit": "mm/s",
+ "type": "float",
+ "default_value": 2,
+ "minimum_value": "0",
+ "maximum_value": "machine_max_feedrate_e",
+ "minimum_value_warning": "1",
+ "maximum_value_warning": "70",
+ "enabled": "wipe_retraction_enable and clean_between_layers",
+ "value": "retraction_speed",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ }
+ }
+ },
+ "wipe_pause":
+ {
+ "label": "Wipe Pause",
+ "description": "Pause after the unretract.",
+ "unit": "s",
+ "type": "float",
+ "default_value": 0,
+ "minimum_value": "0",
+ "enabled": "clean_between_layers",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "settable_per_meshgroup": false
+ },
+ "wipe_hop_enable":
+ {
+ "label": "Wipe Z Hop When Retracted",
+ "description": "Whenever a retraction is done, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate.",
+ "type": "bool",
+ "default_value": true,
+ "enabled": "clean_between_layers",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "settable_per_meshgroup": false
+ },
+ "wipe_hop_amount":
+ {
+ "label": "Wipe Z Hop Height",
+ "description": "The height difference when performing a Z Hop.",
+ "unit": "mm",
+ "type": "float",
+ "default_value": 1,
+ "enabled": "wipe_hop_enable and clean_between_layers",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "settable_per_meshgroup": false
+ },
+ "wipe_hop_speed":
+ {
+ "label": "Wipe Hop Speed",
+ "description": "Speed to move the z-axis during the hop.",
+ "unit": "mm/s",
+ "type": "float",
+ "default_value": 100,
+ "minimum_value": "0",
+ "minimum_value_warning": "1",
+ "enabled": "wipe_hop_enable and clean_between_layers",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "settable_per_meshgroup": false
+ },
+ "wipe_brush_pos_x":
+ {
+ "label": "Wipe Brush X Position",
+ "description": "X location where wipe script will start.",
+ "type": "float",
+ "unit": "mm",
+ "default_value": 100,
+ "minimum_value_warning": "0",
+ "enabled": "clean_between_layers",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "settable_per_meshgroup": false
+ },
+ "wipe_repeat_count":
+ {
+ "label": "Wipe Repeat Count",
+ "description": "Number of times to move the nozzle across the brush.",
+ "type": "int",
+ "minimum_value": "0",
+ "default_value": 5,
+ "enabled": "clean_between_layers",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "settable_per_meshgroup": false
+ },
+ "wipe_move_distance":
+ {
+ "label": "Wipe Move Distance",
+ "description": "The distance to move the head back and forth across the brush.",
+ "unit": "mm",
+ "type": "float",
+ "default_value": 20,
+ "enabled": "clean_between_layers",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "settable_per_meshgroup": false
}
}
},
- "command_line_settings": {
+ "command_line_settings":
+ {
"label": "Command Line Settings",
"description": "Settings which are only used if CuraEngine isn't called from the Cura frontend.",
"type": "category",
"enabled": false,
"children": {
- "center_object": {
+ "center_object":
+ {
"description": "Whether to center the object on the middle of the build platform (0,0), instead of using the coordinate system in which the object was saved.",
"type": "bool",
"label": "Center Object",
"default_value": false,
"enabled": false
},
- "mesh_position_x": {
+ "mesh_position_x":
+ {
"description": "Offset applied to the object in the x direction.",
"type": "float",
"label": "Mesh Position X",
"default_value": 0,
"enabled": false
},
- "mesh_position_y": {
+ "mesh_position_y":
+ {
"description": "Offset applied to the object in the y direction.",
"type": "float",
"label": "Mesh Position Y",
"default_value": 0,
"enabled": false
},
- "mesh_position_z": {
+ "mesh_position_z":
+ {
"description": "Offset applied to the object in the z direction. With this you can perform what was used to be called 'Object Sink'.",
"type": "float",
"label": "Mesh Position Z",
"default_value": 0,
"enabled": false
},
- "mesh_rotation_matrix": {
+ "mesh_rotation_matrix":
+ {
"label": "Mesh Rotation Matrix",
"description": "Transformation matrix to be applied to the model when loading it from file.",
"type": "str",
diff --git a/resources/definitions/hms434.def.json b/resources/definitions/hms434.def.json
new file mode 100644
index 0000000000..163f3fbec2
--- /dev/null
+++ b/resources/definitions/hms434.def.json
@@ -0,0 +1,163 @@
+{
+ "name": "HMS434",
+ "version": 2,
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "author": "Scheepers",
+ "manufacturer": "MaukCC",
+ "file_formats": "text/x-gcode",
+
+ "has_materials": true,
+ "has_machine_materials": false,
+ "preferred_material": "generic_pla",
+ "exclude_materials": [ "chromatik_pla", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "imade3d_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "tizyx_abs", "tizyx_pla", "tizyx_pla_bois", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla", "generic_cpe_175", "generic_nylon_175", "dsm_arnitel2045_175", "dsm_novamid1070_175", "generic_tpu_175", "generic_pc_175" ],
+
+ "has_variants": true,
+ "variants_name": "Tool",
+ "preferred_variant_name": "0.8mm TP extruder",
+
+ "has_machine_quality": true,
+ "preferred_quality_type": "normal",
+
+ "machine_extruder_trains":
+ {
+ "0": "hms434_tool_1",
+ "1": "hms434_tool_2",
+ "2": "hms434_tool_3",
+ "3": "hms434_tool_4",
+ "4": "hms434_tool_5",
+ "5": "hms434_tool_6",
+ "6": "hms434_tool_7",
+ "7": "hms434_tool_8"
+ },
+ "platform": "hms_platform.obj",
+ "platform_offset": [ 26, -13.2, 162.5],
+ "platform_texture": "hms434.png",
+ "first_start_actions": ["MachineSettingsAction"],
+ "supported_actions": ["MachineSettingsAction"]
+ },
+
+ "overrides": {
+ "machine_extruder_count": {"default_value": 1 },
+ "material_diameter": {"default_value": 1.75 },
+ "machine_heated_bed": {"default_value": true },
+ "machine_center_is_zero": {"default_value": false },
+ "gantry_height": {"default_value": 35 },
+ "machine_height": {"default_value": 400 },
+ "machine_depth": {"default_value": 325 },
+ "machine_width": {"default_value": 450 },
+ "machine_gcode_flavor": {"default_value": "RepRap (RepRap)" },
+ "material_print_temp_wait": {"default_value": true},
+ "material_bed_temp_wait": {"default_value": true },
+ "prime_tower_enable": {"default_value": false },
+ "prime_tower_size": {"value": 20.6 },
+ "prime_tower_position_x": {"value": 125 },
+ "prime_tower_position_y": {"value": 70 },
+ "prime_blob_enable": {"default_value": false },
+ "machine_max_feedrate_z": {"default_value": 1200 },
+ "machine_start_gcode": {"default_value": "\n;Neither HMS434 nor any of HMS434 Subsidiaries has any liabilities or gives any warrenties on this .gcode file,\n\n;or on any or all objects made with this .gcode file \nM117 Homing Y ......\nG28 Y\nM117 Homing X ......\nG28 X\nM117 Homing Z ......\nG28 Z F100\nG1 Z10 F600\n\nG1 X-71 F9000;go to wipe point\nG1 Y-100 F9000\nG1 Z0 F900\n\nG1 Z0.2 F900\n\nG1 Y-65 F12000\nG1 X50 Y0 F9000\nM117 HMS434 Printing ...\n\n" },
+ "machine_end_gcode": {"default_value": "" },
+
+ "retraction_extra_prime_amount": {"minimum_value_warning": "-2.0" },
+ "optimize_wall_printing_order": {"default_value": true },
+ "machine_nozzle_heat_up_speed": {"default_value": 12},
+ "machine_nozzle_cool_down_speed": {"default_value": 20},
+ "machine_min_cool_heat_time_window": {"default_value": 5},
+
+ "layer_height": {"maximum_value": "(0.8 * min(extruderValues('machine_nozzle_size')))" },
+ "layer_height_0": {"maximum_value": "(0.8 * min(extruderValues('machine_nozzle_size')))" },
+ "line_width": {"value": "(machine_nozzle_size + layer_height)" },
+ "infill_line_width": {"value": "(line_width)" },
+ "initial_layer_line_width_factor": {"value": 110 },
+
+ "wall_thickness": {"value": "(line_width * 3) if infill_sparse_density < 95 else line_width" },
+ "roofing_layer_count": {"value": "4" },
+ "top_bottom_thickness": {"value": "(layer_height_0 + (layer_height * 3))" },
+ "top_layers": {"value": "4" },
+ "bottom_layers": {"value": "(top_layers)" },
+ "wall_0_inset": {"value": "0" },
+ "alternate_extra_perimeter": {"value": false },
+ "filter_out_tiny_gaps": {"value": false },
+ "fill_outline_gaps": {"value": true },
+ "skin_outline_count": {"value": "0"},
+
+ "infill_sparse_density": {"value": 30},
+ "infill_pattern": {"value": "'lines'"},
+ "infill_overlap": {"value": 5},
+ "skin_overlap": {"value": 5},
+ "infill_wipe_dist": {"value": 0.0},
+ "infill_before_walls": {"value": false},
+
+ "material_print_temperature_layer_0": {"value": "material_print_temperature + 5"},
+ "material_initial_print_temperature": {"value": "material_print_temperature",
+ "maximum_value_warning": "material_print_temperature + 15"},
+ "material_final_print_temperature": {"value": "material_print_temperature"},
+ "material_bed_temperature_layer_0": {"value": "material_bed_temperature + 1"},
+ "material_flow": {"value": "120 if infill_sparse_density < 95 else 115"},
+ "retraction_amount": {"value": "1"},
+ "retraction_speed": {"value": "20"},
+ "retraction_prime_speed": {"value": "8"},
+ "retraction_min_travel": {"value": "(round(line_width * 10))"},
+ "switch_extruder_retraction_amount": {"value": 2},
+ "switch_extruder_retraction_speeds": {"value": "(retraction_speed)"},
+ "switch_extruder_prime_speed": {"value": "(retraction_prime_speed)"},
+
+ "speed_print": {"value": "50"},
+ "speed_infill": {"value": "speed_print"},
+ "speed_wall": {"value": "(speed_print/5*3) if speed_print < 51 else speed_print"},
+ "speed_wall_x": {"value": "speed_wall"},
+ "speed_layer_0": {"value": "(speed_print/5*4) if speed_print < 51 else speed_print"},
+ "speed_topbottom": {"value": "speed_layer_0"},
+ "speed_travel": {"value": "100"},
+ "speed_travel_layer_0": {"value": "speed_travel"},
+ "speed_support_interface": {"value": "speed_topbottom"},
+ "max_feedrate_z_override": {"value": 10},
+ "speed_slowdown_layers": {"value": 1},
+ "acceleration_print": {"value": 200},
+ "acceleration_travel": {"value": 200},
+ "jerk_print": {"value": 5},
+ "jerk_travel": {"value": 5},
+
+ "retraction_hop_enabled": {"value": false},
+ "retraction_hop": {"value": 1},
+ "retraction_combing": {"value": "'off'"},
+
+ "cool_fan_speed": {"value": 0},
+ "cool_fan_enabled": {"value": true},
+ "cool_min_layer_time_fan_speed_max": {"value": "cool_min_layer_time"},
+ "cool_min_layer_time": {"value": 20},
+ "cool_min_speed": {"value": "speed_wall_x"},
+ "cool_lift_head": {"value": false},
+
+ "support_z_distance": {"value": 0},
+ "support_xy_distance": {"value": 1},
+ "support_join_distance": {"value": 10},
+ "support_interface_enable": {"value": true},
+ "support_interface_height": {"value": 0.5},
+ "support_interface_pattern": {"value": "'lines'"},
+
+ "adhesion_type": {"value": "'skirt'"},
+ "skirt_gap": {"value": 1},
+ "skirt_brim_minimal_length": {"value": 50},
+
+ "coasting_enable": {"value": true},
+ "coasting_volume": {"value": 0.1},
+ "coasting_min_volume": {"value": 0.17},
+ "coasting_speed": {"value": 90},
+ "bridge_settings_enabled": {"value": true},
+ "bridge_wall_min_length": {"value": 3},
+ "bridge_skin_support_threshold": {"value": 90},
+ "bridge_wall_speed": {"value": 15},
+ "bridge_wall_material_flow": {"value": 130},
+ "bridge_skin_speed": {"value": 15},
+ "bridge_skin_material_flow": {"value": 130},
+ "bridge_fan_speed": {"value": 0},
+ "bridge_skin_density_2": {"value": 100},
+ "bridge_skin_density_3": {"value": 100},
+ "bridge_skin_material_flow_2": {"value": 110},
+ "bridge_skin_material_flow_3": {"value": 100},
+ "bridge_skin_speed_2": {"value": 20},
+ "bridge_skin_speed_3": {"value": 30}
+ }
+}
diff --git a/resources/definitions/jgaurora_jgmaker_magic.def.json b/resources/definitions/jgaurora_jgmaker_magic.def.json
new file mode 100644
index 0000000000..4036ec51bf
--- /dev/null
+++ b/resources/definitions/jgaurora_jgmaker_magic.def.json
@@ -0,0 +1,93 @@
+{
+ "name": "JGAurora JGMaker Magic",
+ "version": 2,
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "author": "Samuel Pinches",
+ "manufacturer": "JGAurora",
+ "file_formats": "text/x-gcode",
+ "preferred_quality_type": "fast",
+ "machine_extruder_trains":
+ {
+ "0": "jgaurora_jgmaker_magic_extruder_0"
+ }
+ },
+ "overrides": {
+ "machine_name": {
+ "default_value": "JGAurora JGMaker Magic"
+ },
+ "machine_start_gcode": {
+ "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 ;home all axis\nM420 S1 ;turn on mesh bed levelling if enabled in firmware\nG92 E0 ;zero the extruded length\nG1 Z1 F1000 ;move up slightly\nG1 X60.0 Z0 E9.0 F1000.0;intro line\nG1 X100.0 E21.5 F1000.0 ;continue line\nG92 E0 ;zero the extruded length again\n; -- end of START GCODE --"
+ },
+ "machine_end_gcode": {
+ "default_value": "; -- END GCODE --\nM104 S0 ;turn off nozzle heater\nM140 S0 ;turn off bed heater\nG91 ;set to relative positioning\nG1 E-10 F300 ;retract the filament slightly\nG90 ;set to absolute positioning\nG28 X0 ;move to the X-axis origin (Home)\nG0 Y280 F600 ;bring the bed to the front for easy print removal\nM84 ;turn off stepper motors\n; -- end of END GCODE --"
+ },
+ "machine_width": {
+ "default_value": 220
+ },
+ "machine_height": {
+ "default_value": 250
+ },
+ "machine_depth": {
+ "default_value": 220
+ },
+ "machine_heated_bed": {
+ "default_value": true
+ },
+ "machine_center_is_zero": {
+ "default_value": false
+ },
+ "gantry_height": {
+ "default_value": 10
+ },
+ "machine_gcode_flavor": {
+ "default_value": "RepRap (Marlin/Sprinter)"
+ },
+ "material_diameter": {
+ "default_value": 1.75
+ },
+ "material_print_temperature": {
+ "default_value": 200
+ },
+ "material_bed_temperature": {
+ "default_value": 60
+ },
+ "layer_height_0": {
+ "default_value": 0.2
+ },
+ "wall_thickness": {
+ "default_value": 1.2
+ },
+ "speed_print": {
+ "default_value": 60
+ },
+ "speed_infill": {
+ "default_value": 60
+ },
+ "speed_wall": {
+ "default_value": 30
+ },
+ "speed_topbottom": {
+ "default_value": 45
+ },
+ "speed_travel": {
+ "default_value": 125
+ },
+ "speed_layer_0": {
+ "default_value": 30
+ },
+ "support_enable": {
+ "default_value": true
+ },
+ "retraction_enable": {
+ "default_value": true
+ },
+ "retraction_amount": {
+ "default_value": 5
+ },
+ "retraction_speed": {
+ "default_value": 50
+ }
+ }
+}
diff --git a/resources/definitions/kupido.def.json b/resources/definitions/kupido.def.json
index 412fe979b8..191e02ba34 100644
--- a/resources/definitions/kupido.def.json
+++ b/resources/definitions/kupido.def.json
@@ -1,40 +1,49 @@
{
- "name": "Kupido",
"version": 2,
+ "name": "KUPIDO",
"inherits": "fdmprinter",
- "metadata": {
+ "metadata":
+ {
"visible": true,
- "author": "Ultimaker",
- "manufacturer": "Kupido",
+ "author": "ALYA",
+ "manufacturer": "Kati Hal ARGE",
+ "category": "Other",
"file_formats": "text/x-gcode",
"platform_offset": [ 0, 0, 0],
+ "exclude_materials": ["chromatik_pla", "dsm_arnitel2045_175", "dsm_novamid1070_175", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "generic_bam", "generic_cpe", "generic_cpe_175", "generic_cpe_plus", "generic_hips", "generic_hips_175", "generic_nylon", "generic_nylon_175", "generic_pc", "generic_pc_175", "generic_petg", "generic_petg_175", "generic_pp", "generic_pva", "generic_pva_175", "generic_tough_pla", "generic_tpu", "generic_tpu_175", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "ultimaker_abs_black", "ultimaker_abs_blue", "ultimaker_abs_green", "ultimaker_abs_grey", "ultimaker_abs_orange", "ultimaker_abs_pearl-gold", "ultimaker_abs_red", "ultimaker_abs_silver-metallic", "ultimaker_abs_white", "ultimaker_abs_yellow", "ultimaker_bam", "ultimaker_cpe_black", "ultimaker_cpe_blue", "ultimaker_cpe_dark-grey", "ultimaker_cpe_green", "ultimaker_cpe_light-grey", "ultimaker_cpe_plus_black", "ultimaker_cpe_plus_transparent", "ultimaker_cpe_plus_white", "ultimaker_cpe_red", "ultimaker_cpe_transparent", "ultimaker_cpe_white", "ultimaker_cpe_yellow", "ultimaker_nylon_black", "ultimaker_nylon_transparent", "ultimaker_pc_black", "ultimaker_pc_transparent", "ultimaker_pc_white", "ultimaker_pla_black", "ultimaker_pla_blue", "ultimaker_pla_green", "ultimaker_pla_magenta", "ultimaker_pla_orange", "ultimaker_pla_pearl-white", "ultimaker_pla_red", "ultimaker_pla_silver-metallic", "ultimaker_pla_transparent", "ultimaker_pla_white", "ultimaker_pla_yellow", "ultimaker_pp_transparent", "ultimaker_pva", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "ultimaker_tpu_black", "ultimaker_tpu_blue", "ultimaker_tpu_red", "ultimaker_tpu_white", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla","tizyx_pla","tizyx_abs","tizyx_pla_bois" ],
+ "preferred_material": "generic_pla",
+ "has_machine_quality": true,
+ "has_materials": true,
+ "has_variants": false,
+ "supports_usb_connection": false,
"machine_extruder_trains":
{
- "0": "kupido_extruder_0"
+ "0": "alya3dp_extruder_0"
}
},
"overrides": {
- "machine_name": { "default_value": "Kupido" },
- "machine_start_gcode": {
- "default_value": " ;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n ;M190 S{material_bed_temperature} ;Uncomment to add your own bed temperature line\n ;M109 S{material_print_temperature} ;Uncomment to add your own temperature line\n G21 ;metric values\n G90 ;absolute positioning\n M82 ;set extruder to absolute mode\n M107 ;start with the fan off\n G28 X0 Y0 ;move X Y to endstops\n G28 Z0 ;move Z to endstops\n G1 Z20.0 F40 ;move the platform down 20mm\n G1 Y0 X170 F{speed_travel}\n G92 E0 ;zero the extruded length\n G1 F200 E10 ;extrude 3mm of feed stock\n G92 E0 ;zero the extruded length again\n G4 P7000\n G1 F{speed_travel}\n ;Put printing message on LCD screen\n M117 Printing...\n"
+ "machine_name": { "default_value": "ALYA 3DP" },
+ "machine_heated_bed": { "default_value": true },
+ "machine_width": { "default_value": 195 },
+ "machine_height": { "default_value": 190 },
+ "machine_depth": { "default_value": 195 },
+ "machine_center_is_zero": { "default_value": false },
+ "gantry_height": { "default_value": 55 },
+ "retraction_amount": { "default_value": 1 },
+ "support_enable": { "default_value": true},
+ "machine_head_with_fans_polygon": {
+ "default_value": [[75, 18],[18, 18],[18, 35],[75, 35]]
},
- "machine_end_gcode": {
- "default_value": " M104 S0 ;extruder heater off\n M140 S0 ;heated bed heater off (if you have it)\n G91 ;relative positioning\n G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n G1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\n G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n M84 ;steppers off\n G90 ;absolute positioning\n"
+ "adhesion_type": {"options": {"raft": "Raft" ,"none": "None", "brim": "Brim"}, "default_value": "raft"},
+ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
+ "machine_start_gcode":
+ {
+ "default_value": ";Sliced at: {day} {date} {time} \n ;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {fill_density} \n ;Print time: {print_time} \n ;Filament used: {filament_amount}m {filament_weight}g \n ;Filament cost: {filament_cost} \n G28 X0 Y0 ;move X Y to endstops \n G28 Z0 ;move Z to endstops \n M190 S{material_bed_temperature} ;bed temp \n M107 ; switch fan off \n M109 S{material_print_temperature} ;extruder temp set \n G1 F3000 \n G1 Z10 \n G92 E0 ;zero the extruded length \n G1 F200 E1 ;extrude 1mm of feed stock \n G92 E0 ;zero the extruded length again \n G4 P7000 ; wait 7000ms \n M117 Printing... ;Put printing message on LCD screen"
},
- "prime_tower_size": { "default_value": 8.660254037844387 },
- "retraction_speed": { "default_value": 60 },
- "material_bed_temperature": { "default_value": 60 },
- "speed_wall_x": { "default_value": 40 },
- "skirt_line_count": { "default_value": 2 },
- "retraction_min_travel": { "default_value": 2 },
- "speed_wall_0": { "default_value": 30 },
- "material_print_temperature": { "default_value": 220 },
- "brim_line_count": { "default_value": 15 },
- "retraction_amount": { "default_value": 3.6 },
- "speed_topbottom": { "default_value": 20 },
- "layer_height": { "default_value": 0.2 },
- "speed_print": { "default_value": 30 },
- "speed_infill": { "default_value": 30 }
+ "machine_end_gcode":
+ {
+ "default_value": ";End GCode\nM104 S0 ;extruder heater off \nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG28 Z0\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}"
+ }
}
-}
+}
\ No newline at end of file
diff --git a/resources/definitions/maker_starter.def.json b/resources/definitions/maker_starter.def.json
index be85e54967..4f94ca905d 100644
--- a/resources/definitions/maker_starter.def.json
+++ b/resources/definitions/maker_starter.def.json
@@ -132,7 +132,7 @@
"default_value": "ZigZag"
},
"support_infill_rate": {
- "default_value": 15
+ "value": "15 if support_enable else 0 if support_tree_enable else 15"
},
"adhesion_type": {
"default_value": "raft"
diff --git a/resources/definitions/peopoly_moai.def.json b/resources/definitions/peopoly_moai.def.json
index a578cc4240..177a6a801e 100644
--- a/resources/definitions/peopoly_moai.def.json
+++ b/resources/definitions/peopoly_moai.def.json
@@ -173,8 +173,8 @@
"minimum_polygon_circumference": {
"value": "0.1"
},
- "meshfix_maximum_resolution": {
- "value": "0.005"
+ "meshfix_maximum_deviation": {
+ "value": "0.003"
},
"skin_outline_count": {
"value": 0
diff --git a/resources/definitions/raise3D_N2_dual.def.json b/resources/definitions/raise3D_N2_dual.def.json
index eff5884da8..f4600bc027 100644
--- a/resources/definitions/raise3D_N2_dual.def.json
+++ b/resources/definitions/raise3D_N2_dual.def.json
@@ -67,7 +67,7 @@
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
- "default_value": "G90\nG21\n; home all axes\nG28\nG92 X0 Y0 Z0\n; move heatbed into position\nG1 X20.0 Y20.0 Z1.0 F1000\n; zero extruders\nG92 E0 E1\nT0; right tool\n; set extruder steps per mm\nM92 E140\nT1; left tool\n; set extruder steps per mm\nM92 E140\nT0; left tool\nG92 E0 E1\n; purge nozzle\nG1 E25 F250\nT1; left tool\nG92 E0 E1\n; purge nozzle\nG1 E25 F250\n; zero extruders\nG92 E0 E1\n; move heatbed down a little more\nG1 Z5.0 F20\n; wait 600ms\nG4 600\n; move to tack down the strands\nG1 X20.0 Y30.0 Z0 F9000\n; wait 600ms\nG4 600\n;move up a bit\nG1 Z5.0 F9000\n; wait 300ms\nG4 300\n;fast move to center\nG1 X152.5 Y152.5 F9000\nT0\n;Raise3D Job Start\nM117 Printing…\nM1001\n"
+ "default_value": "G90\nG21\n; home all axes\nG28\nG92 X0 Y0 Z0\n; move heatbed into position\nG1 X20.0 Y20.0 Z1.0 F1000\n; zero extruders\nG92 E0 E1\nT0; right tool\n; set extruder steps per mm\nM92 E140\nT1; left tool\n; set extruder steps per mm\nM92 E140\nT0; left tool\nG92 E0 E1\n; purge nozzle\nG1 E25 F250\nT1; left tool\nG92 E0 E1\n; purge nozzle\nG1 E25 F250\n; zero extruders\nG92 E0 E1\n; move heatbed down a little more\nG1 Z5.0 F20\n; wait 600ms\nG4 600\n; move to tack down the strands\nG1 X20.0 Y30.0 Z0 F9000\n; wait 600ms\nG4 600\n;move up a bit\nG1 Z5.0 F9000\n; wait 300ms\nG4 300\n;fast move to center\nG1 X152.5 Y152.5 F9000\nT0\n;Raise3D Job Start\nM117 Printing...\nM1001\n"
},
"machine_end_gcode": {
"default_value": "M107\nM1002\nM104 S0 T1\nM104 S0 T0\nM140 S0\nM117 Print Complete.\nG28 X0 Y0\nG91\nG1 Z10\nG90\nM84"
diff --git a/resources/definitions/raise3D_N2_plus_dual.def.json b/resources/definitions/raise3D_N2_plus_dual.def.json
index 06de52321a..010c8cfa73 100644
--- a/resources/definitions/raise3D_N2_plus_dual.def.json
+++ b/resources/definitions/raise3D_N2_plus_dual.def.json
@@ -67,7 +67,7 @@
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
- "default_value": "G90\nG21\n; home all axes\nG28\nG92 X0 Y0 Z0\n; move heatbed into position\nG1 X20.0 Y20.0 Z1.0 F1000\n; zero extruders\nG92 E0 E1\nT0; right tool\n; set extruder steps per mm\nM92 E140\nT1; left tool\n; set extruder steps per mm\nM92 E140\nT0; left tool\nG92 E0 E1\n; purge nozzle\nG1 E25 F250\nT1; left tool\nG92 E0 E1\n; purge nozzle\nG1 E25 F250\n; zero extruders\nG92 E0 E1\n; move heatbed down a little more\nG1 Z5.0 F20\n; wait 600ms\nG4 600\n; move to tack down the strands\nG1 X20.0 Y30.0 Z0 F9000\n; wait 600ms\nG4 600\n;move up a bit\nG1 Z5.0 F9000\n; wait 300ms\nG4 300\n;fast move to center\nG1 X152.5 Y152.5 F9000\nT0\n;Raise3D Job Start\nM117 Printing…\nM1001\n"
+ "default_value": "G90\nG21\n; home all axes\nG28\nG92 X0 Y0 Z0\n; move heatbed into position\nG1 X20.0 Y20.0 Z1.0 F1000\n; zero extruders\nG92 E0 E1\nT0; right tool\n; set extruder steps per mm\nM92 E140\nT1; left tool\n; set extruder steps per mm\nM92 E140\nT0; left tool\nG92 E0 E1\n; purge nozzle\nG1 E25 F250\nT1; left tool\nG92 E0 E1\n; purge nozzle\nG1 E25 F250\n; zero extruders\nG92 E0 E1\n; move heatbed down a little more\nG1 Z5.0 F20\n; wait 600ms\nG4 600\n; move to tack down the strands\nG1 X20.0 Y30.0 Z0 F9000\n; wait 600ms\nG4 600\n;move up a bit\nG1 Z5.0 F9000\n; wait 300ms\nG4 300\n;fast move to center\nG1 X152.5 Y152.5 F9000\nT0\n;Raise3D Job Start\nM117 Printing...\nM1001\n"
},
"machine_end_gcode": {
"default_value": "M107\nM1002\nM104 S0 T1\nM104 S0 T0\nM140 S0\nM117 Print Complete.\nG28 X0 Y0\nG91\nG1 Z10\nG90\nM84"
diff --git a/resources/definitions/raise3D_N2_plus_single.def.json b/resources/definitions/raise3D_N2_plus_single.def.json
index b829147160..dd2162f5a9 100644
--- a/resources/definitions/raise3D_N2_plus_single.def.json
+++ b/resources/definitions/raise3D_N2_plus_single.def.json
@@ -66,7 +66,7 @@
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
- "default_value": "G90\nG21\n; home all axes\nG28\nG92 X0 Y0 Z0\n; move heatbed into position\nG1 X20.0 Y20.0 Z1.0 F1000\n; zero extruders\nG92 E0 E1\nT0; right tool\n; set extruder steps per mm\nM92 E140\n; purge nozzle\nG1 E25 F250\n; zero extruders\nG92 E0 E1\n; move heatbed down a little more\nG1 Z5.0 F20\n; wait 600ms\nG4 600\n; move to tack down the strands\nG1 X20.0 Y30.0 Z0 F9000\n; wait 600ms\nG4 600\n;move up a bit\nG1 Z5.0 F9000\n; wait 300ms\nG4 300\n;fast move to center\nG1 X152.5 Y152.5 F9000\nT0\n;Raise3D Job Start\nM117 Printing…\nM1001\n"
+ "default_value": "G90\nG21\n; home all axes\nG28\nG92 X0 Y0 Z0\n; move heatbed into position\nG1 X20.0 Y20.0 Z1.0 F1000\n; zero extruders\nG92 E0 E1\nT0; right tool\n; set extruder steps per mm\nM92 E140\n; purge nozzle\nG1 E25 F250\n; zero extruders\nG92 E0 E1\n; move heatbed down a little more\nG1 Z5.0 F20\n; wait 600ms\nG4 600\n; move to tack down the strands\nG1 X20.0 Y30.0 Z0 F9000\n; wait 600ms\nG4 600\n;move up a bit\nG1 Z5.0 F9000\n; wait 300ms\nG4 300\n;fast move to center\nG1 X152.5 Y152.5 F9000\nT0\n;Raise3D Job Start\nM117 Printing...\nM1001\n"
},
"machine_end_gcode": {
"default_value": "M107\nM1002\nM104 S0 T1\nM104 S0 T0\nM140 S0\nM117 Print Complete.\nG28 X0 Y0\nG91\nG1 Z10\nG90\nM84"
diff --git a/resources/definitions/raise3D_N2_single.def.json b/resources/definitions/raise3D_N2_single.def.json
index 899da5188f..e549b97b3b 100644
--- a/resources/definitions/raise3D_N2_single.def.json
+++ b/resources/definitions/raise3D_N2_single.def.json
@@ -66,7 +66,7 @@
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
- "default_value": "G90\nG21\n; home all axes\nG28\nG92 X0 Y0 Z0\n; move heatbed into position\nG1 X20.0 Y20.0 Z1.0 F1000\n; zero extruders\nG92 E0 E1\nT0; right tool\n; set extruder steps per mm\nM92 E140\n; purge nozzle\nG1 E25 F250\n; zero extruders\nG92 E0 E1\n; move heatbed down a little more\nG1 Z5.0 F20\n; wait 600ms\nG4 600\n; move to tack down the strands\nG1 X20.0 Y30.0 Z0 F9000\n; wait 600ms\nG4 600\n;move up a bit\nG1 Z5.0 F9000\n; wait 300ms\nG4 300\n;fast move to center\nG1 X152.5 Y152.5 F9000\nT0\n;Raise3D Job Start\nM117 Printing…\nM1001\n"
+ "default_value": "G90\nG21\n; home all axes\nG28\nG92 X0 Y0 Z0\n; move heatbed into position\nG1 X20.0 Y20.0 Z1.0 F1000\n; zero extruders\nG92 E0 E1\nT0; right tool\n; set extruder steps per mm\nM92 E140\n; purge nozzle\nG1 E25 F250\n; zero extruders\nG92 E0 E1\n; move heatbed down a little more\nG1 Z5.0 F20\n; wait 600ms\nG4 600\n; move to tack down the strands\nG1 X20.0 Y30.0 Z0 F9000\n; wait 600ms\nG4 600\n;move up a bit\nG1 Z5.0 F9000\n; wait 300ms\nG4 300\n;fast move to center\nG1 X152.5 Y152.5 F9000\nT0\n;Raise3D Job Start\nM117 Printing...\nM1001\n"
},
"machine_end_gcode": {
"default_value": "M107\nM1002\nM104 S0 T1\nM104 S0 T0\nM140 S0\nM117 Print Complete.\nG28 X0 Y0\nG91\nG1 Z10\nG90\nM84"
diff --git a/resources/definitions/renkforce_rf100.def.json b/resources/definitions/renkforce_rf100.def.json
index 41549fb531..2ff34a7519 100644
--- a/resources/definitions/renkforce_rf100.def.json
+++ b/resources/definitions/renkforce_rf100.def.json
@@ -183,7 +183,7 @@
"value": "False"
},
"support_infill_rate": {
- "value": "15.0"
+ "value": "15 if support_enable else 0 if support_tree_enable else 15"
},
"support_pattern": {
"default_value": "lines"
diff --git a/resources/definitions/stereotech_start.def.json b/resources/definitions/stereotech_start.def.json
new file mode 100644
index 0000000000..26c4b6a3a2
--- /dev/null
+++ b/resources/definitions/stereotech_start.def.json
@@ -0,0 +1,45 @@
+{
+ "version": 2,
+ "name": "Stereotech START",
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "author": "Stereotech",
+ "manufacturer": "Other",
+ "file_formats": "text/x-gcode",
+ "platform": "stereotech_start.stl",
+ "icon": "icon_ultimaker2",
+ "platform_offset": [0, 0, 0],
+ "machine_extruder_trains":
+ {
+ "0": "stereotech_start_extruder_0"
+ }
+ },
+
+ "overrides": {
+ "machine_heated_bed": {
+ "default_value": true
+ },
+ "machine_width": {
+ "default_value": 190
+ },
+ "machine_height": {
+ "default_value": 190
+ },
+ "machine_depth": {
+ "default_value": 190
+ },
+ "machine_gcode_flavor": {
+ "default_value": "RepRap (Marlin/Sprinter)"
+ },
+ "machine_start_gcode": {
+ "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home all axes (max endstops)\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
+ },
+ "machine_end_gcode": {
+ "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG28 ;Home all axes (max endstops)\nM84 ;steppers off\nG90 ;absolute positioning"
+ },
+ "machine_shape": {
+ "default_value": "rectangular"
+ }
+ }
+}
diff --git a/resources/definitions/stereotech_ste320.def.json b/resources/definitions/stereotech_ste320.def.json
new file mode 100644
index 0000000000..ba5d8595ee
--- /dev/null
+++ b/resources/definitions/stereotech_ste320.def.json
@@ -0,0 +1,89 @@
+{
+ "version": 2,
+ "name": "Stereotech STE320",
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "author": "Stereotech",
+ "manufacturer": "Stereotech LLC.",
+ "category": "Other",
+ "platform": "stereotech_ste320_platform.obj",
+ "platform_texture": "StereotechSte320backplate.png",
+ "platform_offset": [
+ 0,
+ 0,
+ -14
+ ],
+ "file_formats": "text/x-gcode",
+ "has_materials": true,
+ "supports_usb_connection": false,
+ "machine_extruder_trains": {
+ "0": "stereotech_ste320_1st",
+ "1": "stereotech_ste320_2nd"
+ }
+ },
+ "overrides": {
+ "machine_name": {
+ "default_value": "Stereotech STE320"
+ },
+ "machine_width": {
+ "default_value": 218
+ },
+ "machine_height": {
+ "default_value": 200
+ },
+ "machine_depth": {
+ "default_value": 210
+ },
+ "machine_center_is_zero": {
+ "default_value": false
+ },
+ "machine_heated_bed": {
+ "default_value": true
+ },
+ "machine_head_with_fans_polygon": {
+ "default_value": [
+ [
+ -29,
+ 22
+ ],
+ [
+ -29,
+ -20
+ ],
+ [
+ 27,
+ 22
+ ],
+ [
+ 27,
+ -20
+ ]
+ ]
+ },
+ "gantry_height": {
+ "default_value": 25
+ },
+ "machine_use_extruder_offset_to_offset_coords": {
+ "default_value": true
+ },
+ "machine_gcode_flavor": {
+ "default_value": "RepRap (Marlin/Sprinter)"
+ },
+ "machine_start_gcode": {
+ "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;homing\nG1 Z15.0 F9000 ;move the platform down 15mm\nT1 ;Switch to the 2nd extruder\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F200 E-{switch_extruder_retraction_amount}\nT0 ;Switch to the 1st extruder\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
+ },
+ "machine_end_gcode": {
+ "default_value": "M104 T0 S0 ;1st extruder heater off\nM104 T1 S0 ;2nd extruder heater off\nM140 S0 ;heated bed heater off\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
+ },
+ "machine_extruder_count": {
+ "default_value": 2
+ },
+ "prime_tower_position_x": {
+ "value": "195"
+ },
+ "prime_tower_position_y": {
+ "value": "149"
+ }
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/structur3d_discov3ry1_complete_um2plus.def.json b/resources/definitions/structur3d_discov3ry1_complete_um2plus.def.json
new file mode 100644
index 0000000000..2875b949be
--- /dev/null
+++ b/resources/definitions/structur3d_discov3ry1_complete_um2plus.def.json
@@ -0,0 +1,119 @@
+{
+ "version": 2,
+ "name": "Discov3ry Complete (Ultimaker 2+)",
+ "inherits": "fdmprinter",
+ "metadata": {
+ "author": "Andrew Finkle, CTO",
+ "manufacturer": "Structur3d.io",
+ "visible": true,
+ "weight": 1,
+ "file_formats": "text/x-gcode",
+ "platform": "ultimaker2_platform.obj",
+ "platform_texture": "Ultimaker2Plusbackplate.png",
+ "platform_offset": [0, 0, 0],
+ "has_materials": true,
+ "has_variants": true,
+ "variants_name": "Print core",
+ "preferred_variant_name": "0.84mm (Green)",
+ "has_machine_materials": true,
+ "preferred_material": "structur3d_dap100silicone",
+ "has_variant_materials": false,
+ "has_machine_quality": false,
+ "preferred_quality_type": "extra_fast",
+ "first_start_actions": [],
+ "supported_actions": [],
+ "machine_extruder_trains":
+ {
+ "0": "structur3d_discov3ry1_complete_um2plus_extruder_0"
+ },
+ "firmware_file": "MarlinUltimaker2plus.hex"
+ },
+
+ "overrides": {
+ "machine_name": { "default_value": "Discov3ry Complete (Ultimaker 2+)" },
+ "speed_infill": {
+ "value": "speed_print"
+ },
+ "infill_sparse_density": {
+ "value": 100
+ },
+ "retraction_hop_enabled": {
+ "value": true
+ },
+ "adhesion_type": {
+ "default_value": "skirt"
+ },
+ "skirt_brim_minimal_length": {
+ "value": 1500
+ },
+ "speed_print": {
+ "value": 15
+ },
+ "speed_wall_x": {
+ "value": "speed_wall"
+ },
+ "layer_height_0": {
+ "value": "round(machine_nozzle_size / 1.5, 2)"
+ },
+ "line_width": {
+ "value": "round(machine_nozzle_size * 0.875, 2)"
+ },
+ "speed_layer_0": {
+ "default_value": 10
+ },
+ "speed_support": {
+ "value": "speed_wall_0"
+ },
+ "machine_height": {
+ "default_value": 205
+ },
+ "machine_width": {
+ "default_value": 205
+ },
+ "machine_depth": {
+ "default_value": 205
+ },
+ "machine_show_variants": {
+ "default_value": true
+ },
+ "gantry_height": {
+ "default_value": 52
+ },
+ "machine_nozzle_head_distance": {
+ "default_value": 5
+ },
+ "machine_nozzle_expansion_angle": {
+ "default_value": 45
+ },
+ "machine_heat_zone_length": {
+ "default_value": 20
+ },
+ "machine_head_with_fans_polygon":
+ {
+ "default_value": [
+ [ -44, 14 ],
+ [ -44, -34 ],
+ [ 64, 14 ],
+ [ 64, -34 ]
+ ]
+ },
+ "machine_disallowed_areas": {
+ "default_value": [
+ [[-115, 112.5], [ -78, 112.5], [ -80, 102.5], [-115, 102.5]],
+ [[ 115, 112.5], [ 115, 102.5], [ 105, 102.5], [ 103, 112.5]],
+ [[-115, -112.5], [-115, -104.5], [ -84, -104.5], [ -82, -112.5]],
+ [[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]]
+ ]
+ },
+ "machine_gcode_flavor": {
+ "default_value": "RepRap (Marlin/Sprinter)"
+ },
+ "machine_start_gcode": {
+ "default_value": "\n;Updated Firmware (.hex and Marlin .ino) for \n;Ultimaker 2+ with Discov3ry Extruder available at: \n;https://github.com/Structur3d/UM2.1Discov3ry-Firmware-beta \n;**Learn more at https://www.structur3d.io** \n \nM104 S{material_print_temperature} ;Start heating extruder \nM140 S{material_bed_temperature} ;Start heating bed \nG21 ;metric values \nG90 ;absolute positioning \nM82 ;set extruder to absolute mode \nM107 ;start with the fan off \nM302 ;allow cold extrusion \nM92 E2589 ;set extruder EEPROM steps/mm for paste \nG28 Z0 ;move Z to bottom endstops \nG28 X0 Y0 ;move X/Y to endstops \nG1 X15 Y0 F4000 ;move X/Y to front of printer \nG1 Z15.0 F9000 ;move the platform to 15mm \nG92 E0 ;zero the extruded length \nG1 F200 E10 ;extrude 10 mm of feed stock \nG92 E0 ;zero the extruded length again \nG1 F9000 \n;Put printing message on LCD screen \nM117 Printing..."
+ },
+ "machine_end_gcode": {
+ "default_value": "M104 S0 ;extruder heater off \nM140 S0 ;heated bed heater off (if you have it) \nM92 E282 ;reset extruder EEPROM steps/mm for plastic filament \nG91 ;relative positioning \nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure \nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more \nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way \nM84 ;steppers off\nG90 ;absolute positioning"
+ }
+
+ }
+}
diff --git a/resources/definitions/tizyx_evy.def.json b/resources/definitions/tizyx_evy.def.json
index fe9a02a31c..a0bf5d76be 100644
--- a/resources/definitions/tizyx_evy.def.json
+++ b/resources/definitions/tizyx_evy.def.json
@@ -16,7 +16,7 @@
"preferred_variant_name": "0.4mm",
"preferred_material": "tizyx_pla",
"preferred_quality_type": "normal",
- "exclude_materials": ["chromatik_pla", "dsm_arnitel2045_175", "dsm_novamid1070_175", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "generic_bam", "generic_cpe", "generic_cpe_175", "generic_cpe_plus", "generic_hips", "generic_hips_175", "generic_nylon", "generic_nylon_175", "generic_pc", "generic_pc_175","generic_pp", "generic_pva", "generic_pva_175", "generic_tpu", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "ultimaker_abs_black", "ultimaker_abs_blue", "ultimaker_abs_green", "ultimaker_abs_grey", "ultimaker_abs_orange", "ultimaker_abs_pearl-gold", "ultimaker_abs_red", "ultimaker_abs_silver-metallic", "ultimaker_abs_white", "ultimaker_abs_yellow", "ultimaker_bam", "ultimaker_cpe_black", "ultimaker_cpe_blue", "ultimaker_cpe_dark-grey", "ultimaker_cpe_green", "ultimaker_cpe_light-grey", "ultimaker_cpe_plus_black", "ultimaker_cpe_plus_transparent", "ultimaker_cpe_plus_white", "ultimaker_cpe_red", "ultimaker_cpe_transparent", "ultimaker_cpe_white", "ultimaker_cpe_yellow", "ultimaker_nylon_black", "ultimaker_nylon_transparent", "ultimaker_pc_black", "ultimaker_pc_transparent", "ultimaker_pc_white", "ultimaker_pla_black", "ultimaker_pla_blue", "ultimaker_pla_green", "ultimaker_pla_magenta", "ultimaker_pla_orange", "ultimaker_pla_pearl-white", "ultimaker_pla_red", "ultimaker_pla_silver-metallic", "ultimaker_pla_transparent", "ultimaker_pla_white", "ultimaker_pla_yellow", "ultimaker_pp_transparent", "ultimaker_pva", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "ultimaker_tpu_black", "ultimaker_tpu_blue", "ultimaker_tpu_red", "ultimaker_tpu_white", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla" ],
+ "exclude_materials": ["chromatik_pla", "dsm_arnitel2045_175", "dsm_novamid1070_175", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "generic_bam", "generic_cpe", "generic_cpe_175", "generic_cpe_plus", "generic_hips", "generic_hips_175", "generic_nylon", "generic_nylon_175", "generic_pc", "generic_pc_175","generic_pp", "generic_pva", "generic_pva_175", "generic_tpu", "generic_tpu_175", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "ultimaker_abs_black", "ultimaker_abs_blue", "ultimaker_abs_green", "ultimaker_abs_grey", "ultimaker_abs_orange", "ultimaker_abs_pearl-gold", "ultimaker_abs_red", "ultimaker_abs_silver-metallic", "ultimaker_abs_white", "ultimaker_abs_yellow", "ultimaker_bam", "ultimaker_cpe_black", "ultimaker_cpe_blue", "ultimaker_cpe_dark-grey", "ultimaker_cpe_green", "ultimaker_cpe_light-grey", "ultimaker_cpe_plus_black", "ultimaker_cpe_plus_transparent", "ultimaker_cpe_plus_white", "ultimaker_cpe_red", "ultimaker_cpe_transparent", "ultimaker_cpe_white", "ultimaker_cpe_yellow", "ultimaker_nylon_black", "ultimaker_nylon_transparent", "ultimaker_pc_black", "ultimaker_pc_transparent", "ultimaker_pc_white", "ultimaker_pla_black", "ultimaker_pla_blue", "ultimaker_pla_green", "ultimaker_pla_magenta", "ultimaker_pla_orange", "ultimaker_pla_pearl-white", "ultimaker_pla_red", "ultimaker_pla_silver-metallic", "ultimaker_pla_transparent", "ultimaker_pla_white", "ultimaker_pla_yellow", "ultimaker_pp_transparent", "ultimaker_pva", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "ultimaker_tpu_black", "ultimaker_tpu_blue", "ultimaker_tpu_red", "ultimaker_tpu_white", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla" ],
"machine_extruder_trains":
{
diff --git a/resources/definitions/tizyx_evy_dual.def.json b/resources/definitions/tizyx_evy_dual.def.json
new file mode 100644
index 0000000000..2e5ed8b126
--- /dev/null
+++ b/resources/definitions/tizyx_evy_dual.def.json
@@ -0,0 +1,57 @@
+{
+ "name": "TiZYX EVY Dual",
+ "version": 2,
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "author": "TiZYX",
+ "manufacturer": "TiZYX",
+ "file_formats": "text/x-gcode",
+
+ "has_machine_quality": true,
+ "has_materials": true,
+ "has_machine_materials": true,
+ "has_variants": true,
+ "preferred_variant_name": "Classic Extruder",
+
+ "preferred_material": "tizyx_pla",
+ "preferred_quality_type": "normal",
+ "exclude_materials": ["chromatik_pla", "dsm_arnitel2045_175", "dsm_novamid1070_175", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "generic_cpe_175", "generic_cpe_plus","generic_hips_175","generic_nylon_175", "generic_pc_175", "generic_pva_175", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla" ],
+
+ "machine_extruder_trains":
+ {
+ "0": "tizyx_evy_dual_extruder_0",
+ "1": "tizyx_evy_dual_extruder_1"
+ },
+ "platform": "tizyx_k25_platform.stl",
+ "platform_offset": [0, -4, 0],
+ "first_start_actions": ["MachineSettingsAction"],
+ "supported_actions": ["MachineSettingsAction"]
+ },
+
+ "overrides": {
+ "machine_extruder_count": { "default_value": 2 },
+ "machine_heated_bed": { "default_value": true },
+ "machine_center_is_zero": { "default_value": false },
+ "gantry_height": { "default_value": 500 },
+ "machine_height": { "default_value": 255 },
+ "machine_depth": { "default_value": 255 },
+ "machine_width": { "default_value": 255 },
+ "machine_head_with_fans_polygon": {
+ "default_value": [
+ [25, 49],
+ [25, -49],
+ [-25, -49],
+ [25, 49]
+ ]
+ },
+ "machine_start_gcode":
+ {
+ "default_value": "M82\nG90\nG28 X\nG28 Y\nG28 Z\nG29\nG91\nG1 Z0\nG90\nM82\nG92 E0\nG1 X125 Y245 F3000\nG1 Z0"
+ },
+ "machine_end_gcode":
+ {
+ "default_value": "M104 S0\nM140 S0\nG91\nG1 E-5 F300\nG1 Z+3 F3000\nG1 Y245 F3000\nM84"
+ }
+ }
+}
diff --git a/resources/definitions/tizyx_k25.def.json b/resources/definitions/tizyx_k25.def.json
index d6a5ff5ecd..c076b214c7 100644
--- a/resources/definitions/tizyx_k25.def.json
+++ b/resources/definitions/tizyx_k25.def.json
@@ -10,7 +10,7 @@
"file_formats": "text/x-gcode",
"platform": "tizyx_k25_platform.stl",
"platform_offset": [0, -4, 0],
- "exclude_materials": ["chromatik_pla", "dsm_arnitel2045_175", "dsm_novamid1070_175", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "generic_abs", "generic_abs_175", "generic_bam", "generic_cpe", "generic_cpe_175", "generic_cpe_plus", "generic_hips", "generic_hips_175", "generic_nylon", "generic_nylon_175", "generic_pc", "generic_pc_175", "generic_petg", "generic_petg_175", "generic_pla", "generic_pla_175", "generic_pp", "generic_pva", "generic_pva_175", "generic_tough_pla", "generic_tpu", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "ultimaker_abs_black", "ultimaker_abs_blue", "ultimaker_abs_green", "ultimaker_abs_grey", "ultimaker_abs_orange", "ultimaker_abs_pearl-gold", "ultimaker_abs_red", "ultimaker_abs_silver-metallic", "ultimaker_abs_white", "ultimaker_abs_yellow", "ultimaker_bam", "ultimaker_cpe_black", "ultimaker_cpe_blue", "ultimaker_cpe_dark-grey", "ultimaker_cpe_green", "ultimaker_cpe_light-grey", "ultimaker_cpe_plus_black", "ultimaker_cpe_plus_transparent", "ultimaker_cpe_plus_white", "ultimaker_cpe_red", "ultimaker_cpe_transparent", "ultimaker_cpe_white", "ultimaker_cpe_yellow", "ultimaker_nylon_black", "ultimaker_nylon_transparent", "ultimaker_pc_black", "ultimaker_pc_transparent", "ultimaker_pc_white", "ultimaker_pla_black", "ultimaker_pla_blue", "ultimaker_pla_green", "ultimaker_pla_magenta", "ultimaker_pla_orange", "ultimaker_pla_pearl-white", "ultimaker_pla_red", "ultimaker_pla_silver-metallic", "ultimaker_pla_transparent", "ultimaker_pla_white", "ultimaker_pla_yellow", "ultimaker_pp_transparent", "ultimaker_pva", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "ultimaker_tpu_black", "ultimaker_tpu_blue", "ultimaker_tpu_red", "ultimaker_tpu_white", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla" ],
+ "exclude_materials": ["chromatik_pla", "dsm_arnitel2045_175", "dsm_novamid1070_175", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "generic_abs", "generic_abs_175", "generic_bam", "generic_cpe", "generic_cpe_175", "generic_cpe_plus", "generic_hips", "generic_hips_175", "generic_nylon", "generic_nylon_175", "generic_pc", "generic_pc_175", "generic_petg", "generic_petg_175", "generic_pla", "generic_pla_175", "generic_pp", "generic_pva", "generic_pva_175", "generic_tough_pla", "generic_tpu", "generic_tpu_175", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "ultimaker_abs_black", "ultimaker_abs_blue", "ultimaker_abs_green", "ultimaker_abs_grey", "ultimaker_abs_orange", "ultimaker_abs_pearl-gold", "ultimaker_abs_red", "ultimaker_abs_silver-metallic", "ultimaker_abs_white", "ultimaker_abs_yellow", "ultimaker_bam", "ultimaker_cpe_black", "ultimaker_cpe_blue", "ultimaker_cpe_dark-grey", "ultimaker_cpe_green", "ultimaker_cpe_light-grey", "ultimaker_cpe_plus_black", "ultimaker_cpe_plus_transparent", "ultimaker_cpe_plus_white", "ultimaker_cpe_red", "ultimaker_cpe_transparent", "ultimaker_cpe_white", "ultimaker_cpe_yellow", "ultimaker_nylon_black", "ultimaker_nylon_transparent", "ultimaker_pc_black", "ultimaker_pc_transparent", "ultimaker_pc_white", "ultimaker_pla_black", "ultimaker_pla_blue", "ultimaker_pla_green", "ultimaker_pla_magenta", "ultimaker_pla_orange", "ultimaker_pla_pearl-white", "ultimaker_pla_red", "ultimaker_pla_silver-metallic", "ultimaker_pla_transparent", "ultimaker_pla_white", "ultimaker_pla_yellow", "ultimaker_pp_transparent", "ultimaker_pva", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "ultimaker_tpu_black", "ultimaker_tpu_blue", "ultimaker_tpu_red", "ultimaker_tpu_white", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla" ],
"preferred_material": "tizyx_pla",
"has_machine_quality": true,
"has_materials": true,
diff --git a/resources/definitions/ultimaker.def.json b/resources/definitions/ultimaker.def.json
index a980a1afdf..aec7907dbe 100644
--- a/resources/definitions/ultimaker.def.json
+++ b/resources/definitions/ultimaker.def.json
@@ -7,7 +7,7 @@
"manufacturer": "Ultimaker B.V.",
"category": "Ultimaker",
"visible": false,
- "exclude_materials": [ "generic_hips", "generic_petg" ]
+ "exclude_materials": [ "generic_hips", "generic_petg", "structur3d_dap100silicone" ]
},
"overrides": {
"machine_max_feedrate_e": {
diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json
index 4cc291ff45..88731bc297 100644
--- a/resources/definitions/ultimaker2.def.json
+++ b/resources/definitions/ultimaker2.def.json
@@ -14,7 +14,6 @@
"has_materials": false,
"has_machine_quality": true,
"preferred_variant_name": "0.4 mm",
- "exclude_materials": ["generic_hips", "generic_petg", "generic_bam", "ultimaker_bam", "generic_pva", "ultimaker_pva", "generic_tough_pla", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white"],
"first_start_actions": ["UM2UpgradeSelection"],
"supported_actions":["UM2UpgradeSelection"],
"machine_extruder_trains":
diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json
index 28fd2b71f9..dd97e944d6 100644
--- a/resources/definitions/ultimaker2_plus.def.json
+++ b/resources/definitions/ultimaker2_plus.def.json
@@ -14,6 +14,7 @@
"has_materials": true,
"has_machine_materials": true,
"has_machine_quality": true,
+ "exclude_materials": ["generic_hips", "generic_petg", "generic_bam", "ultimaker_bam", "generic_pva", "ultimaker_pva", "generic_tough_pla", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "generic_cffcpe", "generic_cffpa", "generic_gffcpe", "generic_gffpa", "structur3d_dap100silicone" ],
"first_start_actions": [],
"supported_actions": [],
"machine_extruder_trains":
diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json
index 72756de2a5..3535661245 100644
--- a/resources/definitions/ultimaker3.def.json
+++ b/resources/definitions/ultimaker3.def.json
@@ -14,6 +14,7 @@
"has_materials": true,
"has_machine_materials": true,
"has_variants": true,
+ "exclude_materials": [ "generic_hips", "generic_petg", "generic_cffcpe", "generic_cffpa", "generic_gffcpe", "generic_gffpa", "structur3d_dap100silicone" ],
"preferred_variant_name": "AA 0.4",
"preferred_quality_type": "normal",
"variants_name": "Print core",
@@ -25,12 +26,12 @@
"first_start_actions": [ "DiscoverUM3Action" ],
"supported_actions": [ "DiscoverUM3Action" ],
"supports_usb_connection": false,
+ "supports_network_connection": true,
"firmware_update_info": {
"id": 9066,
"check_urls":
[
- "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources",
- "http://software.ultimaker.com/releases/firmware/9066/stable/version.txt"
+ "http://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version"
],
"update_url": "https://ultimaker.com/firmware"
}
@@ -78,7 +79,7 @@
"prime_tower_position_x": { "value": "machine_depth - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) - 30" },
"prime_tower_wipe_enabled": { "default_value": false },
- "prime_blob_enable": { "enabled": true },
+ "prime_blob_enable": { "enabled": true, "default_value": true },
"acceleration_enabled": { "value": "True" },
"acceleration_layer_0": { "value": "acceleration_topbottom" },
@@ -118,7 +119,6 @@
"material_bed_temperature": { "maximum_value": "115" },
"material_bed_temperature_layer_0": { "maximum_value": "115" },
"material_standby_temperature": { "value": "100" },
- "meshfix_maximum_resolution": { "value": "0.04" },
"multiple_mesh_overlap": { "value": "0" },
"optimize_wall_printing_order": { "value": "True" },
"prime_tower_enable": { "default_value": true },
diff --git a/resources/definitions/ultimaker3_extended.def.json b/resources/definitions/ultimaker3_extended.def.json
index 68f26969b7..43f7b94e61 100644
--- a/resources/definitions/ultimaker3_extended.def.json
+++ b/resources/definitions/ultimaker3_extended.def.json
@@ -28,8 +28,7 @@
"id": 9511,
"check_urls":
[
- "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources",
- "http://software.ultimaker.com/releases/firmware/9511/stable/version.txt"
+ "http://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version"
],
"update_url": "https://ultimaker.com/firmware"
}
diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json
index 6a978c47cb..b0637625af 100644
--- a/resources/definitions/ultimaker_original.def.json
+++ b/resources/definitions/ultimaker_original.def.json
@@ -11,9 +11,9 @@
"platform": "ultimaker_platform.stl",
"has_materials": true,
"has_machine_quality": true,
- "exclude_materials": ["generic_hips", "generic_petg", "generic_bam", "ultimaker_bam", "generic_pva", "ultimaker_pva", "generic_tough_pla", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white"],
- "first_start_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel"],
- "supported_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel"],
+ "exclude_materials": ["generic_hips", "generic_petg", "generic_bam", "ultimaker_bam", "generic_pva", "ultimaker_pva", "generic_tough_pla", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "generic_cffcpe", "generic_cffpa", "generic_gffcpe", "generic_gffpa", "structur3d_dap100silicone" ],
+ "first_start_actions": ["UMOUpgradeSelection", "BedLevel"],
+ "supported_actions": ["UMOUpgradeSelection", "BedLevel"],
"machine_extruder_trains":
{
"0": "ultimaker_original_extruder_0"
diff --git a/resources/definitions/ultimaker_original_dual.def.json b/resources/definitions/ultimaker_original_dual.def.json
index 999650aa28..cbc98f31a3 100644
--- a/resources/definitions/ultimaker_original_dual.def.json
+++ b/resources/definitions/ultimaker_original_dual.def.json
@@ -12,7 +12,7 @@
"has_materials": true,
"has_machine_quality": true,
"quality_definition": "ultimaker_original",
- "exclude_materials": ["generic_hips", "generic_petg", "generic_bam", "ultimaker_bam", "generic_pva", "ultimaker_pva", "generic_tough_pla", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white"],
+ "exclude_materials": ["generic_hips", "generic_petg", "generic_bam", "ultimaker_bam", "generic_pva", "ultimaker_pva", "generic_tough_pla", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "generic_cffcpe", "generic_cffpa", "generic_gffcpe", "generic_gffpa", "structur3d_dap100silicone" ],
"machine_extruder_trains":
{
"0": "ultimaker_original_dual_1st",
@@ -20,8 +20,8 @@
},
"firmware_file": "MarlinUltimaker-{baudrate}-dual.hex",
"firmware_hbk_file": "MarlinUltimaker-HBK-{baudrate}-dual.hex",
- "first_start_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel"],
- "supported_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel"]
+ "first_start_actions": ["UMOUpgradeSelection", "BedLevel"],
+ "supported_actions": ["UMOUpgradeSelection", "BedLevel"]
},
"overrides": {
diff --git a/resources/definitions/ultimaker_original_plus.def.json b/resources/definitions/ultimaker_original_plus.def.json
index bdb8a3d788..949e2e8d0d 100644
--- a/resources/definitions/ultimaker_original_plus.def.json
+++ b/resources/definitions/ultimaker_original_plus.def.json
@@ -10,8 +10,8 @@
"platform": "ultimaker2_platform.obj",
"platform_texture": "UltimakerPlusbackplate.png",
"quality_definition": "ultimaker_original",
- "first_start_actions": ["UMOCheckup", "BedLevel"],
- "supported_actions": ["UMOCheckup", "BedLevel"],
+ "first_start_actions": ["BedLevel"],
+ "supported_actions": ["BedLevel"],
"machine_extruder_trains":
{
"0": "ultimaker_original_plus_extruder_0"
diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json
index 310765dbc3..41808c134f 100644
--- a/resources/definitions/ultimaker_s5.def.json
+++ b/resources/definitions/ultimaker_s5.def.json
@@ -30,10 +30,11 @@
"first_start_actions": [ "DiscoverUM3Action" ],
"supported_actions": [ "DiscoverUM3Action" ],
"supports_usb_connection": false,
+ "supports_network_connection": true,
"weight": -1,
"firmware_update_info": {
"id": 9051,
- "check_urls": ["http://software.ultimaker.com/releases/firmware/9051/stable/version.txt"],
+ "check_urls": ["http://software.ultimaker.com/releases/firmware/9051/stable/um-update.swu.version"],
"update_url": "https://ultimaker.com/firmware"
}
},
@@ -156,7 +157,8 @@
"wall_0_inset": { "value": "0" },
"wall_line_width_x": { "value": "round(line_width * 0.3 / 0.35, 2)" },
"wall_thickness": { "value": "1" },
- "meshfix_maximum_resolution": { "value": "0.04" },
+ "meshfix_maximum_resolution": { "value": "(speed_wall_0 + speed_wall_x) / 60" },
+ "meshfix_maximum_deviation": { "value": "layer_height / 2" },
"optimize_wall_printing_order": { "value": "True" },
"retraction_combing": { "default_value": "all" },
"initial_layer_line_width_factor": { "value": "120" },
diff --git a/resources/definitions/wanhao_d9.def.json b/resources/definitions/wanhao_d9.def.json
index 4e368f970f..39ad139ff8 100644
--- a/resources/definitions/wanhao_d9.def.json
+++ b/resources/definitions/wanhao_d9.def.json
@@ -23,10 +23,10 @@
"machine_heated_bed": { "default_value": true },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
- "default_value": "G21 ;metric values\n G90 ;absolute positioning\n M82 ;set extruder to absolute mode\n M107 ;start with the fan off\n G28 X0 Y0 ;move X/Y to min endstops\n G28 Z0 ;move Z to min endstops\n G1 Z15.0 F{travel_speed} ;move the platform down 15mm\n G92 E0 ;zero the extruded length\n G1 F200 E6 ;extrude 6 mm of feed stock\n G92 E0 ;zero the extruded length again\n G1 F{travel_speed} \n ;Put printing message on LCD screen\n M117 Printing..."
+ "default_value": "G21 ;metric values\n G90 ;absolute positioning\n M82 ;set extruder to absolute mode\n M107 ;start with the fan off\n G28 X0 Y0 ;move X/Y to min endstops\n G28 Z0 ;move Z to min endstops\n G1 Z15.0 F{speed_travel} ;move the platform down 15mm\n G92 E0 ;zero the extruded length\n G1 F200 E6 ;extrude 6 mm of feed stock\n G92 E0 ;zero the extruded length again\n G1 F{speed_travel} \n ;Put printing message on LCD screen\n M117 Printing..."
},
"machine_end_gcode": {
- "default_value": "M104 S0 ;extruder heater off \n G91 ;relative positioning\n G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n G1 Z+0.5 E-5 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\n G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n M84 ;steppers off\n G90 ;absolute positioning"
+ "default_value": "M104 S0 ;extruder heater off \n G91 ;relative positioning\n G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n G1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\n G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n M84 ;steppers off\n G90 ;absolute positioning"
},
"support_angle": { "default_value": 60 },
"support_enable": { "default_value": true },
diff --git a/resources/definitions/winbo_dragonl4.def.json b/resources/definitions/winbo_dragonl4.def.json
index 0ca68cdcee..132303f525 100644
--- a/resources/definitions/winbo_dragonl4.def.json
+++ b/resources/definitions/winbo_dragonl4.def.json
@@ -126,7 +126,7 @@
"support_bottom_height": { "value": "max((0.15 if(0.15%layer_height==0) else layer_height*int((0.15+layer_height)/layer_height)),layer_height)" },
"support_bottom_pattern": { "value": "'zigzag'" },
"support_connect_zigzags": { "value": "False" },
- "support_infill_rate": { "value": "8" },
+ "support_infill_rate": { "value": "8 if support_enable else 0 if support_tree_enable else 8" },
"support_interface_density": { "value": "80" },
"support_interface_enable": { "value": "True" },
"support_interface_height": { "value": "0.5" },
diff --git a/resources/definitions/winbo_mini2.def.json b/resources/definitions/winbo_mini2.def.json
index 7393fdf910..81bb737cff 100644
--- a/resources/definitions/winbo_mini2.def.json
+++ b/resources/definitions/winbo_mini2.def.json
@@ -126,7 +126,7 @@
"support_bottom_height": { "value": "max((0.15 if(0.15%layer_height==0) else layer_height*int((0.15+layer_height)/layer_height)),layer_height)" },
"support_bottom_pattern": { "value": "'zigzag'" },
"support_connect_zigzags": { "value": "False" },
- "support_infill_rate": { "value": "8" },
+ "support_infill_rate": { "value": "8 if support_enable else 0 if support_tree_enable else 8" },
"support_interface_density": { "value": "80" },
"support_interface_enable": { "value": "True" },
"support_interface_height": { "value": "0.5" },
diff --git a/resources/definitions/winbo_superhelper105.def.json b/resources/definitions/winbo_superhelper105.def.json
index 59e71fb446..2e89276dcd 100644
--- a/resources/definitions/winbo_superhelper105.def.json
+++ b/resources/definitions/winbo_superhelper105.def.json
@@ -115,7 +115,7 @@
"support_bottom_height": { "value": "max((0.15 if(0.15%layer_height==0) else layer_height*int((0.15+layer_height)/layer_height)),layer_height)" },
"support_bottom_pattern": { "value": "'zigzag'" },
"support_connect_zigzags": { "value": "False" },
- "support_infill_rate": { "value": "8" },
+ "support_infill_rate": { "value": "8 if support_enable else 0 if support_tree_enable else 8" },
"support_interface_density": { "value": "80" },
"support_interface_enable": { "value": "True" },
"support_interface_height": { "value": "0.5" },
diff --git a/resources/extruders/Mark2_extruder1.def.json b/resources/extruders/Mark2_extruder1.def.json
new file mode 100644
index 0000000000..915c331083
--- /dev/null
+++ b/resources/extruders/Mark2_extruder1.def.json
@@ -0,0 +1,19 @@
+{
+ "id": "Mark2_extruder1",
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "Mark2_for_Ultimaker2",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 0,
+ "maximum_value": "1"
+ },
+ "machine_nozzle_offset_x": { "default_value": 0.0 },
+ "machine_nozzle_offset_y": { "default_value": 0.0 }
+ }
+}
diff --git a/resources/extruders/Mark2_extruder2.def.json b/resources/extruders/Mark2_extruder2.def.json
new file mode 100644
index 0000000000..2c05a09391
--- /dev/null
+++ b/resources/extruders/Mark2_extruder2.def.json
@@ -0,0 +1,19 @@
+{
+ "id": "Mark2_extruder2",
+ "version": 2,
+ "name": "Extruder 2",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "Mark2_for_Ultimaker2",
+ "position": "1"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 1,
+ "maximum_value": "1"
+ },
+ "machine_nozzle_offset_x": { "default_value": 0.0 },
+ "machine_nozzle_offset_y": { "default_value": 0.0 }
+ }
+}
diff --git a/resources/extruders/anet_a6_extruder_0.def.json b/resources/extruders/anet_a6_extruder_0.def.json
new file mode 100644
index 0000000000..704d3a55ca
--- /dev/null
+++ b/resources/extruders/anet_a6_extruder_0.def.json
@@ -0,0 +1,16 @@
+{
+ "id": "anet_a6_extruder_0",
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "anet_a6",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.4 },
+ "material_diameter": { "default_value": 1.75 }
+ }
+}
diff --git a/resources/extruders/anycubic_chiron_extruder_0.def.json b/resources/extruders/anycubic_chiron_extruder_0.def.json
new file mode 100644
index 0000000000..cc48df08bb
--- /dev/null
+++ b/resources/extruders/anycubic_chiron_extruder_0.def.json
@@ -0,0 +1,16 @@
+{
+ "id": "anycubic_chiron_extruder_0",
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "anycubic_chiron",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.4 },
+ "material_diameter": { "default_value": 1.75 }
+ }
+}
diff --git a/resources/extruders/deltacomb_extruder_0.def.json b/resources/extruders/deltacomb_extruder_0.def.json
index 046becfd82..64c512b7fe 100755
--- a/resources/extruders/deltacomb_extruder_0.def.json
+++ b/resources/extruders/deltacomb_extruder_0.def.json
@@ -9,8 +9,10 @@
},
"overrides": {
- "extruder_nr": { "default_value": 0 },
- "machine_nozzle_size": { "default_value": 0.4 },
- "material_diameter": { "default_value": 1.75 }
+ "extruder_nr": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.4 },
+ "material_diameter": { "default_value": 1.75 },
+ "machine_nozzle_offset_x": { "default_value": 0.0 },
+ "machine_nozzle_offset_y": { "default_value": 0.0 }
}
}
diff --git a/resources/extruders/deltacomb_extruder_1.def.json b/resources/extruders/deltacomb_extruder_1.def.json
new file mode 100755
index 0000000000..1657688482
--- /dev/null
+++ b/resources/extruders/deltacomb_extruder_1.def.json
@@ -0,0 +1,18 @@
+{
+ "id": "deltacomb_extruder_1",
+ "version": 2,
+ "name": "Extruder 2",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "deltacomb",
+ "position": "1"
+ },
+
+ "overrides": {
+ "extruder_nr": { "default_value": 1 },
+ "machine_nozzle_size": { "default_value": 0.4 },
+ "material_diameter": { "default_value": 1.75 },
+ "machine_nozzle_offset_x": { "default_value": 0.0 },
+ "machine_nozzle_offset_y": { "default_value": 0.0 }
+ }
+}
diff --git a/resources/extruders/hms434_tool_1.def.json b/resources/extruders/hms434_tool_1.def.json
new file mode 100644
index 0000000000..c07a89bf44
--- /dev/null
+++ b/resources/extruders/hms434_tool_1.def.json
@@ -0,0 +1,26 @@
+{
+ "id": "hms434_tool_1",
+ "version": 2,
+ "name": "Tool 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "hms434",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 0,
+ "maximum_value": "8"
+ },
+ "machine_nozzle_offset_x": { "default_value": 0.0 },
+ "machine_nozzle_offset_y": { "default_value": 0.0 },
+ "material_diameter": { "default_value": 1.75 },
+ "machine_extruder_start_code": {
+ "default_value": "\n;start T0\n\nM117 changing tool....\nM109 T0 S{material_print_temperature}\n\nG1 Y-47 F9000; wipe\nG1 X150 Y10 F9000\n\nM117 printing...\n"
+ },
+ "machine_extruder_end_code": {
+ "default_value": "\nM104 T0 S{material_standby_temperature}\nG1 X150 Y10 F9000\nG1 X-47 Y47 F9000 ; go to wipe position\nG1 X0 Y-100 F3000; wipe\nG1 X-44 F9000\n;end T0\n\n"
+ }
+ }
+}
diff --git a/resources/extruders/hms434_tool_2.def.json b/resources/extruders/hms434_tool_2.def.json
new file mode 100644
index 0000000000..f5ed69533d
--- /dev/null
+++ b/resources/extruders/hms434_tool_2.def.json
@@ -0,0 +1,26 @@
+{
+ "id": "hms434_tool_2",
+ "version": 2,
+ "name": "Tool 2",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "hms434",
+ "position": "1"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 1,
+ "maximum_value": "8"
+ },
+ "machine_nozzle_offset_x": { "default_value": 20.0 },
+ "machine_nozzle_offset_y": { "default_value": 0.0 },
+ "material_diameter": { "default_value": 1.75 },
+ "machine_extruder_start_code": {
+ "default_value": "\n;start T1\n\nM117 changing tool....\nM109 T1 S{material_print_temperature}\n\nG1 Y-47 F9000; wipe\nG1 X150 Y10 F9000\n\nM117 printing...\n"
+ },
+ "machine_extruder_end_code": {
+ "default_value": "\nM104 T1 S{material_standby_temperature}\nG1 X150 Y10 F9000\nG1 X-47 Y47 F9000 ; go to wipe position\nG1 X0 Y-100 F3000; wipe\nG1 X-44 F9000\n;end T1\n\n"
+ }
+ }
+}
diff --git a/resources/extruders/hms434_tool_3.def.json b/resources/extruders/hms434_tool_3.def.json
new file mode 100644
index 0000000000..95f774fe54
--- /dev/null
+++ b/resources/extruders/hms434_tool_3.def.json
@@ -0,0 +1,26 @@
+{
+ "id": "hms434_tool_3",
+ "version": 2,
+ "name": "Tool 3",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "hms434",
+ "position": "2"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 2,
+ "maximum_value": "8"
+ },
+ "machine_nozzle_offset_x": { "default_value": 0.0 },
+ "machine_nozzle_offset_y": { "default_value": 0.0 },
+ "material_diameter": { "default_value": 1.75 },
+ "machine_extruder_start_code": {
+ "default_value": "\n;start Tool 3\n\n"
+ },
+ "machine_extruder_end_code": {
+ "default_value": "\n;end Tool 3\n\n"
+ }
+ }
+}
diff --git a/resources/extruders/hms434_tool_4.def.json b/resources/extruders/hms434_tool_4.def.json
new file mode 100644
index 0000000000..bab0a4659a
--- /dev/null
+++ b/resources/extruders/hms434_tool_4.def.json
@@ -0,0 +1,26 @@
+{
+ "id": "hms434_tool_4",
+ "version": 2,
+ "name": "Tool 4",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "hms434",
+ "position": "3"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 3,
+ "maximum_value": "8"
+ },
+ "machine_nozzle_offset_x": { "default_value": 0.0 },
+ "machine_nozzle_offset_y": { "default_value": 0.0 },
+ "material_diameter": { "default_value": 1.75 },
+ "machine_extruder_start_code": {
+ "default_value": "\n;start T0\n\nM104 T0 S{material_print_temperature_layer_0}\nG1 X65 Y35 F9000 ; go to wipe position\nM109 T0 S{material_print_temperature_layer_0}; wait for temp\nG1 E10 F300; prime\nG92 E0\nG1 X45 Y15 F3000; wipe\nG1 X55 F9000\nG1 Y35 F6000; wipe again\n\nM117 printing...\n"
+ },
+ "machine_extruder_end_code": {
+ "default_value": "\nM104 T0 S{material_standby_temperature}\nG1 X65 Y35 F9000 ; go to wipe position\nM109 T0 R{material_standby_temperature}; wait for temp\nG1 X45 Y15 F3000; wipe\nG1 X55 F9000\nG1 Y35 F6000; wipe again\n\n;end T0\n\n"
+ }
+ }
+}
diff --git a/resources/extruders/hms434_tool_5.def.json b/resources/extruders/hms434_tool_5.def.json
new file mode 100644
index 0000000000..30f44a2d65
--- /dev/null
+++ b/resources/extruders/hms434_tool_5.def.json
@@ -0,0 +1,26 @@
+{
+ "id": "hms434_tool_5",
+ "version": 2,
+ "name": "Tool 5",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "hms434",
+ "position": "4"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 4,
+ "maximum_value": "8"
+ },
+ "machine_nozzle_offset_x": { "default_value": 0.0 },
+ "machine_nozzle_offset_y": { "default_value": 0.0 },
+ "material_diameter": { "default_value": 1.75 },
+ "machine_extruder_start_code": {
+ "default_value": "\n;start T0\n\nM104 T0 S{material_print_temperature_layer_0}\nG1 X65 Y35 F9000 ; go to wipe position\nM109 T0 S{material_print_temperature_layer_0}; wait for temp\nG1 E10 F300; prime\nG92 E0\nG1 X45 Y15 F3000; wipe\nG1 X55 F9000\nG1 Y35 F6000; wipe again\n\nM117 printing...\n"
+ },
+ "machine_extruder_end_code": {
+ "default_value": "\nM104 T0 S{material_standby_temperature}\nG1 X65 Y35 F9000 ; go to wipe position\nM109 T0 R{material_standby_temperature}; wait for temp\nG1 X45 Y15 F3000; wipe\nG1 X55 F9000\nG1 Y35 F6000; wipe again\n\n;end T0\n\n"
+ }
+ }
+}
diff --git a/resources/extruders/hms434_tool_6.def.json b/resources/extruders/hms434_tool_6.def.json
new file mode 100644
index 0000000000..221c3135fc
--- /dev/null
+++ b/resources/extruders/hms434_tool_6.def.json
@@ -0,0 +1,26 @@
+{
+ "id": "hms434_tool_6",
+ "version": 2,
+ "name": "Tool 6",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "hms434",
+ "position": "5"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 5,
+ "maximum_value": "8"
+ },
+ "machine_nozzle_offset_x": { "default_value": 0.0 },
+ "machine_nozzle_offset_y": { "default_value": 0.0 },
+ "material_diameter": { "default_value": 1.75 },
+ "machine_extruder_start_code": {
+ "default_value": "\n;start T0\n\nM104 T0 S{material_print_temperature_layer_0}\nG1 X65 Y35 F9000 ; go to wipe position\nM109 T0 S{material_print_temperature_layer_0}; wait for temp\nG1 E10 F300; prime\nG92 E0\nG1 X45 Y15 F3000; wipe\nG1 X55 F9000\nG1 Y35 F6000; wipe again\n\nM117 printing...\n"
+ },
+ "machine_extruder_end_code": {
+ "default_value": "\nM104 T0 S{material_standby_temperature}\nG1 X65 Y35 F9000 ; go to wipe position\nM109 T0 R{material_standby_temperature}; wait for temp\nG1 X45 Y15 F3000; wipe\nG1 X55 F9000\nG1 Y35 F6000; wipe again\n\n;end T0\n\n"
+ }
+ }
+}
diff --git a/resources/extruders/hms434_tool_7.def.json b/resources/extruders/hms434_tool_7.def.json
new file mode 100644
index 0000000000..56f0e7f14b
--- /dev/null
+++ b/resources/extruders/hms434_tool_7.def.json
@@ -0,0 +1,26 @@
+{
+ "id": "hms434_tool_7",
+ "version": 2,
+ "name": "Tool 7",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "hms434",
+ "position": "6"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 6,
+ "maximum_value": "8"
+ },
+ "machine_nozzle_offset_x": { "default_value": 0.0 },
+ "machine_nozzle_offset_y": { "default_value": 0.0 },
+ "material_diameter": { "default_value": 1.75 },
+ "machine_extruder_start_code": {
+ "default_value": "\n;start T0\n\nM104 T0 S{material_print_temperature_layer_0}\nG1 X65 Y35 F9000 ; go to wipe position\nM109 T0 S{material_print_temperature_layer_0}; wait for temp\nG1 E10 F300; prime\nG92 E0\nG1 X45 Y15 F3000; wipe\nG1 X55 F9000\nG1 Y35 F6000; wipe again\n\nM117 printing...\n"
+ },
+ "machine_extruder_end_code": {
+ "default_value": "\nM104 T0 S{material_standby_temperature}\nG1 X65 Y35 F9000 ; go to wipe position\nM109 T0 R{material_standby_temperature}; wait for temp\nG1 X45 Y15 F3000; wipe\nG1 X55 F9000\nG1 Y35 F6000; wipe again\n\n;end T0\n\n"
+ }
+ }
+}
diff --git a/resources/extruders/hms434_tool_8.def.json b/resources/extruders/hms434_tool_8.def.json
new file mode 100644
index 0000000000..6b08aab9c4
--- /dev/null
+++ b/resources/extruders/hms434_tool_8.def.json
@@ -0,0 +1,26 @@
+{
+ "id": "hms434_tool_8",
+ "version": 2,
+ "name": "Tool 8",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "hms434",
+ "position": "7"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 7,
+ "maximum_value": "8"
+ },
+ "machine_nozzle_offset_x": { "default_value": 0.0 },
+ "machine_nozzle_offset_y": { "default_value": 0.0 },
+ "material_diameter": { "default_value": 1.75 },
+ "machine_extruder_start_code": {
+ "default_value": "\n;start T0\n\nM104 T0 S{material_print_temperature_layer_0}\nG1 X65 Y35 F9000 ; go to wipe position\nM109 T0 S{material_print_temperature_layer_0}; wait for temp\nG1 E10 F300; prime\nG92 E0\nG1 X45 Y15 F3000; wipe\nG1 X55 F9000\nG1 Y35 F6000; wipe again\n\nM117 printing...\n"
+ },
+ "machine_extruder_end_code": {
+ "default_value": "\nM104 T0 S{material_standby_temperature}\nG1 X65 Y35 F9000 ; go to wipe position\nM109 T0 R{material_standby_temperature}; wait for temp\nG1 X45 Y15 F3000; wipe\nG1 X55 F9000\nG1 Y35 F6000; wipe again\n\n;end T0\n\n"
+ }
+ }
+}
diff --git a/resources/extruders/jgaurora_jgmaker_magic_extruder_0.def.json b/resources/extruders/jgaurora_jgmaker_magic_extruder_0.def.json
new file mode 100644
index 0000000000..41593a4821
--- /dev/null
+++ b/resources/extruders/jgaurora_jgmaker_magic_extruder_0.def.json
@@ -0,0 +1,16 @@
+{
+ "id": "jgaurora_jgmaker_magic_extruder_0",
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "jgaurora_jgmaker_magic",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.4 },
+ "material_diameter": { "default_value": 1.75 }
+ }
+}
diff --git a/resources/extruders/stereotech_start_extruder_0.def.json b/resources/extruders/stereotech_start_extruder_0.def.json
new file mode 100644
index 0000000000..8658944ebd
--- /dev/null
+++ b/resources/extruders/stereotech_start_extruder_0.def.json
@@ -0,0 +1,16 @@
+{
+ "id": "stereotech_start_extruder_0",
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "stereotech_start",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.4 },
+ "material_diameter": { "default_value": 1.75 }
+ }
+}
\ No newline at end of file
diff --git a/resources/extruders/stereotech_ste320_1st.def.json b/resources/extruders/stereotech_ste320_1st.def.json
new file mode 100644
index 0000000000..ffbf5bde2f
--- /dev/null
+++ b/resources/extruders/stereotech_ste320_1st.def.json
@@ -0,0 +1,46 @@
+{
+ "id": "stereotech_ste320_1st",
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "stereotech_ste320",
+ "position": "0"
+ },
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 0,
+ "maximum_value": "1"
+ },
+ "machine_nozzle_offset_x": {
+ "default_value": 0.0
+ },
+ "machine_nozzle_offset_y": {
+ "default_value": 0.0
+ },
+ "machine_nozzle_size": {
+ "default_value": 0.4
+ },
+ "material_diameter": {
+ "default_value": 1.75
+ },
+ "machine_extruder_start_pos_abs": {
+ "default_value": true
+ },
+ "machine_extruder_start_pos_x": {
+ "value": "prime_tower_position_x"
+ },
+ "machine_extruder_start_pos_y": {
+ "value": "prime_tower_position_y"
+ },
+ "machine_extruder_end_pos_abs": {
+ "default_value": true
+ },
+ "machine_extruder_end_pos_x": {
+ "value": "prime_tower_position_x"
+ },
+ "machine_extruder_end_pos_y": {
+ "value": "prime_tower_position_y"
+ }
+ }
+}
\ No newline at end of file
diff --git a/resources/extruders/stereotech_ste320_2nd.def.json b/resources/extruders/stereotech_ste320_2nd.def.json
new file mode 100644
index 0000000000..ae1b8f0f15
--- /dev/null
+++ b/resources/extruders/stereotech_ste320_2nd.def.json
@@ -0,0 +1,46 @@
+{
+ "id": "stereotech_ste320_2nd",
+ "version": 2,
+ "name": "Extruder 2",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "stereotech_ste320",
+ "position": "1"
+ },
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 1,
+ "maximum_value": "1"
+ },
+ "machine_nozzle_offset_x": {
+ "default_value": 18.0
+ },
+ "machine_nozzle_offset_y": {
+ "default_value": 0.0
+ },
+ "machine_nozzle_size": {
+ "default_value": 0.4
+ },
+ "material_diameter": {
+ "default_value": 1.75
+ },
+ "machine_extruder_start_pos_abs": {
+ "default_value": true
+ },
+ "machine_extruder_start_pos_x": {
+ "value": "prime_tower_position_x"
+ },
+ "machine_extruder_start_pos_y": {
+ "value": "prime_tower_position_y"
+ },
+ "machine_extruder_end_pos_abs": {
+ "default_value": true
+ },
+ "machine_extruder_end_pos_x": {
+ "value": "prime_tower_position_x"
+ },
+ "machine_extruder_end_pos_y": {
+ "value": "prime_tower_position_y"
+ }
+ }
+}
\ No newline at end of file
diff --git a/resources/extruders/structur3d_discov3ry1_complete_um2plus_extruder_0.def.json b/resources/extruders/structur3d_discov3ry1_complete_um2plus_extruder_0.def.json
new file mode 100644
index 0000000000..8436dc0a94
--- /dev/null
+++ b/resources/extruders/structur3d_discov3ry1_complete_um2plus_extruder_0.def.json
@@ -0,0 +1,16 @@
+{
+ "id": "structur3d_discov3ry1_complete_um2plus_extruder_0",
+ "version": 2,
+ "name": "Discov3ry Extruder",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "structur3d_discov3ry1_complete_um2plus",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.84 },
+ "material_diameter": { "default_value": 3.175 }
+ }
+}
diff --git a/resources/extruders/tizyx_evy_dual_extruder_0.def.JSON b/resources/extruders/tizyx_evy_dual_extruder_0.def.JSON
new file mode 100644
index 0000000000..59e9311e50
--- /dev/null
+++ b/resources/extruders/tizyx_evy_dual_extruder_0.def.JSON
@@ -0,0 +1,18 @@
+{
+ "id": "tizyx_evy_dual_extruder_0",
+ "version": 2,
+ "name": "Classic Extruder",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "tizyx_evy_dual",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 0,
+ "maximum_value": "1"
+ },
+ "material_diameter": { "default_value": 1.75 }
+ }
+}
diff --git a/resources/extruders/tizyx_evy_dual_extruder_1.def.JSON b/resources/extruders/tizyx_evy_dual_extruder_1.def.JSON
new file mode 100644
index 0000000000..cf5dc76caa
--- /dev/null
+++ b/resources/extruders/tizyx_evy_dual_extruder_1.def.JSON
@@ -0,0 +1,18 @@
+{
+ "id": "tizyx_evy_dual_extruder_1",
+ "version": 2,
+ "name": "Direct Drive",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "tizyx_evy_dual",
+ "position": "1"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 1,
+ "maximum_value": "1"
+ },
+ "material_diameter": { "default_value": 1.75 }
+ }
+}
diff --git a/resources/i18n/cura.pot b/resources/i18n/cura.pot
index 749fdb65ee..133ca141f9 100644
--- a/resources/i18n/cura.pot
+++ b/resources/i18n/cura.pot
@@ -966,11 +966,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr ""
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -3085,101 +3080,6 @@ msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27
-msgctxt "@title"
-msgid "Check Printer"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39
-msgctxt "@label"
-msgid ""
-"It's a good idea to do a few sanity checks on your Ultimaker. You can skip "
-"this step if you know your machine is functional"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53
-msgctxt "@action:button"
-msgid "Start Printer Check"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80
-msgctxt "@label"
-msgid "Connection: "
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Connected"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Not connected"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99
-msgctxt "@label"
-msgid "Min endstop X: "
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-msgctxt "@info:status"
-msgid "Works"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Not checked"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120
-msgctxt "@label"
-msgid "Min endstop Y: "
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141
-msgctxt "@label"
-msgid "Min endstop Z: "
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163
-msgctxt "@label"
-msgid "Nozzle temperature check: "
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Stop Heating"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Start Heating"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223
-msgctxt "@label"
-msgid "Build plate temperature check:"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Checked"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284
-msgctxt "@label"
-msgid "Everything is in order! You're done with your CheckUp."
-msgstr ""
-
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"
msgid "Not connected to a printer"
diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po
index 11acb189fd..8c357e1462 100644
--- a/resources/i18n/de_DE/cura.po
+++ b/resources/i18n/de_DE/cura.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2018-09-28 14:42+0200\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: German\n"
"Language: de_DE\n"
@@ -64,16 +64,12 @@ msgid ""
"
{model_names}
\n"
"
Find out how to ensure the best possible print quality and reliability.
"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
msgctxt "@item:inmenu"
msgid "Changelog"
-msgstr ""
+msgstr "Änderungsprotokoll"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
msgctxt "@item:inmenu"
@@ -492,100 +488,100 @@ msgstr "Druck vollendet"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
msgctxt "@label:material"
msgid "Empty"
-msgstr ""
+msgstr "Leer"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
msgctxt "@label:material"
msgid "Unknown"
-msgstr ""
+msgstr "Unbekannt"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
msgctxt "@action:button"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Über Cloud drucken"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Über Cloud drucken"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
msgctxt "@info:status"
msgid "Connected via Cloud"
-msgstr ""
+msgstr "Über Cloud verbunden"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
msgctxt "@info:title"
msgid "Cloud error"
-msgstr ""
+msgstr "Cloudfehler"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
msgctxt "@info:status"
msgid "Could not export print job."
-msgstr ""
+msgstr "Druckauftrag konnte nicht exportiert werden."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
-msgstr ""
+msgstr "Daten konnten nicht in Drucker geladen werden."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:51
msgctxt "@info:status"
msgid "tomorrow"
-msgstr ""
+msgstr "morgen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:54
msgctxt "@info:status"
msgid "today"
-msgstr ""
+msgstr "heute"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
-msgstr ""
+msgstr "Es liegt ein Fehler beim Verbinden mit der Cloud vor."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
msgid "Sending data to remote cluster"
-msgstr ""
+msgstr "Daten werden zu Remote-Cluster gesendet"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Druckaufträge mithilfe Ihres Ultimaker-Kontos von einem anderen Ort aus senden und überwachen."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
msgctxt "@info:status"
msgid "Connect to Ultimaker Cloud"
-msgstr ""
+msgstr "Verbinden mit Ultimaker Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
msgctxt "@action"
msgid "Don't ask me again for this printer."
-msgstr ""
+msgstr "Nicht mehr für diesen Drucker nachfragen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
msgctxt "@action"
msgid "Get started"
-msgstr ""
+msgstr "Erste Schritte"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Sie können jetzt Druckaufträge mithilfe Ihres Ultimaker-Kontos von einem anderen Ort aus senden und überwachen."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
msgctxt "@info:status"
msgid "Connected!"
-msgstr ""
+msgstr "Verbunden!"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
msgctxt "@action"
msgid "Review your connection"
-msgstr ""
+msgstr "Ihre Verbindung überprüfen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py:30
msgctxt "@action"
@@ -637,12 +633,12 @@ msgstr "Simulationsansicht"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:35
msgctxt "@item:inmenu"
msgid "Post Processing"
-msgstr ""
+msgstr "Nachbearbeitung"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:36
msgctxt "@item:inmenu"
msgid "Modify G-Code"
-msgstr ""
+msgstr "G-Code ändern"
#: /home/ruben/Projects/Cura/plugins/SupportEraser/__init__.py:12
msgctxt "@label"
@@ -692,7 +688,7 @@ msgstr "Cura 15.04-Profile"
#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
msgctxt "@item:inmenu"
msgid "Evaluation"
-msgstr ""
+msgstr "Bewertung"
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
@@ -760,7 +756,7 @@ msgstr "Schneiden (Slicing) ist nicht möglich, da Objekte vorhanden sind, die m
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
msgctxt "@info:status"
msgid "Nothing to slice because none of the models fit the build volume or are assigned to a disabled extruder. Please scale or rotate models to fit, or enable an extruder."
-msgstr ""
+msgstr "Es ist kein Objekt zum Schneiden vorhanden, da keines der Modelle den Druckabmessungen entspricht oder weil sie einem deaktivierten Extruder zugewiesen wurden. Bitte die Modelle passend skalieren oder drehen."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
@@ -845,7 +841,7 @@ msgstr "Stellen Sie sicher, dass der G-Code für Ihren Drucker und Ihre Druckerk
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:64
msgctxt "@item:inmenu"
msgid "Manage backups"
-msgstr ""
+msgstr "Backups verwalten"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:107
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:113
@@ -858,32 +854,32 @@ msgstr "Backup"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:55
msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
-msgstr ""
+msgstr "Beim Versuch, Ihre Backups aufzulisten, trat ein Fehler auf."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
-msgstr ""
+msgstr "Beim Versuch, Ihr Backup wiederherzustellen, trat ein Fehler auf."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:15
msgctxt "@info:title"
msgid "Backups"
-msgstr ""
+msgstr "Backups"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:27
msgctxt "@info:backup_status"
msgid "Uploading your backup..."
-msgstr ""
+msgstr "Ihr Backup wird hochgeladen..."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:36
msgctxt "@info:backup_status"
msgid "There was an error while uploading your backup."
-msgstr ""
+msgstr "Beim Versuch, Ihr Backup hochzuladen, trat ein Fehler auf."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:39
msgctxt "@info:backup_status"
msgid "Your backup has finished uploading."
-msgstr ""
+msgstr "Ihr Backup wurde erfolgreich hochgeladen."
#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14
#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14
@@ -919,7 +915,7 @@ msgstr "Fehler beim Schreiben von 3MF-Datei."
#: /home/ruben/Projects/Cura/plugins/PreviewStage/__init__.py:13
msgctxt "@item:inmenu"
msgid "Preview"
-msgstr ""
+msgstr "Vorschau"
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
@@ -927,11 +923,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr "Upgrades wählen"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr "Check-up"
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -1020,7 +1011,7 @@ msgstr "Die Datei {0} ist bereits vorhanden. Soll die Datei
#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
msgctxt "@info:status"
msgid "Invalid file URL:"
-msgstr ""
+msgstr "Ungültige Datei-URL:"
#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
msgctxt "@menuitem"
@@ -1041,7 +1032,7 @@ msgstr "Einstellungen aktualisiert"
#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
-msgstr ""
+msgstr "Extruder deaktiviert"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
#, python-brace-format
@@ -1070,13 +1061,13 @@ msgstr "Export erfolgreich ausgeführt"
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
-msgstr ""
+msgstr "Import des Profils aus Datei {0}: {1} fehlgeschlagen"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Can't import profile from {0} before a printer is added."
-msgstr ""
+msgstr "Import des Profils aus Datei {0} kann erst durchgeführt werden, wenn ein Drucker hinzugefügt wurde."
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
#, python-brace-format
@@ -1209,7 +1200,7 @@ msgstr "Versucht, ein Cura-Backup zu erstellen, das nicht Ihrer aktuellen Versio
#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
-msgstr ""
+msgstr "Der Ultimaker-Konto-Server konnte nicht erreicht werden."
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
@@ -1219,7 +1210,7 @@ msgstr "Objekte vervielfältigen und platzieren"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:28
msgctxt "@info:title"
msgid "Placing Objects"
-msgstr ""
+msgstr "Objekte platzieren"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:103
@@ -1264,12 +1255,7 @@ msgid ""
"
Backups can be found in the configuration folder.
\n"
"
Please send us this Crash Report to fix the problem.
\n"
" "
-msgstr ""
-"
Hoppla, bei Ultimaker Cura ist ein Problem aufgetreten.
\n"
-"
Beim Start ist ein nicht behebbarer Fehler aufgetreten. Er wurde möglicherweise durch einige falsche Konfigurationsdateien verursacht. Wir empfehlen ein Backup und Reset Ihrer Konfiguration.
\n"
-"
Backups sind im Konfigurationsordner abgelegt.
\n"
-"
Senden Sie uns diesen Absturzbericht bitte, um das Problem zu beheben.
\n"
-" "
+msgstr "
Hoppla, bei Ultimaker Cura ist ein Problem aufgetreten.
\n
Beim Start ist ein nicht behebbarer Fehler aufgetreten. Er wurde möglicherweise durch einige falsche Konfigurationsdateien verursacht. Wir empfehlen ein Backup und Reset Ihrer Konfiguration.
\n
Backups sind im Konfigurationsordner abgelegt.
\n
Senden Sie uns diesen Absturzbericht bitte, um das Problem zu beheben.
A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem
\n"
"
Please use the \"Send report\" button to post a bug report automatically to our servers
\n"
" "
-msgstr ""
-"
Ein schwerer Fehler ist in Cura aufgetreten. Senden Sie uns diesen Absturzbericht, um das Problem zu beheben
\n"
-"
Verwenden Sie bitte die Schaltfläche „Bericht senden“, um den Fehlerbericht automatisch an unsere Server zu senden
\n"
-" "
+msgstr "
Ein schwerer Fehler ist in Cura aufgetreten. Senden Sie uns diesen Absturzbericht, um das Problem zu beheben
\n
Verwenden Sie bitte die Schaltfläche „Bericht senden“, um den Fehlerbericht automatisch an unsere Server zu senden
\n "
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:173
msgctxt "@title:groupbox"
@@ -1635,7 +1618,7 @@ msgstr "Verbindung zur Cura Paket-Datenbank konnte nicht hergestellt werden. Bit
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/SmallRatingWidget.qml:27
msgctxt "@label"
msgid "ratings"
-msgstr ""
+msgstr "Bewertungen"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
@@ -1654,7 +1637,7 @@ msgstr "Materialien"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:91
msgctxt "@label"
msgid "Your rating"
-msgstr ""
+msgstr "Ihre Bewertung"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
msgctxt "@label"
@@ -1687,7 +1670,7 @@ msgstr "Unbekannt"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
-msgstr ""
+msgstr "Anmeldung für Installation oder Update erforderlich"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
@@ -1710,7 +1693,7 @@ msgstr "Aktualisiert"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:13
msgctxt "@title"
msgid "Marketplace"
-msgstr ""
+msgstr "Marktplatz"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml:25
msgctxt "@action:button"
@@ -1745,12 +1728,12 @@ msgstr "Bestätigen"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to login first before you can rate"
-msgstr ""
+msgstr "Vor der Bewertung müssen Sie sich anmelden"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to install the package before you can rate"
-msgstr ""
+msgstr "Vor der Bewertung müssen Sie das Paket installierten"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:19
msgctxt "@info"
@@ -1790,7 +1773,7 @@ msgstr "Installiert nach Neustart"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:53
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to update"
-msgstr ""
+msgstr "Anmeldung für Update erforderlich"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:71
msgctxt "@action:button"
@@ -1813,10 +1796,7 @@ msgid ""
"This plugin contains a license.\n"
"You need to accept this license to install this plugin.\n"
"Do you agree with the terms below?"
-msgstr ""
-"Dieses Plugin enthält eine Lizenz.\n"
-"Sie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\n"
-"Stimmen Sie den nachfolgenden Bedingungen zu?"
+msgstr "Dieses Plugin enthält eine Lizenz.\nSie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\nStimmen Sie den nachfolgenden Bedingungen zu?"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:55
msgctxt "@action:button"
@@ -1841,22 +1821,22 @@ msgstr "Kompatibilität"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:203
msgctxt "@action:label"
msgid "Technical Data Sheet"
-msgstr ""
+msgstr "Technisches Datenblatt"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:212
msgctxt "@action:label"
msgid "Safety Data Sheet"
-msgstr ""
+msgstr "Sicherheitsdatenblatt"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:221
msgctxt "@action:label"
msgid "Printing Guidelines"
-msgstr ""
+msgstr "Druckrichtlinien"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:230
msgctxt "@action:label"
msgid "Website"
-msgstr ""
+msgstr "Website"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml:16
msgctxt "@info"
@@ -1978,17 +1958,17 @@ msgstr "Benutzervereinbarung"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
msgctxt "@info"
msgid "These options are not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Diese Optionen sind nicht verfügbar, weil Sie einen Cloud-Drucker überwachen."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:241
msgctxt "@info"
msgid "The webcam is not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Die Webcam ist nicht verfügbar, weil Sie einen Cloud-Drucker überwachen."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
msgctxt "@label:status"
msgid "Loading..."
-msgstr ""
+msgstr "Lädt..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
msgctxt "@label:status"
@@ -1998,42 +1978,42 @@ msgstr "Nicht verfügbar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
msgctxt "@label:status"
msgid "Unreachable"
-msgstr ""
+msgstr "Nicht erreichbar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
msgctxt "@label:status"
msgid "Idle"
-msgstr ""
+msgstr "Leerlauf"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:353
msgctxt "@label"
msgid "Untitled"
-msgstr ""
+msgstr "Unbenannt"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
msgctxt "@label"
msgid "Anonymous"
-msgstr ""
+msgstr "Anonym"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
msgctxt "@label:status"
msgid "Requires configuration changes"
-msgstr ""
+msgstr "Erfordert Konfigurationsänderungen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
msgctxt "@action:button"
msgid "Details"
-msgstr ""
+msgstr "Details"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "Unavailable printer"
-msgstr ""
+msgstr "Drucker nicht verfügbar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
msgctxt "@label"
msgid "First available"
-msgstr ""
+msgstr "Zuerst verfügbar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:187
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:132
@@ -2049,27 +2029,27 @@ msgstr "In Warteschlange"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
msgid "Go to Cura Connect"
-msgstr ""
+msgstr "Gehe zu Cura Connect"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
msgctxt "@label"
msgid "Print jobs"
-msgstr ""
+msgstr "Druckaufträge"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Total print time"
-msgstr ""
+msgstr "Druckdauer insgesamt"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
msgctxt "@label"
msgid "Waiting for"
-msgstr ""
+msgstr "Warten auf"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
msgctxt "@label link to connect manager"
msgid "View print history"
-msgstr ""
+msgstr "Druckauftragshistorie anzeigen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
msgctxt "@window:title"
@@ -2092,10 +2072,7 @@ msgid ""
"To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n"
"\n"
"Select your printer from the list below:"
-msgstr ""
-"Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n"
-"\n"
-"Wählen Sie Ihren Drucker aus der folgenden Liste:"
+msgstr "Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n\nWählen Sie Ihren Drucker aus der folgenden Liste:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:87
#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44
@@ -2195,17 +2172,17 @@ msgstr "Beendet"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Preparing..."
-msgstr ""
+msgstr "Vorbereitung..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Aborting..."
-msgstr ""
+msgstr "Wird abgebrochen..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
msgctxt "@label:status"
msgid "Pausing..."
-msgstr ""
+msgstr "Wird pausiert..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
msgctxt "@label:status"
@@ -2215,7 +2192,7 @@ msgstr "Pausiert"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
msgctxt "@label:status"
msgid "Resuming..."
-msgstr ""
+msgstr "Wird fortgesetzt..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
msgctxt "@label:status"
@@ -2225,7 +2202,7 @@ msgstr "Handlung erforderlich"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
msgctxt "@label:status"
msgid "Finishes %1 at %2"
-msgstr ""
+msgstr "Fertigstellung %1 auf %2"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:44
msgctxt "@action:button"
@@ -2261,12 +2238,12 @@ msgstr "Zurückkehren"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:102
msgctxt "@label"
msgid "Pausing..."
-msgstr ""
+msgstr "Wird pausiert..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:104
msgctxt "@label"
msgid "Resuming..."
-msgstr ""
+msgstr "Wird fortgesetzt..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:106
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284
@@ -2278,7 +2255,7 @@ msgstr "Pausieren"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
msgid "Aborting..."
-msgstr ""
+msgstr "Wird abgebrochen..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
@@ -2319,19 +2296,19 @@ msgstr "Drucken abbrechen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:20
msgctxt "@title:window"
msgid "Configuration Changes"
-msgstr ""
+msgstr "Konfigurationsänderungen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:27
msgctxt "@action:button"
msgid "Override"
-msgstr ""
+msgstr "Überschreiben"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
msgctxt "@label"
msgid "The assigned printer, %1, requires the following configuration change:"
msgid_plural "The assigned printer, %1, requires the following configuration changes:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Der zugewiesene Drucker %1 erfordert die folgende Konfigurationsänderung:"
+msgstr[1] "Der zugewiesene Drucker %1 erfordert die folgenden Konfigurationsänderungen:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
msgctxt "@label"
@@ -2361,7 +2338,7 @@ msgstr "Druckplatte auf %1 wechseln (Dies kann nicht übergangen werden)."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
-msgstr ""
+msgstr "Überschreiben verwendet die definierten Einstellungen mit der vorhandenen Druckerkonfiguration. Dies kann zu einem fehlgeschlagenen Druck führen."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
msgctxt "@label"
@@ -2379,22 +2356,22 @@ msgid ""
"Please make sure your printer has a connection:\n"
"- Check if the printer is turned on.\n"
"- Check if the printer is connected to the network."
-msgstr ""
+msgstr "Stellen Sie bitte sicher, dass Ihr Drucker verbunden ist:\n- Prüfen Sie, ob Ihr Drucker eingeschaltet ist.\n- Prüfen Sie, ob der Drucker mit dem Netzwerk verbunden ist."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
msgctxt "@info"
msgid "Please select a network connected printer to monitor."
-msgstr ""
+msgstr "Bitte einen mit dem Netzwerk verbunden Drucker für die Überwachung wählen."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
msgctxt "@info"
msgid "Please connect your Ultimaker printer to your local network."
-msgstr ""
+msgstr "Verbinden Sie Ihren Ultimaker-Drucker bitte mit Ihrem lokalen Netzwerk."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
-msgstr ""
+msgstr "Benutzerhandbücher online anzeigen"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
@@ -2430,17 +2407,17 @@ msgstr "Kompatibilitätsmodus"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
msgctxt "@label"
msgid "Travels"
-msgstr ""
+msgstr "Bewegungen"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
msgctxt "@label"
msgid "Helpers"
-msgstr ""
+msgstr "Helfer"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
msgctxt "@label"
msgid "Shell"
-msgstr ""
+msgstr "Gehäuse"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
@@ -2516,17 +2493,17 @@ msgstr "Cura sendet anonyme Daten an Ultimaker, um die Druckqualität und Benutz
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
msgctxt "@text:window"
msgid "I don't want to send this data"
-msgstr ""
+msgstr "Ich möchte diese Daten nicht senden"
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
msgctxt "@text:window"
msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr ""
+msgstr "Ich erlaube das Senden der Daten an Ultimaker, um Cura zu verbessern"
#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
msgctxt "@label"
msgid "No print selected"
-msgstr ""
+msgstr "Kein Druck ausgewählt"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2788,108 +2765,108 @@ msgstr "Öffnen"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:28
msgctxt "@title"
msgid "My Backups"
-msgstr ""
+msgstr "Meine Backups"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:38
msgctxt "@empty_state"
msgid "You don't have any backups currently. Use the 'Backup Now' button to create one."
-msgstr ""
+msgstr "Sie verfügen derzeit über keine Backups. Verwenden Sie die Schaltfläche ‚Jetzt Backup erstellen‘, um ein Backup zu erstellen."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:60
msgctxt "@backup_limit_info"
msgid "During the preview phase, you'll be limited to 5 visible backups. Remove a backup to see older ones."
-msgstr ""
+msgstr "In der Vorschau-Phase sind Sie auf 5 sichtbare Backups beschränkt. Ein Backup entfernen, um ältere anzusehen."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:34
msgctxt "@description"
msgid "Backup and synchronize your Cura settings."
-msgstr ""
+msgstr "Ihre Cura-Einstellungen sichern und synchronisieren."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
msgctxt "@button"
msgid "Sign in"
-msgstr ""
+msgstr "Anmelden"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/main.qml:24
msgctxt "@title:window"
msgid "Cura Backups"
-msgstr ""
+msgstr "Cura-Backups"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:21
msgctxt "@backuplist:label"
msgid "Cura Version"
-msgstr ""
+msgstr "Cura-Version"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:29
msgctxt "@backuplist:label"
msgid "Machines"
-msgstr ""
+msgstr "Maschinen"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:37
msgctxt "@backuplist:label"
msgid "Materials"
-msgstr ""
+msgstr "Materialien"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:45
msgctxt "@backuplist:label"
msgid "Profiles"
-msgstr ""
+msgstr "Profile"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:53
msgctxt "@backuplist:label"
msgid "Plugins"
-msgstr ""
+msgstr "Plugins"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:71
msgctxt "@button"
msgid "Restore"
-msgstr ""
+msgstr "Wiederherstellen"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:99
msgctxt "@dialog:title"
msgid "Delete Backup"
-msgstr ""
+msgstr "Backup löschen"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:100
msgctxt "@dialog:info"
msgid "Are you sure you want to delete this backup? This cannot be undone."
-msgstr ""
+msgstr "Soll dieses Backup wirklich gelöscht werden? Der Vorgang kann nicht rückgängig gemacht werden."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:108
msgctxt "@dialog:title"
msgid "Restore Backup"
-msgstr ""
+msgstr "Backup wiederherstellen"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:109
msgctxt "@dialog:info"
msgid "You will need to restart Cura before your backup is restored. Do you want to close Cura now?"
-msgstr ""
+msgstr "Cura muss neu gestartet werden, um Ihre Datensicherung wiederherzustellen. Möchten Sie Cura jetzt schließen?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:22
msgctxt "@button"
msgid "Want more?"
-msgstr ""
+msgstr "Möchten Sie mehr?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:31
msgctxt "@button"
msgid "Backup Now"
-msgstr ""
+msgstr "Jetzt Backup durchführen"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:43
msgctxt "@checkbox:description"
msgid "Auto Backup"
-msgstr ""
+msgstr "Automatisches Backup"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:44
msgctxt "@checkbox:description"
msgid "Automatically create a backup each day that Cura is started."
-msgstr ""
+msgstr "An jedem Tag, an dem Cura gestartet wird, ein automatisches Backup erstellen."
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMainSettingsSelector.qml:75
msgctxt "@label"
msgid "Not supported"
-msgstr ""
+msgstr "Nicht unterstützt"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:35
msgctxt "@action:button"
@@ -2974,99 +2951,6 @@ msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr "Beheizte Druckplatte (offizielles Kit oder Eigenbau)"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27
-msgctxt "@title"
-msgid "Check Printer"
-msgstr "Drucker prüfen"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39
-msgctxt "@label"
-msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"
-msgstr "Sie sollten einige Sanity Checks bei Ihrem Ultimaker durchführen. Sie können diesen Schritt überspringen, wenn Sie wissen, dass Ihr Gerät funktionsfähig ist"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53
-msgctxt "@action:button"
-msgid "Start Printer Check"
-msgstr "Überprüfung des Druckers starten"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80
-msgctxt "@label"
-msgid "Connection: "
-msgstr "Verbindung: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Connected"
-msgstr "Verbunden"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Not connected"
-msgstr "Nicht verbunden"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99
-msgctxt "@label"
-msgid "Min endstop X: "
-msgstr "Min. Endstopp X: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-msgctxt "@info:status"
-msgid "Works"
-msgstr "Funktionsfähig"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Not checked"
-msgstr "Nicht überprüft"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120
-msgctxt "@label"
-msgid "Min endstop Y: "
-msgstr "Min. Endstopp Y: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141
-msgctxt "@label"
-msgid "Min endstop Z: "
-msgstr "Min. Endstopp Z: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163
-msgctxt "@label"
-msgid "Nozzle temperature check: "
-msgstr "Temperaturprüfung der Düse: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Stop Heating"
-msgstr "Aufheizen stoppen"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Start Heating"
-msgstr "Aufheizen starten"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223
-msgctxt "@label"
-msgid "Build plate temperature check:"
-msgstr "Temperaturprüfung der Druckplatte:"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Checked"
-msgstr "Geprüft"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284
-msgctxt "@label"
-msgid "Everything is in order! You're done with your CheckUp."
-msgstr "Alles ist in Ordnung! Der Check-up ist abgeschlossen."
-
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"
msgid "Not connected to a printer"
@@ -3638,7 +3522,7 @@ msgstr "Profil erstellen"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
msgctxt "@info"
msgid "Please provide a name for this profile."
-msgstr ""
+msgstr "Geben Sie bitte einen Namen für dieses Profil an."
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
msgctxt "@title:window"
@@ -3668,7 +3552,7 @@ msgstr "Drucker: %1"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
msgid "Default profiles"
-msgstr ""
+msgstr "Standardprofile"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
@@ -3703,7 +3587,7 @@ msgstr "Globale Einstellungen"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
msgctxt "@action:button"
msgid "Marketplace"
-msgstr ""
+msgstr "Marktplatz"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:27
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:13
@@ -3726,7 +3610,7 @@ msgstr "&Ansicht"
#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:13
msgctxt "@title:menu menubar:toplevel"
msgid "&Settings"
-msgstr ""
+msgstr "&Einstellungen"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:55
msgctxt "@title:menu menubar:toplevel"
@@ -3761,7 +3645,7 @@ msgstr "Unbenannt"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:68
msgctxt "@label:textbox"
msgid "search settings"
-msgstr ""
+msgstr "Einstellungen durchsuchen"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
msgctxt "@action:menu"
@@ -3800,10 +3684,7 @@ msgid ""
"Some hidden settings use values different from their normal calculated value.\n"
"\n"
"Click to make these settings visible."
-msgstr ""
-"Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n"
-"\n"
-"Klicken Sie, um diese Einstellungen sichtbar zu machen."
+msgstr "Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n\nKlicken Sie, um diese Einstellungen sichtbar zu machen."
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66
msgctxt "@label Header for list of settings."
@@ -3831,10 +3712,7 @@ msgid ""
"This setting has a value that is different from the profile.\n"
"\n"
"Click to restore the value of the profile."
-msgstr ""
-"Diese Einstellung hat einen vom Profil abweichenden Wert.\n"
-"\n"
-"Klicken Sie, um den Wert des Profils wiederherzustellen."
+msgstr "Diese Einstellung hat einen vom Profil abweichenden Wert.\n\nKlicken Sie, um den Wert des Profils wiederherzustellen."
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:302
msgctxt "@label"
@@ -3842,25 +3720,22 @@ msgid ""
"This setting is normally calculated, but it currently has an absolute value set.\n"
"\n"
"Click to restore the calculated value."
-msgstr ""
-"Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n"
-"\n"
-"Klicken Sie, um den berechneten Wert wiederherzustellen."
+msgstr "Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n\nKlicken Sie, um den berechneten Wert wiederherzustellen."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
msgctxt "@button"
msgid "Recommended"
-msgstr ""
+msgstr "Empfohlen"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
msgctxt "@button"
msgid "Custom"
-msgstr ""
+msgstr "Benutzerdefiniert"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:193
msgctxt "@label"
msgid "Gradual infill"
-msgstr ""
+msgstr "Stufenweise Füllung"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:232
msgctxt "@label"
@@ -3870,7 +3745,7 @@ msgstr "Die graduelle Füllung steigert die Menge der Füllung nach oben hin sch
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
msgctxt "@label"
msgid "Support"
-msgstr ""
+msgstr "Stützstruktur"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
msgctxt "@label"
@@ -3885,7 +3760,7 @@ msgstr "Wählen Sie, welcher Extruder für die Unterstützung verwendet wird. Di
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
msgctxt "@label"
msgid "Adhesion"
-msgstr ""
+msgstr "Haftung"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
msgctxt "@label"
@@ -3905,7 +3780,7 @@ msgstr "Sie haben einige Profileinstellungen geändert. Wenn Sie diese ändern m
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:355
msgctxt "@tooltip"
msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile"
-msgstr ""
+msgstr "Dieses Qualitätsprofil ist für Ihr aktuelles Material und Ihre derzeitige Düsenkonfiguration nicht verfügbar. Bitte ändern Sie diese, um das Qualitätsprofil zu aktivieren."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3915,17 +3790,17 @@ msgstr "Ein benutzerdefiniertes Profil ist derzeit aktiv. Wählen Sie ein vorein
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:13
msgctxt "@label:Should be short"
msgid "On"
-msgstr ""
+msgstr "Ein"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:14
msgctxt "@label:Should be short"
msgid "Off"
-msgstr ""
+msgstr "Aus"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:27
msgctxt "@label"
msgid "Profile"
-msgstr ""
+msgstr "Profil"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:94
msgctxt "@tooltip"
@@ -3933,15 +3808,12 @@ msgid ""
"Some setting/override values are different from the values stored in the profile.\n"
"\n"
"Click to open the profile manager."
-msgstr ""
-"Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n"
-"\n"
-"Klicken Sie, um den Profilmanager zu öffnen."
+msgstr "Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n\nKlicken Sie, um den Profilmanager zu öffnen."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label shown when we load a Gcode file"
msgid "Print setup disabled. G code file can not be modified."
-msgstr ""
+msgstr "Druckeinrichtung ist deaktiviert. G-Code kann nicht geändert werden."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -4182,47 +4054,47 @@ msgstr "Anzahl Kopien"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/AutoConfiguration.qml:18
msgctxt "@header"
msgid "Configurations"
-msgstr ""
+msgstr "Konfigurationen"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:110
msgctxt "@label"
msgid "Select configuration"
-msgstr ""
+msgstr "Konfiguration wählen"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
msgctxt "@label"
msgid "See the material compatibility chart"
-msgstr ""
+msgstr "Siehe Materialkompatibilitätstabelle"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
msgctxt "@label"
msgid "Configurations"
-msgstr ""
+msgstr "Konfigurationen"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:57
msgctxt "@label"
msgid "Loading available configurations from the printer..."
-msgstr ""
+msgstr "Verfügbare Konfigurationen werden von diesem Drucker geladen..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:58
msgctxt "@label"
msgid "The configurations are not available because the printer is disconnected."
-msgstr ""
+msgstr "Die Konfigurationen sind nicht verfügbar, da der Drucker getrennt ist."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:25
msgctxt "@header"
msgid "Custom"
-msgstr ""
+msgstr "Benutzerdefiniert"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:61
msgctxt "@label"
msgid "Printer"
-msgstr ""
+msgstr "Drucker"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
msgctxt "@label"
msgid "Enabled"
-msgstr ""
+msgstr "Aktiviert"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
msgctxt "@label"
@@ -4232,17 +4104,17 @@ msgstr "Material"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
-msgstr ""
+msgstr "Für diese Materialkombination Kleber für eine bessere Haftung verwenden."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:128
msgctxt "@label"
msgid "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile."
-msgstr ""
+msgstr "Diese Konfigurationen sind nicht verfügbar, weil %1 nicht erkannt wird. Besuchen Sie bitte %2 für das Herunterladen des korrekten Materialprofils."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:129
msgctxt "@label"
msgid "Marketplace"
-msgstr ""
+msgstr "Marktplatz"
#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:15
msgctxt "@title:menu menubar:file"
@@ -4272,37 +4144,37 @@ msgstr "Geschätzte verbleibende Zeit"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
msgid "View types"
-msgstr ""
+msgstr "Typen anzeigen"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
msgctxt "@label"
msgid "Hi "
-msgstr ""
+msgstr "Hallo "
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
msgctxt "@button"
msgid "Ultimaker account"
-msgstr ""
+msgstr "Ultimaker‑Konto"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
msgctxt "@button"
msgid "Sign out"
-msgstr ""
+msgstr "Abmelden"
#: /home/ruben/Projects/Cura/resources/qml/Account/AccountWidget.qml:24
msgctxt "@action:button"
msgid "Sign in"
-msgstr ""
+msgstr "Anmelden"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
msgctxt "@label"
msgid "Ultimaker Cloud"
-msgstr ""
+msgstr "Ultimaker Cloud"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
-msgstr ""
+msgstr "Der 3D-Druckablauf der nächsten Generation"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:51
msgctxt "@text"
@@ -4310,27 +4182,27 @@ msgid ""
"- Send print jobs to Ultimaker printers outside your local network\n"
"- Store your Ultimaker Cura settings in the cloud for use anywhere\n"
"- Get exclusive access to material profiles from leading brands"
-msgstr ""
+msgstr "- Aufträge an Ultimaker-Drucker außerhalb Ihres lokalen Netzwerks senden\n- Ihre Ultimaker Cura-Einstellungen für die Verwendung andernorts an die Cloud senden\n- Exklusiven Zugang zu Materialprofilen von führenden Marken erhalten"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
msgid "Create account"
-msgstr ""
+msgstr "Konto erstellen"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
msgctxt "@label"
msgid "No time estimation available"
-msgstr ""
+msgstr "Keine Zeitschätzung verfügbar"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
msgctxt "@label"
msgid "No cost estimation available"
-msgstr ""
+msgstr "Keine Kostenschätzung verfügbar"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
msgctxt "@button"
msgid "Preview"
-msgstr ""
+msgstr "Vorschau"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
msgctxt "@label:PrintjobStatus"
@@ -4345,27 +4217,27 @@ msgstr "Slicing nicht möglich"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
msgctxt "@button"
msgid "Slice"
-msgstr ""
+msgstr "Slice"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
msgctxt "@label"
msgid "Start the slicing process"
-msgstr ""
+msgstr "Slicing-Vorgang starten"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
msgctxt "@button"
msgid "Cancel"
-msgstr ""
+msgstr "Abbrechen"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
msgid "Time specification"
-msgstr ""
+msgstr "Zeitangabe"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
msgid "Material specification"
-msgstr ""
+msgstr "Materialangabe"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4380,27 +4252,27 @@ msgstr "%1 g"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Connected printers"
-msgstr ""
+msgstr "Verbundene Drucker"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Preset printers"
-msgstr ""
+msgstr "Voreingestellte Drucker"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
msgctxt "@button"
msgid "Add printer"
-msgstr ""
+msgstr "Drucker hinzufügen"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
msgctxt "@button"
msgid "Manage printers"
-msgstr ""
+msgstr "Drucker verwalten"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
-msgstr ""
+msgstr "Online-Fehlerbehebung anzeigen"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
msgctxt "@action:inmenu"
@@ -4611,7 +4483,7 @@ msgstr "Konfigurationsordner anzeigen"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
msgctxt "@action:menu"
msgid "&Marketplace"
-msgstr ""
+msgstr "&Marktplatz"
#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
msgctxt "@title:window"
@@ -4683,9 +4555,7 @@ msgctxt "@text:window"
msgid ""
"You have customized some profile settings.\n"
"Would you like to keep or discard those settings?"
-msgstr ""
-"Sie haben einige Profileinstellungen angepasst.\n"
-"Möchten Sie diese Einstellungen übernehmen oder verwerfen?"
+msgstr "Sie haben einige Profileinstellungen angepasst.\nMöchten Sie diese Einstellungen übernehmen oder verwerfen?"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:110
msgctxt "@title:column"
@@ -4730,7 +4600,7 @@ msgstr "Neues Profil erstellen"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
msgctxt "@title:tab"
msgid "Add a printer to Cura"
-msgstr ""
+msgstr "Fügen Sie einen Drucker zu Cura hinzu"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
msgctxt "@title:tab"
@@ -4738,17 +4608,17 @@ msgid ""
"Select the printer you want to use from the list below.\n"
"\n"
"If your printer is not in the list, use the \"Custom FFF Printer\" from the \"Custom\" category and adjust the settings to match your printer in the next dialog."
-msgstr ""
+msgstr "Wählen Sie den zu verwendenden Drucker aus der nachfolgenden Liste.\n\nWenn Ihr Drucker nicht in der Liste aufgeführt ist, verwenden Sie „Benutzerdefinierter FFF-Drucker“ aus der Kategorie „Benutzerdefiniert“ und passen Sie die Einstellungen im folgenden Dialog passend für Ihren Drucker an."
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
msgctxt "@label"
msgid "Manufacturer"
-msgstr ""
+msgstr "Hersteller"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
msgctxt "@label"
msgid "Printer Name"
-msgstr ""
+msgstr "Druckername"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
msgctxt "@action:button"
@@ -4775,9 +4645,7 @@ msgctxt "@info:credit"
msgid ""
"Cura is developed by Ultimaker B.V. in cooperation with the community.\n"
"Cura proudly uses the following open source projects:"
-msgstr ""
-"Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\n"
-"Cura verwendet mit Stolz die folgenden Open Source-Projekte:"
+msgstr "Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\nCura verwendet mit Stolz die folgenden Open Source-Projekte:"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:134
msgctxt "@label"
@@ -5185,6 +5053,7 @@ msgstr "X3G-Writer"
#~ "Print Setup disabled\n"
#~ "G-code files cannot be modified"
#~ msgstr ""
+
#~ "Druckeinrichtung deaktiviert\n"
#~ "G-Code-Dateien können nicht geändert werden"
@@ -5789,6 +5658,7 @@ msgstr "X3G-Writer"
#~ "Could not export using \"{}\" quality!\n"
#~ "Felt back to \"{}\"."
#~ msgstr ""
+
#~ "Exportieren in \"{}\" Qualität nicht möglich!\n"
#~ "Zurückgeschaltet auf \"{}\"."
@@ -5965,6 +5835,7 @@ msgstr "X3G-Writer"
#~ "2) Turn the fan off (only if there are no tiny details on the model).\n"
#~ "3) Use a different material."
#~ msgstr ""
+
#~ "Einige Modelle können aufgrund der Objektgröße und des gewählten Materials für Modelle möglicherweise nicht optimal gedruckt werden: {model_names}.\n"
#~ "Tipps, die für eine bessere Druckqualität hilfreich sein können:\n"
#~ "1) Verwenden Sie abgerundete Ecken.\n"
@@ -5981,6 +5852,7 @@ msgstr "X3G-Writer"
#~ "\n"
#~ "Thanks!"
#~ msgstr ""
+
#~ "Keine Modelle in Ihrer Zeichnung gefunden. Bitte überprüfen Sie den Inhalt erneut und stellen Sie sicher, dass ein Teil oder eine Baugruppe enthalten ist.\n"
#~ "\n"
#~ "Danke!"
@@ -5991,6 +5863,7 @@ msgstr "X3G-Writer"
#~ "\n"
#~ "Sorry!"
#~ msgstr ""
+
#~ "Es wurde mehr als ein Teil oder eine Baugruppe in Ihrer Zeichnung gefunden. Wir unterstützen derzeit nur Zeichnungen mit exakt einem Teil oder einer Baugruppe.\n"
#~ "\n"
#~ "Es tut uns leid!"
@@ -6015,6 +5888,7 @@ msgstr "X3G-Writer"
#~ "With kind regards\n"
#~ " - Thomas Karl Pietrowski"
#~ msgstr ""
+
#~ "Sehr geehrter Kunde,\n"
#~ "wir konnten keine gültige Installation von SolidWorks auf Ihrem System finden. Das bedeutet, dass SolidWorks entweder nicht installiert ist oder sie keine gültige Lizenz besitzen. Stellen Sie bitte sicher, dass SolidWorks problemlos läuft und/oder wenden Sie sich an Ihre ICT-Abteilung.\n"
#~ "\n"
@@ -6029,6 +5903,7 @@ msgstr "X3G-Writer"
#~ "With kind regards\n"
#~ " - Thomas Karl Pietrowski"
#~ msgstr ""
+
#~ "Sehr geehrter Kunde,\n"
#~ "Sie verwenden dieses Plugin derzeit auf einem anderen Betriebssystem als Windows. Dieses Plugin funktioniert nur auf Windows mit installiertem SolidWorks und einer gültigen Lizenz. Installieren Sie dieses Plugin bitte auf einem Windows-Rechner mit installiertem SolidWorks.\n"
#~ "\n"
@@ -6133,6 +6008,7 @@ msgstr "X3G-Writer"
#~ "Open the directory\n"
#~ "with macro and icon"
#~ msgstr ""
+
#~ "Verzeichnis\n"
#~ "mit Makro und Symbol öffnen"
@@ -6431,6 +6307,7 @@ msgstr "X3G-Writer"
#~ "\n"
#~ " Thanks!."
#~ msgstr ""
+
#~ "Keine Modelle in Ihrer Zeichnung gefunden. Bitte überprüfen Sie den Inhalt erneut und stellen Sie sicher, dass ein Teil oder eine Baugruppe enthalten ist.\n"
#~ "\n"
#~ " Danke!"
@@ -6441,6 +6318,7 @@ msgstr "X3G-Writer"
#~ "\n"
#~ "Sorry!"
#~ msgstr ""
+
#~ "Es wurde mehr als ein Teil oder eine Baugruppe in Ihrer Zeichnung gefunden. Wir unterstützen derzeit nur Zeichnungen mit exakt einem Teil oder einer Baugruppe.\n"
#~ "\n"
#~ "Es tut uns leid!"
@@ -6475,6 +6353,7 @@ msgstr "X3G-Writer"
#~ "
Please use the \"Send report\" button to post a bug report automatically to our servers
\n"
#~ " "
#~ msgstr ""
+
#~ "
Ein schwerer Fehler ist aufgetreten. Senden Sie uns diesen Absturzbericht, um das Problem zu beheben
\n"
#~ "
Verwenden Sie bitte die Schaltfläche „Bericht senden“, um den Fehlerbericht automatisch an unsere Server zu senden
\n"
#~ " "
@@ -6829,6 +6710,7 @@ msgstr "X3G-Writer"
#~ "You need to accept this license to install this plugin.\n"
#~ "Do you agree with the terms below?"
#~ msgstr ""
+
#~ " Das Plugin enthält eine Lizenz.\n"
#~ "Sie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\n"
#~ "Stimmen Sie den nachfolgenden Bedingungen zu?"
@@ -7356,6 +7238,7 @@ msgstr "X3G-Writer"
#~ msgid "Print Selected Model with %1"
#~ msgid_plural "Print Selected Models With %1"
#~ msgstr[0] "Ausgewähltes Modell drucken mit %1"
+
#~ msgstr[1] "Ausgewählte Modelle drucken mit %1"
#~ msgctxt "@info:status"
@@ -7385,6 +7268,7 @@ msgstr "X3G-Writer"
#~ "
\n"
diff --git a/resources/i18n/de_DE/fdmextruder.def.json.po b/resources/i18n/de_DE/fdmextruder.def.json.po
index 4bb0cc0705..bb77e47fec 100644
--- a/resources/i18n/de_DE/fdmextruder.def.json.po
+++ b/resources/i18n/de_DE/fdmextruder.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 14:25+0100\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: German\n"
"Language: de_DE\n"
@@ -84,7 +84,7 @@ msgstr "G-Code Extruder-Start"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
-msgstr ""
+msgstr "Auszuführenden G-Code beim Umschalten auf diesen Extruder starten."
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_abs label"
@@ -124,7 +124,7 @@ msgstr "G-Code Extruder-Ende"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_code description"
msgid "End g-code to execute when switching away from this extruder."
-msgstr ""
+msgstr "Auszuführenden G-Code beim Umschalten von diesem Extruder beenden."
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_abs label"
diff --git a/resources/i18n/de_DE/fdmprinter.def.json.po b/resources/i18n/de_DE/fdmprinter.def.json.po
index 360aaf0672..cc2ed06ac5 100644
--- a/resources/i18n/de_DE/fdmprinter.def.json.po
+++ b/resources/i18n/de_DE/fdmprinter.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 14:57+0200\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: German\n"
"Language: de_DE\n"
@@ -57,9 +57,7 @@ msgctxt "machine_start_gcode description"
msgid ""
"G-code commands to be executed at the very start - separated by \n"
"."
-msgstr ""
-"G-Code-Befehle, die zu Beginn ausgeführt werden sollen – getrennt durch \n"
-"."
+msgstr "G-Code-Befehle, die zu Beginn ausgeführt werden sollen – getrennt durch \n."
#: fdmprinter.def.json
msgctxt "machine_end_gcode label"
@@ -71,9 +69,7 @@ msgctxt "machine_end_gcode description"
msgid ""
"G-code commands to be executed at the very end - separated by \n"
"."
-msgstr ""
-"G-Code-Befehle, die am Ende ausgeführt werden sollen – getrennt durch \n"
-"."
+msgstr "G-Code-Befehle, die am Ende ausgeführt werden sollen – getrennt durch \n."
#: fdmprinter.def.json
msgctxt "material_guid label"
@@ -1635,9 +1631,7 @@ msgctxt "infill_wall_line_count description"
msgid ""
"Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n"
"This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right."
-msgstr ""
-"Fügen Sie zusätzliche Wände um den Füllbereich hinzu. Derartige Wände können zu einem verringerten Absacken der oberen/unteren Außenhautlinien beitragen, was bedeutet, dass Sie weniger Außenhautschichten oben/unten bei derselben Qualität von Kosten für zusätzliches Material benötigen.\n"
-" Diese Funktion ist verknüpfbar mit „Füllungspolygone verbinden“, um alle Füllungen mit einem einzigen Extrusionspfad zu verbinden, ohne dass hierzu Vorwärtsbewegungen oder Rückzüge erforderlich sind, sofern die richtige Konfiguration gewählt wurde."
+msgstr "Fügen Sie zusätzliche Wände um den Füllbereich hinzu. Derartige Wände können zu einem verringerten Absacken der oberen/unteren Außenhautlinien beitragen, was bedeutet, dass Sie weniger Außenhautschichten oben/unten bei derselben Qualität von Kosten für zusätzliches Material benötigen.\n Diese Funktion ist verknüpfbar mit „Füllungspolygone verbinden“, um alle Füllungen mit einem einzigen Extrusionspfad zu verbinden, ohne dass hierzu Vorwärtsbewegungen oder Rückzüge erforderlich sind, sofern die richtige Konfiguration gewählt wurde."
#: fdmprinter.def.json
msgctxt "sub_div_rad_add label"
@@ -1677,7 +1671,7 @@ msgstr "Prozentsatz Außenhaut überlappen"
#: fdmprinter.def.json
msgctxt "skin_overlap description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines, as a percentage of the line widths of the skin lines and the innermost wall. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any percentage over 50% may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Justieren Sie die Überlappung zwischen den Wänden und den Außenhaut-Mittellinien bzw. den Endpunkten der Außenhaut-Mittellinien als Prozentwert der Linienbreite der Außenhautlinien und der inneren Wand. Eine geringe Überlappung ermöglicht die feste Verbindung der Wände mit der Außenhaut. Beachten Sie, dass bei einer einheitlichen Linienbreite von Außenhaut und Wand jeder Prozentwert über 50 % bereits dazu führen kann, dass die Außenhaut über die Wand hinausgeht, da in diesem Moment die Position der Düse des Außenhaut-Extruders möglicherweise bereits über die Wandmitte hinausgeht."
#: fdmprinter.def.json
msgctxt "skin_overlap_mm label"
@@ -1687,7 +1681,7 @@ msgstr "Außenhaut überlappen"
#: fdmprinter.def.json
msgctxt "skin_overlap_mm description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any value over half the width of the wall may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Justieren Sie die Überlappung zwischen den Wänden und den Außenhaut-Mittellinien bzw. den Endpunkten der Außenhaut-Mittellinien. Eine geringe Überlappung ermöglicht die feste Verbindung der Wände mit der Außenhaut. Beachten Sie, dass bei einer einheitlichen Linienbreite von Außenhaut und Wand jeder Wert über die Hälfte der Wandbreite bereits dazu führen kann, dass die Außenhaut über die Wand hinausgeht, da in diesem Moment die Position der Düse des Außenhaut-Extruders möglicherweise bereits über die Wandmitte hinausgeht."
#: fdmprinter.def.json
msgctxt "infill_wipe_dist label"
@@ -2127,7 +2121,7 @@ msgstr "Düsenschalter Einzugsabstand"
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_amount description"
msgid "The amount of retraction when switching extruders. Set to 0 for no retraction at all. This should generally be the same as the length of the heat zone."
-msgstr ""
+msgstr "Der Wert für den Einzug beim Umstellen der Extruder: 0 einstellen, um keinen Einzug zu erhalten. Dies sollte generell mit der Länge der Heizzone übereinstimmen."
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_speeds label"
@@ -2787,7 +2781,7 @@ msgstr "Combing-Modus"
#: fdmprinter.def.json
msgctxt "retraction_combing description"
msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas or to only comb within the infill."
-msgstr ""
+msgstr "Durch Combing bleibt die Düse während der Bewegung innerhalb von bereits gedruckten Bereichen. Dies führt zu einer leicht verlängerten Bewegungszeit, reduziert jedoch die Notwendigkeit von Einzügen. Wenn Combing deaktiviert ist, wird das Material eingezogen und die Düse bewegt sich in einer geraden Linie zum nächsten Punkt. Es ist außerdem möglich, das Combing über die oberen/unteren Außenhautbereiche zu vermeiden, oder nur Combing innerhalb der Füllung auszuführen."
#: fdmprinter.def.json
msgctxt "retraction_combing option off"
@@ -3442,12 +3436,12 @@ msgstr "Die Höhe der Stützstruktur-Füllung einer bestimmten Dichte vor dem Um
#: fdmprinter.def.json
msgctxt "minimum_support_area label"
msgid "Minimum Support Area"
-msgstr ""
+msgstr "Mindestbereich Stützstruktur"
#: fdmprinter.def.json
msgctxt "minimum_support_area description"
msgid "Minimum area size for support polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Mindestflächenbreite für Stützstruktur-Polygone. Polygone, die eine kleinere Fläche als diesen Wert aufweisen, werden nicht generiert."
#: fdmprinter.def.json
msgctxt "support_interface_enable label"
@@ -3677,62 +3671,62 @@ msgstr "Zickzack"
#: fdmprinter.def.json
msgctxt "minimum_interface_area label"
msgid "Minimum Support Interface Area"
-msgstr ""
+msgstr "Mindestbereich Stützstruktur-Schnittstelle"
#: fdmprinter.def.json
msgctxt "minimum_interface_area description"
msgid "Minimum area size for support interface polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Mindestflächenbreite für Stützstruktur-Schnittstellen-Polygone. Polygone, die eine kleinere Fläche als diesen Wert aufweisen, werden nicht generiert."
#: fdmprinter.def.json
msgctxt "minimum_roof_area label"
msgid "Minimum Support Roof Area"
-msgstr ""
+msgstr "Mindestbereich Stützstrukturdach"
#: fdmprinter.def.json
msgctxt "minimum_roof_area description"
msgid "Minimum area size for the roofs of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Mindestflächenbreite für die Dächer der Stützstruktur. Polygone, die eine kleinere Fläche als diesen Wert aufweisen, werden nicht generiert."
#: fdmprinter.def.json
msgctxt "minimum_bottom_area label"
msgid "Minimum Support Floor Area"
-msgstr ""
+msgstr "Mindestbereich Stützstrukturboden"
#: fdmprinter.def.json
msgctxt "minimum_bottom_area description"
msgid "Minimum area size for the floors of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Mindestflächenbreite für die Böden der Stützstruktur. Polygone, die eine kleinere Fläche als diesen Wert aufweisen, werden nicht generiert."
#: fdmprinter.def.json
msgctxt "support_interface_offset label"
msgid "Support Interface Horizontal Expansion"
-msgstr ""
+msgstr "Horizontale Erweiterung Stützstruktur-Schnittstelle"
#: fdmprinter.def.json
msgctxt "support_interface_offset description"
msgid "Amount of offset applied to the support interface polygons."
-msgstr ""
+msgstr "Umfang des angewandten Versatzes für die Stützstruktur-Schnittstellen-Polygone."
#: fdmprinter.def.json
msgctxt "support_roof_offset label"
msgid "Support Roof Horizontal Expansion"
-msgstr ""
+msgstr "Horizontale Erweiterung Stützstrukturdach"
#: fdmprinter.def.json
msgctxt "support_roof_offset description"
msgid "Amount of offset applied to the roofs of the support."
-msgstr ""
+msgstr "Umfang des angewandten Versatzes für die Dächer der Stützstruktur."
#: fdmprinter.def.json
msgctxt "support_bottom_offset label"
msgid "Support Floor Horizontal Expansion"
-msgstr ""
+msgstr "Horizontale Erweiterung Stützstrukturboden"
#: fdmprinter.def.json
msgctxt "support_bottom_offset description"
msgid "Amount of offset applied to the floors of the support."
-msgstr ""
+msgstr "Umfang des angewandten Versatzes für die Böden der Stützstruktur."
#: fdmprinter.def.json
msgctxt "support_fan_enable label"
@@ -3904,9 +3898,7 @@ msgctxt "skirt_gap description"
msgid ""
"The horizontal distance between the skirt and the first layer of the print.\n"
"This is the minimum distance. Multiple skirt lines will extend outwards from this distance."
-msgstr ""
-"Der horizontale Abstand zwischen dem Skirt und der ersten Schicht des Drucks.\n"
-"Es handelt sich dabei um den Mindestabstand. Ab diesem Abstand werden mehrere Skirt-Linien in äußerer Richtung angebracht."
+msgstr "Der horizontale Abstand zwischen dem Skirt und der ersten Schicht des Drucks.\nEs handelt sich dabei um den Mindestabstand. Ab diesem Abstand werden mehrere Skirt-Linien in äußerer Richtung angebracht."
#: fdmprinter.def.json
msgctxt "skirt_brim_minimal_length label"
@@ -5353,9 +5345,7 @@ msgctxt "wireframe_up_half_speed description"
msgid ""
"Distance of an upward move which is extruded with half speed.\n"
"This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing."
-msgstr ""
-"Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\n"
-"Dies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur."
+msgstr "Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\nDies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur."
#: fdmprinter.def.json
msgctxt "wireframe_top_jump label"
@@ -5909,6 +5899,7 @@ msgstr "Transformationsmatrix, die beim Laden aus der Datei auf das Modell angew
#~ "Gcode commands to be executed at the very start - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "Gcode-Befehle, die zu Beginn ausgeführt werden sollen – getrennt durch \n"
#~ "."
@@ -5921,6 +5912,7 @@ msgstr "Transformationsmatrix, die beim Laden aus der Datei auf das Modell angew
#~ "Gcode commands to be executed at the very end - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "Gcode-Befehle, die Am Ende ausgeführt werden sollen – getrennt durch \n"
#~ "."
@@ -5977,6 +5969,7 @@ msgstr "Transformationsmatrix, die beim Laden aus der Datei auf das Modell angew
#~ "The horizontal distance between the skirt and the first layer of the print.\n"
#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance."
#~ msgstr ""
+
#~ "Der horizontale Abstand zwischen dem Skirt und der ersten Schicht des Drucks.\n"
#~ "Es handelt sich dabei um den Mindestabstand. Ab diesem Abstand werden Skirt-Linien in äußerer Richtung angebracht."
diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po
index aa217b0275..e3b45817c7 100644
--- a/resources/i18n/es_ES/cura.po
+++ b/resources/i18n/es_ES/cura.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2018-09-28 14:55+0200\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -64,16 +64,12 @@ msgid ""
"
{model_names}
\n"
"
Find out how to ensure the best possible print quality and reliability.
"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
msgctxt "@item:inmenu"
msgid "Changelog"
-msgstr ""
+msgstr "Registro de cambios"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
msgctxt "@item:inmenu"
@@ -492,100 +488,100 @@ msgstr "Impresión terminada"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
msgctxt "@label:material"
msgid "Empty"
-msgstr ""
+msgstr "Vacío"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
msgctxt "@label:material"
msgid "Unknown"
-msgstr ""
+msgstr "Desconocido"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
msgctxt "@action:button"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Imprimir mediante Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Imprimir mediante Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
msgctxt "@info:status"
msgid "Connected via Cloud"
-msgstr ""
+msgstr "Conectado mediante Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
msgctxt "@info:title"
msgid "Cloud error"
-msgstr ""
+msgstr "Error de Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
msgctxt "@info:status"
msgid "Could not export print job."
-msgstr ""
+msgstr "No se ha podido exportar el trabajo de impresión."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
-msgstr ""
+msgstr "No se han podido cargar los datos en la impresora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:51
msgctxt "@info:status"
msgid "tomorrow"
-msgstr ""
+msgstr "mañana"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:54
msgctxt "@info:status"
msgid "today"
-msgstr ""
+msgstr "hoy"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
-msgstr ""
+msgstr "Se ha producido un error al conectarse a la nube."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
msgid "Sending data to remote cluster"
-msgstr ""
+msgstr "Enviando datos al clúster remoto"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Envíe y supervise sus trabajos de impresión desde cualquier lugar a través de su cuenta de Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
msgctxt "@info:status"
msgid "Connect to Ultimaker Cloud"
-msgstr ""
+msgstr "Conectar a Ultimaker Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
msgctxt "@action"
msgid "Don't ask me again for this printer."
-msgstr ""
+msgstr "No volver a preguntarme para esta impresora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
msgctxt "@action"
msgid "Get started"
-msgstr ""
+msgstr "Empezar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Ahora ya puede enviar y supervisar sus trabajos de impresión desde cualquier lugar a través de su cuenta de Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
msgctxt "@info:status"
msgid "Connected!"
-msgstr ""
+msgstr "¡Conectado!"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
msgctxt "@action"
msgid "Review your connection"
-msgstr ""
+msgstr "Revise su conexión"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py:30
msgctxt "@action"
@@ -637,12 +633,12 @@ msgstr "Vista de simulación"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:35
msgctxt "@item:inmenu"
msgid "Post Processing"
-msgstr ""
+msgstr "Posprocesamiento"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:36
msgctxt "@item:inmenu"
msgid "Modify G-Code"
-msgstr ""
+msgstr "Modificar GCode"
#: /home/ruben/Projects/Cura/plugins/SupportEraser/__init__.py:12
msgctxt "@label"
@@ -692,7 +688,7 @@ msgstr "Perfiles de Cura 15.04"
#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
msgctxt "@item:inmenu"
msgid "Evaluation"
-msgstr ""
+msgstr "Evaluación"
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
@@ -760,7 +756,7 @@ msgstr "No se puede segmentar porque hay objetos asociados al extrusor %s que es
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
msgctxt "@info:status"
msgid "Nothing to slice because none of the models fit the build volume or are assigned to a disabled extruder. Please scale or rotate models to fit, or enable an extruder."
-msgstr ""
+msgstr "No hay nada que segmentar porque ninguno de los modelos se adapta al volumen de impresión o los modelos están asignados a un extrusor deshabilitado. Escale o rote los modelos para que se adapten o habilite un extrusor."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
@@ -845,7 +841,7 @@ msgstr "Asegúrese de que el GCode es adecuado para la impresora y para su confi
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:64
msgctxt "@item:inmenu"
msgid "Manage backups"
-msgstr ""
+msgstr "Administrar copias de seguridad"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:107
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:113
@@ -858,32 +854,32 @@ msgstr "Copia de seguridad"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:55
msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
-msgstr ""
+msgstr "Se ha producido un error al obtener sus copias de seguridad."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
-msgstr ""
+msgstr "Se ha producido un error al intentar restaurar su copia de seguridad."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:15
msgctxt "@info:title"
msgid "Backups"
-msgstr ""
+msgstr "Copias de seguridad"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:27
msgctxt "@info:backup_status"
msgid "Uploading your backup..."
-msgstr ""
+msgstr "Cargando su copia de seguridad..."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:36
msgctxt "@info:backup_status"
msgid "There was an error while uploading your backup."
-msgstr ""
+msgstr "Se ha producido un error al cargar su copia de seguridad."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:39
msgctxt "@info:backup_status"
msgid "Your backup has finished uploading."
-msgstr ""
+msgstr "Su copia de seguridad ha terminado de cargarse."
#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14
#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14
@@ -919,7 +915,7 @@ msgstr "Error al escribir el archivo 3MF."
#: /home/ruben/Projects/Cura/plugins/PreviewStage/__init__.py:13
msgctxt "@item:inmenu"
msgid "Preview"
-msgstr ""
+msgstr "Vista previa"
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
@@ -927,11 +923,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr "Seleccionar actualizaciones"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr "Comprobación"
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -1020,7 +1011,7 @@ msgstr "El archivo {0} ya existe. ¿Está seguro de que des
#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
msgctxt "@info:status"
msgid "Invalid file URL:"
-msgstr ""
+msgstr "URL del archivo no válida:"
#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
msgctxt "@menuitem"
@@ -1041,7 +1032,7 @@ msgstr "Ajustes actualizados"
#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
-msgstr ""
+msgstr "Extrusores deshabilitados"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
#, python-brace-format
@@ -1070,13 +1061,13 @@ msgstr "Exportación correcta"
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
-msgstr ""
+msgstr "Error al importar el perfil de {0}: {1}"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Can't import profile from {0} before a printer is added."
-msgstr ""
+msgstr "No se puede importar el perfil de {0} antes de añadir una impresora."
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
#, python-brace-format
@@ -1209,7 +1200,7 @@ msgstr "Se ha intentado restaurar una copia de seguridad de Cura que no coincide
#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
-msgstr ""
+msgstr "No se puede acceder al servidor de cuentas de Ultimaker."
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
@@ -1219,7 +1210,7 @@ msgstr "Multiplicar y colocar objetos"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:28
msgctxt "@info:title"
msgid "Placing Objects"
-msgstr ""
+msgstr "Colocando objetos"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:103
@@ -1264,12 +1255,7 @@ msgid ""
"
Backups can be found in the configuration folder.
\n"
"
Please send us this Crash Report to fix the problem.
\n"
" "
-msgstr ""
-"
¡Vaya! Ultimaker Cura ha encontrado un error.
\n"
-"
Hemos detectado un error irreversible durante el inicio, posiblemente como consecuencia de varios archivos de configuración erróneos. Le recomendamos que realice una copia de seguridad y que restablezca los ajustes.
\n"
-"
Las copias de seguridad se encuentran en la carpeta de configuración.
\n"
-"
Envíenos el informe de errores para que podamos solucionar el problema.
\n"
-" "
+msgstr "
¡Vaya! Ultimaker Cura ha encontrado un error.
\n
Hemos detectado un error irreversible durante el inicio, posiblemente como consecuencia de varios archivos de configuración erróneos. Le recomendamos que realice una copia de seguridad y que restablezca los ajustes.
\n
Las copias de seguridad se encuentran en la carpeta de configuración.
\n
Envíenos el informe de errores para que podamos solucionar el problema.
A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem
\n"
"
Please use the \"Send report\" button to post a bug report automatically to our servers
\n"
" "
-msgstr ""
-"
Se ha producido un error grave en Cura. Envíenos este informe de errores para que podamos solucionar el problema.
\n"
-"
Utilice el botón \"Enviar informe\" para publicar automáticamente el informe de errores en nuestros servidores.
\n"
-" "
+msgstr "
Se ha producido un error grave en Cura. Envíenos este informe de errores para que podamos solucionar el problema.
\n
Utilice el botón \"Enviar informe\" para publicar automáticamente el informe de errores en nuestros servidores.
\n "
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:173
msgctxt "@title:groupbox"
@@ -1635,7 +1618,7 @@ msgstr "No se ha podido conectar con la base de datos del Paquete Cura. Comprueb
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/SmallRatingWidget.qml:27
msgctxt "@label"
msgid "ratings"
-msgstr ""
+msgstr "calificaciones"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
@@ -1654,7 +1637,7 @@ msgstr "Materiales"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:91
msgctxt "@label"
msgid "Your rating"
-msgstr ""
+msgstr "Su calificación"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
msgctxt "@label"
@@ -1687,7 +1670,7 @@ msgstr "Desconocido"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
-msgstr ""
+msgstr "Inicie sesión para realizar la instalación o la actualización"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
@@ -1710,7 +1693,7 @@ msgstr "Actualizado"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:13
msgctxt "@title"
msgid "Marketplace"
-msgstr ""
+msgstr "Marketplace"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml:25
msgctxt "@action:button"
@@ -1745,12 +1728,12 @@ msgstr "Confirmar"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to login first before you can rate"
-msgstr ""
+msgstr "Debe iniciar sesión antes de enviar sus calificaciones"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to install the package before you can rate"
-msgstr ""
+msgstr "Debe instalar el paquete antes de enviar sus calificaciones"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:19
msgctxt "@info"
@@ -1790,7 +1773,7 @@ msgstr "Se instalará después de reiniciar"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:53
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to update"
-msgstr ""
+msgstr "Inicie sesión para realizar la actualización"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:71
msgctxt "@action:button"
@@ -1813,10 +1796,7 @@ msgid ""
"This plugin contains a license.\n"
"You need to accept this license to install this plugin.\n"
"Do you agree with the terms below?"
-msgstr ""
-"Este complemento incluye una licencia.\n"
-"Debe aceptar dicha licencia para instalar el complemento.\n"
-"¿Acepta las condiciones que aparecen a continuación?"
+msgstr "Este complemento incluye una licencia.\nDebe aceptar dicha licencia para instalar el complemento.\n¿Acepta las condiciones que aparecen a continuación?"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:55
msgctxt "@action:button"
@@ -1841,22 +1821,22 @@ msgstr "Compatibilidad"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:203
msgctxt "@action:label"
msgid "Technical Data Sheet"
-msgstr ""
+msgstr "Especificaciones técnicas"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:212
msgctxt "@action:label"
msgid "Safety Data Sheet"
-msgstr ""
+msgstr "Especificaciones de seguridad"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:221
msgctxt "@action:label"
msgid "Printing Guidelines"
-msgstr ""
+msgstr "Directrices de impresión"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:230
msgctxt "@action:label"
msgid "Website"
-msgstr ""
+msgstr "Sitio web"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml:16
msgctxt "@info"
@@ -1978,17 +1958,17 @@ msgstr "Acuerdo de usuario"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
msgctxt "@info"
msgid "These options are not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Estas opciones no se encuentran disponibles porque está supervisando una impresora en la nube."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:241
msgctxt "@info"
msgid "The webcam is not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "La cámara web no se encuentra disponible porque está supervisando una impresora en la nube."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
msgctxt "@label:status"
msgid "Loading..."
-msgstr ""
+msgstr "Cargando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
msgctxt "@label:status"
@@ -1998,42 +1978,42 @@ msgstr "No disponible"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
msgctxt "@label:status"
msgid "Unreachable"
-msgstr ""
+msgstr "No se puede conectar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
msgctxt "@label:status"
msgid "Idle"
-msgstr ""
+msgstr "Sin actividad"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:353
msgctxt "@label"
msgid "Untitled"
-msgstr ""
+msgstr "Sin título"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
msgctxt "@label"
msgid "Anonymous"
-msgstr ""
+msgstr "Anónimo"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
msgctxt "@label:status"
msgid "Requires configuration changes"
-msgstr ""
+msgstr "Debe cambiar la configuración"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
msgctxt "@action:button"
msgid "Details"
-msgstr ""
+msgstr "Detalles"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "Unavailable printer"
-msgstr ""
+msgstr "Impresora no disponible"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
msgctxt "@label"
msgid "First available"
-msgstr ""
+msgstr "Primera disponible"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:187
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:132
@@ -2049,27 +2029,27 @@ msgstr "En cola"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
msgid "Go to Cura Connect"
-msgstr ""
+msgstr "Ir a Cura Connect"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
msgctxt "@label"
msgid "Print jobs"
-msgstr ""
+msgstr "Trabajos de impresión"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Total print time"
-msgstr ""
+msgstr "Tiempo de impresión total"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
msgctxt "@label"
msgid "Waiting for"
-msgstr ""
+msgstr "Esperando"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
msgctxt "@label link to connect manager"
msgid "View print history"
-msgstr ""
+msgstr "Ver historial de impresión"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
msgctxt "@window:title"
@@ -2092,10 +2072,7 @@ msgid ""
"To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n"
"\n"
"Select your printer from the list below:"
-msgstr ""
-"Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n"
-"\n"
-"Seleccione la impresora de la siguiente lista:"
+msgstr "Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n\nSeleccione la impresora de la siguiente lista:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:87
#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44
@@ -2195,17 +2172,17 @@ msgstr "Terminado"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Preparing..."
-msgstr ""
+msgstr "Preparando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Aborting..."
-msgstr ""
+msgstr "Cancelando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
msgctxt "@label:status"
msgid "Pausing..."
-msgstr ""
+msgstr "Pausando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
msgctxt "@label:status"
@@ -2215,7 +2192,7 @@ msgstr "En pausa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
msgctxt "@label:status"
msgid "Resuming..."
-msgstr ""
+msgstr "Reanudando"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
msgctxt "@label:status"
@@ -2225,7 +2202,7 @@ msgstr "Acción requerida"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
msgctxt "@label:status"
msgid "Finishes %1 at %2"
-msgstr ""
+msgstr "Termina el %1 a las %2"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:44
msgctxt "@action:button"
@@ -2261,12 +2238,12 @@ msgstr "Reanudar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:102
msgctxt "@label"
msgid "Pausing..."
-msgstr ""
+msgstr "Pausando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:104
msgctxt "@label"
msgid "Resuming..."
-msgstr ""
+msgstr "Reanudando"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:106
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284
@@ -2278,7 +2255,7 @@ msgstr "Pausar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
msgid "Aborting..."
-msgstr ""
+msgstr "Cancelando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
@@ -2319,24 +2296,24 @@ msgstr "Cancela la impresión"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:20
msgctxt "@title:window"
msgid "Configuration Changes"
-msgstr ""
+msgstr "Cambios de configuración"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:27
msgctxt "@action:button"
msgid "Override"
-msgstr ""
+msgstr "Anular"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
msgctxt "@label"
msgid "The assigned printer, %1, requires the following configuration change:"
msgid_plural "The assigned printer, %1, requires the following configuration changes:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Es necesario realizar el siguiente cambio de configuración en la impresora asignada %1:"
+msgstr[1] "Es necesario realizar los siguientes cambios de configuración en la impresora asignada %1:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
msgctxt "@label"
msgid "The printer %1 is assigned, but the job contains an unknown material configuration."
-msgstr "Se ha asignado la impresora 1%, pero el trabajo tiene una configuración de material desconocido."
+msgstr "Se ha asignado la impresora %1, pero el trabajo tiene una configuración de material desconocido."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:78
msgctxt "@label"
@@ -2361,7 +2338,7 @@ msgstr "Cambiar la placa de impresión a %1 (no se puede anular)."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
-msgstr ""
+msgstr "Al sobrescribir la configuración se usarán los ajustes especificados con la configuración de impresora existente. Esto podría provocar un fallo en la impresión."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
msgctxt "@label"
@@ -2379,22 +2356,22 @@ msgid ""
"Please make sure your printer has a connection:\n"
"- Check if the printer is turned on.\n"
"- Check if the printer is connected to the network."
-msgstr ""
+msgstr "Asegúrese de que su impresora está conectada:\n- Compruebe que la impresora está encendida.\n- Compruebe que la impresora está conectada a la red."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
msgctxt "@info"
msgid "Please select a network connected printer to monitor."
-msgstr ""
+msgstr "Seleccione la impresora conectada a la red que desee supervisar."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
msgctxt "@info"
msgid "Please connect your Ultimaker printer to your local network."
-msgstr ""
+msgstr "Conecte su impresora Ultimaker a su red local."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
-msgstr ""
+msgstr "Ver manuales de usuario en línea"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
@@ -2430,17 +2407,17 @@ msgstr "Modo de compatibilidad"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
msgctxt "@label"
msgid "Travels"
-msgstr ""
+msgstr "Desplazamientos"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
msgctxt "@label"
msgid "Helpers"
-msgstr ""
+msgstr "Asistentes"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
msgctxt "@label"
msgid "Shell"
-msgstr ""
+msgstr "Perímetro"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
@@ -2516,17 +2493,17 @@ msgstr "Cura envía datos anónimos a Ultimaker para mejorar la calidad de impre
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
msgctxt "@text:window"
msgid "I don't want to send this data"
-msgstr ""
+msgstr "No deseo enviar estos datos"
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
msgctxt "@text:window"
msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr ""
+msgstr "Permita que estos datos se envíen a Ultimaker y ayúdenos a mejorar Cura"
#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
msgctxt "@label"
msgid "No print selected"
-msgstr ""
+msgstr "No ha seleccionado ninguna impresora"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2788,108 +2765,108 @@ msgstr "Abrir"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:28
msgctxt "@title"
msgid "My Backups"
-msgstr ""
+msgstr "Mis copias de seguridad"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:38
msgctxt "@empty_state"
msgid "You don't have any backups currently. Use the 'Backup Now' button to create one."
-msgstr ""
+msgstr "Actualmente no posee ninguna copia de seguridad. Utilice el botón de Realizar copia de seguridad ahora para crear una."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:60
msgctxt "@backup_limit_info"
msgid "During the preview phase, you'll be limited to 5 visible backups. Remove a backup to see older ones."
-msgstr ""
+msgstr "Durante la fase de vista previa, solo se mostrarán 5 copias de seguridad. Elimine una copia de seguridad para ver copias de seguridad antiguas."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:34
msgctxt "@description"
msgid "Backup and synchronize your Cura settings."
-msgstr ""
+msgstr "Realice una copia de seguridad y sincronice sus ajustes de Cura."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
msgctxt "@button"
msgid "Sign in"
-msgstr ""
+msgstr "Iniciar sesión"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/main.qml:24
msgctxt "@title:window"
msgid "Cura Backups"
-msgstr ""
+msgstr "Copias de seguridad de Cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:21
msgctxt "@backuplist:label"
msgid "Cura Version"
-msgstr ""
+msgstr "Versión de Cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:29
msgctxt "@backuplist:label"
msgid "Machines"
-msgstr ""
+msgstr "Máquinas"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:37
msgctxt "@backuplist:label"
msgid "Materials"
-msgstr ""
+msgstr "Materiales"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:45
msgctxt "@backuplist:label"
msgid "Profiles"
-msgstr ""
+msgstr "Perfiles"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:53
msgctxt "@backuplist:label"
msgid "Plugins"
-msgstr ""
+msgstr "Complementos"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:71
msgctxt "@button"
msgid "Restore"
-msgstr ""
+msgstr "Restaurar"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:99
msgctxt "@dialog:title"
msgid "Delete Backup"
-msgstr ""
+msgstr "Eliminar copia de seguridad"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:100
msgctxt "@dialog:info"
msgid "Are you sure you want to delete this backup? This cannot be undone."
-msgstr ""
+msgstr "¿Seguro que desea eliminar esta copia de seguridad? Esta acción no se puede deshacer."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:108
msgctxt "@dialog:title"
msgid "Restore Backup"
-msgstr ""
+msgstr "Restaurar copia de seguridad"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:109
msgctxt "@dialog:info"
msgid "You will need to restart Cura before your backup is restored. Do you want to close Cura now?"
-msgstr ""
+msgstr "Deberá reiniciar Cura para restaurar su copia de seguridad. ¿Desea cerrar Cura ahora?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:22
msgctxt "@button"
msgid "Want more?"
-msgstr ""
+msgstr "¿Desea obtener más información?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:31
msgctxt "@button"
msgid "Backup Now"
-msgstr ""
+msgstr "Realizar copia de seguridad ahora"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:43
msgctxt "@checkbox:description"
msgid "Auto Backup"
-msgstr ""
+msgstr "Copia de seguridad automática"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:44
msgctxt "@checkbox:description"
msgid "Automatically create a backup each day that Cura is started."
-msgstr ""
+msgstr "Crea una copia de seguridad de forma automática cada día que inicia Cura."
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMainSettingsSelector.qml:75
msgctxt "@label"
msgid "Not supported"
-msgstr ""
+msgstr "No compatible"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:35
msgctxt "@action:button"
@@ -2974,99 +2951,6 @@ msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr "Placa de impresión caliente (kit oficial o construida por usted mismo)"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27
-msgctxt "@title"
-msgid "Check Printer"
-msgstr "Comprobar impresora"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39
-msgctxt "@label"
-msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"
-msgstr "Es una buena idea hacer un par de comprobaciones en su Ultimaker. Puede omitir este paso si usted sabe que su máquina funciona correctamente"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53
-msgctxt "@action:button"
-msgid "Start Printer Check"
-msgstr "Iniciar comprobación de impresora"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80
-msgctxt "@label"
-msgid "Connection: "
-msgstr "Conexión: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Connected"
-msgstr "Conectado"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Not connected"
-msgstr "Sin conexión"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99
-msgctxt "@label"
-msgid "Min endstop X: "
-msgstr "Parada final mín. en X: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-msgctxt "@info:status"
-msgid "Works"
-msgstr "Funciona"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Not checked"
-msgstr "Sin comprobar"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120
-msgctxt "@label"
-msgid "Min endstop Y: "
-msgstr "Parada final mín. en Y: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141
-msgctxt "@label"
-msgid "Min endstop Z: "
-msgstr "Parada final mín. en Z: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163
-msgctxt "@label"
-msgid "Nozzle temperature check: "
-msgstr "Comprobación de la temperatura de la tobera: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Stop Heating"
-msgstr "Detener calentamiento"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Start Heating"
-msgstr "Iniciar calentamiento"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223
-msgctxt "@label"
-msgid "Build plate temperature check:"
-msgstr "Comprobación de la temperatura de la placa de impresión:"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Checked"
-msgstr "Comprobada"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284
-msgctxt "@label"
-msgid "Everything is in order! You're done with your CheckUp."
-msgstr "¡Todo correcto! Ha terminado con la comprobación."
-
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"
msgid "Not connected to a printer"
@@ -3638,7 +3522,7 @@ msgstr "Crear perfil"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
msgctxt "@info"
msgid "Please provide a name for this profile."
-msgstr ""
+msgstr "Introduzca un nombre para este perfil."
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
msgctxt "@title:window"
@@ -3668,7 +3552,7 @@ msgstr "Impresora: %1"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
msgid "Default profiles"
-msgstr ""
+msgstr "Perfiles predeterminados"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
@@ -3703,7 +3587,7 @@ msgstr "Ajustes globales"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
msgctxt "@action:button"
msgid "Marketplace"
-msgstr ""
+msgstr "Marketplace"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:27
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:13
@@ -3726,7 +3610,7 @@ msgstr "&Ver"
#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:13
msgctxt "@title:menu menubar:toplevel"
msgid "&Settings"
-msgstr ""
+msgstr "A&justes"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:55
msgctxt "@title:menu menubar:toplevel"
@@ -3761,7 +3645,7 @@ msgstr "Sin título"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:68
msgctxt "@label:textbox"
msgid "search settings"
-msgstr ""
+msgstr "buscar ajustes"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
msgctxt "@action:menu"
@@ -3800,10 +3684,7 @@ msgid ""
"Some hidden settings use values different from their normal calculated value.\n"
"\n"
"Click to make these settings visible."
-msgstr ""
-"Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n"
-"\n"
-"Haga clic para mostrar estos ajustes."
+msgstr "Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n\nHaga clic para mostrar estos ajustes."
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66
msgctxt "@label Header for list of settings."
@@ -3831,10 +3712,7 @@ msgid ""
"This setting has a value that is different from the profile.\n"
"\n"
"Click to restore the value of the profile."
-msgstr ""
-"Este ajuste tiene un valor distinto del perfil.\n"
-"\n"
-"Haga clic para restaurar el valor del perfil."
+msgstr "Este ajuste tiene un valor distinto del perfil.\n\nHaga clic para restaurar el valor del perfil."
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:302
msgctxt "@label"
@@ -3842,25 +3720,22 @@ msgid ""
"This setting is normally calculated, but it currently has an absolute value set.\n"
"\n"
"Click to restore the calculated value."
-msgstr ""
-"Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n"
-"\n"
-"Haga clic para restaurar el valor calculado."
+msgstr "Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n\nHaga clic para restaurar el valor calculado."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
msgctxt "@button"
msgid "Recommended"
-msgstr ""
+msgstr "Recomendado"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
msgctxt "@button"
msgid "Custom"
-msgstr ""
+msgstr "Personalizado"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:193
msgctxt "@label"
msgid "Gradual infill"
-msgstr ""
+msgstr "Relleno gradual"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:232
msgctxt "@label"
@@ -3870,7 +3745,7 @@ msgstr "Un relleno gradual aumentará gradualmente la cantidad de relleno hacia
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
msgctxt "@label"
msgid "Support"
-msgstr ""
+msgstr "Soporte"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
msgctxt "@label"
@@ -3885,7 +3760,7 @@ msgstr "Seleccione qué extrusor se utilizará como soporte. Esta opción formar
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
msgctxt "@label"
msgid "Adhesion"
-msgstr ""
+msgstr "Adherencia"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
msgctxt "@label"
@@ -3905,7 +3780,7 @@ msgstr "Ha modificado algunos ajustes del perfil. Si desea cambiarlos, hágalo e
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:355
msgctxt "@tooltip"
msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile"
-msgstr ""
+msgstr "Este perfil de calidad no se encuentra disponible para su configuración de material y tobera actual. Cámbiela para poder habilitar este perfil de calidad."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3915,17 +3790,17 @@ msgstr "Hay un perfil personalizado activado en este momento. Para habilitar el
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:13
msgctxt "@label:Should be short"
msgid "On"
-msgstr ""
+msgstr "Encendido"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:14
msgctxt "@label:Should be short"
msgid "Off"
-msgstr ""
+msgstr "Apagado"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:27
msgctxt "@label"
msgid "Profile"
-msgstr ""
+msgstr "Perfil"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:94
msgctxt "@tooltip"
@@ -3933,15 +3808,12 @@ msgid ""
"Some setting/override values are different from the values stored in the profile.\n"
"\n"
"Click to open the profile manager."
-msgstr ""
-"Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n"
-"\n"
-"Haga clic para abrir el administrador de perfiles."
+msgstr "Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n\nHaga clic para abrir el administrador de perfiles."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label shown when we load a Gcode file"
msgid "Print setup disabled. G code file can not be modified."
-msgstr ""
+msgstr "Configuración de impresión deshabilitada. No se puede modificar el GCode."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -4182,47 +4054,47 @@ msgstr "Número de copias"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/AutoConfiguration.qml:18
msgctxt "@header"
msgid "Configurations"
-msgstr ""
+msgstr "Configuraciones"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:110
msgctxt "@label"
msgid "Select configuration"
-msgstr ""
+msgstr "Seleccionar configuración"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
msgctxt "@label"
msgid "See the material compatibility chart"
-msgstr ""
+msgstr "Ver el gráfico de compatibilidad de materiales"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
msgctxt "@label"
msgid "Configurations"
-msgstr ""
+msgstr "Configuraciones"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:57
msgctxt "@label"
msgid "Loading available configurations from the printer..."
-msgstr ""
+msgstr "Cargando configuraciones disponibles desde la impresora..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:58
msgctxt "@label"
msgid "The configurations are not available because the printer is disconnected."
-msgstr ""
+msgstr "Las configuraciones no se encuentran disponibles porque la impresora no está conectada."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:25
msgctxt "@header"
msgid "Custom"
-msgstr ""
+msgstr "Personalizado"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:61
msgctxt "@label"
msgid "Printer"
-msgstr ""
+msgstr "Impresora"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
msgctxt "@label"
msgid "Enabled"
-msgstr ""
+msgstr "Habilitado"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
msgctxt "@label"
@@ -4232,17 +4104,17 @@ msgstr "Material"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
-msgstr ""
+msgstr "Utilice pegamento con esta combinación de materiales para lograr una mejor adhesión."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:128
msgctxt "@label"
msgid "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile."
-msgstr ""
+msgstr "Esta configuración no se encuentra disponible porque %1 es un perfil desconocido. Visite %2 para descargar el perfil de materiales correcto."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:129
msgctxt "@label"
msgid "Marketplace"
-msgstr ""
+msgstr "Marketplace"
#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:15
msgctxt "@title:menu menubar:file"
@@ -4272,37 +4144,37 @@ msgstr "Tiempo restante estimado"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
msgid "View types"
-msgstr ""
+msgstr "Ver tipos"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
msgctxt "@label"
msgid "Hi "
-msgstr ""
+msgstr "Hola "
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
msgctxt "@button"
msgid "Ultimaker account"
-msgstr ""
+msgstr "Cuenta de Ultimaker"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
msgctxt "@button"
msgid "Sign out"
-msgstr ""
+msgstr "Cerrar sesión"
#: /home/ruben/Projects/Cura/resources/qml/Account/AccountWidget.qml:24
msgctxt "@action:button"
msgid "Sign in"
-msgstr ""
+msgstr "Iniciar sesión"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
msgctxt "@label"
msgid "Ultimaker Cloud"
-msgstr ""
+msgstr "Ultimaker Cloud"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
-msgstr ""
+msgstr "El flujo de trabajo de impresión 3D de próxima generación"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:51
msgctxt "@text"
@@ -4310,27 +4182,27 @@ msgid ""
"- Send print jobs to Ultimaker printers outside your local network\n"
"- Store your Ultimaker Cura settings in the cloud for use anywhere\n"
"- Get exclusive access to material profiles from leading brands"
-msgstr ""
+msgstr "- Envíe trabajos de impresión a impresoras Ultimaker fuera de su red local\n- Guarde su configuración de Ultimaker Cura en la nube para poder usarla en cualquier lugar\n- Disfrute de acceso exclusivo a perfiles de materiales de marcas líderes"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
msgid "Create account"
-msgstr ""
+msgstr "Crear cuenta"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
msgctxt "@label"
msgid "No time estimation available"
-msgstr ""
+msgstr "Ningún cálculo de tiempo disponible"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
msgctxt "@label"
msgid "No cost estimation available"
-msgstr ""
+msgstr "Ningún cálculo de costes disponible"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
msgctxt "@button"
msgid "Preview"
-msgstr ""
+msgstr "Vista previa"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
msgctxt "@label:PrintjobStatus"
@@ -4345,27 +4217,27 @@ msgstr "No se puede segmentar"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
msgctxt "@button"
msgid "Slice"
-msgstr ""
+msgstr "Segmentación"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
msgctxt "@label"
msgid "Start the slicing process"
-msgstr ""
+msgstr "Iniciar el proceso de segmentación"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
msgctxt "@button"
msgid "Cancel"
-msgstr ""
+msgstr "Cancelar"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
msgid "Time specification"
-msgstr ""
+msgstr "Especificación de tiempos"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
msgid "Material specification"
-msgstr ""
+msgstr "Especificación de materiales"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4380,27 +4252,27 @@ msgstr "%1 g"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Connected printers"
-msgstr ""
+msgstr "Impresoras conectadas"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Preset printers"
-msgstr ""
+msgstr "Impresoras preconfiguradas"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
msgctxt "@button"
msgid "Add printer"
-msgstr ""
+msgstr "Agregar impresora"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
msgctxt "@button"
msgid "Manage printers"
-msgstr ""
+msgstr "Administrar impresoras"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
-msgstr ""
+msgstr "Mostrar Guía de resolución de problemas en línea"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
msgctxt "@action:inmenu"
@@ -4611,7 +4483,7 @@ msgstr "Mostrar carpeta de configuración"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
msgctxt "@action:menu"
msgid "&Marketplace"
-msgstr ""
+msgstr "&Marketplace"
#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
msgctxt "@title:window"
@@ -4683,9 +4555,7 @@ msgctxt "@text:window"
msgid ""
"You have customized some profile settings.\n"
"Would you like to keep or discard those settings?"
-msgstr ""
-"Ha personalizado parte de los ajustes del perfil.\n"
-"¿Desea descartar los cambios o guardarlos?"
+msgstr "Ha personalizado parte de los ajustes del perfil.\n¿Desea descartar los cambios o guardarlos?"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:110
msgctxt "@title:column"
@@ -4730,7 +4600,7 @@ msgstr "Crear nuevo perfil"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
msgctxt "@title:tab"
msgid "Add a printer to Cura"
-msgstr ""
+msgstr "Añadir una impresora a Cura"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
msgctxt "@title:tab"
@@ -4738,17 +4608,17 @@ msgid ""
"Select the printer you want to use from the list below.\n"
"\n"
"If your printer is not in the list, use the \"Custom FFF Printer\" from the \"Custom\" category and adjust the settings to match your printer in the next dialog."
-msgstr ""
+msgstr "Seleccione la impresora que desee utilizar de la lista que se muestra a continuación.\n\nSi no encuentra su impresora en la lista, utilice la opción \"Custom FFF Printer\" (Impresora FFF personalizada) de la categoría Personalizado y configure los ajustes para adaptarlos a su impresora en el siguiente cuadro de diálogo."
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
msgctxt "@label"
msgid "Manufacturer"
-msgstr ""
+msgstr "Fabricante"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
msgctxt "@label"
msgid "Printer Name"
-msgstr ""
+msgstr "Nombre de la impresora"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
msgctxt "@action:button"
@@ -4775,9 +4645,7 @@ msgctxt "@info:credit"
msgid ""
"Cura is developed by Ultimaker B.V. in cooperation with the community.\n"
"Cura proudly uses the following open source projects:"
-msgstr ""
-"Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\n"
-"Cura se enorgullece de utilizar los siguientes proyectos de código abierto:"
+msgstr "Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\nCura se enorgullece de utilizar los siguientes proyectos de código abierto:"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:134
msgctxt "@label"
@@ -5185,6 +5053,7 @@ msgstr "X3GWriter"
#~ "Print Setup disabled\n"
#~ "G-code files cannot be modified"
#~ msgstr ""
+
#~ "Ajustes de impresión deshabilitados\n"
#~ "No se pueden modificar los archivos GCode"
@@ -5789,6 +5658,7 @@ msgstr "X3GWriter"
#~ "Could not export using \"{}\" quality!\n"
#~ "Felt back to \"{}\"."
#~ msgstr ""
+
#~ "No ha podido exportarse con la calidad \"{}\"\n"
#~ "Retroceder a \"{}\"."
@@ -5965,6 +5835,7 @@ msgstr "X3GWriter"
#~ "2) Turn the fan off (only if there are no tiny details on the model).\n"
#~ "3) Use a different material."
#~ msgstr ""
+
#~ "Es posible que algunos modelos no se impriman correctamente debido al tamaño del objeto y al material elegido para los modelos: {model_names}.\n"
#~ "Consejos para mejorar la calidad de la impresión:\n"
#~ "1) Utilizar esquinas redondeadas.\n"
@@ -5981,6 +5852,7 @@ msgstr "X3GWriter"
#~ "\n"
#~ "Thanks!"
#~ msgstr ""
+
#~ "No se han encontrado modelos en el dibujo. ¿Puede comprobar el contenido de nuevo y asegurarse de que hay una parte o un ensamblado dentro?\n"
#~ "\n"
#~ "Gracias."
@@ -5991,6 +5863,7 @@ msgstr "X3GWriter"
#~ "\n"
#~ "Sorry!"
#~ msgstr ""
+
#~ "Se ha encontrado más de una parte o ensamblado en el dibujo. Actualmente, únicamente son compatibles dibujos con una sola parte o ensamblado.\n"
#~ "\n"
#~ "Perdone las molestias."
@@ -6015,6 +5888,7 @@ msgstr "X3GWriter"
#~ "With kind regards\n"
#~ " - Thomas Karl Pietrowski"
#~ msgstr ""
+
#~ "Estimado cliente:\n"
#~ "No hemos encontrado una instalación válida de SolidWorks en el sistema. Esto significa que SolidWorks no está instalado o que no dispone de una licencia válida. Asegúrese de que la ejecución del propio SolidWorks funciona sin problemas o póngase en contacto con su CDTI.\n"
#~ "\n"
@@ -6029,6 +5903,7 @@ msgstr "X3GWriter"
#~ "With kind regards\n"
#~ " - Thomas Karl Pietrowski"
#~ msgstr ""
+
#~ "Estimado cliente:\n"
#~ "Actualmente está ejecutando este complemento en un sistema operativo diferente a Windows. Este complemento solo funcionará en Windows con SolidWorks instalado, siempre que se disponga de una licencia válida. Instale este complemento en un equipo Windows con SolidWorks instalado.\n"
#~ "\n"
@@ -6133,6 +6008,7 @@ msgstr "X3GWriter"
#~ "Open the directory\n"
#~ "with macro and icon"
#~ msgstr ""
+
#~ "Abra el directorio\n"
#~ "con la macro y el icono"
@@ -6431,6 +6307,7 @@ msgstr "X3GWriter"
#~ "\n"
#~ " Thanks!."
#~ msgstr ""
+
#~ "No se han encontrado modelos en el dibujo. ¿Puede comprobar el contenido de nuevo y asegurarse de que hay una parte o un ensamblado dentro?\n"
#~ "\n"
#~ " Gracias."
@@ -6441,6 +6318,7 @@ msgstr "X3GWriter"
#~ "\n"
#~ "Sorry!"
#~ msgstr ""
+
#~ "Se ha encontrado más de una parte o ensamblado en el dibujo. Actualmente únicamente son compatibles dibujos con una sola parte o ensamblado.\n"
#~ "\n"
#~ " Disculpe."
@@ -6475,6 +6353,7 @@ msgstr "X3GWriter"
#~ "
Please use the \"Send report\" button to post a bug report automatically to our servers
\n"
#~ " "
#~ msgstr ""
+
#~ "
Se ha producido un error grave. Envíenos este informe de incidencias para que podamos solucionar el problema.
\n"
#~ "
Utilice el botón «Enviar informe» para publicar automáticamente un informe de errores en nuestros servidores.
\n"
diff --git a/resources/i18n/es_ES/fdmextruder.def.json.po b/resources/i18n/es_ES/fdmextruder.def.json.po
index 3dfd35a0f3..9333665e05 100644
--- a/resources/i18n/es_ES/fdmextruder.def.json.po
+++ b/resources/i18n/es_ES/fdmextruder.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 14:25+0100\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -84,7 +84,7 @@ msgstr "GCode inicial del extrusor"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
-msgstr ""
+msgstr "Iniciar GCode para ejecutarlo al cambiar a este extrusor."
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_abs label"
@@ -124,7 +124,7 @@ msgstr "GCode final del extrusor"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_code description"
msgid "End g-code to execute when switching away from this extruder."
-msgstr ""
+msgstr "Finalizar GCode para ejecutarlo al cambiar desde este extrusor."
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_abs label"
diff --git a/resources/i18n/es_ES/fdmprinter.def.json.po b/resources/i18n/es_ES/fdmprinter.def.json.po
index fbdf0d8f48..3eeabf81ca 100644
--- a/resources/i18n/es_ES/fdmprinter.def.json.po
+++ b/resources/i18n/es_ES/fdmprinter.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 14:56+0200\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -57,9 +57,7 @@ msgctxt "machine_start_gcode description"
msgid ""
"G-code commands to be executed at the very start - separated by \n"
"."
-msgstr ""
-"Los comandos de GCode que se ejecutarán justo al inicio separados por - \n"
-"."
+msgstr "Los comandos de GCode que se ejecutarán justo al inicio separados por - \n."
#: fdmprinter.def.json
msgctxt "machine_end_gcode label"
@@ -71,9 +69,7 @@ msgctxt "machine_end_gcode description"
msgid ""
"G-code commands to be executed at the very end - separated by \n"
"."
-msgstr ""
-"Los comandos de GCode que se ejecutarán justo al final separados por -\n"
-"."
+msgstr "Los comandos de GCode que se ejecutarán justo al final separados por -\n."
#: fdmprinter.def.json
msgctxt "material_guid label"
@@ -1635,9 +1631,7 @@ msgctxt "infill_wall_line_count description"
msgid ""
"Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n"
"This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right."
-msgstr ""
-"Agregar paredes adicionales alrededor del área de relleno. Estas paredes pueden hacer que las líneas del forro superior/inferior se aflojen menos, lo que significa que necesitaría menos capas de forro superior/inferior para obtener la misma calidad utilizando algo más de material.\n"
-"Puede utilizar esta función junto a la de Conectar polígonos de relleno para conectar todo el relleno en una única trayectoria de extrusión sin necesidad de desplazamientos ni retracciones si se configura correctamente."
+msgstr "Agregar paredes adicionales alrededor del área de relleno. Estas paredes pueden hacer que las líneas del forro superior/inferior se aflojen menos, lo que significa que necesitaría menos capas de forro superior/inferior para obtener la misma calidad utilizando algo más de material.\nPuede utilizar esta función junto a la de Conectar polígonos de relleno para conectar todo el relleno en una única trayectoria de extrusión sin necesidad de desplazamientos ni retracciones si se configura correctamente."
#: fdmprinter.def.json
msgctxt "sub_div_rad_add label"
@@ -1677,7 +1671,7 @@ msgstr "Porcentaje de superposición del forro"
#: fdmprinter.def.json
msgctxt "skin_overlap description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines, as a percentage of the line widths of the skin lines and the innermost wall. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any percentage over 50% may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Ajuste la cantidad de superposición entre las paredes y (los extremos de) las líneas centrales del forro, como un porcentaje de los anchos de las líneas del forro y la pared más profunda. Una ligera superposición permite que las paredes estén firmemente unidas al forro. Tenga en cuenta que, con un mismo ancho de la línea del forro y la pared, cualquier porcentaje superior al 50 % ya puede provocar que cualquier forro sobrepase la pared, debido a que en ese punto la posición de la tobera del extrusor del forro ya puede sobrepasar la mitad de la pared."
#: fdmprinter.def.json
msgctxt "skin_overlap_mm label"
@@ -1687,7 +1681,7 @@ msgstr "Superposición del forro"
#: fdmprinter.def.json
msgctxt "skin_overlap_mm description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any value over half the width of the wall may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Ajuste la cantidad de superposición entre las paredes y (los extremos de) las líneas centrales del forro. Una ligera superposición permite que las paredes estén firmemente unidas al forro. Tenga en cuenta que, con un mismo ancho de la línea del forro y la pared, cualquier valor superior a la mitad del ancho de la pared ya puede provocar que cualquier forro sobrepase la pared, debido a que en ese punto la posición de la tobera del extrusor del forro ya puede sobrepasar la mitad de la pared."
#: fdmprinter.def.json
msgctxt "infill_wipe_dist label"
@@ -2127,7 +2121,7 @@ msgstr "Distancia de retracción del cambio de tobera"
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_amount description"
msgid "The amount of retraction when switching extruders. Set to 0 for no retraction at all. This should generally be the same as the length of the heat zone."
-msgstr ""
+msgstr "Distancia de la retracción al cambiar los extrusores. Utilice el valor 0 para que no haya retracción. Por norma general, este valor debe ser igual a la longitud de la zona de calentamiento."
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_speeds label"
@@ -2787,7 +2781,7 @@ msgstr "Modo Peinada"
#: fdmprinter.def.json
msgctxt "retraction_combing description"
msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas or to only comb within the infill."
-msgstr ""
+msgstr "La opción de peinada mantiene la tobera dentro de las áreas ya impresas al desplazarse. Esto ocasiona movimientos de desplazamiento ligeramente más largos, pero reduce la necesidad de realizar retracciones. Si se desactiva la opción de peinada, el material se retraerá y la tobera se moverá en línea recta hasta el siguiente punto. Otra posibilidad es evitar la peinada en áreas de forro superiores/inferiores o peinar solo en el relleno."
#: fdmprinter.def.json
msgctxt "retraction_combing option off"
@@ -3442,12 +3436,12 @@ msgstr "Altura del relleno de soporte de una determinada densidad antes de cambi
#: fdmprinter.def.json
msgctxt "minimum_support_area label"
msgid "Minimum Support Area"
-msgstr ""
+msgstr "Área del soporte mínima"
#: fdmprinter.def.json
msgctxt "minimum_support_area description"
msgid "Minimum area size for support polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Tamaño del área mínima para los polígonos del soporte. No se generarán polígonos que posean un área de menor tamaño que este valor."
#: fdmprinter.def.json
msgctxt "support_interface_enable label"
@@ -3677,62 +3671,62 @@ msgstr "Zigzag"
#: fdmprinter.def.json
msgctxt "minimum_interface_area label"
msgid "Minimum Support Interface Area"
-msgstr ""
+msgstr "Área de la interfaz de soporte mínima"
#: fdmprinter.def.json
msgctxt "minimum_interface_area description"
msgid "Minimum area size for support interface polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Tamaño del área mínima para los polígonos de la interfaz de soporte. No se generarán polígonos que posean un área de menor tamaño que este valor."
#: fdmprinter.def.json
msgctxt "minimum_roof_area label"
msgid "Minimum Support Roof Area"
-msgstr ""
+msgstr "Área de los techos del soporte mínima"
#: fdmprinter.def.json
msgctxt "minimum_roof_area description"
msgid "Minimum area size for the roofs of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Tamaño del área mínima para los techos del soporte. No se generarán polígonos que posean un área de menor tamaño que este valor."
#: fdmprinter.def.json
msgctxt "minimum_bottom_area label"
msgid "Minimum Support Floor Area"
-msgstr ""
+msgstr "Área de los suelos del soporte mínima"
#: fdmprinter.def.json
msgctxt "minimum_bottom_area description"
msgid "Minimum area size for the floors of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Tamaño del área mínima para los suelos del soporte. No se generarán polígonos que posean un área de menor tamaño que este valor."
#: fdmprinter.def.json
msgctxt "support_interface_offset label"
msgid "Support Interface Horizontal Expansion"
-msgstr ""
+msgstr "Expansión horizontal de la interfaz de soporte"
#: fdmprinter.def.json
msgctxt "support_interface_offset description"
msgid "Amount of offset applied to the support interface polygons."
-msgstr ""
+msgstr "Cantidad de desplazamiento aplicado a los polígonos de la interfaz de soporte."
#: fdmprinter.def.json
msgctxt "support_roof_offset label"
msgid "Support Roof Horizontal Expansion"
-msgstr ""
+msgstr "Expansión horizontal de los techos del soporte"
#: fdmprinter.def.json
msgctxt "support_roof_offset description"
msgid "Amount of offset applied to the roofs of the support."
-msgstr ""
+msgstr "Cantidad de desplazamiento aplicado a los techos del soporte."
#: fdmprinter.def.json
msgctxt "support_bottom_offset label"
msgid "Support Floor Horizontal Expansion"
-msgstr ""
+msgstr "Expansión horizontal de los suelos de soporte"
#: fdmprinter.def.json
msgctxt "support_bottom_offset description"
msgid "Amount of offset applied to the floors of the support."
-msgstr ""
+msgstr "Cantidad de desplazamiento aplicado a los suelos del soporte."
#: fdmprinter.def.json
msgctxt "support_fan_enable label"
@@ -3904,9 +3898,7 @@ msgctxt "skirt_gap description"
msgid ""
"The horizontal distance between the skirt and the first layer of the print.\n"
"This is the minimum distance. Multiple skirt lines will extend outwards from this distance."
-msgstr ""
-"La distancia horizontal entre la falda y la primera capa de la impresión.\n"
-"Se trata de la distancia mínima. Múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia."
+msgstr "La distancia horizontal entre la falda y la primera capa de la impresión.\nSe trata de la distancia mínima. Múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia."
#: fdmprinter.def.json
msgctxt "skirt_brim_minimal_length label"
@@ -5353,9 +5345,7 @@ msgctxt "wireframe_up_half_speed description"
msgid ""
"Distance of an upward move which is extruded with half speed.\n"
"This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing."
-msgstr ""
-"Distancia de un movimiento ascendente que se extrude a media velocidad.\n"
-"Esto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre."
+msgstr "Distancia de un movimiento ascendente que se extrude a media velocidad.\nEsto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre."
#: fdmprinter.def.json
msgctxt "wireframe_top_jump label"
@@ -5909,6 +5899,7 @@ msgstr "Matriz de transformación que se aplicará al modelo cuando se cargue de
#~ "Gcode commands to be executed at the very start - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "Los comandos de Gcode que se ejecutarán justo al inicio - separados por \n"
#~ "."
@@ -5921,6 +5912,7 @@ msgstr "Matriz de transformación que se aplicará al modelo cuando se cargue de
#~ "Gcode commands to be executed at the very end - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "Los comandos de Gcode que se ejecutarán justo al final - separados por \n"
#~ "."
@@ -5977,6 +5969,7 @@ msgstr "Matriz de transformación que se aplicará al modelo cuando se cargue de
#~ "The horizontal distance between the skirt and the first layer of the print.\n"
#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance."
#~ msgstr ""
+
#~ "La distancia horizontal entre la falda y la primera capa de la impresión.\n"
#~ "Esta es la distancia mínima; múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia."
diff --git a/resources/i18n/fi_FI/cura.po b/resources/i18n/fi_FI/cura.po
index d07b032bad..86ea911539 100644
--- a/resources/i18n/fi_FI/cura.po
+++ b/resources/i18n/fi_FI/cura.po
@@ -921,11 +921,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr "Valitse päivitykset"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr "Tarkastus"
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -2957,99 +2952,6 @@ msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr "Lämmitettävä alusta (virallinen sarja tai itse rakennettu)"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27
-msgctxt "@title"
-msgid "Check Printer"
-msgstr "Tarkista tulostin"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39
-msgctxt "@label"
-msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"
-msgstr "Ultimakerille on hyvä tehdä muutamia toimintatarkastuksia. Voit jättää tämän vaiheen väliin, jos tiedät laitteesi olevan toimintakunnossa"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53
-msgctxt "@action:button"
-msgid "Start Printer Check"
-msgstr "Aloita tulostintarkistus"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80
-msgctxt "@label"
-msgid "Connection: "
-msgstr "Yhteys: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Connected"
-msgstr "Yhdistetty"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Not connected"
-msgstr "Ei yhteyttä"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99
-msgctxt "@label"
-msgid "Min endstop X: "
-msgstr "Min. päätyraja X: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-msgctxt "@info:status"
-msgid "Works"
-msgstr "Toimii"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Not checked"
-msgstr "Ei tarkistettu"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120
-msgctxt "@label"
-msgid "Min endstop Y: "
-msgstr "Min. päätyraja Y: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141
-msgctxt "@label"
-msgid "Min endstop Z: "
-msgstr "Min. päätyraja Z: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163
-msgctxt "@label"
-msgid "Nozzle temperature check: "
-msgstr "Suuttimen lämpötilatarkistus: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Stop Heating"
-msgstr "Lopeta lämmitys"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Start Heating"
-msgstr "Aloita lämmitys"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223
-msgctxt "@label"
-msgid "Build plate temperature check:"
-msgstr "Alustan lämpötilan tarkistus:"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Checked"
-msgstr "Tarkistettu"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284
-msgctxt "@label"
-msgid "Everything is in order! You're done with your CheckUp."
-msgstr "Kaikki on kunnossa! CheckUp on valmis."
-
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"
msgid "Not connected to a printer"
@@ -5061,7 +4963,7 @@ msgstr ""
#~ msgctxt "@label:textbox"
#~ msgid "Search..."
-#~ msgstr "Haku…"
+#~ msgstr "Haku..."
#~ msgctxt "@label:listbox"
#~ msgid "Print Setup"
@@ -5517,7 +5419,7 @@ msgstr ""
#~ msgctxt "@title:menu menubar:file"
#~ msgid "Save &As..."
-#~ msgstr "Tallenna &nimellä…"
+#~ msgstr "Tallenna &nimellä..."
#~ msgctxt "description"
#~ msgid "Accepts G-Code and sends them over WiFi to a Doodle3D WiFi-Box."
diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po
index f7f48e9410..03f088dd34 100644
--- a/resources/i18n/fr_FR/cura.po
+++ b/resources/i18n/fr_FR/cura.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2018-09-28 14:59+0200\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -64,16 +64,12 @@ msgid ""
"
{model_names}
\n"
"
Find out how to ensure the best possible print quality and reliability.
"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
msgctxt "@item:inmenu"
msgid "Changelog"
-msgstr ""
+msgstr "Récapitulatif des changements"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
msgctxt "@item:inmenu"
@@ -492,100 +488,100 @@ msgstr "Impression terminée"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
msgctxt "@label:material"
msgid "Empty"
-msgstr ""
+msgstr "Vide"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
msgctxt "@label:material"
msgid "Unknown"
-msgstr ""
+msgstr "Inconnu"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
msgctxt "@action:button"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Imprimer via le cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Imprimer via le cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
msgctxt "@info:status"
msgid "Connected via Cloud"
-msgstr ""
+msgstr "Connecté via le cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
msgctxt "@info:title"
msgid "Cloud error"
-msgstr ""
+msgstr "Erreur de cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
msgctxt "@info:status"
msgid "Could not export print job."
-msgstr ""
+msgstr "Impossible d'exporter la tâche d'impression."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
-msgstr ""
+msgstr "Impossible de transférer les données à l'imprimante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:51
msgctxt "@info:status"
msgid "tomorrow"
-msgstr ""
+msgstr "demain"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:54
msgctxt "@info:status"
msgid "today"
-msgstr ""
+msgstr "aujourd'hui"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
-msgstr ""
+msgstr "Une erreur s'est produite lors de la connexion au cloud."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
msgid "Sending data to remote cluster"
-msgstr ""
+msgstr "Envoi de données à un cluster distant"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Lancez et surveillez des impressions où que vous soyez avec votre compte Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
msgctxt "@info:status"
msgid "Connect to Ultimaker Cloud"
-msgstr ""
+msgstr "Se connecter à Ultimaker Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
msgctxt "@action"
msgid "Don't ask me again for this printer."
-msgstr ""
+msgstr "Ne plus me demander pour cette imprimante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
msgctxt "@action"
msgid "Get started"
-msgstr ""
+msgstr "Prise en main"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Vous pouvez maintenant lancer et surveiller des impressions où que vous soyez avec votre compte Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
msgctxt "@info:status"
msgid "Connected!"
-msgstr ""
+msgstr "Connecté !"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
msgctxt "@action"
msgid "Review your connection"
-msgstr ""
+msgstr "Consulter votre connexion"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py:30
msgctxt "@action"
@@ -637,12 +633,12 @@ msgstr "Vue simulation"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:35
msgctxt "@item:inmenu"
msgid "Post Processing"
-msgstr ""
+msgstr "Post-traitement"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:36
msgctxt "@item:inmenu"
msgid "Modify G-Code"
-msgstr ""
+msgstr "Modifier le G-Code"
#: /home/ruben/Projects/Cura/plugins/SupportEraser/__init__.py:12
msgctxt "@label"
@@ -692,7 +688,7 @@ msgstr "Profils Cura 15.04"
#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
msgctxt "@item:inmenu"
msgid "Evaluation"
-msgstr ""
+msgstr "Évaluation"
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
@@ -760,7 +756,7 @@ msgstr "Impossible de couper car il existe des objets associés à l'extrudeuse
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
msgctxt "@info:status"
msgid "Nothing to slice because none of the models fit the build volume or are assigned to a disabled extruder. Please scale or rotate models to fit, or enable an extruder."
-msgstr ""
+msgstr "Rien à découper car les modèles ne conviennent pas au volume d'impression ou sont assignés à une extrudeuse désactivée. Mettez les modèles à l'échelle ou faites-les pivoter pour les faire correspondre, ou activez une extrudeuse."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
@@ -845,7 +841,7 @@ msgstr "Assurez-vous que le g-code est adapté à votre imprimante et à la conf
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:64
msgctxt "@item:inmenu"
msgid "Manage backups"
-msgstr ""
+msgstr "Gérer les sauvegardes"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:107
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:113
@@ -858,32 +854,32 @@ msgstr "Sauvegarde"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:55
msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
-msgstr ""
+msgstr "Une erreur s’est produite lors du listage de vos sauvegardes."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
-msgstr ""
+msgstr "Une erreur s’est produite lors de la tentative de restauration de votre sauvegarde."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:15
msgctxt "@info:title"
msgid "Backups"
-msgstr ""
+msgstr "Sauvegardes"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:27
msgctxt "@info:backup_status"
msgid "Uploading your backup..."
-msgstr ""
+msgstr "Téléchargement de votre sauvegarde..."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:36
msgctxt "@info:backup_status"
msgid "There was an error while uploading your backup."
-msgstr ""
+msgstr "Une erreur s’est produite lors du téléchargement de votre sauvegarde."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:39
msgctxt "@info:backup_status"
msgid "Your backup has finished uploading."
-msgstr ""
+msgstr "Le téléchargement de votre sauvegarde est terminé."
#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14
#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14
@@ -919,7 +915,7 @@ msgstr "Erreur d'écriture du fichier 3MF."
#: /home/ruben/Projects/Cura/plugins/PreviewStage/__init__.py:13
msgctxt "@item:inmenu"
msgid "Preview"
-msgstr ""
+msgstr "Aperçu"
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
@@ -927,11 +923,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr "Sélectionner les mises à niveau"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr "Check-up"
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -1020,7 +1011,7 @@ msgstr "Le fichier {0} existe déjà. Êtes-vous sûr de vo
#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
msgctxt "@info:status"
msgid "Invalid file URL:"
-msgstr ""
+msgstr "URL de fichier invalide :"
#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
msgctxt "@menuitem"
@@ -1041,7 +1032,7 @@ msgstr "Paramètres mis à jour"
#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
-msgstr ""
+msgstr "Extrudeuse(s) désactivée(s)"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
#, python-brace-format
@@ -1070,13 +1061,13 @@ msgstr "L'exportation a réussi"
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
-msgstr ""
+msgstr "Impossible d'importer le profil depuis {0} : {1}"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Can't import profile from {0} before a printer is added."
-msgstr ""
+msgstr "Impossible d'importer le profil depuis {0} avant l'ajout d'une imprimante."
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
#, python-brace-format
@@ -1209,7 +1200,7 @@ msgstr "A essayé de restaurer une sauvegarde Cura qui ne correspond pas à votr
#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
-msgstr ""
+msgstr "Impossible d’atteindre le serveur du compte Ultimaker."
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
@@ -1219,7 +1210,7 @@ msgstr "Multiplication et placement d'objets"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:28
msgctxt "@info:title"
msgid "Placing Objects"
-msgstr ""
+msgstr "Placement des objets"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:103
@@ -1264,12 +1255,7 @@ msgid ""
"
Backups can be found in the configuration folder.
\n"
"
Please send us this Crash Report to fix the problem.
\n"
" "
-msgstr ""
-"
Oups, un problème est survenu dans Ultimaker Cura.
\n"
-"
Une erreur irrécupérable est survenue lors du démarrage. Elle peut avoir été causée par des fichiers de configuration incorrects. Nous vous suggérons de sauvegarder et de réinitialiser votre configuration.
\n"
-"
Les sauvegardes se trouvent dans le dossier de configuration.
\n"
-"
Veuillez nous envoyer ce rapport d'incident pour que nous puissions résoudre le problème.
\n"
-" "
+msgstr "
Oups, un problème est survenu dans Ultimaker Cura.
\n
Une erreur irrécupérable est survenue lors du démarrage. Elle peut avoir été causée par des fichiers de configuration incorrects. Nous vous suggérons de sauvegarder et de réinitialiser votre configuration.
\n
Les sauvegardes se trouvent dans le dossier de configuration.
\n
Veuillez nous envoyer ce rapport d'incident pour que nous puissions résoudre le problème.
A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem
\n"
"
Please use the \"Send report\" button to post a bug report automatically to our servers
\n"
" "
-msgstr ""
-"
Une erreur fatale est survenue dans Cura. Veuillez nous envoyer ce rapport d'incident pour résoudre le problème
\n"
-"
Veuillez utiliser le bouton « Envoyer rapport » pour publier automatiquement un rapport d'erreur sur nos serveurs
\n"
-" "
+msgstr "
Une erreur fatale est survenue dans Cura. Veuillez nous envoyer ce rapport d'incident pour résoudre le problème
\n
Veuillez utiliser le bouton « Envoyer rapport » pour publier automatiquement un rapport d'erreur sur nos serveurs
\n "
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:173
msgctxt "@title:groupbox"
@@ -1635,7 +1618,7 @@ msgstr "Impossible de se connecter à la base de données Cura Package. Veuillez
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/SmallRatingWidget.qml:27
msgctxt "@label"
msgid "ratings"
-msgstr ""
+msgstr "évaluations"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
@@ -1654,7 +1637,7 @@ msgstr "Matériaux"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:91
msgctxt "@label"
msgid "Your rating"
-msgstr ""
+msgstr "Votre évaluation"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
msgctxt "@label"
@@ -1687,7 +1670,7 @@ msgstr "Inconnu"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
-msgstr ""
+msgstr "Connexion nécessaire pour l'installation ou la mise à jour"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
@@ -1710,7 +1693,7 @@ msgstr "Mis à jour"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:13
msgctxt "@title"
msgid "Marketplace"
-msgstr ""
+msgstr "Marché en ligne"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml:25
msgctxt "@action:button"
@@ -1745,12 +1728,12 @@ msgstr "Confirmer"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to login first before you can rate"
-msgstr ""
+msgstr "Vous devez être connecté avant de pouvoir effectuer une évaluation"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to install the package before you can rate"
-msgstr ""
+msgstr "Vous devez installer le paquet avant de pouvoir effectuer une évaluation"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:19
msgctxt "@info"
@@ -1790,7 +1773,7 @@ msgstr "S'installera au redémarrage"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:53
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to update"
-msgstr ""
+msgstr "Connexion nécessaire pour effectuer la mise à jour"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:71
msgctxt "@action:button"
@@ -1813,10 +1796,7 @@ msgid ""
"This plugin contains a license.\n"
"You need to accept this license to install this plugin.\n"
"Do you agree with the terms below?"
-msgstr ""
-"Ce plug-in contient une licence.\n"
-"Vous devez approuver cette licence pour installer ce plug-in.\n"
-"Acceptez-vous les clauses ci-dessous ?"
+msgstr "Ce plug-in contient une licence.\nVous devez approuver cette licence pour installer ce plug-in.\nAcceptez-vous les clauses ci-dessous ?"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:55
msgctxt "@action:button"
@@ -1841,22 +1821,22 @@ msgstr "Compatibilité"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:203
msgctxt "@action:label"
msgid "Technical Data Sheet"
-msgstr ""
+msgstr "Fiche technique"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:212
msgctxt "@action:label"
msgid "Safety Data Sheet"
-msgstr ""
+msgstr "Fiche de sécurité"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:221
msgctxt "@action:label"
msgid "Printing Guidelines"
-msgstr ""
+msgstr "Directives d'impression"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:230
msgctxt "@action:label"
msgid "Website"
-msgstr ""
+msgstr "Site Internet"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml:16
msgctxt "@info"
@@ -1978,17 +1958,17 @@ msgstr "Accord utilisateur"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
msgctxt "@info"
msgid "These options are not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Ces options ne sont pas disponibles car vous surveillez une imprimante cloud."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:241
msgctxt "@info"
msgid "The webcam is not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "La webcam n'est pas disponible car vous surveillez une imprimante cloud."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
msgctxt "@label:status"
msgid "Loading..."
-msgstr ""
+msgstr "Chargement..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
msgctxt "@label:status"
@@ -1998,42 +1978,42 @@ msgstr "Indisponible"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
msgctxt "@label:status"
msgid "Unreachable"
-msgstr ""
+msgstr "Injoignable"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
msgctxt "@label:status"
msgid "Idle"
-msgstr ""
+msgstr "Inactif"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:353
msgctxt "@label"
msgid "Untitled"
-msgstr ""
+msgstr "Sans titre"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
msgctxt "@label"
msgid "Anonymous"
-msgstr ""
+msgstr "Anonyme"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
msgctxt "@label:status"
msgid "Requires configuration changes"
-msgstr ""
+msgstr "Nécessite des modifications de configuration"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
msgctxt "@action:button"
msgid "Details"
-msgstr ""
+msgstr "Détails"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "Unavailable printer"
-msgstr ""
+msgstr "Imprimante indisponible"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
msgctxt "@label"
msgid "First available"
-msgstr ""
+msgstr "Premier disponible"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:187
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:132
@@ -2049,27 +2029,27 @@ msgstr "Mis en file d'attente"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
msgid "Go to Cura Connect"
-msgstr ""
+msgstr "Aller à Cura Connect"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
msgctxt "@label"
msgid "Print jobs"
-msgstr ""
+msgstr "Tâches d'impression"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Total print time"
-msgstr ""
+msgstr "Temps total d'impression"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
msgctxt "@label"
msgid "Waiting for"
-msgstr ""
+msgstr "Attente de"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
msgctxt "@label link to connect manager"
msgid "View print history"
-msgstr ""
+msgstr "Voir l'historique d'impression"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
msgctxt "@window:title"
@@ -2092,10 +2072,7 @@ msgid ""
"To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n"
"\n"
"Select your printer from the list below:"
-msgstr ""
-"Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n"
-"\n"
-"Sélectionnez votre imprimante dans la liste ci-dessous :"
+msgstr "Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n\nSélectionnez votre imprimante dans la liste ci-dessous :"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:87
#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44
@@ -2195,17 +2172,17 @@ msgstr "Terminé"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Preparing..."
-msgstr ""
+msgstr "Préparation..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Aborting..."
-msgstr ""
+msgstr "Abandon..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
msgctxt "@label:status"
msgid "Pausing..."
-msgstr ""
+msgstr "Mise en pause..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
msgctxt "@label:status"
@@ -2215,7 +2192,7 @@ msgstr "En pause"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
msgctxt "@label:status"
msgid "Resuming..."
-msgstr ""
+msgstr "Reprise..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
msgctxt "@label:status"
@@ -2225,7 +2202,7 @@ msgstr "Action requise"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
msgctxt "@label:status"
msgid "Finishes %1 at %2"
-msgstr ""
+msgstr "Finit %1 à %2"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:44
msgctxt "@action:button"
@@ -2261,12 +2238,12 @@ msgstr "Reprendre"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:102
msgctxt "@label"
msgid "Pausing..."
-msgstr ""
+msgstr "Mise en pause..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:104
msgctxt "@label"
msgid "Resuming..."
-msgstr ""
+msgstr "Reprise..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:106
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284
@@ -2278,7 +2255,7 @@ msgstr "Pause"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
msgid "Aborting..."
-msgstr ""
+msgstr "Abandon..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
@@ -2319,19 +2296,19 @@ msgstr "Abandonner l'impression"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:20
msgctxt "@title:window"
msgid "Configuration Changes"
-msgstr ""
+msgstr "Modifications de configuration"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:27
msgctxt "@action:button"
msgid "Override"
-msgstr ""
+msgstr "Remplacer"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
msgctxt "@label"
msgid "The assigned printer, %1, requires the following configuration change:"
msgid_plural "The assigned printer, %1, requires the following configuration changes:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "L'imprimante assignée, %1, nécessite la modification de configuration suivante :"
+msgstr[1] "L'imprimante assignée, %1, nécessite les modifications de configuration suivantes :"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
msgctxt "@label"
@@ -2361,7 +2338,7 @@ msgstr "Changer le plateau en %1 (Ceci ne peut pas être remplacé)."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
-msgstr ""
+msgstr "Si vous sélectionnez « Remplacer », les paramètres de la configuration actuelle de l'imprimante seront utilisés. Cela peut entraîner l'échec de l'impression."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
msgctxt "@label"
@@ -2379,22 +2356,22 @@ msgid ""
"Please make sure your printer has a connection:\n"
"- Check if the printer is turned on.\n"
"- Check if the printer is connected to the network."
-msgstr ""
+msgstr "Assurez-vous que votre imprimante est connectée :\n- Vérifiez si l'imprimante est sous tension.\n- Vérifiez si l'imprimante est connectée au réseau."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
msgctxt "@info"
msgid "Please select a network connected printer to monitor."
-msgstr ""
+msgstr "Veuillez sélectionner une imprimante à surveiller qui est connectée au réseau."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
msgctxt "@info"
msgid "Please connect your Ultimaker printer to your local network."
-msgstr ""
+msgstr "Veuillez connecter votre imprimante Ultimaker à votre réseau local."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
-msgstr ""
+msgstr "Voir les manuels d'utilisation en ligne"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
@@ -2430,17 +2407,17 @@ msgstr "Mode de compatibilité"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
msgctxt "@label"
msgid "Travels"
-msgstr ""
+msgstr "Déplacements"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
msgctxt "@label"
msgid "Helpers"
-msgstr ""
+msgstr "Aides"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
msgctxt "@label"
msgid "Shell"
-msgstr ""
+msgstr "Coque"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
@@ -2516,17 +2493,17 @@ msgstr "Cura envoie des données anonymes à Ultimaker afin d'améliorer la qual
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
msgctxt "@text:window"
msgid "I don't want to send this data"
-msgstr ""
+msgstr "Je ne veux pas envoyer ces données"
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
msgctxt "@text:window"
msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr ""
+msgstr "Permettre l'envoi de ces données à Ultimaker et nous aider à améliorer Cura"
#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
msgctxt "@label"
msgid "No print selected"
-msgstr ""
+msgstr "Aucune impression sélectionnée"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2788,108 +2765,108 @@ msgstr "Ouvrir"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:28
msgctxt "@title"
msgid "My Backups"
-msgstr ""
+msgstr "Mes sauvegardes"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:38
msgctxt "@empty_state"
msgid "You don't have any backups currently. Use the 'Backup Now' button to create one."
-msgstr ""
+msgstr "Vous n'avez actuellement aucune sauvegarde. Utilisez le bouton « Sauvegarder maintenant » pour en créer une."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:60
msgctxt "@backup_limit_info"
msgid "During the preview phase, you'll be limited to 5 visible backups. Remove a backup to see older ones."
-msgstr ""
+msgstr "Pendant la phase de prévisualisation, vous ne pourrez voir qu'un maximum de 5 sauvegardes. Supprimez une sauvegarde pour voir les plus anciennes."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:34
msgctxt "@description"
msgid "Backup and synchronize your Cura settings."
-msgstr ""
+msgstr "Sauvegardez et synchronisez vos paramètres Cura."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
msgctxt "@button"
msgid "Sign in"
-msgstr ""
+msgstr "Se connecter"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/main.qml:24
msgctxt "@title:window"
msgid "Cura Backups"
-msgstr ""
+msgstr "Sauvegardes Cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:21
msgctxt "@backuplist:label"
msgid "Cura Version"
-msgstr ""
+msgstr "Version Cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:29
msgctxt "@backuplist:label"
msgid "Machines"
-msgstr ""
+msgstr "Machines"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:37
msgctxt "@backuplist:label"
msgid "Materials"
-msgstr ""
+msgstr "Matériaux"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:45
msgctxt "@backuplist:label"
msgid "Profiles"
-msgstr ""
+msgstr "Profils"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:53
msgctxt "@backuplist:label"
msgid "Plugins"
-msgstr ""
+msgstr "Plug-ins"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:71
msgctxt "@button"
msgid "Restore"
-msgstr ""
+msgstr "Restaurer"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:99
msgctxt "@dialog:title"
msgid "Delete Backup"
-msgstr ""
+msgstr "Supprimer la sauvegarde"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:100
msgctxt "@dialog:info"
msgid "Are you sure you want to delete this backup? This cannot be undone."
-msgstr ""
+msgstr "Êtes-vous sûr de vouloir supprimer cette sauvegarde ? Il est impossible d'annuler cette action."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:108
msgctxt "@dialog:title"
msgid "Restore Backup"
-msgstr ""
+msgstr "Restaurer la sauvegarde"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:109
msgctxt "@dialog:info"
msgid "You will need to restart Cura before your backup is restored. Do you want to close Cura now?"
-msgstr ""
+msgstr "Vous devez redémarrer Cura avant que votre sauvegarde ne soit restaurée. Voulez-vous fermer Cura maintenant ?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:22
msgctxt "@button"
msgid "Want more?"
-msgstr ""
+msgstr "Vous en voulez plus ?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:31
msgctxt "@button"
msgid "Backup Now"
-msgstr ""
+msgstr "Sauvegarder maintenant"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:43
msgctxt "@checkbox:description"
msgid "Auto Backup"
-msgstr ""
+msgstr "Sauvegarde automatique"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:44
msgctxt "@checkbox:description"
msgid "Automatically create a backup each day that Cura is started."
-msgstr ""
+msgstr "Créez automatiquement une sauvegarde chaque jour où Cura est démarré."
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMainSettingsSelector.qml:75
msgctxt "@label"
msgid "Not supported"
-msgstr ""
+msgstr "Non pris en charge"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:35
msgctxt "@action:button"
@@ -2974,99 +2951,6 @@ msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr "Plateau chauffant (kit officiel ou fabriqué soi-même)"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27
-msgctxt "@title"
-msgid "Check Printer"
-msgstr "Tester l'imprimante"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39
-msgctxt "@label"
-msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"
-msgstr "Il est préférable de procéder à quelques tests de fonctionnement sur votre Ultimaker. Vous pouvez passer cette étape si vous savez que votre machine est fonctionnelle"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53
-msgctxt "@action:button"
-msgid "Start Printer Check"
-msgstr "Démarrer le test de l'imprimante"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80
-msgctxt "@label"
-msgid "Connection: "
-msgstr "Connexion : "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Connected"
-msgstr "Connecté"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Not connected"
-msgstr "Non connecté"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99
-msgctxt "@label"
-msgid "Min endstop X: "
-msgstr "Fin de course X : "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-msgctxt "@info:status"
-msgid "Works"
-msgstr "Fonctionne"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Not checked"
-msgstr "Non testé"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120
-msgctxt "@label"
-msgid "Min endstop Y: "
-msgstr "Fin de course Y : "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141
-msgctxt "@label"
-msgid "Min endstop Z: "
-msgstr "Fin de course Z : "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163
-msgctxt "@label"
-msgid "Nozzle temperature check: "
-msgstr "Test de la température de la buse : "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Stop Heating"
-msgstr "Arrêter le chauffage"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Start Heating"
-msgstr "Démarrer le chauffage"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223
-msgctxt "@label"
-msgid "Build plate temperature check:"
-msgstr "Contrôle de la température du plateau :"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Checked"
-msgstr "Contrôlée"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284
-msgctxt "@label"
-msgid "Everything is in order! You're done with your CheckUp."
-msgstr "Tout est en ordre ! Vous avez terminé votre check-up."
-
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"
msgid "Not connected to a printer"
@@ -3638,7 +3522,7 @@ msgstr "Créer un profil"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
msgctxt "@info"
msgid "Please provide a name for this profile."
-msgstr ""
+msgstr "Veuillez fournir un nom pour ce profil."
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
msgctxt "@title:window"
@@ -3668,7 +3552,7 @@ msgstr "Imprimante : %1"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
msgid "Default profiles"
-msgstr ""
+msgstr "Profils par défaut"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
@@ -3703,7 +3587,7 @@ msgstr "Paramètres généraux"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
msgctxt "@action:button"
msgid "Marketplace"
-msgstr ""
+msgstr "Marché en ligne"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:27
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:13
@@ -3726,7 +3610,7 @@ msgstr "&Visualisation"
#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:13
msgctxt "@title:menu menubar:toplevel"
msgid "&Settings"
-msgstr ""
+msgstr "&Paramètres"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:55
msgctxt "@title:menu menubar:toplevel"
@@ -3761,7 +3645,7 @@ msgstr "Sans titre"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:68
msgctxt "@label:textbox"
msgid "search settings"
-msgstr ""
+msgstr "paramètres de recherche"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
msgctxt "@action:menu"
@@ -3800,10 +3684,7 @@ msgid ""
"Some hidden settings use values different from their normal calculated value.\n"
"\n"
"Click to make these settings visible."
-msgstr ""
-"Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n"
-"\n"
-"Cliquez pour rendre ces paramètres visibles."
+msgstr "Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n\nCliquez pour rendre ces paramètres visibles."
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66
msgctxt "@label Header for list of settings."
@@ -3831,10 +3712,7 @@ msgid ""
"This setting has a value that is different from the profile.\n"
"\n"
"Click to restore the value of the profile."
-msgstr ""
-"Ce paramètre possède une valeur qui est différente du profil.\n"
-"\n"
-"Cliquez pour restaurer la valeur du profil."
+msgstr "Ce paramètre possède une valeur qui est différente du profil.\n\nCliquez pour restaurer la valeur du profil."
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:302
msgctxt "@label"
@@ -3842,25 +3720,22 @@ msgid ""
"This setting is normally calculated, but it currently has an absolute value set.\n"
"\n"
"Click to restore the calculated value."
-msgstr ""
-"Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n"
-"\n"
-"Cliquez pour restaurer la valeur calculée."
+msgstr "Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n\nCliquez pour restaurer la valeur calculée."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
msgctxt "@button"
msgid "Recommended"
-msgstr ""
+msgstr "Recommandé"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
msgctxt "@button"
msgid "Custom"
-msgstr ""
+msgstr "Personnalisé"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:193
msgctxt "@label"
msgid "Gradual infill"
-msgstr ""
+msgstr "Remplissage graduel"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:232
msgctxt "@label"
@@ -3870,7 +3745,7 @@ msgstr "Un remplissage graduel augmentera la quantité de remplissage vers le ha
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
msgctxt "@label"
msgid "Support"
-msgstr ""
+msgstr "Support"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
msgctxt "@label"
@@ -3885,7 +3760,7 @@ msgstr "Sélectionnez l'extrudeur à utiliser comme support. Cela créera des st
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
msgctxt "@label"
msgid "Adhesion"
-msgstr ""
+msgstr "Adhérence"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
msgctxt "@label"
@@ -3905,7 +3780,7 @@ msgstr "Vous avez modifié certains paramètres du profil. Si vous souhaitez les
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:355
msgctxt "@tooltip"
msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile"
-msgstr ""
+msgstr "Ce profil de qualité n'est pas disponible pour votre matériau et configuration des buses actuels. Veuillez modifier ces derniers pour activer ce profil de qualité."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3915,17 +3790,17 @@ msgstr "Un profil personnalisé est actuellement actif. Pour activer le curseur
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:13
msgctxt "@label:Should be short"
msgid "On"
-msgstr ""
+msgstr "On"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:14
msgctxt "@label:Should be short"
msgid "Off"
-msgstr ""
+msgstr "Off"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:27
msgctxt "@label"
msgid "Profile"
-msgstr ""
+msgstr "Profil"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:94
msgctxt "@tooltip"
@@ -3933,15 +3808,12 @@ msgid ""
"Some setting/override values are different from the values stored in the profile.\n"
"\n"
"Click to open the profile manager."
-msgstr ""
-"Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n"
-"\n"
-"Cliquez pour ouvrir le gestionnaire de profils."
+msgstr "Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n\nCliquez pour ouvrir le gestionnaire de profils."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label shown when we load a Gcode file"
msgid "Print setup disabled. G code file can not be modified."
-msgstr ""
+msgstr "Configuration d'impression désactivée. Le fichier G-Code ne peut pas être modifié."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -4182,47 +4054,47 @@ msgstr "Nombre de copies"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/AutoConfiguration.qml:18
msgctxt "@header"
msgid "Configurations"
-msgstr ""
+msgstr "Configurations"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:110
msgctxt "@label"
msgid "Select configuration"
-msgstr ""
+msgstr "Sélectionner la configuration"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
msgctxt "@label"
msgid "See the material compatibility chart"
-msgstr ""
+msgstr "Voir le tableau de compatibilité des matériaux"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
msgctxt "@label"
msgid "Configurations"
-msgstr ""
+msgstr "Configurations"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:57
msgctxt "@label"
msgid "Loading available configurations from the printer..."
-msgstr ""
+msgstr "Chargement des configurations disponibles à partir de l'imprimante..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:58
msgctxt "@label"
msgid "The configurations are not available because the printer is disconnected."
-msgstr ""
+msgstr "Les configurations ne sont pas disponibles car l'imprimante est déconnectée."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:25
msgctxt "@header"
msgid "Custom"
-msgstr ""
+msgstr "Personnalisé"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:61
msgctxt "@label"
msgid "Printer"
-msgstr ""
+msgstr "Imprimante"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
msgctxt "@label"
msgid "Enabled"
-msgstr ""
+msgstr "Activé"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
msgctxt "@label"
@@ -4232,17 +4104,17 @@ msgstr "Matériau"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
-msgstr ""
+msgstr "Utiliser de la colle pour une meilleure adhérence avec cette combinaison de matériaux."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:128
msgctxt "@label"
msgid "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile."
-msgstr ""
+msgstr "Cette configuration n'est pas disponible car %1 n'est pas reconnu. Veuillez visiter %2 pour télécharger le profil matériel correct."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:129
msgctxt "@label"
msgid "Marketplace"
-msgstr ""
+msgstr "Marché en ligne"
#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:15
msgctxt "@title:menu menubar:file"
@@ -4272,37 +4144,37 @@ msgstr "Durée restante estimée"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
msgid "View types"
-msgstr ""
+msgstr "Types d'affichages"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
msgctxt "@label"
msgid "Hi "
-msgstr ""
+msgstr "Bonjour "
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
msgctxt "@button"
msgid "Ultimaker account"
-msgstr ""
+msgstr "Compte Ultimaker"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
msgctxt "@button"
msgid "Sign out"
-msgstr ""
+msgstr "Déconnexion"
#: /home/ruben/Projects/Cura/resources/qml/Account/AccountWidget.qml:24
msgctxt "@action:button"
msgid "Sign in"
-msgstr ""
+msgstr "Se connecter"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
msgctxt "@label"
msgid "Ultimaker Cloud"
-msgstr ""
+msgstr "Ultimaker Cloud"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
-msgstr ""
+msgstr "Le flux d'impression 3D de nouvelle génération"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:51
msgctxt "@text"
@@ -4310,27 +4182,27 @@ msgid ""
"- Send print jobs to Ultimaker printers outside your local network\n"
"- Store your Ultimaker Cura settings in the cloud for use anywhere\n"
"- Get exclusive access to material profiles from leading brands"
-msgstr ""
+msgstr "- Envoyez des tâches d'impression à des imprimantes Ultimaker hors de votre réseau local\n- Stockez vos paramètres Ultimaker Cura dans le cloud pour les utiliser où que vous soyez\n- Obtenez un accès exclusif aux profils de matériaux des principales marques"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
msgid "Create account"
-msgstr ""
+msgstr "Créer un compte"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
msgctxt "@label"
msgid "No time estimation available"
-msgstr ""
+msgstr "Aucune estimation de la durée n'est disponible"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
msgctxt "@label"
msgid "No cost estimation available"
-msgstr ""
+msgstr "Aucune estimation des coûts n'est disponible"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
msgctxt "@button"
msgid "Preview"
-msgstr ""
+msgstr "Aperçu"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
msgctxt "@label:PrintjobStatus"
@@ -4345,27 +4217,27 @@ msgstr "Impossible de découper"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
msgctxt "@button"
msgid "Slice"
-msgstr ""
+msgstr "Découper"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
msgctxt "@label"
msgid "Start the slicing process"
-msgstr ""
+msgstr "Démarrer le processus de découpe"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
msgctxt "@button"
msgid "Cancel"
-msgstr ""
+msgstr "Annuler"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
msgid "Time specification"
-msgstr ""
+msgstr "Spécification de durée"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
msgid "Material specification"
-msgstr ""
+msgstr "Spécification des matériaux"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4380,27 +4252,27 @@ msgstr "%1g"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Connected printers"
-msgstr ""
+msgstr "Imprimantes connectées"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Preset printers"
-msgstr ""
+msgstr "Imprimantes préréglées"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
msgctxt "@button"
msgid "Add printer"
-msgstr ""
+msgstr "Ajouter une imprimante"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
msgctxt "@button"
msgid "Manage printers"
-msgstr ""
+msgstr "Gérer les imprimantes"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
-msgstr ""
+msgstr "Afficher le guide de dépannage en ligne"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
msgctxt "@action:inmenu"
@@ -4611,7 +4483,7 @@ msgstr "Afficher le dossier de configuration"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
msgctxt "@action:menu"
msgid "&Marketplace"
-msgstr ""
+msgstr "&Marché en ligne"
#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
msgctxt "@title:window"
@@ -4683,9 +4555,7 @@ msgctxt "@text:window"
msgid ""
"You have customized some profile settings.\n"
"Would you like to keep or discard those settings?"
-msgstr ""
-"Vous avez personnalisé certains paramètres du profil.\n"
-"Souhaitez-vous conserver ces changements, ou les annuler ?"
+msgstr "Vous avez personnalisé certains paramètres du profil.\nSouhaitez-vous conserver ces changements, ou les annuler ?"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:110
msgctxt "@title:column"
@@ -4730,7 +4600,7 @@ msgstr "Créer un nouveau profil"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
msgctxt "@title:tab"
msgid "Add a printer to Cura"
-msgstr ""
+msgstr "Ajouter une imprimante à Cura"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
msgctxt "@title:tab"
@@ -4738,17 +4608,17 @@ msgid ""
"Select the printer you want to use from the list below.\n"
"\n"
"If your printer is not in the list, use the \"Custom FFF Printer\" from the \"Custom\" category and adjust the settings to match your printer in the next dialog."
-msgstr ""
+msgstr "Sélectionnez l'imprimante que vous voulez utiliser dans la liste ci-dessous.\n\nSi votre imprimante n'est pas dans la liste, utilisez l'imprimante « Imprimante FFF personnalisée » de la catégorie « Personnalisé » et ajustez les paramètres pour qu'ils correspondent à votre imprimante dans le dialogue suivant."
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
msgctxt "@label"
msgid "Manufacturer"
-msgstr ""
+msgstr "Fabricant"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
msgctxt "@label"
msgid "Printer Name"
-msgstr ""
+msgstr "Nom de l'imprimante"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
msgctxt "@action:button"
@@ -4775,9 +4645,7 @@ msgctxt "@info:credit"
msgid ""
"Cura is developed by Ultimaker B.V. in cooperation with the community.\n"
"Cura proudly uses the following open source projects:"
-msgstr ""
-"Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\n"
-"Cura est fier d'utiliser les projets open source suivants :"
+msgstr "Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\nCura est fier d'utiliser les projets open source suivants :"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:134
msgctxt "@label"
@@ -5185,6 +5053,7 @@ msgstr "X3GWriter"
#~ "Print Setup disabled\n"
#~ "G-code files cannot be modified"
#~ msgstr ""
+
#~ "Configuration de l'impression désactivée\n"
#~ "Les fichiers G-Code ne peuvent pas être modifiés"
@@ -5789,6 +5658,7 @@ msgstr "X3GWriter"
#~ "Could not export using \"{}\" quality!\n"
#~ "Felt back to \"{}\"."
#~ msgstr ""
+
#~ "Impossible d'exporter avec la qualité \"{}\" !\n"
#~ "Qualité redéfinie sur \"{}\"."
@@ -5965,6 +5835,7 @@ msgstr "X3GWriter"
#~ "2) Turn the fan off (only if there are no tiny details on the model).\n"
#~ "3) Use a different material."
#~ msgstr ""
+
#~ "Certains modèles peuvent ne pas être imprimés de manière optimale en raison de la taille de l'objet et du matériau choisi pour les modèles : {model_names}.\n"
#~ "Conseils utiles pour améliorer la qualité d'impression :\n"
#~ "1) Utiliser des coins arrondis.\n"
@@ -5981,6 +5852,7 @@ msgstr "X3GWriter"
#~ "\n"
#~ "Thanks!"
#~ msgstr ""
+
#~ "Aucun modèle n'a été trouvé à l'intérieur de votre dessin. Pouvez-vous vérifier son contenu de nouveau et vous assurer qu'une pièce ou un assemblage est présent ?\n"
#~ "\n"
#~ "Merci !"
@@ -5991,6 +5863,7 @@ msgstr "X3GWriter"
#~ "\n"
#~ "Sorry!"
#~ msgstr ""
+
#~ "Plus d'une pièce ou d'un assemblage ont été trouvés dans votre dessin. Nous ne prenons actuellement en charge que les dessins comptant une seule pièce ou un seul assemblage.\n"
#~ "\n"
#~ "Désolé !"
@@ -6015,6 +5888,7 @@ msgstr "X3GWriter"
#~ "With kind regards\n"
#~ " - Thomas Karl Pietrowski"
#~ msgstr ""
+
#~ "Cher client,\n"
#~ "Nous n'avons pas pu trouver une installation valide de SolidWorks sur votre système. Cela signifie soit que SolidWorks n'est pas installé, soit que vous ne possédez pas de licence valide. Veuillez vous assurer que l'exécution de SolidWorks lui-même fonctionne sans problèmes et / ou contactez votre service IT.\n"
#~ "\n"
@@ -6029,6 +5903,7 @@ msgstr "X3GWriter"
#~ "With kind regards\n"
#~ " - Thomas Karl Pietrowski"
#~ msgstr ""
+
#~ "Cher client,\n"
#~ "Vous exécutez actuellement ce plug-in sur un système d'exploitation autre que Windows. Ce plug-in fonctionne uniquement sous Windows et lorsque SolidWorks est installé avec une licence valide. Veuillez installer ce plug-in sur un poste Windows où SolidWorks est installé.\n"
#~ "\n"
@@ -6133,6 +6008,7 @@ msgstr "X3GWriter"
#~ "Open the directory\n"
#~ "with macro and icon"
#~ msgstr ""
+
#~ "Ouvrez le répertoire\n"
#~ "contenant la macro et l'icône"
@@ -6431,6 +6307,7 @@ msgstr "X3GWriter"
#~ "\n"
#~ " Thanks!."
#~ msgstr ""
+
#~ "Aucun modèle n'a été trouvé à l'intérieur de votre dessin. Pouvez-vous vérifier son contenu de nouveau et vous assurer qu'une pièce ou un assemblage est présent ?\n"
#~ "\n"
#~ " Merci !"
@@ -6441,6 +6318,7 @@ msgstr "X3GWriter"
#~ "\n"
#~ "Sorry!"
#~ msgstr ""
+
#~ "Plus d'une pièce ou d'un ensemble de pièces ont été trouvés dans votre dessin. Nous ne prenons actuellement en charge que les dessins comptant exactement une pièce ou un ensemble de pièces.\n"
#~ "\n"
#~ "Désolé !"
@@ -6475,6 +6353,7 @@ msgstr "X3GWriter"
#~ "
Please use the \"Send report\" button to post a bug report automatically to our servers
\n"
#~ " "
#~ msgstr ""
+
#~ "
Une erreur fatale s'est produite. Veuillez nous envoyer ce Rapport d'incident pour résoudre le problème
\n"
#~ "
Veuillez utiliser le bouton « Envoyer rapport » pour publier automatiquement un rapport d'erreur sur nos serveurs
\n"
#~ " "
@@ -6829,6 +6710,7 @@ msgstr "X3GWriter"
#~ "You need to accept this license to install this plugin.\n"
#~ "Do you agree with the terms below?"
#~ msgstr ""
+
#~ " le plug-in contient une licence.\n"
#~ "Vous devez approuver cette licence pour installer ce plug-in.\n"
#~ "Acceptez-vous les clauses ci-dessous ?"
@@ -7356,6 +7238,7 @@ msgstr "X3GWriter"
#~ msgid "Print Selected Model with %1"
#~ msgid_plural "Print Selected Models With %1"
#~ msgstr[0] "Imprimer le modèle sélectionné avec %1"
+
#~ msgstr[1] "Imprimer les modèles sélectionnés avec %1"
#~ msgctxt "@info:status"
@@ -7385,6 +7268,7 @@ msgstr "X3GWriter"
#~ "
"
diff --git a/resources/i18n/fr_FR/fdmextruder.def.json.po b/resources/i18n/fr_FR/fdmextruder.def.json.po
index d9f8b75097..a2b3150f0d 100644
--- a/resources/i18n/fr_FR/fdmextruder.def.json.po
+++ b/resources/i18n/fr_FR/fdmextruder.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 14:25+0100\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -84,7 +84,7 @@ msgstr "Extrudeuse G-Code de démarrage"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
-msgstr ""
+msgstr "Démarrer le G-Code à exécuter lors du passage à cette extrudeuse."
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_abs label"
@@ -124,7 +124,7 @@ msgstr "Extrudeuse G-Code de fin"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_code description"
msgid "End g-code to execute when switching away from this extruder."
-msgstr ""
+msgstr "Fin du G-Code à exécuter lors de l'abandon de l'extrudeuse."
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_abs label"
diff --git a/resources/i18n/fr_FR/fdmprinter.def.json.po b/resources/i18n/fr_FR/fdmprinter.def.json.po
index caeafec806..8e46a0175d 100644
--- a/resources/i18n/fr_FR/fdmprinter.def.json.po
+++ b/resources/i18n/fr_FR/fdmprinter.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 15:00+0200\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -57,9 +57,7 @@ msgctxt "machine_start_gcode description"
msgid ""
"G-code commands to be executed at the very start - separated by \n"
"."
-msgstr ""
-"Commandes G-Code à exécuter au tout début, séparées par \n"
-"."
+msgstr "Commandes G-Code à exécuter au tout début, séparées par \n."
#: fdmprinter.def.json
msgctxt "machine_end_gcode label"
@@ -71,9 +69,7 @@ msgctxt "machine_end_gcode description"
msgid ""
"G-code commands to be executed at the very end - separated by \n"
"."
-msgstr ""
-"Commandes G-Code à exécuter tout à la fin, séparées par \n"
-"."
+msgstr "Commandes G-Code à exécuter tout à la fin, séparées par \n."
#: fdmprinter.def.json
msgctxt "material_guid label"
@@ -1635,9 +1631,7 @@ msgctxt "infill_wall_line_count description"
msgid ""
"Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n"
"This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right."
-msgstr ""
-"Ajoutez des parois supplémentaires autour de la zone de remplissage. De telles parois peuvent réduire l'affaissement des lignes de couche extérieure supérieure / inférieure, réduisant le nombre de couches extérieures supérieures / inférieures nécessaires pour obtenir la même qualité, au prix d'un peu de matériau supplémentaire.\n"
-"Configurée correctement, cette fonctionnalité peut être combinée avec « Relier les polygones de remplissage » pour relier tous les remplissages en un seul mouvement d'extrusion sans avoir besoin de déplacements ou de rétractions."
+msgstr "Ajoutez des parois supplémentaires autour de la zone de remplissage. De telles parois peuvent réduire l'affaissement des lignes de couche extérieure supérieure / inférieure, réduisant le nombre de couches extérieures supérieures / inférieures nécessaires pour obtenir la même qualité, au prix d'un peu de matériau supplémentaire.\nConfigurée correctement, cette fonctionnalité peut être combinée avec « Relier les polygones de remplissage » pour relier tous les remplissages en un seul mouvement d'extrusion sans avoir besoin de déplacements ou de rétractions."
#: fdmprinter.def.json
msgctxt "sub_div_rad_add label"
@@ -1677,7 +1671,7 @@ msgstr "Pourcentage de chevauchement de la couche extérieure"
#: fdmprinter.def.json
msgctxt "skin_overlap description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines, as a percentage of the line widths of the skin lines and the innermost wall. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any percentage over 50% may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Ajuster le degré de chevauchement entre les parois et les (extrémités des) lignes centrales de la couche extérieure, en pourcentage de la largeur des lignes de la couche extérieure et de la paroi intérieure. Un chevauchement léger permet de relier fermement les parois à la couche extérieure. Notez que, si la largeur de la couche extérieure est égale à celle de la ligne de la paroi, un pourcentage supérieur à 50 % peut déjà faire dépasser la couche extérieure de la paroi, car dans ce cas la position de la buse de l'extrudeuse peut déjà atteindre le milieu de la paroi."
#: fdmprinter.def.json
msgctxt "skin_overlap_mm label"
@@ -1687,7 +1681,7 @@ msgstr "Chevauchement de la couche extérieure"
#: fdmprinter.def.json
msgctxt "skin_overlap_mm description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any value over half the width of the wall may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Ajuster le degré de chevauchement entre les parois et les (extrémités des) lignes centrales de la couche extérieure. Un chevauchement léger permet de relier fermement les parois à la couche extérieure. Notez que, si la largeur de la couche extérieure est égale à celle de la ligne de la paroi, une valeur supérieure à la moitié de la largeur de la paroi peut déjà faire dépasser la couche extérieure de la paroi, car dans ce cas la position de la buse de l'extrudeuse peut déjà atteindre le milieu de la paroi."
#: fdmprinter.def.json
msgctxt "infill_wipe_dist label"
@@ -2127,7 +2121,7 @@ msgstr "Distance de rétraction de changement de buse"
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_amount description"
msgid "The amount of retraction when switching extruders. Set to 0 for no retraction at all. This should generally be the same as the length of the heat zone."
-msgstr ""
+msgstr "Degré de rétraction lors de la commutation d'extrudeuses. Une valeur de 0 signifie qu'il n'y aura aucune rétraction. En général, cette valeur doit être équivalente à la longueur de la zone de chauffe."
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_speeds label"
@@ -2787,7 +2781,7 @@ msgstr "Mode de détours"
#: fdmprinter.def.json
msgctxt "retraction_combing description"
msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas or to only comb within the infill."
-msgstr ""
+msgstr "Les détours maintiennent la buse dans les zones déjà imprimées lors des déplacements. Cela résulte en des déplacements légèrement plus longs mais réduit le recours aux rétractions. Si les détours sont désactivés, le matériau se rétractera et la buse se déplacera en ligne droite jusqu'au point suivant. Il est également possible d'éviter les détours sur les zones de la couche du dessus / dessous ou d'effectuer les détours uniquement dans le remplissage."
#: fdmprinter.def.json
msgctxt "retraction_combing option off"
@@ -3442,12 +3436,12 @@ msgstr "La hauteur de remplissage de support d'une densité donnée avant de pas
#: fdmprinter.def.json
msgctxt "minimum_support_area label"
msgid "Minimum Support Area"
-msgstr ""
+msgstr "Surface minimale de support"
#: fdmprinter.def.json
msgctxt "minimum_support_area description"
msgid "Minimum area size for support polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Taille minimale de la surface des polygones de support : les polygones dont la surface est inférieure à cette valeur ne seront pas générés."
#: fdmprinter.def.json
msgctxt "support_interface_enable label"
@@ -3677,62 +3671,62 @@ msgstr "Zig Zag"
#: fdmprinter.def.json
msgctxt "minimum_interface_area label"
msgid "Minimum Support Interface Area"
-msgstr ""
+msgstr "Surface minimale de l'interface de support"
#: fdmprinter.def.json
msgctxt "minimum_interface_area description"
msgid "Minimum area size for support interface polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Taille minimale de la surface des polygones d'interface de support : les polygones dont la surface est inférieure à cette valeur ne seront pas générés."
#: fdmprinter.def.json
msgctxt "minimum_roof_area label"
msgid "Minimum Support Roof Area"
-msgstr ""
+msgstr "Surface minimale du plafond de support"
#: fdmprinter.def.json
msgctxt "minimum_roof_area description"
msgid "Minimum area size for the roofs of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Taille minimale de la surface des plafonds du support : les polygones dont la surface est inférieure à cette valeur ne seront pas générés."
#: fdmprinter.def.json
msgctxt "minimum_bottom_area label"
msgid "Minimum Support Floor Area"
-msgstr ""
+msgstr "Surface minimale du bas de support"
#: fdmprinter.def.json
msgctxt "minimum_bottom_area description"
msgid "Minimum area size for the floors of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Taille minimale de la surface des bas du support : les polygones dont la surface est inférieure à cette valeur ne seront pas générés."
#: fdmprinter.def.json
msgctxt "support_interface_offset label"
msgid "Support Interface Horizontal Expansion"
-msgstr ""
+msgstr "Expansion horizontale de l'interface de support"
#: fdmprinter.def.json
msgctxt "support_interface_offset description"
msgid "Amount of offset applied to the support interface polygons."
-msgstr ""
+msgstr "Quantité de décalage appliquée aux polygones de l'interface de support."
#: fdmprinter.def.json
msgctxt "support_roof_offset label"
msgid "Support Roof Horizontal Expansion"
-msgstr ""
+msgstr "Expansion horizontale du plafond de support"
#: fdmprinter.def.json
msgctxt "support_roof_offset description"
msgid "Amount of offset applied to the roofs of the support."
-msgstr ""
+msgstr "Quantité de décalage appliqué aux plafonds du support."
#: fdmprinter.def.json
msgctxt "support_bottom_offset label"
msgid "Support Floor Horizontal Expansion"
-msgstr ""
+msgstr "Expansion horizontale du bas de support"
#: fdmprinter.def.json
msgctxt "support_bottom_offset description"
msgid "Amount of offset applied to the floors of the support."
-msgstr ""
+msgstr "Quantité de décalage appliqué aux bas du support."
#: fdmprinter.def.json
msgctxt "support_fan_enable label"
@@ -3904,9 +3898,7 @@ msgctxt "skirt_gap description"
msgid ""
"The horizontal distance between the skirt and the first layer of the print.\n"
"This is the minimum distance. Multiple skirt lines will extend outwards from this distance."
-msgstr ""
-"La distance horizontale entre la jupe et la première couche de l’impression.\n"
-"Il s’agit de la distance minimale séparant la jupe de l’objet. Si la jupe a d’autres lignes, celles-ci s’étendront vers l’extérieur."
+msgstr "La distance horizontale entre la jupe et la première couche de l’impression.\nIl s’agit de la distance minimale séparant la jupe de l’objet. Si la jupe a d’autres lignes, celles-ci s’étendront vers l’extérieur."
#: fdmprinter.def.json
msgctxt "skirt_brim_minimal_length label"
@@ -5353,9 +5345,7 @@ msgctxt "wireframe_up_half_speed description"
msgid ""
"Distance of an upward move which is extruded with half speed.\n"
"This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing."
-msgstr ""
-"Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\n"
-"Cela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire."
+msgstr "Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\nCela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire."
#: fdmprinter.def.json
msgctxt "wireframe_top_jump label"
@@ -5909,6 +5899,7 @@ msgstr "Matrice de transformation à appliquer au modèle lors de son chargement
#~ "Gcode commands to be executed at the very start - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "Commandes Gcode à exécuter au tout début, séparées par \n"
#~ "."
@@ -5921,6 +5912,7 @@ msgstr "Matrice de transformation à appliquer au modèle lors de son chargement
#~ "Gcode commands to be executed at the very end - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "Commandes Gcode à exécuter à la toute fin, séparées par \n"
#~ "."
@@ -5977,6 +5969,7 @@ msgstr "Matrice de transformation à appliquer au modèle lors de son chargement
#~ "The horizontal distance between the skirt and the first layer of the print.\n"
#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance."
#~ msgstr ""
+
#~ "La distance horizontale entre le contour et la première couche de l’impression.\n"
#~ "Il s’agit de la distance minimale séparant le contour de l’objet. Si le contour a d’autres lignes, celles-ci s’étendront vers l’extérieur."
diff --git a/resources/i18n/it_IT/cura.po b/resources/i18n/it_IT/cura.po
index c857499eb3..4b5cbd9e60 100644
--- a/resources/i18n/it_IT/cura.po
+++ b/resources/i18n/it_IT/cura.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2018-09-28 15:01+0200\n"
+"PO-Revision-Date: 2019-03-14 14:31+0100\n"
"Last-Translator: Bothof \n"
"Language-Team: Italian\n"
"Language: it_IT\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.0.6\n"
+"X-Generator: Poedit 2.1.1\n"
#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
msgctxt "@action"
@@ -73,7 +73,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
msgctxt "@item:inmenu"
msgid "Changelog"
-msgstr ""
+msgstr "Registro modifiche"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
msgctxt "@item:inmenu"
@@ -492,100 +492,100 @@ msgstr "Stampa finita"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
msgctxt "@label:material"
msgid "Empty"
-msgstr ""
+msgstr "Vuoto"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
msgctxt "@label:material"
msgid "Unknown"
-msgstr ""
+msgstr "Sconosciuto"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
msgctxt "@action:button"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Stampa tramite Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Stampa tramite Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
msgctxt "@info:status"
msgid "Connected via Cloud"
-msgstr ""
+msgstr "Collegato tramite Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
msgctxt "@info:title"
msgid "Cloud error"
-msgstr ""
+msgstr "Errore cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
msgctxt "@info:status"
msgid "Could not export print job."
-msgstr ""
+msgstr "Impossibile esportare il processo di stampa."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
-msgstr ""
+msgstr "Impossibile caricare i dati sulla stampante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:51
msgctxt "@info:status"
msgid "tomorrow"
-msgstr ""
+msgstr "domani"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:54
msgctxt "@info:status"
msgid "today"
-msgstr ""
+msgstr "oggi"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
-msgstr ""
+msgstr "Si è verificato un errore di collegamento al cloud."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
msgid "Sending data to remote cluster"
-msgstr ""
+msgstr "Invio dati al cluster remoto"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Invia e controlla i processi di stampa ovunque con l’account Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
msgctxt "@info:status"
msgid "Connect to Ultimaker Cloud"
-msgstr ""
+msgstr "Collegato a Ultimaker Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
msgctxt "@action"
msgid "Don't ask me again for this printer."
-msgstr ""
+msgstr "Non chiedere nuovamente per questa stampante."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
msgctxt "@action"
msgid "Get started"
-msgstr ""
+msgstr "Per iniziare"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Ora è possibile inviare e controllare i processi di stampa ovunque con l’account Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
msgctxt "@info:status"
msgid "Connected!"
-msgstr ""
+msgstr "Collegato!"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
msgctxt "@action"
msgid "Review your connection"
-msgstr ""
+msgstr "Controlla collegamento"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py:30
msgctxt "@action"
@@ -637,12 +637,12 @@ msgstr "Vista simulazione"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:35
msgctxt "@item:inmenu"
msgid "Post Processing"
-msgstr ""
+msgstr "Post-elaborazione"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:36
msgctxt "@item:inmenu"
msgid "Modify G-Code"
-msgstr ""
+msgstr "Modifica codice G"
#: /home/ruben/Projects/Cura/plugins/SupportEraser/__init__.py:12
msgctxt "@label"
@@ -692,7 +692,7 @@ msgstr "Profili Cura 15.04"
#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
msgctxt "@item:inmenu"
msgid "Evaluation"
-msgstr ""
+msgstr "Valutazione"
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
@@ -760,7 +760,7 @@ msgstr "Impossibile effettuare il sezionamento in quanto vi sono oggetti associa
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
msgctxt "@info:status"
msgid "Nothing to slice because none of the models fit the build volume or are assigned to a disabled extruder. Please scale or rotate models to fit, or enable an extruder."
-msgstr ""
+msgstr "Nulla da sezionare in quanto nessuno dei modelli corrisponde al volume di stampa o è assegnato a un estrusore disabilitato. Ridimensionare o ruotare i modelli secondo necessità o abilitare un estrusore."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
@@ -845,7 +845,7 @@ msgstr "Verifica che il codice G sia idoneo alla tua stampante e alla sua config
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:64
msgctxt "@item:inmenu"
msgid "Manage backups"
-msgstr ""
+msgstr "Gestione backup"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:107
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:113
@@ -858,32 +858,32 @@ msgstr "Backup"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:55
msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
-msgstr ""
+msgstr "Si è verificato un errore nell’elenco dei backup."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
-msgstr ""
+msgstr "Si è verificato un errore cercando di ripristinare il backup."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:15
msgctxt "@info:title"
msgid "Backups"
-msgstr ""
+msgstr "Backup"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:27
msgctxt "@info:backup_status"
msgid "Uploading your backup..."
-msgstr ""
+msgstr "Caricamento backup in corso..."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:36
msgctxt "@info:backup_status"
msgid "There was an error while uploading your backup."
-msgstr ""
+msgstr "Si è verificato un errore durante il caricamento del backup."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:39
msgctxt "@info:backup_status"
msgid "Your backup has finished uploading."
-msgstr ""
+msgstr "Caricamento backup completato."
#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14
#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14
@@ -919,7 +919,7 @@ msgstr "Errore scrittura file 3MF."
#: /home/ruben/Projects/Cura/plugins/PreviewStage/__init__.py:13
msgctxt "@item:inmenu"
msgid "Preview"
-msgstr ""
+msgstr "Anteprima"
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
@@ -927,11 +927,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr "Seleziona aggiornamenti"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr "Controllo"
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -1020,7 +1015,7 @@ msgstr "Il file {0} esiste già. Sei sicuro di volerlo sovr
#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
msgctxt "@info:status"
msgid "Invalid file URL:"
-msgstr ""
+msgstr "File URL non valido:"
#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
msgctxt "@menuitem"
@@ -1041,7 +1036,7 @@ msgstr "Impostazioni aggiornate"
#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
-msgstr ""
+msgstr "Estrusore disabilitato"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
#, python-brace-format
@@ -1070,13 +1065,13 @@ msgstr "Esportazione riuscita"
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
-msgstr ""
+msgstr "Impossibile importare il profilo da {0}: {1}"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Can't import profile from {0} before a printer is added."
-msgstr ""
+msgstr "Impossibile importare il profilo da {0} prima di aggiungere una stampante."
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
#, python-brace-format
@@ -1209,7 +1204,7 @@ msgstr "Tentativo di ripristinare un backup di Cura non corrispondente alla vers
#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
-msgstr ""
+msgstr "Impossibile raggiungere il server account Ultimaker."
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
@@ -1219,7 +1214,7 @@ msgstr "Moltiplicazione e collocazione degli oggetti"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:28
msgctxt "@info:title"
msgid "Placing Objects"
-msgstr ""
+msgstr "Sistemazione oggetti"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:103
@@ -1635,7 +1630,7 @@ msgstr "Impossibile connettersi al database pacchetto Cura. Verificare la connes
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/SmallRatingWidget.qml:27
msgctxt "@label"
msgid "ratings"
-msgstr ""
+msgstr "valori"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
@@ -1654,7 +1649,7 @@ msgstr "Materiali"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:91
msgctxt "@label"
msgid "Your rating"
-msgstr ""
+msgstr "I tuoi valori"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
msgctxt "@label"
@@ -1687,7 +1682,7 @@ msgstr "Sconosciuto"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
-msgstr ""
+msgstr "Log in deve essere installato o aggiornato"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
@@ -1710,7 +1705,7 @@ msgstr "Aggiornamento eseguito"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:13
msgctxt "@title"
msgid "Marketplace"
-msgstr ""
+msgstr "Mercato"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml:25
msgctxt "@action:button"
@@ -1745,12 +1740,12 @@ msgstr "Conferma"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to login first before you can rate"
-msgstr ""
+msgstr "Prima della valutazione è necessario effettuare l’accesso"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to install the package before you can rate"
-msgstr ""
+msgstr "Prima della valutazione è necessario installare il pacchetto"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:19
msgctxt "@info"
@@ -1790,7 +1785,7 @@ msgstr "L'installazione sarà eseguita al riavvio"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:53
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to update"
-msgstr ""
+msgstr "Log in deve essere aggiornato"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:71
msgctxt "@action:button"
@@ -1841,22 +1836,22 @@ msgstr "Compatibilità"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:203
msgctxt "@action:label"
msgid "Technical Data Sheet"
-msgstr ""
+msgstr "Scheda dati tecnici"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:212
msgctxt "@action:label"
msgid "Safety Data Sheet"
-msgstr ""
+msgstr "Scheda dati di sicurezza"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:221
msgctxt "@action:label"
msgid "Printing Guidelines"
-msgstr ""
+msgstr "Linee guida di stampa"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:230
msgctxt "@action:label"
msgid "Website"
-msgstr ""
+msgstr "Sito web"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml:16
msgctxt "@info"
@@ -1978,17 +1973,17 @@ msgstr "Contratto di licenza"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
msgctxt "@info"
msgid "These options are not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Queste opzioni non sono disponibili perché si sta controllando una stampante cloud."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:241
msgctxt "@info"
msgid "The webcam is not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "La webcam non è disponibile perché si sta controllando una stampante cloud."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
msgctxt "@label:status"
msgid "Loading..."
-msgstr ""
+msgstr "Caricamento in corso..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
msgctxt "@label:status"
@@ -1998,42 +1993,42 @@ msgstr "Non disponibile"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
msgctxt "@label:status"
msgid "Unreachable"
-msgstr ""
+msgstr "Non raggiungibile"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
msgctxt "@label:status"
msgid "Idle"
-msgstr ""
+msgstr "Ferma"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:353
msgctxt "@label"
msgid "Untitled"
-msgstr ""
+msgstr "Senza titolo"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
msgctxt "@label"
msgid "Anonymous"
-msgstr ""
+msgstr "Anonimo"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
msgctxt "@label:status"
msgid "Requires configuration changes"
-msgstr ""
+msgstr "Richiede modifiche di configurazione"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
msgctxt "@action:button"
msgid "Details"
-msgstr ""
+msgstr "Dettagli"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "Unavailable printer"
-msgstr ""
+msgstr "Stampante non disponibile"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
msgctxt "@label"
msgid "First available"
-msgstr ""
+msgstr "Primo disponibile"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:187
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:132
@@ -2049,27 +2044,27 @@ msgstr "Coda di stampa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
msgid "Go to Cura Connect"
-msgstr ""
+msgstr "Vai a Cura Connect"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
msgctxt "@label"
msgid "Print jobs"
-msgstr ""
+msgstr "Processi di stampa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Total print time"
-msgstr ""
+msgstr "Tempo di stampa totale"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
msgctxt "@label"
msgid "Waiting for"
-msgstr ""
+msgstr "In attesa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
msgctxt "@label link to connect manager"
msgid "View print history"
-msgstr ""
+msgstr "Visualizza cronologia di stampa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
msgctxt "@window:title"
@@ -2195,17 +2190,17 @@ msgstr "Terminato"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Preparing..."
-msgstr ""
+msgstr "Preparazione in corso..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Aborting..."
-msgstr ""
+msgstr "Interr. in corso..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
msgctxt "@label:status"
msgid "Pausing..."
-msgstr ""
+msgstr "Messa in pausa..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
msgctxt "@label:status"
@@ -2215,7 +2210,7 @@ msgstr "In pausa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
msgctxt "@label:status"
msgid "Resuming..."
-msgstr ""
+msgstr "Ripresa in corso..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
msgctxt "@label:status"
@@ -2225,7 +2220,7 @@ msgstr "Richiede un'azione"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
msgctxt "@label:status"
msgid "Finishes %1 at %2"
-msgstr ""
+msgstr "Finisce %1 a %2"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:44
msgctxt "@action:button"
@@ -2261,12 +2256,12 @@ msgstr "Riprendi"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:102
msgctxt "@label"
msgid "Pausing..."
-msgstr ""
+msgstr "Messa in pausa..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:104
msgctxt "@label"
msgid "Resuming..."
-msgstr ""
+msgstr "Ripresa in corso..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:106
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284
@@ -2278,7 +2273,7 @@ msgstr "Pausa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
msgid "Aborting..."
-msgstr ""
+msgstr "Interr. in corso..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
@@ -2288,7 +2283,7 @@ msgstr "Interrompi"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:143
msgctxt "@label %1 is the name of a print job."
msgid "Are you sure you want to move %1 to the top of the queue?"
-msgstr "Sei sicuro di voler spostare 1% all’inizio della coda?"
+msgstr "Sei sicuro di voler spostare %1 all’inizio della coda?"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:144
msgctxt "@window:title"
@@ -2319,19 +2314,19 @@ msgstr "Interrompi la stampa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:20
msgctxt "@title:window"
msgid "Configuration Changes"
-msgstr ""
+msgstr "Modifiche configurazione"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:27
msgctxt "@action:button"
msgid "Override"
-msgstr ""
+msgstr "Override"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
msgctxt "@label"
msgid "The assigned printer, %1, requires the following configuration change:"
msgid_plural "The assigned printer, %1, requires the following configuration changes:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "La stampante assegnata, %1, richiede la seguente modifica di configurazione:"
+msgstr[1] "La stampante assegnata, %1, richiede le seguenti modifiche di configurazione:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
msgctxt "@label"
@@ -2361,7 +2356,7 @@ msgstr "Cambia piano di stampa a %1 (Operazione non annullabile)."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
-msgstr ""
+msgstr "L’override utilizza le impostazioni specificate con la configurazione stampante esistente. Ciò può causare una stampa non riuscita."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
msgctxt "@label"
@@ -2380,21 +2375,24 @@ msgid ""
"- Check if the printer is turned on.\n"
"- Check if the printer is connected to the network."
msgstr ""
+"Accertarsi che la stampante sia collegata:\n"
+"- Controllare se la stampante è accesa.\n"
+"- Controllare se la stampante è collegata alla rete."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
msgctxt "@info"
msgid "Please select a network connected printer to monitor."
-msgstr ""
+msgstr "Selezionare una stampante collegata alla rete per controllare."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
msgctxt "@info"
msgid "Please connect your Ultimaker printer to your local network."
-msgstr ""
+msgstr "Collegare la stampante Ultimaker alla rete locale."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
-msgstr ""
+msgstr "Visualizza i manuali utente online"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
@@ -2430,17 +2428,17 @@ msgstr "Modalità di compatibilità"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
msgctxt "@label"
msgid "Travels"
-msgstr ""
+msgstr "Spostamenti"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
msgctxt "@label"
msgid "Helpers"
-msgstr ""
+msgstr "Helper"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
msgctxt "@label"
msgid "Shell"
-msgstr ""
+msgstr "Guscio"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
@@ -2516,17 +2514,17 @@ msgstr "Cura invia dati anonimi ad Ultimaker per migliorare la qualità di stamp
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
msgctxt "@text:window"
msgid "I don't want to send this data"
-msgstr ""
+msgstr "Non desidero inviare questi dati"
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
msgctxt "@text:window"
msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr ""
+msgstr "Consenti l’invio di questi dati ad Ultimaker e aiutaci ad ottimizzare Cura"
#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
msgctxt "@label"
msgid "No print selected"
-msgstr ""
+msgstr "Nessuna stampante selezionata"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2788,108 +2786,108 @@ msgstr "Apri"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:28
msgctxt "@title"
msgid "My Backups"
-msgstr ""
+msgstr "I miei backup"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:38
msgctxt "@empty_state"
msgid "You don't have any backups currently. Use the 'Backup Now' button to create one."
-msgstr ""
+msgstr "Nessun backup. Usare il pulsante ‘Esegui backup adesso’ per crearne uno."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:60
msgctxt "@backup_limit_info"
msgid "During the preview phase, you'll be limited to 5 visible backups. Remove a backup to see older ones."
-msgstr ""
+msgstr "Durante la fase di anteprima, saranno visibili solo 5 backup. Rimuovi un backup per vedere quelli precedenti."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:34
msgctxt "@description"
msgid "Backup and synchronize your Cura settings."
-msgstr ""
+msgstr "Backup e sincronizzazione delle impostazioni Cura."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
msgctxt "@button"
msgid "Sign in"
-msgstr ""
+msgstr "Accedi"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/main.qml:24
msgctxt "@title:window"
msgid "Cura Backups"
-msgstr ""
+msgstr "Backup Cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:21
msgctxt "@backuplist:label"
msgid "Cura Version"
-msgstr ""
+msgstr "Versione Cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:29
msgctxt "@backuplist:label"
msgid "Machines"
-msgstr ""
+msgstr "Macchine"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:37
msgctxt "@backuplist:label"
msgid "Materials"
-msgstr ""
+msgstr "Materiali"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:45
msgctxt "@backuplist:label"
msgid "Profiles"
-msgstr ""
+msgstr "Profili"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:53
msgctxt "@backuplist:label"
msgid "Plugins"
-msgstr ""
+msgstr "Plugin"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:71
msgctxt "@button"
msgid "Restore"
-msgstr ""
+msgstr "Ripristina"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:99
msgctxt "@dialog:title"
msgid "Delete Backup"
-msgstr ""
+msgstr "Cancella backup"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:100
msgctxt "@dialog:info"
msgid "Are you sure you want to delete this backup? This cannot be undone."
-msgstr ""
+msgstr "Sei sicuro di voler cancellare questo backup? Questa operazione non può essere annullata."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:108
msgctxt "@dialog:title"
msgid "Restore Backup"
-msgstr ""
+msgstr "Ripristina backup"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:109
msgctxt "@dialog:info"
msgid "You will need to restart Cura before your backup is restored. Do you want to close Cura now?"
-msgstr ""
+msgstr "Riavviare Cura prima di ripristinare il backup. Chiudere Cura adesso?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:22
msgctxt "@button"
msgid "Want more?"
-msgstr ""
+msgstr "Ulteriori informazioni?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:31
msgctxt "@button"
msgid "Backup Now"
-msgstr ""
+msgstr "Esegui backup adesso"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:43
msgctxt "@checkbox:description"
msgid "Auto Backup"
-msgstr ""
+msgstr "Backup automatico"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:44
msgctxt "@checkbox:description"
msgid "Automatically create a backup each day that Cura is started."
-msgstr ""
+msgstr "Crea automaticamente un backup ogni giorno in cui viene avviata Cura."
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMainSettingsSelector.qml:75
msgctxt "@label"
msgid "Not supported"
-msgstr ""
+msgstr "Non supportato"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:35
msgctxt "@action:button"
@@ -2974,99 +2972,6 @@ msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr "Piano di stampa riscaldato (kit ufficiale o integrato)"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27
-msgctxt "@title"
-msgid "Check Printer"
-msgstr "Controllo stampante"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39
-msgctxt "@label"
-msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"
-msgstr "È consigliabile eseguire alcuni controlli di integrità sulla Ultimaker. È possibile saltare questo passaggio se si è certi che la macchina funziona correttamente"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53
-msgctxt "@action:button"
-msgid "Start Printer Check"
-msgstr "Avvia controllo stampante"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80
-msgctxt "@label"
-msgid "Connection: "
-msgstr "Collegamento: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Connected"
-msgstr "Collegato"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Not connected"
-msgstr "Non collegato"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99
-msgctxt "@label"
-msgid "Min endstop X: "
-msgstr "Endstop min. asse X: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-msgctxt "@info:status"
-msgid "Works"
-msgstr "Funziona"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Not checked"
-msgstr "Controllo non selezionato"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120
-msgctxt "@label"
-msgid "Min endstop Y: "
-msgstr "Endstop min. asse Y: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141
-msgctxt "@label"
-msgid "Min endstop Z: "
-msgstr "Endstop min. asse Z: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163
-msgctxt "@label"
-msgid "Nozzle temperature check: "
-msgstr "Controllo temperatura ugello: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Stop Heating"
-msgstr "Arresto riscaldamento"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Start Heating"
-msgstr "Avvio riscaldamento"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223
-msgctxt "@label"
-msgid "Build plate temperature check:"
-msgstr "Controllo temperatura piano di stampa:"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Checked"
-msgstr "Controllo eseguito"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284
-msgctxt "@label"
-msgid "Everything is in order! You're done with your CheckUp."
-msgstr "È tutto in ordine! Controllo terminato."
-
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"
msgid "Not connected to a printer"
@@ -3638,7 +3543,7 @@ msgstr "Crea profilo"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
msgctxt "@info"
msgid "Please provide a name for this profile."
-msgstr ""
+msgstr "Indica un nome per questo profilo."
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
msgctxt "@title:window"
@@ -3668,7 +3573,7 @@ msgstr "Stampante: %1"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
msgid "Default profiles"
-msgstr ""
+msgstr "Profili predefiniti"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
@@ -3703,7 +3608,7 @@ msgstr "Impostazioni globali"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
msgctxt "@action:button"
msgid "Marketplace"
-msgstr ""
+msgstr "Mercato"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:27
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:13
@@ -3726,7 +3631,7 @@ msgstr "&Visualizza"
#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:13
msgctxt "@title:menu menubar:toplevel"
msgid "&Settings"
-msgstr ""
+msgstr "&Impostazioni"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:55
msgctxt "@title:menu menubar:toplevel"
@@ -3761,7 +3666,7 @@ msgstr "Senza titolo"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:68
msgctxt "@label:textbox"
msgid "search settings"
-msgstr ""
+msgstr "impostazioni ricerca"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
msgctxt "@action:menu"
@@ -3850,17 +3755,17 @@ msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
msgctxt "@button"
msgid "Recommended"
-msgstr ""
+msgstr "Consigliata"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
msgctxt "@button"
msgid "Custom"
-msgstr ""
+msgstr "Personalizzata"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:193
msgctxt "@label"
msgid "Gradual infill"
-msgstr ""
+msgstr "Riempimento graduale"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:232
msgctxt "@label"
@@ -3870,7 +3775,7 @@ msgstr "Un riempimento graduale aumenterà gradualmente la quantità di riempime
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
msgctxt "@label"
msgid "Support"
-msgstr ""
+msgstr "Supporto"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
msgctxt "@label"
@@ -3885,7 +3790,7 @@ msgstr "Seleziona l’estrusore da utilizzare per la stampa di strutture di supp
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
msgctxt "@label"
msgid "Adhesion"
-msgstr ""
+msgstr "Adesione"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
msgctxt "@label"
@@ -3905,7 +3810,7 @@ msgstr "Sono state modificate alcune impostazioni del profilo. Per modificarle,
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:355
msgctxt "@tooltip"
msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile"
-msgstr ""
+msgstr "Questo profilo di qualità non è disponibile per il materiale e la configurazione ugello corrente. Modificarli per abilitare questo profilo di qualità"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3915,17 +3820,17 @@ msgstr "Un profilo personalizzato è attualmente attivo. Per attivare il cursore
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:13
msgctxt "@label:Should be short"
msgid "On"
-msgstr ""
+msgstr "Inserita"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:14
msgctxt "@label:Should be short"
msgid "Off"
-msgstr ""
+msgstr "Disinserita"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:27
msgctxt "@label"
msgid "Profile"
-msgstr ""
+msgstr "Profilo"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:94
msgctxt "@tooltip"
@@ -3941,7 +3846,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label shown when we load a Gcode file"
msgid "Print setup disabled. G code file can not be modified."
-msgstr ""
+msgstr "Impostazione di stampa disabilitata. Impossibile modificare il file codice G."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -4182,47 +4087,47 @@ msgstr "Numero di copie"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/AutoConfiguration.qml:18
msgctxt "@header"
msgid "Configurations"
-msgstr ""
+msgstr "Configurazioni"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:110
msgctxt "@label"
msgid "Select configuration"
-msgstr ""
+msgstr "Seleziona configurazione"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
msgctxt "@label"
msgid "See the material compatibility chart"
-msgstr ""
+msgstr "Vedere il grafico di compatibilità dei materiali"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
msgctxt "@label"
msgid "Configurations"
-msgstr ""
+msgstr "Configurazioni"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:57
msgctxt "@label"
msgid "Loading available configurations from the printer..."
-msgstr ""
+msgstr "Caricamento in corso configurazioni disponibili dalla stampante..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:58
msgctxt "@label"
msgid "The configurations are not available because the printer is disconnected."
-msgstr ""
+msgstr "Le configurazioni non sono disponibili perché la stampante è scollegata."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:25
msgctxt "@header"
msgid "Custom"
-msgstr ""
+msgstr "Personalizzata"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:61
msgctxt "@label"
msgid "Printer"
-msgstr ""
+msgstr "Stampante"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
msgctxt "@label"
msgid "Enabled"
-msgstr ""
+msgstr "Abilitato"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
msgctxt "@label"
@@ -4232,17 +4137,17 @@ msgstr "Materiale"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
-msgstr ""
+msgstr "Utilizzare la colla per una migliore adesione con questa combinazione di materiali."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:128
msgctxt "@label"
msgid "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile."
-msgstr ""
+msgstr "Questa configurazione non è disponibile perché %1 non viene riconosciuto. Visitare %2 per scaricare il profilo materiale corretto."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:129
msgctxt "@label"
msgid "Marketplace"
-msgstr ""
+msgstr "Mercato"
#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:15
msgctxt "@title:menu menubar:file"
@@ -4272,37 +4177,37 @@ msgstr "Tempo residuo stimato"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
msgid "View types"
-msgstr ""
+msgstr "Visualizza tipi"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
msgctxt "@label"
msgid "Hi "
-msgstr ""
+msgstr "Ciao "
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
msgctxt "@button"
msgid "Ultimaker account"
-msgstr ""
+msgstr "Account Ultimaker"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
msgctxt "@button"
msgid "Sign out"
-msgstr ""
+msgstr "Esci"
#: /home/ruben/Projects/Cura/resources/qml/Account/AccountWidget.qml:24
msgctxt "@action:button"
msgid "Sign in"
-msgstr ""
+msgstr "Accedi"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
msgctxt "@label"
msgid "Ultimaker Cloud"
-msgstr ""
+msgstr "Ultimaker Cloud"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
-msgstr ""
+msgstr "Flusso di stampa 3D di ultima generazione"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:51
msgctxt "@text"
@@ -4311,26 +4216,29 @@ msgid ""
"- Store your Ultimaker Cura settings in the cloud for use anywhere\n"
"- Get exclusive access to material profiles from leading brands"
msgstr ""
+"- Invia i processi di stampa alle stampanti Ultimaker esterne alla rete locale\n"
+"- Invia le impostazioni Ultimaker Cura nel cloud per usarle ovunque\n"
+"- Ottieni l’accesso esclusivo ai profili materiale da marchi leader"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
msgid "Create account"
-msgstr ""
+msgstr "Crea account"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
msgctxt "@label"
msgid "No time estimation available"
-msgstr ""
+msgstr "Nessuna stima di tempo disponibile"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
msgctxt "@label"
msgid "No cost estimation available"
-msgstr ""
+msgstr "Nessuna stima di costo disponibile"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
msgctxt "@button"
msgid "Preview"
-msgstr ""
+msgstr "Anteprima"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
msgctxt "@label:PrintjobStatus"
@@ -4345,27 +4253,27 @@ msgstr "Sezionamento impossibile"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
msgctxt "@button"
msgid "Slice"
-msgstr ""
+msgstr "Sezionamento"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
msgctxt "@label"
msgid "Start the slicing process"
-msgstr ""
+msgstr "Avvia il processo di sezionamento"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
msgctxt "@button"
msgid "Cancel"
-msgstr ""
+msgstr "Annulla"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
msgid "Time specification"
-msgstr ""
+msgstr "Indicazioni di tempo"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
msgid "Material specification"
-msgstr ""
+msgstr "Specifiche materiale"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4380,27 +4288,27 @@ msgstr "%1g"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Connected printers"
-msgstr ""
+msgstr "Stampanti collegate"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Preset printers"
-msgstr ""
+msgstr "Stampanti preimpostate"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
msgctxt "@button"
msgid "Add printer"
-msgstr ""
+msgstr "Aggiungi stampante"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
msgctxt "@button"
msgid "Manage printers"
-msgstr ""
+msgstr "Gestione stampanti"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
-msgstr ""
+msgstr "Mostra la Guida ricerca e riparazione dei guasti online"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
msgctxt "@action:inmenu"
@@ -4611,7 +4519,7 @@ msgstr "Mostra cartella di configurazione"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
msgctxt "@action:menu"
msgid "&Marketplace"
-msgstr ""
+msgstr "&Mercato"
#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
msgctxt "@title:window"
@@ -4730,7 +4638,7 @@ msgstr "Crea nuovo profilo"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
msgctxt "@title:tab"
msgid "Add a printer to Cura"
-msgstr ""
+msgstr "Aggiungi una stampante a Cura"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
msgctxt "@title:tab"
@@ -4739,16 +4647,19 @@ msgid ""
"\n"
"If your printer is not in the list, use the \"Custom FFF Printer\" from the \"Custom\" category and adjust the settings to match your printer in the next dialog."
msgstr ""
+"Seleziona la stampante da usare dell’elenco seguente.\n"
+"\n"
+"Se la stampante non è nell’elenco, usare la “Stampante FFF personalizzata\" dalla categoria “Personalizzata\" e regolare le impostazioni in modo che corrispondano alla stampante nella finestra di dialogo successiva."
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
msgctxt "@label"
msgid "Manufacturer"
-msgstr ""
+msgstr "Produttore"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
msgctxt "@label"
msgid "Printer Name"
-msgstr ""
+msgstr "Nome stampante"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
msgctxt "@action:button"
diff --git a/resources/i18n/it_IT/fdmextruder.def.json.po b/resources/i18n/it_IT/fdmextruder.def.json.po
index 355986a0dd..f3b5484cbf 100644
--- a/resources/i18n/it_IT/fdmextruder.def.json.po
+++ b/resources/i18n/it_IT/fdmextruder.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 14:25+0100\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Italian\n"
"Language: it_IT\n"
@@ -84,7 +84,7 @@ msgstr "Codice G avvio estrusore"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
-msgstr ""
+msgstr "Inizio codice G da eseguire quando si passa a questo estrusore."
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_abs label"
@@ -124,7 +124,7 @@ msgstr "Codice G fine estrusore"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_code description"
msgid "End g-code to execute when switching away from this extruder."
-msgstr ""
+msgstr "Fine codice G da eseguire quando si passa a questo estrusore."
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_abs label"
diff --git a/resources/i18n/it_IT/fdmprinter.def.json.po b/resources/i18n/it_IT/fdmprinter.def.json.po
index 7cb8244362..6a377af9a2 100644
--- a/resources/i18n/it_IT/fdmprinter.def.json.po
+++ b/resources/i18n/it_IT/fdmprinter.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 15:02+0200\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Italian\n"
"Language: it_IT\n"
@@ -57,9 +57,7 @@ msgctxt "machine_start_gcode description"
msgid ""
"G-code commands to be executed at the very start - separated by \n"
"."
-msgstr ""
-"I comandi codice G da eseguire all’avvio, separati da \n"
-"."
+msgstr "I comandi codice G da eseguire all’avvio, separati da \n."
#: fdmprinter.def.json
msgctxt "machine_end_gcode label"
@@ -71,9 +69,7 @@ msgctxt "machine_end_gcode description"
msgid ""
"G-code commands to be executed at the very end - separated by \n"
"."
-msgstr ""
-"I comandi codice G da eseguire alla fine, separati da \n"
-"."
+msgstr "I comandi codice G da eseguire alla fine, separati da \n."
#: fdmprinter.def.json
msgctxt "material_guid label"
@@ -1635,9 +1631,7 @@ msgctxt "infill_wall_line_count description"
msgid ""
"Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n"
"This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right."
-msgstr ""
-"Aggiunge pareti supplementari intorno alla zona di riempimento. Queste pareti possono ridurre l’abbassamento delle linee del rivestimento esterno superiore/inferiore, pertanto saranno necessari meno strati di rivestimento esterno superiore/inferiore per ottenere la stessa qualità al costo del materiale supplementare.\n"
-"Questa funzione può essere abbinata a Collega poligoni riempimento per collegare tutto il riempimento in un unico percorso di estrusione senza necessità di avanzamenti o arretramenti, se configurata correttamente."
+msgstr "Aggiunge pareti supplementari intorno alla zona di riempimento. Queste pareti possono ridurre l’abbassamento delle linee del rivestimento esterno superiore/inferiore, pertanto saranno necessari meno strati di rivestimento esterno superiore/inferiore per ottenere la stessa qualità al costo del materiale supplementare.\nQuesta funzione può essere abbinata a Collega poligoni riempimento per collegare tutto il riempimento in un unico percorso di estrusione senza necessità di avanzamenti o arretramenti, se configurata correttamente."
#: fdmprinter.def.json
msgctxt "sub_div_rad_add label"
@@ -1677,7 +1671,7 @@ msgstr "Percentuale di sovrapposizione del rivestimento esterno"
#: fdmprinter.def.json
msgctxt "skin_overlap description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines, as a percentage of the line widths of the skin lines and the innermost wall. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any percentage over 50% may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Regolare l’entità della sovrapposizione tra le pareti e (i punti finali delle) linee centrali del rivestimento esterno espressa in percentuale delle larghezze delle linee del rivestimento esterno. Una leggera sovrapposizione consente alle pareti di essere saldamente collegate al rivestimento. Si noti che, data una larghezza uguale del rivestimento esterno e della linea perimetrale, qualsiasi percentuale superiore al 50% può già causare il superamento della parete da parte del rivestimento esterno in quanto, in quel punto, la posizione dell’ugello dell’estrusore del rivestimento esterno può già avere superato la parte centrale della parete."
#: fdmprinter.def.json
msgctxt "skin_overlap_mm label"
@@ -1687,7 +1681,7 @@ msgstr "Sovrapposizione del rivestimento esterno"
#: fdmprinter.def.json
msgctxt "skin_overlap_mm description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any value over half the width of the wall may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Regolare l’entità della sovrapposizione tra le pareti e (i punti finali delle) linee centrali del rivestimento esterno. Una leggera sovrapposizione consente alle pareti di essere saldamente collegate al rivestimento. Si noti che, data una larghezza uguale del rivestimento esterno e della linea perimetrale, qualsiasi percentuale superiore alla metà della parete può già causare il superamento della parete da parte del rivestimento esterno in quanto, in quel punto, la posizione dell’ugello dell’estrusore del rivestimento esterno può già aver superato la parte centrale della parete."
#: fdmprinter.def.json
msgctxt "infill_wipe_dist label"
@@ -2127,7 +2121,7 @@ msgstr "Distanza di retrazione cambio ugello"
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_amount description"
msgid "The amount of retraction when switching extruders. Set to 0 for no retraction at all. This should generally be the same as the length of the heat zone."
-msgstr ""
+msgstr "Indica il valore di retrazione alla commutazione degli estrusori. Impostato a 0 per nessuna retrazione. Questo valore generalmente dovrebbe essere lo stesso della lunghezza della zona di riscaldamento."
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_speeds label"
@@ -2787,7 +2781,7 @@ msgstr "Modalità Combing"
#: fdmprinter.def.json
msgctxt "retraction_combing description"
msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas or to only comb within the infill."
-msgstr ""
+msgstr "La funzione Combing tiene l’ugello all’interno delle aree già stampate durante lo spostamento. In tal modo le corse di spostamento sono leggermente più lunghe ma si riduce l’esigenza di effettuare retrazioni. Se questa funzione viene disabilitata, il materiale viene retratto e l’ugello si sposta in linea retta al punto successivo. È anche possibile evitare il combing sopra le aree del rivestimento esterno superiore/inferiore o effettuare il combing solo nel riempimento."
#: fdmprinter.def.json
msgctxt "retraction_combing option off"
@@ -3442,12 +3436,12 @@ msgstr "Indica l’altezza di riempimento del supporto di una data densità prim
#: fdmprinter.def.json
msgctxt "minimum_support_area label"
msgid "Minimum Support Area"
-msgstr ""
+msgstr "Area minima supporto"
#: fdmprinter.def.json
msgctxt "minimum_support_area description"
msgid "Minimum area size for support polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Dimensioni minime area per i poligoni del supporto. I poligoni con un’area inferiore a questo valore non verranno generati."
#: fdmprinter.def.json
msgctxt "support_interface_enable label"
@@ -3677,62 +3671,62 @@ msgstr "Zig Zag"
#: fdmprinter.def.json
msgctxt "minimum_interface_area label"
msgid "Minimum Support Interface Area"
-msgstr ""
+msgstr "Area minima interfaccia supporto"
#: fdmprinter.def.json
msgctxt "minimum_interface_area description"
msgid "Minimum area size for support interface polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Dimensioni minime area per i poligoni di interfaccia del supporto. I poligoni con un’area inferiore a questo valore non verranno generati."
#: fdmprinter.def.json
msgctxt "minimum_roof_area label"
msgid "Minimum Support Roof Area"
-msgstr ""
+msgstr "Area minima parti superiori supporto"
#: fdmprinter.def.json
msgctxt "minimum_roof_area description"
msgid "Minimum area size for the roofs of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Dimensioni minime area per le parti superiori del supporto. I poligoni con un’area inferiore a questo valore non verranno generati."
#: fdmprinter.def.json
msgctxt "minimum_bottom_area label"
msgid "Minimum Support Floor Area"
-msgstr ""
+msgstr "Area minima parti inferiori supporto"
#: fdmprinter.def.json
msgctxt "minimum_bottom_area description"
msgid "Minimum area size for the floors of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Dimensioni minime area per le parti inferiori del supporto. I poligoni con un’area inferiore a questo valore non verranno generati."
#: fdmprinter.def.json
msgctxt "support_interface_offset label"
msgid "Support Interface Horizontal Expansion"
-msgstr ""
+msgstr "Espansione orizzontale interfaccia supporto"
#: fdmprinter.def.json
msgctxt "support_interface_offset description"
msgid "Amount of offset applied to the support interface polygons."
-msgstr ""
+msgstr "Entità di offset applicato ai poligoni di interfaccia del supporto."
#: fdmprinter.def.json
msgctxt "support_roof_offset label"
msgid "Support Roof Horizontal Expansion"
-msgstr ""
+msgstr "Espansione orizzontale parti superiori supporto"
#: fdmprinter.def.json
msgctxt "support_roof_offset description"
msgid "Amount of offset applied to the roofs of the support."
-msgstr ""
+msgstr "Entità di offset applicato alle parti superiori del supporto."
#: fdmprinter.def.json
msgctxt "support_bottom_offset label"
msgid "Support Floor Horizontal Expansion"
-msgstr ""
+msgstr "Espansione orizzontale parti inferiori supporto"
#: fdmprinter.def.json
msgctxt "support_bottom_offset description"
msgid "Amount of offset applied to the floors of the support."
-msgstr ""
+msgstr "Entità di offset applicato alle parti inferiori del supporto."
#: fdmprinter.def.json
msgctxt "support_fan_enable label"
@@ -3904,9 +3898,7 @@ msgctxt "skirt_gap description"
msgid ""
"The horizontal distance between the skirt and the first layer of the print.\n"
"This is the minimum distance. Multiple skirt lines will extend outwards from this distance."
-msgstr ""
-"Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\n"
-"Questa è la distanza minima. Più linee di skirt aumenteranno tale distanza."
+msgstr "Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\nQuesta è la distanza minima. Più linee di skirt aumenteranno tale distanza."
#: fdmprinter.def.json
msgctxt "skirt_brim_minimal_length label"
@@ -5353,9 +5345,7 @@ msgctxt "wireframe_up_half_speed description"
msgid ""
"Distance of an upward move which is extruded with half speed.\n"
"This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing."
-msgstr ""
-"Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\n"
-"Ciò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing."
+msgstr "Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\nCiò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing."
#: fdmprinter.def.json
msgctxt "wireframe_top_jump label"
@@ -5909,6 +5899,7 @@ msgstr "Matrice di rotazione da applicare al modello quando caricato dal file."
#~ "Gcode commands to be executed at the very start - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "I comandi del Gcode da eseguire all’avvio, separati da \n"
#~ "."
@@ -5921,6 +5912,7 @@ msgstr "Matrice di rotazione da applicare al modello quando caricato dal file."
#~ "Gcode commands to be executed at the very end - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "I comandi del Gcode da eseguire alla fine, separati da \n"
#~ "."
@@ -5977,6 +5969,7 @@ msgstr "Matrice di rotazione da applicare al modello quando caricato dal file."
#~ "The horizontal distance between the skirt and the first layer of the print.\n"
#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance."
#~ msgstr ""
+
#~ "Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\n"
#~ "Questa è la distanza minima, più linee di skirt aumenteranno tale distanza."
diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po
index e57c3e4cea..4a072e3936 100644
--- a/resources/i18n/ja_JP/cura.po
+++ b/resources/i18n/ja_JP/cura.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2018-11-06 14:58+0100\n"
+"PO-Revision-Date: 2019-03-14 14:39+0100\n"
"Last-Translator: Bothof \n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
@@ -16,7 +16,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 2.0.6\n"
+"X-Generator: Poedit 2.1.1\n"
#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
msgctxt "@action"
@@ -73,7 +73,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
msgctxt "@item:inmenu"
msgid "Changelog"
-msgstr ""
+msgstr "Changelog"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
msgctxt "@item:inmenu"
@@ -493,100 +493,100 @@ msgstr "プリント終了"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
msgctxt "@label:material"
msgid "Empty"
-msgstr ""
+msgstr "空にする"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
msgctxt "@label:material"
msgid "Unknown"
-msgstr ""
+msgstr "不明"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
msgctxt "@action:button"
msgid "Print via Cloud"
-msgstr ""
+msgstr "クラウドからプリントする"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
-msgstr ""
+msgstr "クラウドからプリントする"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
msgctxt "@info:status"
msgid "Connected via Cloud"
-msgstr ""
+msgstr "クラウドを使って接続しました"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
msgctxt "@info:title"
msgid "Cloud error"
-msgstr ""
+msgstr "クラウドエラー"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
msgctxt "@info:status"
msgid "Could not export print job."
-msgstr ""
+msgstr "印刷ジョブをエクスポートできませんでした。"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
-msgstr ""
+msgstr "データをプリンタにアップロードできませんでした。"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:51
msgctxt "@info:status"
msgid "tomorrow"
-msgstr ""
+msgstr "翌日"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:54
msgctxt "@info:status"
msgid "today"
-msgstr ""
+msgstr "本日"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
-msgstr ""
+msgstr "クラウドの接続時にエラーが発生しました。"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
msgid "Sending data to remote cluster"
-msgstr ""
+msgstr "リモートクラスタにデータ送信中"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Ultimaker のアカウントを使用して、どこからでも印刷ジョブを送信およびモニターします。"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
msgctxt "@info:status"
msgid "Connect to Ultimaker Cloud"
-msgstr ""
+msgstr "Ultimaker Cloud に接続する"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
msgctxt "@action"
msgid "Don't ask me again for this printer."
-msgstr ""
+msgstr "このプリンタでは次回から質問しない。"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
msgctxt "@action"
msgid "Get started"
-msgstr ""
+msgstr "はじめに"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Ultimaker のアカウントを使用して、どこからでも印刷ジョブを送信およびモニターできるようになりました。"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
msgctxt "@info:status"
msgid "Connected!"
-msgstr ""
+msgstr "接続しました!"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
msgctxt "@action"
msgid "Review your connection"
-msgstr ""
+msgstr "接続の確認"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py:30
msgctxt "@action"
@@ -638,12 +638,12 @@ msgstr "シミュレーションビュー"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:35
msgctxt "@item:inmenu"
msgid "Post Processing"
-msgstr ""
+msgstr "後処理"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:36
msgctxt "@item:inmenu"
msgid "Modify G-Code"
-msgstr ""
+msgstr "G-codeを修正"
#: /home/ruben/Projects/Cura/plugins/SupportEraser/__init__.py:12
msgctxt "@label"
@@ -693,7 +693,7 @@ msgstr "Cura 15.04 プロファイル"
#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
msgctxt "@item:inmenu"
msgid "Evaluation"
-msgstr ""
+msgstr "評価"
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
@@ -761,7 +761,7 @@ msgstr "無効な Extruder %s に関連付けられている造形物がある
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
msgctxt "@info:status"
msgid "Nothing to slice because none of the models fit the build volume or are assigned to a disabled extruder. Please scale or rotate models to fit, or enable an extruder."
-msgstr ""
+msgstr "ビルドモジュールに合うモデルがない、または無効なエクストルーダーに割り当てられているため、スライスできるものがありません。モデルが合うように拡張または回転させるか、エクストルーダーを有効にしてください。"
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
@@ -846,7 +846,7 @@ msgstr "データファイルを送信する前に、プリンターとプリン
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:64
msgctxt "@item:inmenu"
msgid "Manage backups"
-msgstr ""
+msgstr "バックアップを管理する"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:107
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:113
@@ -859,32 +859,32 @@ msgstr "バックアップ"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:55
msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
-msgstr ""
+msgstr "バックアップのリスト作成時にエラーが発生しました。"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
-msgstr ""
+msgstr "バックアップのリストア中にエラーが発生しました。"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:15
msgctxt "@info:title"
msgid "Backups"
-msgstr ""
+msgstr "バックアップ"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:27
msgctxt "@info:backup_status"
msgid "Uploading your backup..."
-msgstr ""
+msgstr "バックアップをアップロードしています..."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:36
msgctxt "@info:backup_status"
msgid "There was an error while uploading your backup."
-msgstr ""
+msgstr "バックアップのアップロード中にエラーが発生しました。"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:39
msgctxt "@info:backup_status"
msgid "Your backup has finished uploading."
-msgstr ""
+msgstr "バックアップのアップロードを完了しました。"
#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14
#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14
@@ -920,7 +920,7 @@ msgstr "3Mf ファイルの書き込みエラー。"
#: /home/ruben/Projects/Cura/plugins/PreviewStage/__init__.py:13
msgctxt "@item:inmenu"
msgid "Preview"
-msgstr ""
+msgstr "プレビュー"
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
@@ -928,11 +928,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr "アップグレードを選択する"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr "チェックアップ"
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -1021,7 +1016,7 @@ msgstr "{0} は既に存在します。ファイルを上
#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
msgctxt "@info:status"
msgid "Invalid file URL:"
-msgstr ""
+msgstr "無効なファイルのURL:"
#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
msgctxt "@menuitem"
@@ -1042,7 +1037,7 @@ msgstr "設定が更新されました"
#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
-msgstr ""
+msgstr "エクストルーダーを無効にしました"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
#, python-brace-format
@@ -1071,19 +1066,19 @@ msgstr "書き出し完了"
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
-msgstr ""
+msgstr "{0}からプロファイルの取り込に失敗しました:{1}"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Can't import profile from {0} before a printer is added."
-msgstr ""
+msgstr "プリンタを追加する前に、{0}からプロファイルの取り込はできません。"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "No custom profile to import in file {0}"
-msgstr "ファイル{0}にはカスタムプロファイルがインポートされていません。"
+msgstr "ファイル{0}にはカスタムプロファイルがインポートされていません"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:194
#, python-brace-format
@@ -1210,7 +1205,7 @@ msgstr "現行バージョンと一致しないCuraバックアップをリス
#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
-msgstr ""
+msgstr "Ultimaker アカウントサーバーに到達できません。"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
@@ -1220,7 +1215,7 @@ msgstr "造形データを増やす、配置する"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:28
msgctxt "@info:title"
msgid "Placing Objects"
-msgstr ""
+msgstr "造形データを配置"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:103
@@ -1636,7 +1631,7 @@ msgstr "Curaパッケージデータベースに接続できません。接続
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/SmallRatingWidget.qml:27
msgctxt "@label"
msgid "ratings"
-msgstr ""
+msgstr "評価"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
@@ -1655,7 +1650,7 @@ msgstr "マテリアル"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:91
msgctxt "@label"
msgid "Your rating"
-msgstr ""
+msgstr "ユーザー評価"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
msgctxt "@label"
@@ -1688,7 +1683,7 @@ msgstr "不明"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
-msgstr ""
+msgstr "インストールまたはアップデートにはログインが必要です"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
@@ -1711,7 +1706,7 @@ msgstr "更新済み"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:13
msgctxt "@title"
msgid "Marketplace"
-msgstr ""
+msgstr "マーケットプレース"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml:25
msgctxt "@action:button"
@@ -1746,12 +1741,12 @@ msgstr "確認"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to login first before you can rate"
-msgstr ""
+msgstr "評価する前にはログインが必要です"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to install the package before you can rate"
-msgstr ""
+msgstr "評価する前にはパッケージをインストールする必要があります"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:19
msgctxt "@info"
@@ -1791,7 +1786,7 @@ msgstr "再起動時にインストール"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:53
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to update"
-msgstr ""
+msgstr "アップデートにはログインが必要です"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:71
msgctxt "@action:button"
@@ -1842,22 +1837,22 @@ msgstr "互換性"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:203
msgctxt "@action:label"
msgid "Technical Data Sheet"
-msgstr ""
+msgstr "技術データシート"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:212
msgctxt "@action:label"
msgid "Safety Data Sheet"
-msgstr ""
+msgstr "安全データシート"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:221
msgctxt "@action:label"
msgid "Printing Guidelines"
-msgstr ""
+msgstr "印刷ガイドライン"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:230
msgctxt "@action:label"
msgid "Website"
-msgstr ""
+msgstr "ウェブサイト"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml:16
msgctxt "@info"
@@ -1979,17 +1974,17 @@ msgstr "ユーザー用使用許諾契約"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
msgctxt "@info"
msgid "These options are not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "クラウドプリンタをモニタリングしている場合は、これらのオプションは利用できません。"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:241
msgctxt "@info"
msgid "The webcam is not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "クラウドプリンタをモニタリングしている場合は、ウェブカムを利用できません。"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
msgctxt "@label:status"
msgid "Loading..."
-msgstr ""
+msgstr "読み込み中..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
msgctxt "@label:status"
@@ -1999,42 +1994,42 @@ msgstr "利用不可"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
msgctxt "@label:status"
msgid "Unreachable"
-msgstr ""
+msgstr "到達不能"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
msgctxt "@label:status"
msgid "Idle"
-msgstr ""
+msgstr "アイドル"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:353
msgctxt "@label"
msgid "Untitled"
-msgstr ""
+msgstr "無題"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
msgctxt "@label"
msgid "Anonymous"
-msgstr ""
+msgstr "匿名"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
msgctxt "@label:status"
msgid "Requires configuration changes"
-msgstr ""
+msgstr "構成の変更が必要です"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
msgctxt "@action:button"
msgid "Details"
-msgstr ""
+msgstr "詳細"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "Unavailable printer"
-msgstr ""
+msgstr "利用できないプリンター"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
msgctxt "@label"
msgid "First available"
-msgstr ""
+msgstr "次の空き"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:187
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:132
@@ -2050,27 +2045,27 @@ msgstr "順番を待つ"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
msgid "Go to Cura Connect"
-msgstr ""
+msgstr "Cura Connectに移動する"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
msgctxt "@label"
msgid "Print jobs"
-msgstr ""
+msgstr "プリントジョブ"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Total print time"
-msgstr ""
+msgstr "合計印刷時間"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
msgctxt "@label"
msgid "Waiting for"
-msgstr ""
+msgstr "待ち時間"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
msgctxt "@label link to connect manager"
msgid "View print history"
-msgstr ""
+msgstr "印刷履歴の表示"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
msgctxt "@window:title"
@@ -2193,17 +2188,17 @@ msgstr "終了"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Preparing..."
-msgstr ""
+msgstr "準備中..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Aborting..."
-msgstr ""
+msgstr "中止しています..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
msgctxt "@label:status"
msgid "Pausing..."
-msgstr ""
+msgstr "一時停止しています..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
msgctxt "@label:status"
@@ -2213,7 +2208,7 @@ msgstr "一時停止"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
msgctxt "@label:status"
msgid "Resuming..."
-msgstr ""
+msgstr "再開しています…"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
msgctxt "@label:status"
@@ -2223,7 +2218,7 @@ msgstr "アクションが必要です"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
msgctxt "@label:status"
msgid "Finishes %1 at %2"
-msgstr ""
+msgstr "%1 を %2 に終了します"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:44
msgctxt "@action:button"
@@ -2259,12 +2254,12 @@ msgstr "再開"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:102
msgctxt "@label"
msgid "Pausing..."
-msgstr ""
+msgstr "一時停止しています..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:104
msgctxt "@label"
msgid "Resuming..."
-msgstr ""
+msgstr "再開しています…"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:106
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284
@@ -2276,7 +2271,7 @@ msgstr "一時停止"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
msgid "Aborting..."
-msgstr ""
+msgstr "中止しています..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
@@ -2317,18 +2312,18 @@ msgstr "プリント中止"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:20
msgctxt "@title:window"
msgid "Configuration Changes"
-msgstr ""
+msgstr "構成の変更"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:27
msgctxt "@action:button"
msgid "Override"
-msgstr ""
+msgstr "上書き"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
msgctxt "@label"
msgid "The assigned printer, %1, requires the following configuration change:"
msgid_plural "The assigned printer, %1, requires the following configuration changes:"
-msgstr[0] ""
+msgstr[0] "割り当てられたプリンター %1 には以下の構成変更が必要です。"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
msgctxt "@label"
@@ -2358,7 +2353,7 @@ msgstr "ビルドプレートを %1 に変更します(これは上書きで
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
-msgstr ""
+msgstr "上書きは、既存のプリンタ構成で指定された設定を使用します。これにより、印刷が失敗する場合があります。"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
msgctxt "@label"
@@ -2377,21 +2372,24 @@ msgid ""
"- Check if the printer is turned on.\n"
"- Check if the printer is connected to the network."
msgstr ""
+"プリンタが接続されていること確認してください:\n"
+"- プリンタの電源が入っていることを確認してください。\n"
+"- プリンタがネットワークに接続されているか確認してください。"
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
msgctxt "@info"
msgid "Please select a network connected printer to monitor."
-msgstr ""
+msgstr "モニターするプリンタが接続されているネットワークを選択してください。"
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
msgctxt "@info"
msgid "Please connect your Ultimaker printer to your local network."
-msgstr ""
+msgstr "Ultimaker プリンタをローカルネットワークに接続してください。"
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
-msgstr ""
+msgstr "ユーザーマニュアルをオンラインで見る"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
@@ -2427,17 +2425,17 @@ msgstr "コンパティビリティモード"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
msgctxt "@label"
msgid "Travels"
-msgstr ""
+msgstr "移動"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
msgctxt "@label"
msgid "Helpers"
-msgstr ""
+msgstr "ヘルプ"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
msgctxt "@label"
msgid "Shell"
-msgstr ""
+msgstr "外郭"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
@@ -2513,17 +2511,17 @@ msgstr "Curaは印刷の品質とユーザー体験を向上させるために
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
msgctxt "@text:window"
msgid "I don't want to send this data"
-msgstr ""
+msgstr "このデータは送信しない"
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
msgctxt "@text:window"
msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr ""
+msgstr "Ultimakerへのデータ送信を許可し、Curaの改善を手助けする"
#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
msgctxt "@label"
msgid "No print selected"
-msgstr ""
+msgstr "プリンタが選択されていません"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2787,108 +2785,108 @@ msgstr "開く"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:28
msgctxt "@title"
msgid "My Backups"
-msgstr ""
+msgstr "マイ バックアップ"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:38
msgctxt "@empty_state"
msgid "You don't have any backups currently. Use the 'Backup Now' button to create one."
-msgstr ""
+msgstr "現在バックアップは存在しません。[今すぐバックアップする] を使用して作成してください。"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:60
msgctxt "@backup_limit_info"
msgid "During the preview phase, you'll be limited to 5 visible backups. Remove a backup to see older ones."
-msgstr ""
+msgstr "プレビューではバックアップは5つまでに制限されています。古いバックアップは削除してください。"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:34
msgctxt "@description"
msgid "Backup and synchronize your Cura settings."
-msgstr ""
+msgstr "Cura のバックアップおよび同期を設定します。"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
msgctxt "@button"
msgid "Sign in"
-msgstr ""
+msgstr "サインイン"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/main.qml:24
msgctxt "@title:window"
msgid "Cura Backups"
-msgstr ""
+msgstr "Cura バックアップ"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:21
msgctxt "@backuplist:label"
msgid "Cura Version"
-msgstr ""
+msgstr "Cura バージョン"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:29
msgctxt "@backuplist:label"
msgid "Machines"
-msgstr ""
+msgstr "プリンタ"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:37
msgctxt "@backuplist:label"
msgid "Materials"
-msgstr ""
+msgstr "材料"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:45
msgctxt "@backuplist:label"
msgid "Profiles"
-msgstr ""
+msgstr "プロファイル"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:53
msgctxt "@backuplist:label"
msgid "Plugins"
-msgstr ""
+msgstr "プラグイン"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:71
msgctxt "@button"
msgid "Restore"
-msgstr ""
+msgstr "リストア"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:99
msgctxt "@dialog:title"
msgid "Delete Backup"
-msgstr ""
+msgstr "バックアップの削除"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:100
msgctxt "@dialog:info"
msgid "Are you sure you want to delete this backup? This cannot be undone."
-msgstr ""
+msgstr "このバックアップを削除しますか?これは取り消しできません。"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:108
msgctxt "@dialog:title"
msgid "Restore Backup"
-msgstr ""
+msgstr "バックアップのリストア"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:109
msgctxt "@dialog:info"
msgid "You will need to restart Cura before your backup is restored. Do you want to close Cura now?"
-msgstr ""
+msgstr "バックアップをリストアする前に Cura を再起動する必要があります。今すぐ Cura を閉じますか?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:22
msgctxt "@button"
msgid "Want more?"
-msgstr ""
+msgstr "詳しく知りたい?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:31
msgctxt "@button"
msgid "Backup Now"
-msgstr ""
+msgstr "今すぐバックアップする"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:43
msgctxt "@checkbox:description"
msgid "Auto Backup"
-msgstr ""
+msgstr "自動バックアップ"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:44
msgctxt "@checkbox:description"
msgid "Automatically create a backup each day that Cura is started."
-msgstr ""
+msgstr "Cura を起動した日は常にバックアップを自動生成します。"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMainSettingsSelector.qml:75
msgctxt "@label"
msgid "Not supported"
-msgstr ""
+msgstr "サポート対象外"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:35
msgctxt "@action:button"
@@ -2951,7 +2949,7 @@ msgstr "プリントの成功率を上げるために、ビルドプレートを
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47
msgctxt "@label"
msgid "For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build plate height is right when the paper is slightly gripped by the tip of the nozzle."
-msgstr "すべてのポジションに"
+msgstr "すべてのポジションに。"
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62
msgctxt "@action:button"
@@ -2973,99 +2971,6 @@ msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr "ヒーティッドビルドプレート(オフィシャルキットまたはセルフビルド)"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27
-msgctxt "@title"
-msgid "Check Printer"
-msgstr "プリンターチェック"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39
-msgctxt "@label"
-msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"
-msgstr "お持ちのUltimkaerにてサニティーチェックを数回行うことは推奨します。もしプリンター機能に問題ない場合はこの項目をスキップしてください"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53
-msgctxt "@action:button"
-msgid "Start Printer Check"
-msgstr "プリンターチェックを開始する"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80
-msgctxt "@label"
-msgid "Connection: "
-msgstr "コネクション: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Connected"
-msgstr "接続済"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Not connected"
-msgstr "プリンターにつながっていません"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99
-msgctxt "@label"
-msgid "Min endstop X: "
-msgstr "エンドストップ X: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-msgctxt "@info:status"
-msgid "Works"
-msgstr "作品"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Not checked"
-msgstr "チェックされていません"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120
-msgctxt "@label"
-msgid "Min endstop Y: "
-msgstr "エンドストップ Y: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141
-msgctxt "@label"
-msgid "Min endstop Z: "
-msgstr "エンドストップ Z: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163
-msgctxt "@label"
-msgid "Nozzle temperature check: "
-msgstr "ノズル温度チェック: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Stop Heating"
-msgstr "ヒーティングストップ"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Start Heating"
-msgstr "ヒーティング開始"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223
-msgctxt "@label"
-msgid "Build plate temperature check:"
-msgstr "ビルドプレートの温度チェック:"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Checked"
-msgstr "チェック済"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284
-msgctxt "@label"
-msgid "Everything is in order! You're done with your CheckUp."
-msgstr "すべてに異常はありません。チェックアップを終了しました。"
-
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"
msgid "Not connected to a printer"
@@ -3637,7 +3542,7 @@ msgstr "プロファイルを作る"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
msgctxt "@info"
msgid "Please provide a name for this profile."
-msgstr ""
+msgstr "このプロファイルの名前を指定してください。"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
msgctxt "@title:window"
@@ -3667,7 +3572,7 @@ msgstr "プリンター:%1"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
msgid "Default profiles"
-msgstr ""
+msgstr "デフォルトプロファイル"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
@@ -3702,7 +3607,7 @@ msgstr "グローバル設定"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
msgctxt "@action:button"
msgid "Marketplace"
-msgstr ""
+msgstr "マーケットプレース"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:27
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:13
@@ -3725,7 +3630,7 @@ msgstr "&ビュー"
#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:13
msgctxt "@title:menu menubar:toplevel"
msgid "&Settings"
-msgstr ""
+msgstr "&設定"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:55
msgctxt "@title:menu menubar:toplevel"
@@ -3760,7 +3665,7 @@ msgstr "無題"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:68
msgctxt "@label:textbox"
msgid "search settings"
-msgstr ""
+msgstr "検索設定"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
msgctxt "@action:menu"
@@ -3846,17 +3751,17 @@ msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
msgctxt "@button"
msgid "Recommended"
-msgstr ""
+msgstr "推奨"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
msgctxt "@button"
msgid "Custom"
-msgstr ""
+msgstr "カスタム"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:193
msgctxt "@label"
msgid "Gradual infill"
-msgstr ""
+msgstr "インフィル半減"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:232
msgctxt "@label"
@@ -3866,7 +3771,7 @@ msgstr "グラデュアルインフィルはトップに向かうに従ってイ
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
msgctxt "@label"
msgid "Support"
-msgstr ""
+msgstr "サポート"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
msgctxt "@label"
@@ -3881,7 +3786,7 @@ msgstr "サポートに使うエクストルーダーを選択してください
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
msgctxt "@label"
msgid "Adhesion"
-msgstr ""
+msgstr "密着性"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
msgctxt "@label"
@@ -3901,7 +3806,7 @@ msgstr "プロファイルの設定がいくつか変更されました。変更
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:355
msgctxt "@tooltip"
msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile"
-msgstr ""
+msgstr "この品質プロファイルは現在の材料およびノズル構成では使用できません。この品質プロファイルを使用できるように変更してください"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3911,17 +3816,17 @@ msgstr "カスタムプロファイルが有効になっています。品質ス
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:13
msgctxt "@label:Should be short"
msgid "On"
-msgstr ""
+msgstr "オン"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:14
msgctxt "@label:Should be short"
msgid "Off"
-msgstr ""
+msgstr "オフ"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:27
msgctxt "@label"
msgid "Profile"
-msgstr ""
+msgstr "プロファイル"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:94
msgctxt "@tooltip"
@@ -3936,7 +3841,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label shown when we load a Gcode file"
msgid "Print setup disabled. G code file can not be modified."
-msgstr ""
+msgstr "印刷の設定を無効にしました。G コードファイルは変更できません。"
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -4177,47 +4082,47 @@ msgstr "コピーの数"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/AutoConfiguration.qml:18
msgctxt "@header"
msgid "Configurations"
-msgstr ""
+msgstr "構成"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:110
msgctxt "@label"
msgid "Select configuration"
-msgstr ""
+msgstr "構成の選択"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
msgctxt "@label"
msgid "See the material compatibility chart"
-msgstr ""
+msgstr "材料の適合性チャートをご覧ください"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
msgctxt "@label"
msgid "Configurations"
-msgstr ""
+msgstr "構成"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:57
msgctxt "@label"
msgid "Loading available configurations from the printer..."
-msgstr ""
+msgstr "プリンタから利用可能な構成を読み込んでいます..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:58
msgctxt "@label"
msgid "The configurations are not available because the printer is disconnected."
-msgstr ""
+msgstr "プリンタが接続されていないため、構成は利用できません。"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:25
msgctxt "@header"
msgid "Custom"
-msgstr ""
+msgstr "カスタム"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:61
msgctxt "@label"
msgid "Printer"
-msgstr ""
+msgstr "プリンター"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
msgctxt "@label"
msgid "Enabled"
-msgstr ""
+msgstr "有効"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
msgctxt "@label"
@@ -4227,17 +4132,17 @@ msgstr "フィラメント"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
-msgstr ""
+msgstr "この材料の組み合わせの接着に接着材を使用する。"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:128
msgctxt "@label"
msgid "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile."
-msgstr ""
+msgstr "%1 が認識されていないためこの構成は利用できません。%2 から適切な材料プロファイルをダウンロードしてください。"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:129
msgctxt "@label"
msgid "Marketplace"
-msgstr ""
+msgstr "マーケットプレース"
#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:15
msgctxt "@title:menu menubar:file"
@@ -4267,37 +4172,37 @@ msgstr "残り時間"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
msgid "View types"
-msgstr ""
+msgstr "タイプ表示"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
msgctxt "@label"
msgid "Hi "
-msgstr ""
+msgstr "こんにちわ "
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
msgctxt "@button"
msgid "Ultimaker account"
-msgstr ""
+msgstr "Ultimaker アカウント"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
msgctxt "@button"
msgid "Sign out"
-msgstr ""
+msgstr "サインアウト"
#: /home/ruben/Projects/Cura/resources/qml/Account/AccountWidget.qml:24
msgctxt "@action:button"
msgid "Sign in"
-msgstr ""
+msgstr "サインイン"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
msgctxt "@label"
msgid "Ultimaker Cloud"
-msgstr ""
+msgstr "Ultimaker Cloud"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
-msgstr ""
+msgstr "次世代 3D 印刷ワークフロー"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:51
msgctxt "@text"
@@ -4306,26 +4211,29 @@ msgid ""
"- Store your Ultimaker Cura settings in the cloud for use anywhere\n"
"- Get exclusive access to material profiles from leading brands"
msgstr ""
+"- 印刷ジョブをローカルネットワークの外の Ultimaker プリンタに送信します\n"
+"- Ultimaker Cura の設定をクラウドに保管してどこからでも利用できるようにします\n"
+"- 有名ブランドから材料プロファイルへの例外アクセスを取得します"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
msgid "Create account"
-msgstr ""
+msgstr "アカウントを作成する"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
msgctxt "@label"
msgid "No time estimation available"
-msgstr ""
+msgstr "時間予測がありません"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
msgctxt "@label"
msgid "No cost estimation available"
-msgstr ""
+msgstr "コスト予測がありません"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
msgctxt "@button"
msgid "Preview"
-msgstr ""
+msgstr "プレビュー"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
msgctxt "@label:PrintjobStatus"
@@ -4340,27 +4248,27 @@ msgstr "スライスできません"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
msgctxt "@button"
msgid "Slice"
-msgstr ""
+msgstr "スライス"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
msgctxt "@label"
msgid "Start the slicing process"
-msgstr ""
+msgstr "スライス処理の開始"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
msgctxt "@button"
msgid "Cancel"
-msgstr ""
+msgstr "キャンセル"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
msgid "Time specification"
-msgstr ""
+msgstr "時間仕様"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
msgid "Material specification"
-msgstr ""
+msgstr "材料仕様"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4375,27 +4283,27 @@ msgstr "%1g"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Connected printers"
-msgstr ""
+msgstr "キャンセルしたプリンター"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Preset printers"
-msgstr ""
+msgstr "プリンターのプリセット"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
msgctxt "@button"
msgid "Add printer"
-msgstr ""
+msgstr "プリンターの追加"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
msgctxt "@button"
msgid "Manage printers"
-msgstr ""
+msgstr "プリンター管理"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
-msgstr ""
+msgstr "オンラインでトラブルシューティングガイドを表示する"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
msgctxt "@action:inmenu"
@@ -4606,7 +4514,7 @@ msgstr "コンフィグレーションのフォルダーを表示する"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
msgctxt "@action:menu"
msgid "&Marketplace"
-msgstr ""
+msgstr "&マーケットプレース"
#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
msgctxt "@title:window"
@@ -4723,7 +4631,7 @@ msgstr "新しいプロファイルを作る"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
msgctxt "@title:tab"
msgid "Add a printer to Cura"
-msgstr ""
+msgstr "プリンターを Cura に追加"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
msgctxt "@title:tab"
@@ -4732,16 +4640,19 @@ msgid ""
"\n"
"If your printer is not in the list, use the \"Custom FFF Printer\" from the \"Custom\" category and adjust the settings to match your printer in the next dialog."
msgstr ""
+"下のリストから使用するプリンターを選択します。\n"
+"\n"
+"プリンターがリストにない場合は、「カスタム」カテゴリの「カスタムFFFプリンター」を使用して、次のダイアログでプリンターに合う設定に調整します。"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
msgctxt "@label"
msgid "Manufacturer"
-msgstr ""
+msgstr "製造元"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
msgctxt "@label"
msgid "Printer Name"
-msgstr ""
+msgstr "プリンター名"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
msgctxt "@action:button"
diff --git a/resources/i18n/ja_JP/fdmextruder.def.json.po b/resources/i18n/ja_JP/fdmextruder.def.json.po
index a9e9df7718..83cbdd0515 100644
--- a/resources/i18n/ja_JP/fdmextruder.def.json.po
+++ b/resources/i18n/ja_JP/fdmextruder.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 15:24+0200\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
@@ -85,7 +85,7 @@ msgstr "エクストルーダーがG-Codeを開始する"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
-msgstr ""
+msgstr "このエクストルーダーに切り替えた時に G-Code の開始を実行します。"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_abs label"
@@ -125,7 +125,7 @@ msgstr "エクストルーダーがG-Codeを終了する"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_code description"
msgid "End g-code to execute when switching away from this extruder."
-msgstr ""
+msgstr "このエクストルーダーから切り替えた時に G-Code の終了を実行します。"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_abs label"
diff --git a/resources/i18n/ja_JP/fdmprinter.def.json.po b/resources/i18n/ja_JP/fdmprinter.def.json.po
index 08cb5e870e..05cda76519 100644
--- a/resources/i18n/ja_JP/fdmprinter.def.json.po
+++ b/resources/i18n/ja_JP/fdmprinter.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 15:27+0200\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
@@ -61,9 +61,7 @@ msgctxt "machine_start_gcode description"
msgid ""
"G-code commands to be executed at the very start - separated by \n"
"."
-msgstr ""
-"最初に実行するG-codeコマンドは、\n"
-"で区切ります。"
+msgstr "最初に実行するG-codeコマンドは、\nで区切ります。"
#: fdmprinter.def.json
msgctxt "machine_end_gcode label"
@@ -75,9 +73,7 @@ msgctxt "machine_end_gcode description"
msgid ""
"G-code commands to be executed at the very end - separated by \n"
"."
-msgstr ""
-"最後に実行するG-codeコマンドは、\n"
-"で区切ります。"
+msgstr "最後に実行するG-codeコマンドは、\nで区切ります。"
#: fdmprinter.def.json
msgctxt "material_guid label"
@@ -1326,9 +1322,7 @@ msgstr "ZシームX"
#: fdmprinter.def.json
msgctxt "z_seam_x description"
msgid "The X coordinate of the position near where to start printing each part in a layer."
-msgstr ""
-"レイヤー内の各印刷を開始するX座\n"
-"標の位置。"
+msgstr "レイヤー内の各印刷を開始するX座\n標の位置。"
#: fdmprinter.def.json
msgctxt "z_seam_y label"
@@ -1711,9 +1705,7 @@ msgctxt "infill_wall_line_count description"
msgid ""
"Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n"
"This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right."
-msgstr ""
-"インフィルエリア周辺に外壁を追加します。このような壁は、上層/底層ラインにたるみを作ります。つまり、一部の外壁材料の費用で同じ品質を実現するためには、必要な上層/底層スキンが少ないことを意味します。\n"
-"この機能は、インフィルポリゴン接合と組み合わせて、構成が正しい場合、移動または引き戻しが必要なく、すべてのインフィルを1つの押出経路に接続することができます。"
+msgstr "インフィルエリア周辺に外壁を追加します。このような壁は、上層/底層ラインにたるみを作ります。つまり、一部の外壁材料の費用で同じ品質を実現するためには、必要な上層/底層スキンが少ないことを意味します。\nこの機能は、インフィルポリゴン接合と組み合わせて、構成が正しい場合、移動または引き戻しが必要なく、すべてのインフィルを1つの押出経路に接続することができます。"
#: fdmprinter.def.json
msgctxt "sub_div_rad_add label"
@@ -1754,7 +1746,7 @@ msgstr "表面公差量"
#: fdmprinter.def.json
msgctxt "skin_overlap description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines, as a percentage of the line widths of the skin lines and the innermost wall. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any percentage over 50% may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "壁とスキンの中央ライン(のエンドポイント)が交差する量(スキンラインのライン幅と壁の最内部に対する割合)を調整します。わずかな交差によって、壁がスキンにしっかりつながります。スキンと壁のライン幅が同じで、割合が50%を超えると、スキンが壁を通過している可能性があります。これは、その時点で、スキン押出機のノズルの位置が、すでに壁の真ん中を過ぎている可能性があるためです。"
#: fdmprinter.def.json
msgctxt "skin_overlap_mm label"
@@ -1764,7 +1756,7 @@ msgstr "表面公差"
#: fdmprinter.def.json
msgctxt "skin_overlap_mm description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any value over half the width of the wall may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "壁とスキンの中央ライン(のエンドポイント)が交差する量を調整します。わずかな交差によって、壁がスキンにしっかりつながります。スキンと壁のライン幅が同じで、壁の幅が半分以上の値になると、スキンが壁を通過している可能性があります。これは、その時点で、スキン押出機のノズルの位置が、すでに壁の真ん中を過ぎている可能性があるためです。"
#: fdmprinter.def.json
msgctxt "infill_wipe_dist label"
@@ -1815,9 +1807,7 @@ msgstr "インフィル優先"
#: fdmprinter.def.json
msgctxt "infill_before_walls description"
msgid "Print the infill before printing the walls. Printing the walls first may lead to more accurate walls, but overhangs print worse. Printing the infill first leads to sturdier walls, but the infill pattern might sometimes show through the surface."
-msgstr ""
-"壁より前にインフィルをプリントします はじめに壁をプリントするとより精密な壁になりますが、オーバーハングのプリントは悪化します\n"
-"はじめにインフィルをプリントすると丈夫な壁になりますが、インフィルの模様が時折表面から透けて表れます。"
+msgstr "壁より前にインフィルをプリントします はじめに壁をプリントするとより精密な壁になりますが、オーバーハングのプリントは悪化します\nはじめにインフィルをプリントすると丈夫な壁になりますが、インフィルの模様が時折表面から透けて表れます。"
#: fdmprinter.def.json
msgctxt "min_infill_area label"
@@ -2212,7 +2202,7 @@ msgstr "ノズルスイッチ引き戻し距離"
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_amount description"
msgid "The amount of retraction when switching extruders. Set to 0 for no retraction at all. This should generally be the same as the length of the heat zone."
-msgstr ""
+msgstr "エクストルーダー切り替え時の引き込み量。引き込みを行わない場合は0に設定します。これは通常、ヒートゾーンの長さと同じに設定します。"
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_speeds label"
@@ -2881,7 +2871,7 @@ msgstr "コーミングモード"
#: fdmprinter.def.json
msgctxt "retraction_combing description"
msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas or to only comb within the infill."
-msgstr ""
+msgstr "コーミングは、走行時にすでに印刷された領域内にノズルを保ちます。その結果、移動距離はわずかに長くなりますが、引き込みの必要性は減ります。コーミングがオフの場合、フィラメントの引き戻しを行い、ノズルは次のポイントまで直線移動します。また、インフィルのみにてコーミングすることにより、トップとボトムのスキン領域上での櫛通りを回避できます。"
#: fdmprinter.def.json
msgctxt "retraction_combing option off"
@@ -3547,12 +3537,12 @@ msgstr "密度が半分に切り替える前の所定のサポートのインフ
#: fdmprinter.def.json
msgctxt "minimum_support_area label"
msgid "Minimum Support Area"
-msgstr ""
+msgstr "最小サポート領域"
#: fdmprinter.def.json
msgctxt "minimum_support_area description"
msgid "Minimum area size for support polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "ポリゴンをサポートする最小領域サイズ。この領域よりポリゴンが小さい場合は生成されません。"
#: fdmprinter.def.json
msgctxt "support_interface_enable label"
@@ -3799,62 +3789,62 @@ msgstr "ジグザグ"
#: fdmprinter.def.json
msgctxt "minimum_interface_area label"
msgid "Minimum Support Interface Area"
-msgstr ""
+msgstr "最小サポートインターフェイス領域"
#: fdmprinter.def.json
msgctxt "minimum_interface_area description"
msgid "Minimum area size for support interface polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "インターフェイスポリゴンをサポートする最小領域サイズ。この領域よりポリゴンが小さい場合は生成されません。"
#: fdmprinter.def.json
msgctxt "minimum_roof_area label"
msgid "Minimum Support Roof Area"
-msgstr ""
+msgstr "最小サポートルーフ領域"
#: fdmprinter.def.json
msgctxt "minimum_roof_area description"
msgid "Minimum area size for the roofs of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "サポートのルーフに対する最小領域サイズ。この領域よりポリゴンが小さい場合は生成されません。"
#: fdmprinter.def.json
msgctxt "minimum_bottom_area label"
msgid "Minimum Support Floor Area"
-msgstr ""
+msgstr "最小サポートフロア領域"
#: fdmprinter.def.json
msgctxt "minimum_bottom_area description"
msgid "Minimum area size for the floors of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "サポートのフロアに対する最小領域サイズ。この領域よりポリゴンが小さい場合は生成されません。"
#: fdmprinter.def.json
msgctxt "support_interface_offset label"
msgid "Support Interface Horizontal Expansion"
-msgstr ""
+msgstr "サポートインターフェイス水平展開"
#: fdmprinter.def.json
msgctxt "support_interface_offset description"
msgid "Amount of offset applied to the support interface polygons."
-msgstr ""
+msgstr "サポートインターフェイスポリゴンに適用されるオフセット量。"
#: fdmprinter.def.json
msgctxt "support_roof_offset label"
msgid "Support Roof Horizontal Expansion"
-msgstr ""
+msgstr "サポートルーフ水平展開"
#: fdmprinter.def.json
msgctxt "support_roof_offset description"
msgid "Amount of offset applied to the roofs of the support."
-msgstr ""
+msgstr "サポートのルーフに適用されるオフセット量。"
#: fdmprinter.def.json
msgctxt "support_bottom_offset label"
msgid "Support Floor Horizontal Expansion"
-msgstr ""
+msgstr "サポートフロア水平展開"
#: fdmprinter.def.json
msgctxt "support_bottom_offset description"
msgid "Amount of offset applied to the floors of the support."
-msgstr ""
+msgstr "サポートのフロアに適用されるオフセット量。"
#: fdmprinter.def.json
msgctxt "support_fan_enable label"
@@ -4033,9 +4023,7 @@ msgctxt "skirt_gap description"
msgid ""
"The horizontal distance between the skirt and the first layer of the print.\n"
"This is the minimum distance. Multiple skirt lines will extend outwards from this distance."
-msgstr ""
-"スカートと印刷の最初の層の間の水平距離。\n"
-"これは最小距離です。複数のスカートラインがこの距離から外側に展開されます。"
+msgstr "スカートと印刷の最初の層の間の水平距離。\nこれは最小距離です。複数のスカートラインがこの距離から外側に展開されます。"
#: fdmprinter.def.json
msgctxt "skirt_brim_minimal_length label"
@@ -6067,6 +6055,7 @@ msgstr "ファイルから読み込むときに、モデルに適用するトラ
#~ "Gcode commands to be executed at the very start - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "Gcodeのコマンドは −で始まり\n"
#~ "で区切られます。"
@@ -6080,6 +6069,7 @@ msgstr "ファイルから読み込むときに、モデルに適用するトラ
#~ "Gcode commands to be executed at the very end - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "Gcodeのコマンドは −で始まり\n"
#~ "で区切られます。"
diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po
index c3dd1a434f..5824ccd940 100644
--- a/resources/i18n/ko_KR/cura.po
+++ b/resources/i18n/ko_KR/cura.po
@@ -8,15 +8,15 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2018-11-06 15:00+0100\n"
-"Last-Translator: Jinbuhm Kim \n"
+"PO-Revision-Date: 2019-03-14 14:40+0100\n"
+"Last-Translator: Korean \n"
"Language-Team: Jinbum Kim , Korean \n"
"Language: ko_KR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Poedit 2.0.6\n"
+"X-Generator: Poedit 2.1.1\n"
#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
msgctxt "@action"
@@ -73,7 +73,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
msgctxt "@item:inmenu"
msgid "Changelog"
-msgstr ""
+msgstr "변경 내역"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
msgctxt "@item:inmenu"
@@ -492,100 +492,100 @@ msgstr "프린팅이 완료됨"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
msgctxt "@label:material"
msgid "Empty"
-msgstr ""
+msgstr "비어 있음"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
msgctxt "@label:material"
msgid "Unknown"
-msgstr ""
+msgstr "알 수 없음"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
msgctxt "@action:button"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Cloud를 통해 인쇄"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Cloud를 통해 인쇄"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
msgctxt "@info:status"
msgid "Connected via Cloud"
-msgstr ""
+msgstr "Cloud를 통해 연결됨"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
msgctxt "@info:title"
msgid "Cloud error"
-msgstr ""
+msgstr "Cloud 오류"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
msgctxt "@info:status"
msgid "Could not export print job."
-msgstr ""
+msgstr "인쇄 작업을 내보낼 수 없음."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
-msgstr ""
+msgstr "데이터를 프린터로 업로드할 수 없음."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:51
msgctxt "@info:status"
msgid "tomorrow"
-msgstr ""
+msgstr "내일"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:54
msgctxt "@info:status"
msgid "today"
-msgstr ""
+msgstr "오늘"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
-msgstr ""
+msgstr "Cloud 연결 시 오류가 있었습니다."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
msgid "Sending data to remote cluster"
-msgstr ""
+msgstr "원격 클러스터로 데이터 전송 중"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Ultimaker 계정을 사용하여 어디에서든 인쇄 작업을 전송하고 모니터링하십시오."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
msgctxt "@info:status"
msgid "Connect to Ultimaker Cloud"
-msgstr ""
+msgstr "Ultimaker Cloud에 연결"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
msgctxt "@action"
msgid "Don't ask me again for this printer."
-msgstr ""
+msgstr "이 프린터에 대해 다시 물어보지 마십시오."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
msgctxt "@action"
msgid "Get started"
-msgstr ""
+msgstr "시작하기"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "이제 Ultimaker 계정을 사용하여 어디에서든 인쇄 작업을 전송하고 모니터링할 수 있습니다."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
msgctxt "@info:status"
msgid "Connected!"
-msgstr ""
+msgstr "연결됨!"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
msgctxt "@action"
msgid "Review your connection"
-msgstr ""
+msgstr "연결 검토"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py:30
msgctxt "@action"
@@ -637,12 +637,12 @@ msgstr "시뮬레이션 뷰"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:35
msgctxt "@item:inmenu"
msgid "Post Processing"
-msgstr ""
+msgstr "후 처리"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:36
msgctxt "@item:inmenu"
msgid "Modify G-Code"
-msgstr ""
+msgstr "G 코드 수정"
#: /home/ruben/Projects/Cura/plugins/SupportEraser/__init__.py:12
msgctxt "@label"
@@ -692,7 +692,7 @@ msgstr "Cura 15.04 프로파일"
#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
msgctxt "@item:inmenu"
msgid "Evaluation"
-msgstr ""
+msgstr "평가"
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
@@ -760,7 +760,7 @@ msgstr "비활성화된 익스트루더 %s(와)과 연결된 개체가 있기
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
msgctxt "@info:status"
msgid "Nothing to slice because none of the models fit the build volume or are assigned to a disabled extruder. Please scale or rotate models to fit, or enable an extruder."
-msgstr ""
+msgstr "어떤 모델도 빌드 볼륨에 맞지 않으므로 슬라이스 할 수 없습니다. 크기에 맞게 모델을 위치시키거나 회전하거나, 또는 익스트루더를 활성화하십시오."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
@@ -845,7 +845,7 @@ msgstr "파일을 보내기 전에 g-코드가 프린터 및 프린터 구성에
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:64
msgctxt "@item:inmenu"
msgid "Manage backups"
-msgstr ""
+msgstr "백업 관리"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:107
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:113
@@ -858,32 +858,32 @@ msgstr "백업"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:55
msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
-msgstr ""
+msgstr "백업 열거 중 오류가 있었습니다."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
-msgstr ""
+msgstr "백업 복원 시도 중 오류가 있었습니다."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:15
msgctxt "@info:title"
msgid "Backups"
-msgstr ""
+msgstr "백업"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:27
msgctxt "@info:backup_status"
msgid "Uploading your backup..."
-msgstr ""
+msgstr "백업 업로드 중..."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:36
msgctxt "@info:backup_status"
msgid "There was an error while uploading your backup."
-msgstr ""
+msgstr "백업을 업로드하는 도중 오류가 있었습니다."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:39
msgctxt "@info:backup_status"
msgid "Your backup has finished uploading."
-msgstr ""
+msgstr "백업이 업로드를 완료했습니다."
#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14
#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14
@@ -919,7 +919,7 @@ msgstr "3MF 파일 작성 중 오류."
#: /home/ruben/Projects/Cura/plugins/PreviewStage/__init__.py:13
msgctxt "@item:inmenu"
msgid "Preview"
-msgstr ""
+msgstr "미리 보기"
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
@@ -927,11 +927,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr "업그레이드 선택"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr "검사"
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -1020,7 +1015,7 @@ msgstr "파일 {0}이 이미 있습니다. 덮어 쓰시겠
#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
msgctxt "@info:status"
msgid "Invalid file URL:"
-msgstr ""
+msgstr "유효하지 않은 파일 URL:"
#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
msgctxt "@menuitem"
@@ -1041,7 +1036,7 @@ msgstr "설정이 업데이트되었습니다"
#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
-msgstr ""
+msgstr "익스트루더 비활성화됨"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
#, python-brace-format
@@ -1070,13 +1065,13 @@ msgstr "내보내기 완료"
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
-msgstr ""
+msgstr "{0}에서 프로파일을 가져오지 못했습니다 {1}"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Can't import profile from {0} before a printer is added."
-msgstr ""
+msgstr "프린터가 추가되기 전 {0}에서 프로파일을 가져올 수 없습니다."
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
#, python-brace-format
@@ -1209,7 +1204,7 @@ msgstr "현재 버전과 일치하지 않는 Cura 백업을 복원하려고 시
#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
-msgstr ""
+msgstr "Ultimaker 계정 서버에 도달할 수 없음."
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
@@ -1219,7 +1214,7 @@ msgstr "객체를 증가시키고 배치"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:28
msgctxt "@info:title"
msgid "Placing Objects"
-msgstr ""
+msgstr "개체 배치 중"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:103
@@ -1635,7 +1630,7 @@ msgstr "Cura 패키지 데이터베이스에 연결할 수 없습니다. 연결
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/SmallRatingWidget.qml:27
msgctxt "@label"
msgid "ratings"
-msgstr ""
+msgstr "평가"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
@@ -1654,7 +1649,7 @@ msgstr "재료"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:91
msgctxt "@label"
msgid "Your rating"
-msgstr ""
+msgstr "귀하의 평가"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
msgctxt "@label"
@@ -1687,7 +1682,7 @@ msgstr "알 수 없는"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
-msgstr ""
+msgstr "설치 또는 업데이트에 로그인 필요"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
@@ -1710,7 +1705,7 @@ msgstr "업데이트됨"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:13
msgctxt "@title"
msgid "Marketplace"
-msgstr ""
+msgstr "시장"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml:25
msgctxt "@action:button"
@@ -1745,12 +1740,12 @@ msgstr "확인"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to login first before you can rate"
-msgstr ""
+msgstr "평가하기 전 먼저 로그인해야 함"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to install the package before you can rate"
-msgstr ""
+msgstr "평가하기 전 패키지를 설치해야 함"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:19
msgctxt "@info"
@@ -1790,7 +1785,7 @@ msgstr "다시 시작 시 설치 예정"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:53
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to update"
-msgstr ""
+msgstr "업데이트에 로그인 필요"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:71
msgctxt "@action:button"
@@ -1841,22 +1836,22 @@ msgstr "호환성"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:203
msgctxt "@action:label"
msgid "Technical Data Sheet"
-msgstr ""
+msgstr "기술 데이터 시트"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:212
msgctxt "@action:label"
msgid "Safety Data Sheet"
-msgstr ""
+msgstr "안전 데이터 시트"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:221
msgctxt "@action:label"
msgid "Printing Guidelines"
-msgstr ""
+msgstr "인쇄 가이드라인"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:230
msgctxt "@action:label"
msgid "Website"
-msgstr ""
+msgstr "웹 사이트"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml:16
msgctxt "@info"
@@ -1978,17 +1973,17 @@ msgstr "사용자 계약"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
msgctxt "@info"
msgid "These options are not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Cloud 프린터를 모니터링하고 있기 때문에 이 옵션을 사용할 수 없습니다."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:241
msgctxt "@info"
msgid "The webcam is not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Cloud 프린터를 모니터링하고 있기 때문에 웹캠을 사용할 수 없습니다."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
msgctxt "@label:status"
msgid "Loading..."
-msgstr ""
+msgstr "로딩 중..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
msgctxt "@label:status"
@@ -1998,42 +1993,42 @@ msgstr "사용불가"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
msgctxt "@label:status"
msgid "Unreachable"
-msgstr ""
+msgstr "연결할 수 없음"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
msgctxt "@label:status"
msgid "Idle"
-msgstr ""
+msgstr "대기 상태"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:353
msgctxt "@label"
msgid "Untitled"
-msgstr ""
+msgstr "제목 없음"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
msgctxt "@label"
msgid "Anonymous"
-msgstr ""
+msgstr "익명"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
msgctxt "@label:status"
msgid "Requires configuration changes"
-msgstr ""
+msgstr "구성 변경 필요"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
msgctxt "@action:button"
msgid "Details"
-msgstr ""
+msgstr "세부 사항"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "Unavailable printer"
-msgstr ""
+msgstr "사용할 수 없는 프린터"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
msgctxt "@label"
msgid "First available"
-msgstr ""
+msgstr "첫 번째로 사용 가능"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:187
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:132
@@ -2049,27 +2044,27 @@ msgstr "대기 중"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
msgid "Go to Cura Connect"
-msgstr ""
+msgstr "Cura Connect로 이동"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
msgctxt "@label"
msgid "Print jobs"
-msgstr ""
+msgstr "인쇄 작업"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Total print time"
-msgstr ""
+msgstr "총 인쇄 시간"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
msgctxt "@label"
msgid "Waiting for"
-msgstr ""
+msgstr "대기"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
msgctxt "@label link to connect manager"
msgid "View print history"
-msgstr ""
+msgstr "인쇄 내역 보기"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
msgctxt "@window:title"
@@ -2149,7 +2144,7 @@ msgstr "이 프린터는 프린터 그룹을 호스트하도록 설정되어 있
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
msgctxt "@label"
msgid "This printer is the host for a group of %1 printers."
-msgstr "이 프린터는 1%개 프린터 그룹의 호스트입니다."
+msgstr "이 프린터는 %1개 프린터 그룹의 호스트입니다."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:332
msgctxt "@label"
@@ -2195,17 +2190,17 @@ msgstr "끝마친"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Preparing..."
-msgstr ""
+msgstr "준비 중..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Aborting..."
-msgstr ""
+msgstr "중지 중…"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
msgctxt "@label:status"
msgid "Pausing..."
-msgstr ""
+msgstr "일시 정지 중…"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
msgctxt "@label:status"
@@ -2215,7 +2210,7 @@ msgstr "일시 중지됨"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
msgctxt "@label:status"
msgid "Resuming..."
-msgstr ""
+msgstr "다시 시작..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
msgctxt "@label:status"
@@ -2225,7 +2220,7 @@ msgstr "조치가 필요함"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
msgctxt "@label:status"
msgid "Finishes %1 at %2"
-msgstr ""
+msgstr "%2에서 %1 완료"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:44
msgctxt "@action:button"
@@ -2261,12 +2256,12 @@ msgstr "재개"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:102
msgctxt "@label"
msgid "Pausing..."
-msgstr ""
+msgstr "일시 정지 중…"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:104
msgctxt "@label"
msgid "Resuming..."
-msgstr ""
+msgstr "다시 시작..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:106
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284
@@ -2278,7 +2273,7 @@ msgstr "중지"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
msgid "Aborting..."
-msgstr ""
+msgstr "중지 중…"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
@@ -2319,18 +2314,18 @@ msgstr "프린팅 중단"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:20
msgctxt "@title:window"
msgid "Configuration Changes"
-msgstr ""
+msgstr "구성 변경"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:27
msgctxt "@action:button"
msgid "Override"
-msgstr ""
+msgstr "무시하기"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
msgctxt "@label"
msgid "The assigned printer, %1, requires the following configuration change:"
msgid_plural "The assigned printer, %1, requires the following configuration changes:"
-msgstr[0] ""
+msgstr[0] "할당된 프린터 %1의 구성을 다음과 같이 변경해야 합니다."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
msgctxt "@label"
@@ -2360,7 +2355,7 @@ msgstr "빌드 플레이트를 %1(으)로 변경합니다(이 작업은 무효
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
-msgstr ""
+msgstr "무시하기는 기존 프린터 구성과 함께 지정된 설정을 사용하게 됩니다. 이는 인쇄 실패로 이어질 수 있습니다."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
msgctxt "@label"
@@ -2379,21 +2374,24 @@ msgid ""
"- Check if the printer is turned on.\n"
"- Check if the printer is connected to the network."
msgstr ""
+"프린터에 연결이 있는지 확인하십시오.\n"
+"- 프린터가 켜져 있는지 확인하십시오.\n"
+"- 프린터가 네트워크에 연결되어 있는지 확인하십시오."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
msgctxt "@info"
msgid "Please select a network connected printer to monitor."
-msgstr ""
+msgstr "네트워크 연결 프린터를 선택하여 모니터링하십시오."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
msgctxt "@info"
msgid "Please connect your Ultimaker printer to your local network."
-msgstr ""
+msgstr "Ultimaker 프린터를 로컬 네트워크에 연결하십시오."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
-msgstr ""
+msgstr "사용자 매뉴얼 온라인 보기"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
@@ -2429,17 +2427,17 @@ msgstr "호환 모드"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
msgctxt "@label"
msgid "Travels"
-msgstr ""
+msgstr "이동"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
msgctxt "@label"
msgid "Helpers"
-msgstr ""
+msgstr "도움말"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
msgctxt "@label"
msgid "Shell"
-msgstr ""
+msgstr "외곽"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
@@ -2515,17 +2513,17 @@ msgstr "Cura는 인쇄 품질 및 사용자 환경을 개선하기 위해 익명
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
msgctxt "@text:window"
msgid "I don't want to send this data"
-msgstr ""
+msgstr "이 데이터 전송을 원하지 않습니다"
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
msgctxt "@text:window"
msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr ""
+msgstr "이 데이터를 Ultimaker에 전송해 Cura 개선에 도움을 주고 싶습니다"
#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
msgctxt "@label"
msgid "No print selected"
-msgstr ""
+msgstr "선택한 인쇄 없음"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2785,108 +2783,108 @@ msgstr "열기"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:28
msgctxt "@title"
msgid "My Backups"
-msgstr ""
+msgstr "내 백업"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:38
msgctxt "@empty_state"
msgid "You don't have any backups currently. Use the 'Backup Now' button to create one."
-msgstr ""
+msgstr "현재 백업이 없습니다. ‘지금 백업’ 버튼을 사용하여 생성하십시오."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:60
msgctxt "@backup_limit_info"
msgid "During the preview phase, you'll be limited to 5 visible backups. Remove a backup to see older ones."
-msgstr ""
+msgstr "미리 보기 단계 중에는 보이는 백업 5개로 제한됩니다. 기존 백업을 보려면 백업을 제거하십시오."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:34
msgctxt "@description"
msgid "Backup and synchronize your Cura settings."
-msgstr ""
+msgstr "Cura 설정을 백업, 동기화하십시오."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
msgctxt "@button"
msgid "Sign in"
-msgstr ""
+msgstr "로그인"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/main.qml:24
msgctxt "@title:window"
msgid "Cura Backups"
-msgstr ""
+msgstr "Cura 백업"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:21
msgctxt "@backuplist:label"
msgid "Cura Version"
-msgstr ""
+msgstr "Cura 버전"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:29
msgctxt "@backuplist:label"
msgid "Machines"
-msgstr ""
+msgstr "기기"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:37
msgctxt "@backuplist:label"
msgid "Materials"
-msgstr ""
+msgstr "재료"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:45
msgctxt "@backuplist:label"
msgid "Profiles"
-msgstr ""
+msgstr "프로파일"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:53
msgctxt "@backuplist:label"
msgid "Plugins"
-msgstr ""
+msgstr "플러그인"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:71
msgctxt "@button"
msgid "Restore"
-msgstr ""
+msgstr "복원"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:99
msgctxt "@dialog:title"
msgid "Delete Backup"
-msgstr ""
+msgstr "백업 삭제"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:100
msgctxt "@dialog:info"
msgid "Are you sure you want to delete this backup? This cannot be undone."
-msgstr ""
+msgstr "이 백업을 삭제하시겠습니까? 이 작업을 완료할 수 없습니다."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:108
msgctxt "@dialog:title"
msgid "Restore Backup"
-msgstr ""
+msgstr "백업 복원"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:109
msgctxt "@dialog:info"
msgid "You will need to restart Cura before your backup is restored. Do you want to close Cura now?"
-msgstr ""
+msgstr "백업이 복원되기 전에 Cura를 다시 시작해야 합니다. 지금 Cura를 닫으시겠습니까?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:22
msgctxt "@button"
msgid "Want more?"
-msgstr ""
+msgstr "무엇을 더 하시겠습니까?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:31
msgctxt "@button"
msgid "Backup Now"
-msgstr ""
+msgstr "지금 백업"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:43
msgctxt "@checkbox:description"
msgid "Auto Backup"
-msgstr ""
+msgstr "자동 백업"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:44
msgctxt "@checkbox:description"
msgid "Automatically create a backup each day that Cura is started."
-msgstr ""
+msgstr "Cura가 시작되는 날마다 자동으로 백업을 생성하십시오."
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMainSettingsSelector.qml:75
msgctxt "@label"
msgid "Not supported"
-msgstr ""
+msgstr "지원되지 않음"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:35
msgctxt "@action:button"
@@ -2971,99 +2969,6 @@ msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr "히팅 빌드 플레이트 (공식 키트 또는 자체 조립식)"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27
-msgctxt "@title"
-msgid "Check Printer"
-msgstr "프린터 확인"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39
-msgctxt "@label"
-msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"
-msgstr "Ultimaker에서 몇 가지 검사를 하는 것이 좋습니다. 기기가 제대로 작동한다고 생각이 되면 이 단계를 건너 뛸 수 있습니다"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53
-msgctxt "@action:button"
-msgid "Start Printer Check"
-msgstr "프린터 체 시작"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80
-msgctxt "@label"
-msgid "Connection: "
-msgstr "연결 "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Connected"
-msgstr "연결됨"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Not connected"
-msgstr "연결되지 않음"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99
-msgctxt "@label"
-msgid "Min endstop X: "
-msgstr "최소 엔드 스톱 X "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-msgctxt "@info:status"
-msgid "Works"
-msgstr "작업"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Not checked"
-msgstr "확인되지 않음"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120
-msgctxt "@label"
-msgid "Min endstop Y: "
-msgstr "최소 엔드 스톱 Y "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141
-msgctxt "@label"
-msgid "Min endstop Z: "
-msgstr "최소 엔드 스톱 Z "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163
-msgctxt "@label"
-msgid "Nozzle temperature check: "
-msgstr "노즐 온도 확인 "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Stop Heating"
-msgstr "가열 중지"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Start Heating"
-msgstr "가열 시작"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223
-msgctxt "@label"
-msgid "Build plate temperature check:"
-msgstr "빌드 플레이트 온도 확인 :"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Checked"
-msgstr "체크 됨"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284
-msgctxt "@label"
-msgid "Everything is in order! You're done with your CheckUp."
-msgstr "모든 점검이 순조롭게 끝났습니다."
-
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"
msgid "Not connected to a printer"
@@ -3635,7 +3540,7 @@ msgstr "프로파일 생성하기"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
msgctxt "@info"
msgid "Please provide a name for this profile."
-msgstr ""
+msgstr "이 프로파일에 대한 이름을 제공하십시오."
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
msgctxt "@title:window"
@@ -3665,7 +3570,7 @@ msgstr "프린터: %1"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
msgid "Default profiles"
-msgstr ""
+msgstr "기본 프로파일"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
@@ -3700,7 +3605,7 @@ msgstr "전역 설정"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
msgctxt "@action:button"
msgid "Marketplace"
-msgstr ""
+msgstr "시장"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:27
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:13
@@ -3723,7 +3628,7 @@ msgstr "보기(&V)"
#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:13
msgctxt "@title:menu menubar:toplevel"
msgid "&Settings"
-msgstr ""
+msgstr "설정"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:55
msgctxt "@title:menu menubar:toplevel"
@@ -3758,7 +3663,7 @@ msgstr "제목 없음"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:68
msgctxt "@label:textbox"
msgid "search settings"
-msgstr ""
+msgstr "검색 설정"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
msgctxt "@action:menu"
@@ -3847,17 +3752,17 @@ msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
msgctxt "@button"
msgid "Recommended"
-msgstr ""
+msgstr "추천"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
msgctxt "@button"
msgid "Custom"
-msgstr ""
+msgstr "사용자 정의"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:193
msgctxt "@label"
msgid "Gradual infill"
-msgstr ""
+msgstr "점진적 내부채움"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:232
msgctxt "@label"
@@ -3867,7 +3772,7 @@ msgstr "점차적인 내부채움은 점차적으로 빈 공간 채우기의 양
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
msgctxt "@label"
msgid "Support"
-msgstr ""
+msgstr "서포트"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
msgctxt "@label"
@@ -3882,7 +3787,7 @@ msgstr "서포트에 사용할 익스트루더를 선택하십시오. 이렇게
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
msgctxt "@label"
msgid "Adhesion"
-msgstr ""
+msgstr "부착"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
msgctxt "@label"
@@ -3902,7 +3807,7 @@ msgstr "일부 프로파일 설정을 수정했습니다. 이러한 설정을
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:355
msgctxt "@tooltip"
msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile"
-msgstr ""
+msgstr "현재 재료 및 노즐 구성에 대해 이 품질 프로파일을 사용할 수 없습니다. 이 품질 프로파일을 활성화하려면 이를 변경하십시오"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3912,17 +3817,17 @@ msgstr "사용자 지정 프로파일이 현재 활성 상태입니다. 품질
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:13
msgctxt "@label:Should be short"
msgid "On"
-msgstr ""
+msgstr "유효한"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:14
msgctxt "@label:Should be short"
msgid "Off"
-msgstr ""
+msgstr "비활성"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:27
msgctxt "@label"
msgid "Profile"
-msgstr ""
+msgstr "프로파일"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:94
msgctxt "@tooltip"
@@ -3938,7 +3843,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label shown when we load a Gcode file"
msgid "Print setup disabled. G code file can not be modified."
-msgstr ""
+msgstr "인쇄 설정 비활성화됨. G 코드 파일을 수정할 수 없습니다."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -4177,47 +4082,47 @@ msgstr "복제할 수"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/AutoConfiguration.qml:18
msgctxt "@header"
msgid "Configurations"
-msgstr ""
+msgstr "구성"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:110
msgctxt "@label"
msgid "Select configuration"
-msgstr ""
+msgstr "구성 선택"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
msgctxt "@label"
msgid "See the material compatibility chart"
-msgstr ""
+msgstr "재료 호환성 차트 보기"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
msgctxt "@label"
msgid "Configurations"
-msgstr ""
+msgstr "구성"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:57
msgctxt "@label"
msgid "Loading available configurations from the printer..."
-msgstr ""
+msgstr "프린터에서 사용 가능한 구성 로딩 중..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:58
msgctxt "@label"
msgid "The configurations are not available because the printer is disconnected."
-msgstr ""
+msgstr "프린터가 연결되어 있지 않기 때문에 구성을 사용할 수 없습니다."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:25
msgctxt "@header"
msgid "Custom"
-msgstr ""
+msgstr "사용자 정의"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:61
msgctxt "@label"
msgid "Printer"
-msgstr ""
+msgstr "프린터"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
msgctxt "@label"
msgid "Enabled"
-msgstr ""
+msgstr "실행됨"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
msgctxt "@label"
@@ -4227,17 +4132,17 @@ msgstr "재료"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
-msgstr ""
+msgstr "더 나은 접착력을 위해 이 재료 조합과 함께 접착제를 사용하십시오.."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:128
msgctxt "@label"
msgid "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile."
-msgstr ""
+msgstr "%1이(가) 인식되지 않기 때문에 이 구성을 사용할 수 없습니다. %2에 방문하여 올바른 재료 프로파일을 다운로드하십시오."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:129
msgctxt "@label"
msgid "Marketplace"
-msgstr ""
+msgstr "시장"
#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:15
msgctxt "@title:menu menubar:file"
@@ -4267,37 +4172,37 @@ msgstr "예상 남은 시간"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
msgid "View types"
-msgstr ""
+msgstr "유형 보기"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
msgctxt "@label"
msgid "Hi "
-msgstr ""
+msgstr "안녕하세요 "
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
msgctxt "@button"
msgid "Ultimaker account"
-msgstr ""
+msgstr "Ultimaker 계정"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
msgctxt "@button"
msgid "Sign out"
-msgstr ""
+msgstr "로그아웃"
#: /home/ruben/Projects/Cura/resources/qml/Account/AccountWidget.qml:24
msgctxt "@action:button"
msgid "Sign in"
-msgstr ""
+msgstr "로그인"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
msgctxt "@label"
msgid "Ultimaker Cloud"
-msgstr ""
+msgstr "Ultimaker Cloud"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
-msgstr ""
+msgstr "차세대 3D 인쇄 워크플로"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:51
msgctxt "@text"
@@ -4306,26 +4211,29 @@ msgid ""
"- Store your Ultimaker Cura settings in the cloud for use anywhere\n"
"- Get exclusive access to material profiles from leading brands"
msgstr ""
+"- 인쇄 작업을 로컬 네트워크 외부의 Ultimaker 프린터로 전송하십시오\n"
+"- Ultimaker Cura 설정을 어디에서든 사용할 수 있도록 Cloud에 저장하십시오\n"
+"- 유수 브랜드의 재료 프로파일에 대한 독점적 액세스 권한을 얻으십시오"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
msgid "Create account"
-msgstr ""
+msgstr "계정 생성"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
msgctxt "@label"
msgid "No time estimation available"
-msgstr ""
+msgstr "시간 추산 이용 불가"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
msgctxt "@label"
msgid "No cost estimation available"
-msgstr ""
+msgstr "비용 추산 이용 불가"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
msgctxt "@button"
msgid "Preview"
-msgstr ""
+msgstr "미리 보기"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
msgctxt "@label:PrintjobStatus"
@@ -4340,27 +4248,27 @@ msgstr "슬라이스 할 수 없음"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
msgctxt "@button"
msgid "Slice"
-msgstr ""
+msgstr "슬라이스"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
msgctxt "@label"
msgid "Start the slicing process"
-msgstr ""
+msgstr "슬라이싱 프로세스 시작"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
msgctxt "@button"
msgid "Cancel"
-msgstr ""
+msgstr "취소"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
msgid "Time specification"
-msgstr ""
+msgstr "시간 사양"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
msgid "Material specification"
-msgstr ""
+msgstr "재료 사양"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4375,27 +4283,27 @@ msgstr "%1g"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Connected printers"
-msgstr ""
+msgstr "연결된 프린터"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Preset printers"
-msgstr ""
+msgstr "프린터 사전 설정"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
msgctxt "@button"
msgid "Add printer"
-msgstr ""
+msgstr "프린터 추가"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
msgctxt "@button"
msgid "Manage printers"
-msgstr ""
+msgstr "프린터 관리"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
-msgstr ""
+msgstr "온라인 문제 해결 가이드 표시"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
msgctxt "@action:inmenu"
@@ -4603,7 +4511,7 @@ msgstr "설정 폴더 표시"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
msgctxt "@action:menu"
msgid "&Marketplace"
-msgstr ""
+msgstr "&시장"
#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
msgctxt "@title:window"
@@ -4721,7 +4629,7 @@ msgstr "새 프로파일 만들기"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
msgctxt "@title:tab"
msgid "Add a printer to Cura"
-msgstr ""
+msgstr "Cura에 프린터 추가"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
msgctxt "@title:tab"
@@ -4730,16 +4638,19 @@ msgid ""
"\n"
"If your printer is not in the list, use the \"Custom FFF Printer\" from the \"Custom\" category and adjust the settings to match your printer in the next dialog."
msgstr ""
+"아래 목록에서 사용하고자 하는 프린터를 선택하십시오.\n"
+"\n"
+"프린터가 목록에 없을 경우 “사용자 정의” 범주에서 “사용자 정의 FFF 프린터\"를 사용하고 다음 대화 상자의 프린터와 일치하도록 설정을 조정하십시오."
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
msgctxt "@label"
msgid "Manufacturer"
-msgstr ""
+msgstr "제조업체"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
msgctxt "@label"
msgid "Printer Name"
-msgstr ""
+msgstr "프린터 이름"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
msgctxt "@action:button"
@@ -5793,7 +5704,7 @@ msgstr "X3GWriter"
#~ msgctxt "@label"
#~ msgid "This printer is the host for a group of %1 Ultimaker 3 printers."
-#~ msgstr "이 프린터는 1% Ultimaker 3 프린터 그룹의 호스트입니다."
+#~ msgstr "이 프린터는 %1 Ultimaker 3 프린터 그룹의 호스트입니다."
#~ msgctxt "@label: arg 1 is group name"
#~ msgid "%1 is not set up to host a group of connected Ultimaker 3 printers"
diff --git a/resources/i18n/ko_KR/fdmextruder.def.json.po b/resources/i18n/ko_KR/fdmextruder.def.json.po
index 6de9d346ad..8dc825e5e2 100644
--- a/resources/i18n/ko_KR/fdmextruder.def.json.po
+++ b/resources/i18n/ko_KR/fdmextruder.def.json.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 14:25+0100\n"
-"Last-Translator: Jinbuhm Kim \n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
+"Last-Translator: Korean \n"
"Language-Team: Jinbum Kim , Korean \n"
"Language: ko_KR\n"
"MIME-Version: 1.0\n"
@@ -86,7 +86,7 @@ msgstr "익스트루더 스타트 G 코드"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
-msgstr ""
+msgstr "이 익스트루더로 전환 시 실행할 G 코드를 시작하십시오."
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_abs label"
@@ -126,7 +126,7 @@ msgstr "익스트루더 엔드 G 코드"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_code description"
msgid "End g-code to execute when switching away from this extruder."
-msgstr ""
+msgstr "이 익스트루더에서 전환 시 실행할 G 코드를 종료하십시오."
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_abs label"
diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po
index c14e1a28b4..b254d7da57 100644
--- a/resources/i18n/ko_KR/fdmprinter.def.json.po
+++ b/resources/i18n/ko_KR/fdmprinter.def.json.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-10-01 14:10+0100\n"
-"Last-Translator: Jinbuhm Kim \n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
+"Last-Translator: Korean \n"
"Language-Team: Jinbum Kim , Korean \n"
"Language: ko_KR\n"
"MIME-Version: 1.0\n"
@@ -58,9 +58,7 @@ msgctxt "machine_start_gcode description"
msgid ""
"G-code commands to be executed at the very start - separated by \n"
"."
-msgstr ""
-"시작과 동시에형실행될 G 코드 명령어 \n"
-"."
+msgstr "시작과 동시에형실행될 G 코드 명령어 \n."
#: fdmprinter.def.json
msgctxt "machine_end_gcode label"
@@ -72,9 +70,7 @@ msgctxt "machine_end_gcode description"
msgid ""
"G-code commands to be executed at the very end - separated by \n"
"."
-msgstr ""
-"맨 마지막에 실행될 G 코드 명령 \n"
-"."
+msgstr "맨 마지막에 실행될 G 코드 명령 \n."
#: fdmprinter.def.json
msgctxt "material_guid label"
@@ -1636,9 +1632,7 @@ msgctxt "infill_wall_line_count description"
msgid ""
"Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n"
"This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right."
-msgstr ""
-"내부채움 영역 주변에 여분의 벽을 추가합니다. 이러한 벽은 상단/하단 스킨 라인이 늘어지는 것을 줄여줄 수 있습니다. 일부 여분 재료를 사용해도 같은 품질을 유지하는 데 필요한 필요한 상단/하단 스킨 층이 감소한다는 의미입니다.\n"
-"이 기능을 올바르게 구성하는 경우 내부채움 다각형 연결과 함께 사용해 이동 또는 리트랙션없이 모든 내부채움을 단일 돌출 경로에 연결할 수 있습니다."
+msgstr "내부채움 영역 주변에 여분의 벽을 추가합니다. 이러한 벽은 상단/하단 스킨 라인이 늘어지는 것을 줄여줄 수 있습니다. 일부 여분 재료를 사용해도 같은 품질을 유지하는 데 필요한 필요한 상단/하단 스킨 층이 감소한다는 의미입니다.\n이 기능을 올바르게 구성하는 경우 내부채움 다각형 연결과 함께 사용해 이동 또는 리트랙션없이 모든 내부채움을 단일 돌출 경로에 연결할 수 있습니다."
#: fdmprinter.def.json
msgctxt "sub_div_rad_add label"
@@ -1678,7 +1672,7 @@ msgstr "스킨 겹침 비율"
#: fdmprinter.def.json
msgctxt "skin_overlap description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines, as a percentage of the line widths of the skin lines and the innermost wall. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any percentage over 50% may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "벽과 스킨-센터라인(종점) 사이의 겹침 양을 스킨 라인과 가장 안쪽 벽의 라인 폭 비율로 조정하십시오. 약간의 겹침으로 벽이 스킨에 확실하게 연결될 수 있습니다. 동일한 스킨 및 벽 라인-폭을 고려할 때 비율이 50%가 넘는다면, 그 지점에서 스킨-익스트루더의 노즐 위치가 이미 벽 중앙을 지나 도달할 수 있기 때문에 이미 스킨이 벽을 지나치고 있을 수 있습니다."
#: fdmprinter.def.json
msgctxt "skin_overlap_mm label"
@@ -1688,7 +1682,7 @@ msgstr "스킨 겹침"
#: fdmprinter.def.json
msgctxt "skin_overlap_mm description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any value over half the width of the wall may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "벽과 스킨-센터라인(종점) 사이의 겹침 양을 조정하십시오. 약간의 겹침으로 벽이 스킨에 확실하게 연결될 수 있습니다. 동일한 스킨 및 벽 라인-폭을 고려할 때 값이 벽 폭의 절반을 넘는다면, 그 지점에서 스킨-익스트루더의 노즐 위치가 이미 벽 중앙을 지나 도달할 수 있기 때문에 이미 스킨이 벽을 지나치고 있을 수 있습니다."
#: fdmprinter.def.json
msgctxt "infill_wipe_dist label"
@@ -2128,7 +2122,7 @@ msgstr "노즐 스위치 리트렉션 거리"
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_amount description"
msgid "The amount of retraction when switching extruders. Set to 0 for no retraction at all. This should generally be the same as the length of the heat zone."
-msgstr ""
+msgstr "익스트루더 전환 시 리트렉션 양. 리트렉션이 전혀 없는 경우 0으로 설정하십시오. 이는 일반적으로 열 영역의 길이와 같아야 합니다."
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_speeds label"
@@ -2788,7 +2782,7 @@ msgstr "Combing 모드"
#: fdmprinter.def.json
msgctxt "retraction_combing description"
msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas or to only comb within the infill."
-msgstr ""
+msgstr "Combing은 이동할 때 이미 인쇄 된 영역 내에 노즐을 유지합니다. 이로 인해 이동이 약간 더 길어 지지만 리트렉션의 필요성은 줄어듭니다. Combing이 꺼져 있으면 재료가 후퇴하고 노즐이 직선으로 다음 점으로 이동합니다. 또한 상단/하단 스킨 영역을 Combing하거나 내부채움 내에서만 빗질하는 것을 피할 수 있습니다."
#: fdmprinter.def.json
msgctxt "retraction_combing option off"
@@ -3443,12 +3437,12 @@ msgstr "밀도의 절반으로 전환하기 전에 주어진 밀도의 서포트
#: fdmprinter.def.json
msgctxt "minimum_support_area label"
msgid "Minimum Support Area"
-msgstr ""
+msgstr "최소 서포트 지역"
#: fdmprinter.def.json
msgctxt "minimum_support_area description"
msgid "Minimum area size for support polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "서포트 영역에 대한 최소 지역 크기. 이 값보다 작은 지역을 갖는 영역은 생성되지 않습니다."
#: fdmprinter.def.json
msgctxt "support_interface_enable label"
@@ -3678,62 +3672,62 @@ msgstr "지그재그"
#: fdmprinter.def.json
msgctxt "minimum_interface_area label"
msgid "Minimum Support Interface Area"
-msgstr ""
+msgstr "최소 서포트 인터페이스 지역"
#: fdmprinter.def.json
msgctxt "minimum_interface_area description"
msgid "Minimum area size for support interface polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "지원 인터페이스 영역에 대한 최소 지역 크기. 이 값보다 작은 지역을 갖는 영역은 생성되지 않습니다."
#: fdmprinter.def.json
msgctxt "minimum_roof_area label"
msgid "Minimum Support Roof Area"
-msgstr ""
+msgstr "최소 서포트 지붕 지역"
#: fdmprinter.def.json
msgctxt "minimum_roof_area description"
msgid "Minimum area size for the roofs of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "서포트 지붕에 대한 최소 지역 크기. 이 값보다 작은 지역을 갖는 영역은 생성되지 않습니다."
#: fdmprinter.def.json
msgctxt "minimum_bottom_area label"
msgid "Minimum Support Floor Area"
-msgstr ""
+msgstr "최소 서포트 바닥 지역"
#: fdmprinter.def.json
msgctxt "minimum_bottom_area description"
msgid "Minimum area size for the floors of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "서포트 바닥에 대한 최소 지역 크기. 이 값보다 작은 지역을 갖는 영역은 생성되지 않습니다."
#: fdmprinter.def.json
msgctxt "support_interface_offset label"
msgid "Support Interface Horizontal Expansion"
-msgstr ""
+msgstr "서포트 인터페이스 수평 확장"
#: fdmprinter.def.json
msgctxt "support_interface_offset description"
msgid "Amount of offset applied to the support interface polygons."
-msgstr ""
+msgstr "서포트 인터페이스 영역에 적용되는 오프셋 양."
#: fdmprinter.def.json
msgctxt "support_roof_offset label"
msgid "Support Roof Horizontal Expansion"
-msgstr ""
+msgstr "서포트 지붕 수평 확장"
#: fdmprinter.def.json
msgctxt "support_roof_offset description"
msgid "Amount of offset applied to the roofs of the support."
-msgstr ""
+msgstr "서포트 지붕에 적용되는 오프셋 양."
#: fdmprinter.def.json
msgctxt "support_bottom_offset label"
msgid "Support Floor Horizontal Expansion"
-msgstr ""
+msgstr "서포트 바닥 수평 확장"
#: fdmprinter.def.json
msgctxt "support_bottom_offset description"
msgid "Amount of offset applied to the floors of the support."
-msgstr ""
+msgstr "서포트 바닥에 적용되는 오프셋 양."
#: fdmprinter.def.json
msgctxt "support_fan_enable label"
@@ -3905,9 +3899,7 @@ msgctxt "skirt_gap description"
msgid ""
"The horizontal distance between the skirt and the first layer of the print.\n"
"This is the minimum distance. Multiple skirt lines will extend outwards from this distance."
-msgstr ""
-"프린트의 스커트와 첫 번째 레이어 사이의 수평 거리입니다.\n"
-"이것은 최소 거리입니다. 여러 개의 스커트 선이 이 거리에서 바깥쪽으로 연장됩니다."
+msgstr "프린트의 스커트와 첫 번째 레이어 사이의 수평 거리입니다.\n이것은 최소 거리입니다. 여러 개의 스커트 선이 이 거리에서 바깥쪽으로 연장됩니다."
#: fdmprinter.def.json
msgctxt "skirt_brim_minimal_length label"
@@ -5908,6 +5900,7 @@ msgstr "파일로부터 로드 하는 경유, 모델에 적용될 변환 행렬
#~ "Gcode commands to be executed at the very start - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "시작과 동시에 실행될 G 코드 명령어 \n"
#~ "."
@@ -5920,6 +5913,7 @@ msgstr "파일로부터 로드 하는 경유, 모델에 적용될 변환 행렬
#~ "Gcode commands to be executed at the very end - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "맨 마지막에 실행될 G 코드 명령 \n"
#~ "."
diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po
index ce499a87d0..a6e81f819a 100644
--- a/resources/i18n/nl_NL/cura.po
+++ b/resources/i18n/nl_NL/cura.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2018-11-06 15:03+0100\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
@@ -64,16 +64,12 @@ msgid ""
"
{model_names}
\n"
"
Find out how to ensure the best possible print quality and reliability.
"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
msgctxt "@item:inmenu"
msgid "Changelog"
-msgstr ""
+msgstr "Wijzigingenlogboek"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
msgctxt "@item:inmenu"
@@ -492,100 +488,100 @@ msgstr "Print klaar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
msgctxt "@label:material"
msgid "Empty"
-msgstr ""
+msgstr "Leeg"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
msgctxt "@label:material"
msgid "Unknown"
-msgstr ""
+msgstr "Onbekend"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
msgctxt "@action:button"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Printen via Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Printen via Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
msgctxt "@info:status"
msgid "Connected via Cloud"
-msgstr ""
+msgstr "Verbonden via Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
msgctxt "@info:title"
msgid "Cloud error"
-msgstr ""
+msgstr "Cloud-fout"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
msgctxt "@info:status"
msgid "Could not export print job."
-msgstr ""
+msgstr "Kan de printtaak niet exporteren."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
-msgstr ""
+msgstr "Kan de gegevens niet uploaden naar de printer."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:51
msgctxt "@info:status"
msgid "tomorrow"
-msgstr ""
+msgstr "morgen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:54
msgctxt "@info:status"
msgid "today"
-msgstr ""
+msgstr "vandaag"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
-msgstr ""
+msgstr "Er is een fout opgetreden tijdens het verbinden met de cloud."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
msgid "Sending data to remote cluster"
-msgstr ""
+msgstr "Gegevens naar een extern cluster verzenden"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Verzend en controleer overal printtaken met uw Ultimaker-account."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
msgctxt "@info:status"
msgid "Connect to Ultimaker Cloud"
-msgstr ""
+msgstr "Verbinden met Ultimaker Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
msgctxt "@action"
msgid "Don't ask me again for this printer."
-msgstr ""
+msgstr "Niet opnieuw vragen voor deze printer."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
msgctxt "@action"
msgid "Get started"
-msgstr ""
+msgstr "Aan de slag"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "U kunt nu overal vandaan printtaken verzenden en controleren met uw Ultimaker-account."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
msgctxt "@info:status"
msgid "Connected!"
-msgstr ""
+msgstr "Verbonden!"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
msgctxt "@action"
msgid "Review your connection"
-msgstr ""
+msgstr "Uw verbinding controleren"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py:30
msgctxt "@action"
@@ -637,12 +633,12 @@ msgstr "Simulatieweergave"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:35
msgctxt "@item:inmenu"
msgid "Post Processing"
-msgstr ""
+msgstr "Nabewerking"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:36
msgctxt "@item:inmenu"
msgid "Modify G-Code"
-msgstr ""
+msgstr "G-code wijzigen"
#: /home/ruben/Projects/Cura/plugins/SupportEraser/__init__.py:12
msgctxt "@label"
@@ -692,7 +688,7 @@ msgstr "Cura 15.04-profielen"
#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
msgctxt "@item:inmenu"
msgid "Evaluation"
-msgstr ""
+msgstr "Evaluatie"
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
@@ -760,7 +756,7 @@ msgstr "Slicen is niet mogelijk omdat er objecten gekoppeld zijn aan uitgeschake
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
msgctxt "@info:status"
msgid "Nothing to slice because none of the models fit the build volume or are assigned to a disabled extruder. Please scale or rotate models to fit, or enable an extruder."
-msgstr ""
+msgstr "Er kan niets worden geslicet omdat geen van de modellen in het bouwvolume past of omdat de modellen toegewezen zijn aan een uitgeschakelde extruder. Schaal of roteer de modellen totdat deze passen of schakel een extruder in."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
@@ -845,7 +841,7 @@ msgstr "Zorg ervoor dat de G-code geschikt is voor uw printer en de printerconfi
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:64
msgctxt "@item:inmenu"
msgid "Manage backups"
-msgstr ""
+msgstr "Back-ups beheren"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:107
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:113
@@ -858,32 +854,32 @@ msgstr "Back-up"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:55
msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
-msgstr ""
+msgstr "Er is een fout opgetreden tijdens het vermelden van uw back-ups."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
-msgstr ""
+msgstr "Er is een fout opgetreden tijdens het herstellen van uw back-up."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:15
msgctxt "@info:title"
msgid "Backups"
-msgstr ""
+msgstr "Back-ups"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:27
msgctxt "@info:backup_status"
msgid "Uploading your backup..."
-msgstr ""
+msgstr "Uw back-up wordt geüpload..."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:36
msgctxt "@info:backup_status"
msgid "There was an error while uploading your backup."
-msgstr ""
+msgstr "Er is een fout opgetreden tijdens het uploaden van uw back-up."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:39
msgctxt "@info:backup_status"
msgid "Your backup has finished uploading."
-msgstr ""
+msgstr "Uw back-up is geüpload."
#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14
#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14
@@ -919,7 +915,7 @@ msgstr "Fout bij het schrijven van het 3mf-bestand."
#: /home/ruben/Projects/Cura/plugins/PreviewStage/__init__.py:13
msgctxt "@item:inmenu"
msgid "Preview"
-msgstr ""
+msgstr "Voorbeeld"
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
@@ -927,11 +923,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr "Upgrades selecteren"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr "Controle"
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -1020,7 +1011,7 @@ msgstr "Het bestand {0} bestaat al. Weet u zeker dat u dit
#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
msgctxt "@info:status"
msgid "Invalid file URL:"
-msgstr ""
+msgstr "Ongeldige bestands-URL:"
#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
msgctxt "@menuitem"
@@ -1041,7 +1032,7 @@ msgstr "De instellingen zijn bijgewerkt"
#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
-msgstr ""
+msgstr "Extruder(s) uitgeschakeld"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
#, python-brace-format
@@ -1070,13 +1061,13 @@ msgstr "De export is voltooid"
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
-msgstr ""
+msgstr "Kan het profiel niet importeren uit {0}: {1}"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Can't import profile from {0} before a printer is added."
-msgstr ""
+msgstr "Kan het profiel niet importeren uit {0} voordat een printer toegevoegd is."
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
#, python-brace-format
@@ -1209,7 +1200,7 @@ msgstr "Geprobeerd een Cura-back-up te herstellen die niet overeenkomt met uw hu
#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
-msgstr ""
+msgstr "Kan de Ultimaker-accountserver niet bereiken."
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
@@ -1219,7 +1210,7 @@ msgstr "Objecten verveelvoudigen en plaatsen"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:28
msgctxt "@info:title"
msgid "Placing Objects"
-msgstr ""
+msgstr "Objecten plaatsen"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:103
@@ -1264,12 +1255,7 @@ msgid ""
"
Backups can be found in the configuration folder.
\n"
"
Please send us this Crash Report to fix the problem.
\n"
" "
-msgstr ""
-"
Oeps, Ultimaker Cura heeft een probleem gedetecteerd.
\n"
-"
Tijdens het opstarten is een onherstelbare fout opgetreden. Deze fout is mogelijk veroorzaakt door enkele onjuiste configuratiebestanden. Het wordt aanbevolen een back-up te maken en de standaardinstelling van uw configuratie te herstellen.
\n"
-"
Back-ups bevinden zich in de configuratiemap.
\n"
-"
Stuur ons dit crashrapport om het probleem op te lossen.
\n"
-" "
+msgstr "
Oeps, Ultimaker Cura heeft een probleem gedetecteerd.
\n
Tijdens het opstarten is een onherstelbare fout opgetreden. Deze fout is mogelijk veroorzaakt door enkele onjuiste configuratiebestanden. Het wordt aanbevolen een back-up te maken en de standaardinstelling van uw configuratie te herstellen.
\n
Back-ups bevinden zich in de configuratiemap.
\n
Stuur ons dit crashrapport om het probleem op te lossen.
A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem
\n"
"
Please use the \"Send report\" button to post a bug report automatically to our servers
\n"
" "
-msgstr ""
-"
Er is een fatale fout opgetreden in Cura. Stuur ons het crashrapport om het probleem op te lossen
\n"
-"
Druk op de knop \"Rapport verzenden\" om het foutenrapport automatisch naar onze servers te verzenden
\n"
-" "
+msgstr "
Er is een fatale fout opgetreden in Cura. Stuur ons het crashrapport om het probleem op te lossen
\n
Druk op de knop \"Rapport verzenden\" om het foutenrapport automatisch naar onze servers te verzenden
\n "
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:173
msgctxt "@title:groupbox"
@@ -1630,7 +1613,7 @@ msgstr "Kan geen verbinding maken met de Cura Package-database. Controleer uw ve
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/SmallRatingWidget.qml:27
msgctxt "@label"
msgid "ratings"
-msgstr ""
+msgstr "beoordelingen"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
@@ -1649,7 +1632,7 @@ msgstr "Materialen"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:91
msgctxt "@label"
msgid "Your rating"
-msgstr ""
+msgstr "Uw beoordeling"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
msgctxt "@label"
@@ -1682,7 +1665,7 @@ msgstr "Onbekend"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
-msgstr ""
+msgstr "Aanmelden is vereist voor installeren of bijwerken"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
@@ -1705,7 +1688,7 @@ msgstr "Bijgewerkt"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:13
msgctxt "@title"
msgid "Marketplace"
-msgstr ""
+msgstr "Marktplaats"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml:25
msgctxt "@action:button"
@@ -1740,12 +1723,12 @@ msgstr "Bevestigen"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to login first before you can rate"
-msgstr ""
+msgstr "U moet zich aanmelden voordat u een beoordeling kunt geven"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to install the package before you can rate"
-msgstr ""
+msgstr "U moet het package installeren voordat u een beoordeling kunt geven"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:19
msgctxt "@info"
@@ -1785,7 +1768,7 @@ msgstr "Wordt geïnstalleerd na opnieuw starten"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:53
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to update"
-msgstr ""
+msgstr "Aanmelden is vereist voor het bijwerken"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:71
msgctxt "@action:button"
@@ -1808,10 +1791,7 @@ msgid ""
"This plugin contains a license.\n"
"You need to accept this license to install this plugin.\n"
"Do you agree with the terms below?"
-msgstr ""
-"Deze invoegtoepassing bevat een licentie.\n"
-"U moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\n"
-"Gaat u akkoord met de onderstaande voorwaarden?"
+msgstr "Deze invoegtoepassing bevat een licentie.\nU moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\nGaat u akkoord met de onderstaande voorwaarden?"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:55
msgctxt "@action:button"
@@ -1836,22 +1816,22 @@ msgstr "Compatibiliteit"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:203
msgctxt "@action:label"
msgid "Technical Data Sheet"
-msgstr ""
+msgstr "Technisch informatieblad"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:212
msgctxt "@action:label"
msgid "Safety Data Sheet"
-msgstr ""
+msgstr "Veiligheidsinformatieblad"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:221
msgctxt "@action:label"
msgid "Printing Guidelines"
-msgstr ""
+msgstr "Richtlijnen voor printen"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:230
msgctxt "@action:label"
msgid "Website"
-msgstr ""
+msgstr "Website"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml:16
msgctxt "@info"
@@ -1973,17 +1953,17 @@ msgstr "Gebruikersovereenkomst"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
msgctxt "@info"
msgid "These options are not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Deze opties zijn niet beschikbaar omdat u een cloudprinter controleert."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:241
msgctxt "@info"
msgid "The webcam is not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "De webcam is niet beschikbaar omdat u een cloudprinter controleert."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
msgctxt "@label:status"
msgid "Loading..."
-msgstr ""
+msgstr "Laden..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
msgctxt "@label:status"
@@ -1993,42 +1973,42 @@ msgstr "Niet beschikbaar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
msgctxt "@label:status"
msgid "Unreachable"
-msgstr ""
+msgstr "Onbereikbaar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
msgctxt "@label:status"
msgid "Idle"
-msgstr ""
+msgstr "Inactief"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:353
msgctxt "@label"
msgid "Untitled"
-msgstr ""
+msgstr "Zonder titel"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
msgctxt "@label"
msgid "Anonymous"
-msgstr ""
+msgstr "Anoniem"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
msgctxt "@label:status"
msgid "Requires configuration changes"
-msgstr ""
+msgstr "Hiervoor zijn configuratiewijzigingen vereist"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
msgctxt "@action:button"
msgid "Details"
-msgstr ""
+msgstr "Details"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "Unavailable printer"
-msgstr ""
+msgstr "Niet‑beschikbare printer"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
msgctxt "@label"
msgid "First available"
-msgstr ""
+msgstr "Eerst beschikbaar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:187
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:132
@@ -2044,27 +2024,27 @@ msgstr "In wachtrij"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
msgid "Go to Cura Connect"
-msgstr ""
+msgstr "Ga naar Cura Connect"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
msgctxt "@label"
msgid "Print jobs"
-msgstr ""
+msgstr "Printtaken"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Total print time"
-msgstr ""
+msgstr "Totale printtijd"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
msgctxt "@label"
msgid "Waiting for"
-msgstr ""
+msgstr "Wachten op"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
msgctxt "@label link to connect manager"
msgid "View print history"
-msgstr ""
+msgstr "Printgeschiedenis weergeven"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
msgctxt "@window:title"
@@ -2087,10 +2067,7 @@ msgid ""
"To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n"
"\n"
"Select your printer from the list below:"
-msgstr ""
-"Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n"
-"\n"
-"Selecteer uw printer in de onderstaande lijst:"
+msgstr "Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n\nSelecteer uw printer in de onderstaande lijst:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:87
#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44
@@ -2190,17 +2167,17 @@ msgstr "Gereed"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Preparing..."
-msgstr ""
+msgstr "Voorbereiden..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Aborting..."
-msgstr ""
+msgstr "Afbreken..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
msgctxt "@label:status"
msgid "Pausing..."
-msgstr ""
+msgstr "Pauzeren..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
msgctxt "@label:status"
@@ -2210,7 +2187,7 @@ msgstr "Gepauzeerd"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
msgctxt "@label:status"
msgid "Resuming..."
-msgstr ""
+msgstr "Hervatten..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
msgctxt "@label:status"
@@ -2220,7 +2197,7 @@ msgstr "Handeling nodig"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
msgctxt "@label:status"
msgid "Finishes %1 at %2"
-msgstr ""
+msgstr "Voltooit %1 om %2"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:44
msgctxt "@action:button"
@@ -2256,12 +2233,12 @@ msgstr "Hervatten"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:102
msgctxt "@label"
msgid "Pausing..."
-msgstr ""
+msgstr "Pauzeren..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:104
msgctxt "@label"
msgid "Resuming..."
-msgstr ""
+msgstr "Hervatten..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:106
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284
@@ -2273,7 +2250,7 @@ msgstr "Pauzeren"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
msgid "Aborting..."
-msgstr ""
+msgstr "Afbreken..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
@@ -2314,24 +2291,24 @@ msgstr "Printen afbreken"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:20
msgctxt "@title:window"
msgid "Configuration Changes"
-msgstr ""
+msgstr "Configuratiewijzigingen"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:27
msgctxt "@action:button"
msgid "Override"
-msgstr ""
+msgstr "Overschrijven"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
msgctxt "@label"
msgid "The assigned printer, %1, requires the following configuration change:"
msgid_plural "The assigned printer, %1, requires the following configuration changes:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Voor de toegewezen printer, %1, is de volgende configuratiewijziging vereist:"
+msgstr[1] "Voor de toegewezen printer, %1, zijn de volgende configuratiewijzigingen vereist:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
msgctxt "@label"
msgid "The printer %1 is assigned, but the job contains an unknown material configuration."
-msgstr "De printer 1% is toegewezen. De taak bevat echter een onbekende materiaalconfiguratie."
+msgstr "De printer %1 is toegewezen. De taak bevat echter een onbekende materiaalconfiguratie."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:78
msgctxt "@label"
@@ -2356,7 +2333,7 @@ msgstr "Wijzig het platform naar %1 (kan niet worden overschreven)."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
-msgstr ""
+msgstr "Met het overschrijven worden de opgegeven instellingen gebruikt met de bestaande printerconfiguratie. De print kan hierdoor mislukken."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
msgctxt "@label"
@@ -2374,22 +2351,22 @@ msgid ""
"Please make sure your printer has a connection:\n"
"- Check if the printer is turned on.\n"
"- Check if the printer is connected to the network."
-msgstr ""
+msgstr "Controleer of de printer verbonden is:\n- Controleer of de printer ingeschakeld is.\n- Controleer of de printer verbonden is met het netwerk."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
msgctxt "@info"
msgid "Please select a network connected printer to monitor."
-msgstr ""
+msgstr "Selecteer een met een netwerk verbonden printer om te controleren."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
msgctxt "@info"
msgid "Please connect your Ultimaker printer to your local network."
-msgstr ""
+msgstr "Verbind uw Ultimaker-printer met uw lokale netwerk."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
-msgstr ""
+msgstr "Gebruikershandleidingen online weergegeven"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
@@ -2425,17 +2402,17 @@ msgstr "Compatibiliteitsmodus"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
msgctxt "@label"
msgid "Travels"
-msgstr ""
+msgstr "Bewegingen"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
msgctxt "@label"
msgid "Helpers"
-msgstr ""
+msgstr "Helpers"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
msgctxt "@label"
msgid "Shell"
-msgstr ""
+msgstr "Shell"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
@@ -2511,17 +2488,17 @@ msgstr "Cura verzendt anonieme gegevens naar Ultimaker om de printkwaliteit en g
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
msgctxt "@text:window"
msgid "I don't want to send this data"
-msgstr ""
+msgstr "Ik wil deze gegevens niet verzenden"
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
msgctxt "@text:window"
msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr ""
+msgstr "Verzenden van deze gegevens naar Ultimaker toestaan en ons helpen Cura te verbeteren"
#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
msgctxt "@label"
msgid "No print selected"
-msgstr ""
+msgstr "Er is geen print geselecteerd"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2783,108 +2760,108 @@ msgstr "Openen"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:28
msgctxt "@title"
msgid "My Backups"
-msgstr ""
+msgstr "Mijn back-ups"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:38
msgctxt "@empty_state"
msgid "You don't have any backups currently. Use the 'Backup Now' button to create one."
-msgstr ""
+msgstr "U hebt momenteel geen back-ups. Gebruik de knop 'Nu back-up maken' om een back-up te maken."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:60
msgctxt "@backup_limit_info"
msgid "During the preview phase, you'll be limited to 5 visible backups. Remove a backup to see older ones."
-msgstr ""
+msgstr "Tijdens de voorbeeldfase zijn er maximaal 5 back-ups zichtbaar. Verwijder een back-up als u oudere back-ups wilt bekijken."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:34
msgctxt "@description"
msgid "Backup and synchronize your Cura settings."
-msgstr ""
+msgstr "Maak een back-up van uw Cura-instellingen en synchroniseer deze."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
msgctxt "@button"
msgid "Sign in"
-msgstr ""
+msgstr "Aanmelden"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/main.qml:24
msgctxt "@title:window"
msgid "Cura Backups"
-msgstr ""
+msgstr "Cura-back-ups"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:21
msgctxt "@backuplist:label"
msgid "Cura Version"
-msgstr ""
+msgstr "Cura-versie"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:29
msgctxt "@backuplist:label"
msgid "Machines"
-msgstr ""
+msgstr "Machines"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:37
msgctxt "@backuplist:label"
msgid "Materials"
-msgstr ""
+msgstr "Materialen"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:45
msgctxt "@backuplist:label"
msgid "Profiles"
-msgstr ""
+msgstr "Profielen"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:53
msgctxt "@backuplist:label"
msgid "Plugins"
-msgstr ""
+msgstr "Invoegtoepassingen"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:71
msgctxt "@button"
msgid "Restore"
-msgstr ""
+msgstr "Herstellen"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:99
msgctxt "@dialog:title"
msgid "Delete Backup"
-msgstr ""
+msgstr "Back-up verwijderen"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:100
msgctxt "@dialog:info"
msgid "Are you sure you want to delete this backup? This cannot be undone."
-msgstr ""
+msgstr "Weet u zeker dat u deze back-up wilt verwijderen? Dit kan niet ongedaan worden gemaakt."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:108
msgctxt "@dialog:title"
msgid "Restore Backup"
-msgstr ""
+msgstr "Back-up herstellen"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:109
msgctxt "@dialog:info"
msgid "You will need to restart Cura before your backup is restored. Do you want to close Cura now?"
-msgstr ""
+msgstr "U moet Cura opnieuw starten voordat uw back-up wordt hersteld. Wilt u Cura nu sluiten?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:22
msgctxt "@button"
msgid "Want more?"
-msgstr ""
+msgstr "Wilt u meer?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:31
msgctxt "@button"
msgid "Backup Now"
-msgstr ""
+msgstr "Nu back-up maken"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:43
msgctxt "@checkbox:description"
msgid "Auto Backup"
-msgstr ""
+msgstr "Auto back-up"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:44
msgctxt "@checkbox:description"
msgid "Automatically create a backup each day that Cura is started."
-msgstr ""
+msgstr "Maak elke dag dat Cura wordt gestart, automatisch een back-up."
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMainSettingsSelector.qml:75
msgctxt "@label"
msgid "Not supported"
-msgstr ""
+msgstr "Niet ondersteund"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:35
msgctxt "@action:button"
@@ -2969,99 +2946,6 @@ msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr "Verwarmd Platform (officiële kit of eigenbouw)"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27
-msgctxt "@title"
-msgid "Check Printer"
-msgstr "Printer Controleren"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39
-msgctxt "@label"
-msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"
-msgstr "Het wordt aangeraden een controle uit te voeren op de Ultimaker. U kunt deze stap overslaan als u zeker weet dat de machine correct functioneert"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53
-msgctxt "@action:button"
-msgid "Start Printer Check"
-msgstr "Printercontrole Starten"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80
-msgctxt "@label"
-msgid "Connection: "
-msgstr "Verbinding: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Connected"
-msgstr "Aangesloten"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Not connected"
-msgstr "Niet aangesloten"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99
-msgctxt "@label"
-msgid "Min endstop X: "
-msgstr "Min. eindstop X: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-msgctxt "@info:status"
-msgid "Works"
-msgstr "Werkt"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Not checked"
-msgstr "Niet gecontroleerd"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120
-msgctxt "@label"
-msgid "Min endstop Y: "
-msgstr "Min. eindstop Y: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141
-msgctxt "@label"
-msgid "Min endstop Z: "
-msgstr "Min. eindstop Z: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163
-msgctxt "@label"
-msgid "Nozzle temperature check: "
-msgstr "Temperatuurcontrole nozzle: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Stop Heating"
-msgstr "Verwarmen Stoppen"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Start Heating"
-msgstr "Verwarmen Starten"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223
-msgctxt "@label"
-msgid "Build plate temperature check:"
-msgstr "Temperatuurcontrole platform:"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Checked"
-msgstr "Gecontroleerd"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284
-msgctxt "@label"
-msgid "Everything is in order! You're done with your CheckUp."
-msgstr "Alles is in orde! De controle is voltooid."
-
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"
msgid "Not connected to a printer"
@@ -3633,7 +3517,7 @@ msgstr "Profiel Maken"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
msgctxt "@info"
msgid "Please provide a name for this profile."
-msgstr ""
+msgstr "Geef een naam op voor dit profiel."
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
msgctxt "@title:window"
@@ -3663,7 +3547,7 @@ msgstr "Printer: %1"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
msgid "Default profiles"
-msgstr ""
+msgstr "Standaardprofielen"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
@@ -3698,7 +3582,7 @@ msgstr "Algemene Instellingen"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
msgctxt "@action:button"
msgid "Marketplace"
-msgstr ""
+msgstr "Marktplaats"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:27
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:13
@@ -3721,7 +3605,7 @@ msgstr "Beel&d"
#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:13
msgctxt "@title:menu menubar:toplevel"
msgid "&Settings"
-msgstr ""
+msgstr "In&stellingen"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:55
msgctxt "@title:menu menubar:toplevel"
@@ -3756,7 +3640,7 @@ msgstr "Zonder titel"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:68
msgctxt "@label:textbox"
msgid "search settings"
-msgstr ""
+msgstr "instellingen zoeken"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
msgctxt "@action:menu"
@@ -3795,10 +3679,7 @@ msgid ""
"Some hidden settings use values different from their normal calculated value.\n"
"\n"
"Click to make these settings visible."
-msgstr ""
-"Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n"
-"\n"
-"Klik om deze instellingen zichtbaar te maken."
+msgstr "Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n\nKlik om deze instellingen zichtbaar te maken."
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66
msgctxt "@label Header for list of settings."
@@ -3826,10 +3707,7 @@ msgid ""
"This setting has a value that is different from the profile.\n"
"\n"
"Click to restore the value of the profile."
-msgstr ""
-"Deze instelling heeft een andere waarde dan in het profiel.\n"
-"\n"
-"Klik om de waarde van het profiel te herstellen."
+msgstr "Deze instelling heeft een andere waarde dan in het profiel.\n\nKlik om de waarde van het profiel te herstellen."
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:302
msgctxt "@label"
@@ -3837,25 +3715,22 @@ msgid ""
"This setting is normally calculated, but it currently has an absolute value set.\n"
"\n"
"Click to restore the calculated value."
-msgstr ""
-"Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n"
-"\n"
-"Klik om de berekende waarde te herstellen."
+msgstr "Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n\nKlik om de berekende waarde te herstellen."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
msgctxt "@button"
msgid "Recommended"
-msgstr ""
+msgstr "Aanbevolen"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
msgctxt "@button"
msgid "Custom"
-msgstr ""
+msgstr "Aangepast"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:193
msgctxt "@label"
msgid "Gradual infill"
-msgstr ""
+msgstr "Geleidelijke vulling"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:232
msgctxt "@label"
@@ -3865,7 +3740,7 @@ msgstr "Met geleidelijke vulling neemt de hoeveelheid vulling naar boven toe."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
msgctxt "@label"
msgid "Support"
-msgstr ""
+msgstr "Supportstructuur"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
msgctxt "@label"
@@ -3880,7 +3755,7 @@ msgstr "Selecteren welke extruder voor support wordt gebruikt. Deze optie zorgt
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
msgctxt "@label"
msgid "Adhesion"
-msgstr ""
+msgstr "Hechting"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
msgctxt "@label"
@@ -3900,7 +3775,7 @@ msgstr "U hebt enkele profielinstellingen aangepast. Ga naar de aangepaste modus
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:355
msgctxt "@tooltip"
msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile"
-msgstr ""
+msgstr "Dit kwaliteitsprofiel is niet beschikbaar voor uw huidige materiaal- en nozzleconfiguratie. Breng hierin wijzigingen aan om gebruik van dit kwaliteitsprofiel mogelijk te maken"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3910,17 +3785,17 @@ msgstr "Er is momenteel een aangepast profiel actief. Als u de kwaliteitsschuifr
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:13
msgctxt "@label:Should be short"
msgid "On"
-msgstr ""
+msgstr "Aan"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:14
msgctxt "@label:Should be short"
msgid "Off"
-msgstr ""
+msgstr "Uit"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:27
msgctxt "@label"
msgid "Profile"
-msgstr ""
+msgstr "Profiel"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:94
msgctxt "@tooltip"
@@ -3928,15 +3803,12 @@ msgid ""
"Some setting/override values are different from the values stored in the profile.\n"
"\n"
"Click to open the profile manager."
-msgstr ""
-"Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n"
-"\n"
-"Klik om het profielbeheer te openen."
+msgstr "Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n\nKlik om het profielbeheer te openen."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label shown when we load a Gcode file"
msgid "Print setup disabled. G code file can not be modified."
-msgstr ""
+msgstr "Printinstelling is uitgeschakeld. Het G-code-bestand kan niet worden gewijzigd."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -4177,47 +4049,47 @@ msgstr "Aantal exemplaren"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/AutoConfiguration.qml:18
msgctxt "@header"
msgid "Configurations"
-msgstr ""
+msgstr "Configuraties"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:110
msgctxt "@label"
msgid "Select configuration"
-msgstr ""
+msgstr "Configuratie selecteren"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
msgctxt "@label"
msgid "See the material compatibility chart"
-msgstr ""
+msgstr "Zie de materiaalcompatibiliteitsgrafiek"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
msgctxt "@label"
msgid "Configurations"
-msgstr ""
+msgstr "Configuraties"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:57
msgctxt "@label"
msgid "Loading available configurations from the printer..."
-msgstr ""
+msgstr "Beschikbare configuraties laden vanaf de printer..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:58
msgctxt "@label"
msgid "The configurations are not available because the printer is disconnected."
-msgstr ""
+msgstr "De configuraties zijn niet beschikbaar omdat de printer niet verbonden is."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:25
msgctxt "@header"
msgid "Custom"
-msgstr ""
+msgstr "Aangepast"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:61
msgctxt "@label"
msgid "Printer"
-msgstr ""
+msgstr "Printer"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
msgctxt "@label"
msgid "Enabled"
-msgstr ""
+msgstr "Ingeschakeld"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
msgctxt "@label"
@@ -4227,17 +4099,17 @@ msgstr "Materiaal"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
-msgstr ""
+msgstr "Gebruik lijm bij deze combinatie van materialen voor een betere hechting."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:128
msgctxt "@label"
msgid "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile."
-msgstr ""
+msgstr "Deze configuratie is niet beschikbaar omdat %1 niet wordt herkend. Ga naar %2 om het juiste materiaalprofiel te downloaden."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:129
msgctxt "@label"
msgid "Marketplace"
-msgstr ""
+msgstr "Marktplaats"
#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:15
msgctxt "@title:menu menubar:file"
@@ -4267,37 +4139,37 @@ msgstr "Geschatte resterende tijd"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
msgid "View types"
-msgstr ""
+msgstr "Typen weergeven"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
msgctxt "@label"
msgid "Hi "
-msgstr ""
+msgstr "Hallo "
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
msgctxt "@button"
msgid "Ultimaker account"
-msgstr ""
+msgstr "Ultimaker-account"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
msgctxt "@button"
msgid "Sign out"
-msgstr ""
+msgstr "Afmelden"
#: /home/ruben/Projects/Cura/resources/qml/Account/AccountWidget.qml:24
msgctxt "@action:button"
msgid "Sign in"
-msgstr ""
+msgstr "Aanmelden"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
msgctxt "@label"
msgid "Ultimaker Cloud"
-msgstr ""
+msgstr "Ultimaker Cloud"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
-msgstr ""
+msgstr "De 3D-printworkflow van de volgende generatie"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:51
msgctxt "@text"
@@ -4305,27 +4177,27 @@ msgid ""
"- Send print jobs to Ultimaker printers outside your local network\n"
"- Store your Ultimaker Cura settings in the cloud for use anywhere\n"
"- Get exclusive access to material profiles from leading brands"
-msgstr ""
+msgstr "- Printtaken verzenden naar Ultimaker-printers buiten uw lokale netwerk\n- Ultimaker Cura-instellingen opslaan in de cloud zodat u ze overal kunt gebruiken\n- Exclusieve toegang verkrijgen tot materiaalprofielen van toonaangevende merken"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
msgid "Create account"
-msgstr ""
+msgstr "Account maken"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
msgctxt "@label"
msgid "No time estimation available"
-msgstr ""
+msgstr "Geen tijdschatting beschikbaar"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
msgctxt "@label"
msgid "No cost estimation available"
-msgstr ""
+msgstr "Geen kostenraming beschikbaar"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
msgctxt "@button"
msgid "Preview"
-msgstr ""
+msgstr "Voorbeeld"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
msgctxt "@label:PrintjobStatus"
@@ -4340,27 +4212,27 @@ msgstr "Kan Niet Slicen"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
msgctxt "@button"
msgid "Slice"
-msgstr ""
+msgstr "Slicen"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
msgctxt "@label"
msgid "Start the slicing process"
-msgstr ""
+msgstr "Het sliceproces starten"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
msgctxt "@button"
msgid "Cancel"
-msgstr ""
+msgstr "Annuleren"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
msgid "Time specification"
-msgstr ""
+msgstr "Tijdspecificatie"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
msgid "Material specification"
-msgstr ""
+msgstr "Materiaalspecificatie"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4375,27 +4247,27 @@ msgstr "%1 g"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Connected printers"
-msgstr ""
+msgstr "Verbonden printers"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Preset printers"
-msgstr ""
+msgstr "Vooraf ingestelde printers"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
msgctxt "@button"
msgid "Add printer"
-msgstr ""
+msgstr "Printer toevoegen"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
msgctxt "@button"
msgid "Manage printers"
-msgstr ""
+msgstr "Printers beheren"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
-msgstr ""
+msgstr "Online gids voor probleemoplossing weergegeven"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
msgctxt "@action:inmenu"
@@ -4606,7 +4478,7 @@ msgstr "Open Configuratiemap"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
msgctxt "@action:menu"
msgid "&Marketplace"
-msgstr ""
+msgstr "&Marktplaats"
#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
msgctxt "@title:window"
@@ -4678,9 +4550,7 @@ msgctxt "@text:window"
msgid ""
"You have customized some profile settings.\n"
"Would you like to keep or discard those settings?"
-msgstr ""
-"U hebt enkele profielinstellingen aangepast.\n"
-"Wilt u deze instellingen behouden of verwijderen?"
+msgstr "U hebt enkele profielinstellingen aangepast.\nWilt u deze instellingen behouden of verwijderen?"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:110
msgctxt "@title:column"
@@ -4725,7 +4595,7 @@ msgstr "Nieuw profiel maken"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
msgctxt "@title:tab"
msgid "Add a printer to Cura"
-msgstr ""
+msgstr "Een printer aan Cura toevoegen"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
msgctxt "@title:tab"
@@ -4733,17 +4603,17 @@ msgid ""
"Select the printer you want to use from the list below.\n"
"\n"
"If your printer is not in the list, use the \"Custom FFF Printer\" from the \"Custom\" category and adjust the settings to match your printer in the next dialog."
-msgstr ""
+msgstr "Selecteer de printer die u wilt gebruiken, uit de onderstaande lijst.\n\nAls uw printer niet in de lijst wordt weergegeven, gebruikt u de 'Custom FFF Printer' (Aangepaste FFF-printer) uit de categorie 'Custom' (Aangepast) en past u in het dialoogvenster dat wordt weergegeven, de instellingen aan zodat deze overeenkomen met uw printer."
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
msgctxt "@label"
msgid "Manufacturer"
-msgstr ""
+msgstr "Fabrikant"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
msgctxt "@label"
msgid "Printer Name"
-msgstr ""
+msgstr "Printernaam"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
msgctxt "@action:button"
@@ -4770,9 +4640,7 @@ msgctxt "@info:credit"
msgid ""
"Cura is developed by Ultimaker B.V. in cooperation with the community.\n"
"Cura proudly uses the following open source projects:"
-msgstr ""
-"Cura is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\n"
-"Cura maakt met trots gebruik van de volgende opensourceprojecten:"
+msgstr "Cura is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\nCura maakt met trots gebruik van de volgende opensourceprojecten:"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:134
msgctxt "@label"
@@ -5049,7 +4917,7 @@ msgstr "X3G-schrijver"
#~ msgctxt "@label"
#~ msgid "The assigned printer, %1, requires the following configuration change(s):"
-#~ msgstr "Voor de toegewezen printer, 1%, is/zijn de volgende configuratiewijziging/configuratiewijzigingen vereist:"
+#~ msgstr "Voor de toegewezen printer, %1, is/zijn de volgende configuratiewijziging/configuratiewijzigingen vereist:"
#~ msgctxt "@label"
#~ msgid "Override"
@@ -5180,6 +5048,7 @@ msgstr "X3G-schrijver"
#~ "Print Setup disabled\n"
#~ "G-code files cannot be modified"
#~ msgstr ""
+
#~ "Instelling voor printen uitgeschakeld\n"
#~ "G-code-bestanden kunnen niet worden aangepast"
@@ -5784,6 +5653,7 @@ msgstr "X3G-schrijver"
#~ "Could not export using \"{}\" quality!\n"
#~ "Felt back to \"{}\"."
#~ msgstr ""
+
#~ "Kan niet exporteren met de kwaliteit \"{}\"!\n"
#~ "Instelling teruggezet naar \"{}\"."
@@ -5960,6 +5830,7 @@ msgstr "X3G-schrijver"
#~ "2) Turn the fan off (only if there are no tiny details on the model).\n"
#~ "3) Use a different material."
#~ msgstr ""
+
#~ "Sommige modellen worden mogelijk niet optimaal geprint vanwege de grootte van het object en de gekozen materialen voor modellen: {model_names}.\n"
#~ "Mogelijk nuttige tips om de printkwaliteit te verbeteren:\n"
#~ "1) Gebruik afgeronde hoeken.\n"
@@ -5976,6 +5847,7 @@ msgstr "X3G-schrijver"
#~ "\n"
#~ "Thanks!"
#~ msgstr ""
+
#~ "In uw tekening zijn geen modellen gevonden. Controleer de inhoud nogmaals en zorg ervoor dat één onderdeel of assemblage zich in de tekening bevindt.\n"
#~ "\n"
#~ "Hartelijk dank."
@@ -5986,6 +5858,7 @@ msgstr "X3G-schrijver"
#~ "\n"
#~ "Sorry!"
#~ msgstr ""
+
#~ "In uw tekening is meer dan één onderdeel of assemblage gevonden. Momenteel worden alleen tekeningen met precies één onderdeel of assemblage ondersteund.\n"
#~ "\n"
#~ "Sorry."
@@ -6010,6 +5883,7 @@ msgstr "X3G-schrijver"
#~ "With kind regards\n"
#~ " - Thomas Karl Pietrowski"
#~ msgstr ""
+
#~ "Beste klant,\n"
#~ "Op uw systeem is geen geldige installatie van SolidWorks aangetroffen. Dit betekent dat SolidWorks niet is geïnstalleerd of dat u niet over een geldige licentie beschikt. Controleer of SolidWorks zelf zonder problemen kan worden uitgevoerd en/of neem contact op met uw IT-afdeling.\n"
#~ "\n"
@@ -6024,6 +5898,7 @@ msgstr "X3G-schrijver"
#~ "With kind regards\n"
#~ " - Thomas Karl Pietrowski"
#~ msgstr ""
+
#~ "Beste klant,\n"
#~ "Momenteel voert u deze invoegtoepassing uit op een ander besturingssysteem dan Windows. Deze invoegtoepassing werkt alleen op systemen waarop Windows en SolidWorks met een geldige licentie zijn geïnstalleerd. Installeer deze invoegtoepassing op een Windows-systeem waarop SolidWorks is geïnstalleerd.\n"
#~ "\n"
@@ -6128,6 +6003,7 @@ msgstr "X3G-schrijver"
#~ "Open the directory\n"
#~ "with macro and icon"
#~ msgstr ""
+
#~ "Open de map\n"
#~ "met macro en pictogram"
@@ -6426,6 +6302,7 @@ msgstr "X3G-schrijver"
#~ "\n"
#~ " Thanks!."
#~ msgstr ""
+
#~ "In uw tekening zijn geen modellen gevonden. Controleer de inhoud en zorg ervoor dat zich in de tekening een onderdeel of assemblage bevindt.\n"
#~ "\n"
#~ " Hartelijk dank."
@@ -6436,6 +6313,7 @@ msgstr "X3G-schrijver"
#~ "\n"
#~ "Sorry!"
#~ msgstr ""
+
#~ "In uw tekening is meer dan één onderdeel of assemblage gevonden. Momenteel worden alleen tekeningen met precies één onderdeel of assemblage ondersteund.\n"
#~ "\n"
#~ "Sorry."
@@ -6470,6 +6348,7 @@ msgstr "X3G-schrijver"
#~ "
Please use the \"Send report\" button to post a bug report automatically to our servers
\n"
#~ " "
#~ msgstr ""
+
#~ "
Er is een fatale fout opgetreden. Stuur ons het Crashrapport om het probleem op te lossen
\n"
#~ "
Druk op de knop \"Rapport verzenden\" om het foutenrapport automatisch naar onze servers te verzenden
\n"
#~ " "
@@ -6824,6 +6705,7 @@ msgstr "X3G-schrijver"
#~ "You need to accept this license to install this plugin.\n"
#~ "Do you agree with the terms below?"
#~ msgstr ""
+
#~ " invoegtoepassing bevat een licentie.\n"
#~ "U moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\n"
#~ "Gaat u akkoord met onderstaande voorwaarden?"
@@ -7351,6 +7233,7 @@ msgstr "X3G-schrijver"
#~ msgid "Print Selected Model with %1"
#~ msgid_plural "Print Selected Models With %1"
#~ msgstr[0] "Geselecteerd model printen met %1"
+
#~ msgstr[1] "Geselecteerde modellen printen met %1"
#~ msgctxt "@info:status"
@@ -7380,6 +7263,7 @@ msgstr "X3G-schrijver"
#~ "
\n"
diff --git a/resources/i18n/nl_NL/fdmextruder.def.json.po b/resources/i18n/nl_NL/fdmextruder.def.json.po
index 74786cfcc7..4a23082f83 100644
--- a/resources/i18n/nl_NL/fdmextruder.def.json.po
+++ b/resources/i18n/nl_NL/fdmextruder.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 14:25+0100\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
@@ -84,7 +84,7 @@ msgstr "Start-G-code van Extruder"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
-msgstr ""
+msgstr "Start-g-code die wordt uitgevoerd wanneer naar deze extruder wordt gewisseld."
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_abs label"
@@ -124,7 +124,7 @@ msgstr "Eind-G-code van Extruder"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_code description"
msgid "End g-code to execute when switching away from this extruder."
-msgstr ""
+msgstr "Eind-g-code die wordt uitgevoerd wanneer naar een andere extruder wordt gewisseld."
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_abs label"
diff --git a/resources/i18n/nl_NL/fdmprinter.def.json.po b/resources/i18n/nl_NL/fdmprinter.def.json.po
index 41f4b22ff1..f6b9c17d48 100644
--- a/resources/i18n/nl_NL/fdmprinter.def.json.po
+++ b/resources/i18n/nl_NL/fdmprinter.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-11-06 15:03+0100\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
@@ -57,9 +57,7 @@ msgctxt "machine_start_gcode description"
msgid ""
"G-code commands to be executed at the very start - separated by \n"
"."
-msgstr ""
-"G-code-opdrachten die aan het begin worden uitgevoerd, gescheiden door \n"
-"."
+msgstr "G-code-opdrachten die aan het begin worden uitgevoerd, gescheiden door \n."
#: fdmprinter.def.json
msgctxt "machine_end_gcode label"
@@ -71,9 +69,7 @@ msgctxt "machine_end_gcode description"
msgid ""
"G-code commands to be executed at the very end - separated by \n"
"."
-msgstr ""
-"G-code-opdrachten die aan het eind worden uitgevoerd, gescheiden door \n"
-"."
+msgstr "G-code-opdrachten die aan het eind worden uitgevoerd, gescheiden door \n."
#: fdmprinter.def.json
msgctxt "material_guid label"
@@ -1635,9 +1631,7 @@ msgctxt "infill_wall_line_count description"
msgid ""
"Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n"
"This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right."
-msgstr ""
-"Voeg extra wanden toe rondom de vulling. Deze wanden kunnen ervoor zorgen dat de skin aan de boven-/onderkant minder doorzakt. Dit betekent dat u met alleen wat extra materiaal voor dezelfde kwaliteit minder skinlagen aan de boven-/onderkant nodig hebt.\n"
-"Deze optie kan in combinatie met de optie 'Polygonen voor de vulling verbinden' worden gebruikt om alle vulling in één doorvoerpad te verbinden zonder extra bewegingen of intrekkingen, mits correct ingesteld."
+msgstr "Voeg extra wanden toe rondom de vulling. Deze wanden kunnen ervoor zorgen dat de skin aan de boven-/onderkant minder doorzakt. Dit betekent dat u met alleen wat extra materiaal voor dezelfde kwaliteit minder skinlagen aan de boven-/onderkant nodig hebt.\nDeze optie kan in combinatie met de optie 'Polygonen voor de vulling verbinden' worden gebruikt om alle vulling in één doorvoerpad te verbinden zonder extra bewegingen of intrekkingen, mits correct ingesteld."
#: fdmprinter.def.json
msgctxt "sub_div_rad_add label"
@@ -1677,7 +1671,7 @@ msgstr "Overlappercentage Skin"
#: fdmprinter.def.json
msgctxt "skin_overlap description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines, as a percentage of the line widths of the skin lines and the innermost wall. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any percentage over 50% may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Pas de mate van overlap tussen de wanden en (de eindpunten van) de skin-middellijnen aan, als percentage van de lijnbreedtes van de skin-lijnen en de binnenste wand. Met een lichte overlap kunnen de wanden goed hechten aan de skin. Houd er rekening mee dat met een gelijke lijnbreedte voor skin en wand, skin buiten de wand kan treden bij een percentage hoger dan 50%, omdat de nozzle van de skin-extruder op deze positie al voorbij het midden van de wand kan zijn."
#: fdmprinter.def.json
msgctxt "skin_overlap_mm label"
@@ -1687,7 +1681,7 @@ msgstr "Overlap Skin"
#: fdmprinter.def.json
msgctxt "skin_overlap_mm description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any value over half the width of the wall may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Pas de mate van overlap tussen de wanden en (de eindpunten van) de skin-middellijnen aan. Met een lichte overlap kunnen de wanden goed hechten aan de skin. Houd er rekening mee dat met een gelijke lijnbreedte voor skin en wand, skin buiten de wand kan treden bij een waarde groter dan de halve wandbreedte, omdat de nozzle van de skin-extruder op deze positie het midden van de wand al kan hebben bereikt."
#: fdmprinter.def.json
msgctxt "infill_wipe_dist label"
@@ -2127,7 +2121,7 @@ msgstr "Intrekafstand bij Wisselen Nozzles"
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_amount description"
msgid "The amount of retraction when switching extruders. Set to 0 for no retraction at all. This should generally be the same as the length of the heat zone."
-msgstr ""
+msgstr "De intrekafstand wanneer de extruders worden gewisseld. Als u deze optie instelt op 0, wordt er niet ingetrokken. Deze waarde dient doorgaans gelijk te zijn aan de lengte van de verwarmingszone."
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_speeds label"
@@ -2787,7 +2781,7 @@ msgstr "Combing-modus"
#: fdmprinter.def.json
msgctxt "retraction_combing description"
msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas or to only comb within the infill."
-msgstr ""
+msgstr "Met combing blijft de nozzle tijdens bewegingen binnen eerder geprinte delen. Hierdoor zijn de bewegingen iets langer, maar hoeft het filament minder vaak te worden ingetrokken. Als combing is uitgeschakeld, wordt het materiaal ingetrokken en beweegt de nozzle in een rechte lijn naar het volgende punt. Het is ook mogelijk om combing over boven-/onderskingedeelten te voorkomen of combing alleen binnen de vulling te gebruiken."
#: fdmprinter.def.json
msgctxt "retraction_combing option off"
@@ -3442,12 +3436,12 @@ msgstr "De hoogte van de supportvulling van een bepaalde dichtheid voordat de di
#: fdmprinter.def.json
msgctxt "minimum_support_area label"
msgid "Minimum Support Area"
-msgstr ""
+msgstr "Minimumgebied supportstructuur"
#: fdmprinter.def.json
msgctxt "minimum_support_area description"
msgid "Minimum area size for support polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Minimumgebied voor steunpolygonen. Polygonen met een gebied dat kleiner is dan deze waarde, worden niet gegenereerd."
#: fdmprinter.def.json
msgctxt "support_interface_enable label"
@@ -3677,62 +3671,62 @@ msgstr "Zigzag"
#: fdmprinter.def.json
msgctxt "minimum_interface_area label"
msgid "Minimum Support Interface Area"
-msgstr ""
+msgstr "Minimumgebied verbindingsstructuur"
#: fdmprinter.def.json
msgctxt "minimum_interface_area description"
msgid "Minimum area size for support interface polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Minimumgebied voor verbindingspolygonen. Polygonen met een gebied dat kleiner is dan deze waarde, worden niet gegenereerd."
#: fdmprinter.def.json
msgctxt "minimum_roof_area label"
msgid "Minimum Support Roof Area"
-msgstr ""
+msgstr "Minimumgebied supportdak"
#: fdmprinter.def.json
msgctxt "minimum_roof_area description"
msgid "Minimum area size for the roofs of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Minimumgebied voor de supportdaken. Polygonen met een gebied dat kleiner is dan deze waarde, worden niet gegenereerd."
#: fdmprinter.def.json
msgctxt "minimum_bottom_area label"
msgid "Minimum Support Floor Area"
-msgstr ""
+msgstr "Minimumgebied supportvloer"
#: fdmprinter.def.json
msgctxt "minimum_bottom_area description"
msgid "Minimum area size for the floors of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Minimumgebied voor de supportvloeren. Polygonen met een gebied dat kleiner is dan deze waarde, worden niet gegenereerd."
#: fdmprinter.def.json
msgctxt "support_interface_offset label"
msgid "Support Interface Horizontal Expansion"
-msgstr ""
+msgstr "Supportstructuur horizontale uitbreiding"
#: fdmprinter.def.json
msgctxt "support_interface_offset description"
msgid "Amount of offset applied to the support interface polygons."
-msgstr ""
+msgstr "De mate van offset die wordt toegepast op de verbindingspolygonen."
#: fdmprinter.def.json
msgctxt "support_roof_offset label"
msgid "Support Roof Horizontal Expansion"
-msgstr ""
+msgstr "Supportdak horizontale uitbreiding"
#: fdmprinter.def.json
msgctxt "support_roof_offset description"
msgid "Amount of offset applied to the roofs of the support."
-msgstr ""
+msgstr "De mate van offset die wordt toegepast op de supportdaken."
#: fdmprinter.def.json
msgctxt "support_bottom_offset label"
msgid "Support Floor Horizontal Expansion"
-msgstr ""
+msgstr "Supportvloer horizontale uitbreiding"
#: fdmprinter.def.json
msgctxt "support_bottom_offset description"
msgid "Amount of offset applied to the floors of the support."
-msgstr ""
+msgstr "De mate van offset die wordt toegepast op de supportvloeren."
#: fdmprinter.def.json
msgctxt "support_fan_enable label"
@@ -3904,9 +3898,7 @@ msgctxt "skirt_gap description"
msgid ""
"The horizontal distance between the skirt and the first layer of the print.\n"
"This is the minimum distance. Multiple skirt lines will extend outwards from this distance."
-msgstr ""
-"De horizontale afstand tussen de skirt en de eerste laag van de print.\n"
-"Dit is de minimumafstand. Als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint."
+msgstr "De horizontale afstand tussen de skirt en de eerste laag van de print.\nDit is de minimumafstand. Als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint."
#: fdmprinter.def.json
msgctxt "skirt_brim_minimal_length label"
@@ -5353,9 +5345,7 @@ msgctxt "wireframe_up_half_speed description"
msgid ""
"Distance of an upward move which is extruded with half speed.\n"
"This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing."
-msgstr ""
-"De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\n"
-"Hierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten."
+msgstr "De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\nHierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten."
#: fdmprinter.def.json
msgctxt "wireframe_top_jump label"
@@ -5973,6 +5963,7 @@ msgstr "Omzettingsmatrix die moet worden toegepast op het model wanneer dit word
#~ "The horizontal distance between the skirt and the first layer of the print.\n"
#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance."
#~ msgstr ""
+
#~ "De horizontale afstand tussen de skirt en de eerste laag van de print.\n"
#~ "Dit is de minimumafstand; als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint."
diff --git a/resources/i18n/pl_PL/cura.po b/resources/i18n/pl_PL/cura.po
index 10f01d54e1..3f3e14a2b1 100644
--- a/resources/i18n/pl_PL/cura.po
+++ b/resources/i18n/pl_PL/cura.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2018-09-21 20:52+0200\n"
-"Last-Translator: 'Jaguś' Paweł Jagusiak, Andrzej 'anraf1001' Rafalski and Jakub 'drzejkopf' Świeciński\n"
+"PO-Revision-Date: 2019-03-14 14:44+0100\n"
+"Last-Translator: Mariusz 'Virgin71' Matłosz \n"
"Language-Team: reprapy.pl\n"
"Language: pl_PL\n"
"MIME-Version: 1.0\n"
@@ -17,6 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.1.1\n"
+"X-Poedit-SourceCharset: UTF-8\n"
#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
msgctxt "@action"
@@ -49,7 +50,7 @@ msgstr "Zapisywacz G-code nie obsługuje trybu nietekstowego."
#: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89
msgctxt "@warning:status"
msgid "Please prepare G-code before exporting."
-msgstr ""
+msgstr "Przygotuj G-code przed eksportem."
#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:31
msgctxt "@info:title"
@@ -73,7 +74,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
msgctxt "@item:inmenu"
msgid "Changelog"
-msgstr ""
+msgstr "Lista zmian"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
msgctxt "@item:inmenu"
@@ -83,7 +84,7 @@ msgstr "Pokaż Dziennik"
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py:25
msgctxt "@action"
msgid "Update Firmware"
-msgstr ""
+msgstr "Aktualizacja Oprogramowania Sprzętowego"
#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:23
msgctxt "@item:inmenu"
@@ -492,100 +493,100 @@ msgstr "Drukowanie zakończone"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
msgctxt "@label:material"
msgid "Empty"
-msgstr ""
+msgstr "Pusty"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
msgctxt "@label:material"
msgid "Unknown"
-msgstr ""
+msgstr "Nieznany"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
msgctxt "@action:button"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Drukuj przez Chmurę"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Drukuj przez Chmurę"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
msgctxt "@info:status"
msgid "Connected via Cloud"
-msgstr ""
+msgstr "Połączony z Chmurą"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
msgctxt "@info:title"
msgid "Cloud error"
-msgstr ""
+msgstr "Błąd Chmury"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
msgctxt "@info:status"
msgid "Could not export print job."
-msgstr ""
+msgstr "Nie można eksportować zadania druku."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
-msgstr ""
+msgstr "Nie można wgrać danych do drukarki."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:51
msgctxt "@info:status"
msgid "tomorrow"
-msgstr ""
+msgstr "jutro"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:54
msgctxt "@info:status"
msgid "today"
-msgstr ""
+msgstr "dziś"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
-msgstr ""
+msgstr "Wystąpił błąd połączenia z chmurą."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
msgid "Sending data to remote cluster"
-msgstr ""
+msgstr "Wysyłanie danych do zdalnego klastra"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Wyślij i nadzoruj zadania druku z każdego miejsca, używając konta Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
msgctxt "@info:status"
msgid "Connect to Ultimaker Cloud"
-msgstr ""
+msgstr "Połącz z Ultimaker Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
msgctxt "@action"
msgid "Don't ask me again for this printer."
-msgstr ""
+msgstr "Nie pytaj więcej dla tej drukarki."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
msgctxt "@action"
msgid "Get started"
-msgstr ""
+msgstr "Rozpocznij"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Możesz teraz wysłać i nadzorować zadania druku z każdego miejsca, używając konta Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
msgctxt "@info:status"
msgid "Connected!"
-msgstr ""
+msgstr "Połączono!"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
msgctxt "@action"
msgid "Review your connection"
-msgstr ""
+msgstr "Odnów połączenie"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py:30
msgctxt "@action"
@@ -637,12 +638,12 @@ msgstr "Widok symulacji"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:35
msgctxt "@item:inmenu"
msgid "Post Processing"
-msgstr ""
+msgstr "Przetwarzanie końcowe"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:36
msgctxt "@item:inmenu"
msgid "Modify G-Code"
-msgstr ""
+msgstr "Modyfikuj G-code"
#: /home/ruben/Projects/Cura/plugins/SupportEraser/__init__.py:12
msgctxt "@label"
@@ -692,7 +693,7 @@ msgstr "Profile Cura 15.04"
#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
msgctxt "@item:inmenu"
msgid "Evaluation"
-msgstr ""
+msgstr "Obliczanie"
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
@@ -760,7 +761,7 @@ msgstr "Nie można pociąć, ponieważ obecne są obiekty powiązane z wyłączo
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
msgctxt "@info:status"
msgid "Nothing to slice because none of the models fit the build volume or are assigned to a disabled extruder. Please scale or rotate models to fit, or enable an extruder."
-msgstr ""
+msgstr "Nic do pocięcia, ponieważ żaden z modeli nie mieści się w obszarze roboczym lub jest przypisany do wyłączonego ekstrudera. Skaluj lub obróć modele, aby dopasować lub włącz ekstruder."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
@@ -845,7 +846,7 @@ msgstr "Przed wysłaniem pliku upewnij się, że G-code jest odpowiedni do konfi
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:64
msgctxt "@item:inmenu"
msgid "Manage backups"
-msgstr ""
+msgstr "Zarządzaj kopiami zapasowymi"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:107
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:113
@@ -858,32 +859,32 @@ msgstr "Kopia zapasowa"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:55
msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
-msgstr ""
+msgstr "Wystąpił błąd z listą kopii zapasowych."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
-msgstr ""
+msgstr "Wystąpił błąd podczas próby przywrócenia kopii zapasowej."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:15
msgctxt "@info:title"
msgid "Backups"
-msgstr ""
+msgstr "Kopie zapasowe"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:27
msgctxt "@info:backup_status"
msgid "Uploading your backup..."
-msgstr ""
+msgstr "Wgrywanie kopii zapasowej..."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:36
msgctxt "@info:backup_status"
msgid "There was an error while uploading your backup."
-msgstr ""
+msgstr "Wystąpił błąd podczas wgrywania kopii zapasowej."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:39
msgctxt "@info:backup_status"
msgid "Your backup has finished uploading."
-msgstr ""
+msgstr "Wgrywanie kopii zapasowej zakończone."
#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14
#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14
@@ -919,7 +920,7 @@ msgstr "Błąd zapisu pliku 3mf."
#: /home/ruben/Projects/Cura/plugins/PreviewStage/__init__.py:13
msgctxt "@item:inmenu"
msgid "Preview"
-msgstr ""
+msgstr "Podgląd"
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
@@ -927,11 +928,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr "Wybierz aktualizacje"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr "Sprawdzanie"
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -1001,7 +997,7 @@ msgstr "Plik pocięty wcześniej {0}"
#: /home/ruben/Projects/Cura/cura/API/Account.py:77
msgctxt "@info:title"
msgid "Login failed"
-msgstr ""
+msgstr "Logowanie nie powiodło się"
#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:201
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121
@@ -1020,7 +1016,7 @@ msgstr "Plik {0} już istnieje. Czy na pewno chcesz go nadp
#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
msgctxt "@info:status"
msgid "Invalid file URL:"
-msgstr ""
+msgstr "Nieprawidłowy adres URL pliku:"
#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
msgctxt "@menuitem"
@@ -1041,7 +1037,7 @@ msgstr "Ustawienia zostały zaaktualizowane"
#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
-msgstr ""
+msgstr "Ekstruder(y) wyłączony(/e)"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
#, python-brace-format
@@ -1070,44 +1066,44 @@ msgstr "Eksport udany"
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
-msgstr ""
+msgstr "Nie powiódł się import profilu z {0}: {1}"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Can't import profile from {0} before a printer is added."
-msgstr ""
+msgstr "Nie można importować profilu z {0} przed dodaniem drukarki."
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "No custom profile to import in file {0}"
-msgstr ""
+msgstr "Brak niestandardowego profilu do importu w pliku {0}"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:194
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}:"
-msgstr ""
+msgstr "Nie powiódł się import profilu z {0}:"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:218
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:228
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "This profile {0} contains incorrect data, could not import it."
-msgstr ""
+msgstr "Profil {0} zawiera błędne dane, nie można go importować."
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:241
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "The machine defined in profile {0} ({1}) doesn't match with your current machine ({2}), could not import it."
-msgstr ""
+msgstr "Drukarka zdefiniowana w profilu {0} ({1}) nie jest zgodna z bieżącą drukarką ({2}), nie można jej importować."
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to import profile from {0}:"
-msgstr ""
+msgstr "Nie powiódł się import profilu z {0}:"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:316
#, python-brace-format
@@ -1209,7 +1205,7 @@ msgstr "Podjęto próbę przywrócenia kopii zapasowej Cura, która nie odpowiad
#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
-msgstr ""
+msgstr "Nie można uzyskać dostępu do serwera kont Ultimaker."
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
@@ -1219,7 +1215,7 @@ msgstr "Zwielokrotnienie i umieszczanie przedmiotów"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:28
msgctxt "@info:title"
msgid "Placing Objects"
-msgstr ""
+msgstr "Umieść Obiekty"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:103
@@ -1599,7 +1595,7 @@ msgstr "Korekcja dyszy Y"
#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:452
msgctxt "@label"
msgid "Cooling Fan Number"
-msgstr ""
+msgstr "Numer Wentylatora"
#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:453
msgctxt "@label"
@@ -1635,7 +1631,7 @@ msgstr "Nie można połączyć się z bazą danych pakietów Cura. Sprawdź swoj
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/SmallRatingWidget.qml:27
msgctxt "@label"
msgid "ratings"
-msgstr ""
+msgstr "oceny"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
@@ -1654,7 +1650,7 @@ msgstr "Materiał"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:91
msgctxt "@label"
msgid "Your rating"
-msgstr ""
+msgstr "Twoja ocena"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
msgctxt "@label"
@@ -1687,7 +1683,7 @@ msgstr "Nieznany"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
-msgstr ""
+msgstr "Zaloguj aby zainstalować lub aktualizować"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
@@ -1710,7 +1706,7 @@ msgstr "Zaktualizowano"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:13
msgctxt "@title"
msgid "Marketplace"
-msgstr ""
+msgstr "Marketplace"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml:25
msgctxt "@action:button"
@@ -1720,7 +1716,7 @@ msgstr "Powrót"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20
msgctxt "@title:window"
msgid "Confirm uninstall"
-msgstr ""
+msgstr "Potwierdź deinstalację"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50
msgctxt "@text:window"
@@ -1745,12 +1741,12 @@ msgstr "Potwierdź"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to login first before you can rate"
-msgstr ""
+msgstr "Musisz być zalogowany aby ocenić"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to install the package before you can rate"
-msgstr ""
+msgstr "Musisz zainstalować pakiety zanim będziesz mógł ocenić"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:19
msgctxt "@info"
@@ -1790,7 +1786,7 @@ msgstr "Zostanie zainstalowane po ponownym uruchomieniu"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:53
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to update"
-msgstr ""
+msgstr "Zaloguj aby aktualizować"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:71
msgctxt "@action:button"
@@ -1841,22 +1837,22 @@ msgstr "Zgodność"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:203
msgctxt "@action:label"
msgid "Technical Data Sheet"
-msgstr ""
+msgstr "Dane Techniczne"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:212
msgctxt "@action:label"
msgid "Safety Data Sheet"
-msgstr ""
+msgstr "Dane Bezpieczeństwa"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:221
msgctxt "@action:label"
msgid "Printing Guidelines"
-msgstr ""
+msgstr "Wskazówki Drukowania"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:230
msgctxt "@action:label"
msgid "Website"
-msgstr ""
+msgstr "Strona Internetowa"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml:16
msgctxt "@info"
@@ -1897,7 +1893,7 @@ msgstr "Zamknij"
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:31
msgctxt "@title"
msgid "Update Firmware"
-msgstr ""
+msgstr "Aktualizacja Oprogramowania Sprzętowego"
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:39
msgctxt "@label"
@@ -1922,12 +1918,12 @@ msgstr "Prześlij niestandardowe oprogramowanie"
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:83
msgctxt "@label"
msgid "Firmware can not be updated because there is no connection with the printer."
-msgstr ""
+msgstr "Oprogramowanie sprzętowe nie może być zaktualizowane, ponieważ nie ma połączenia z drukarką."
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:91
msgctxt "@label"
msgid "Firmware can not be updated because the connection with the printer does not support upgrading firmware."
-msgstr ""
+msgstr "Oprogramowanie sprzętowe nie może być zaktualizowane, ponieważ połączenie z drukarką nie wspiera usługi."
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:98
msgctxt "@title:window"
@@ -1978,17 +1974,17 @@ msgstr "Zgoda Użytkownika"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
msgctxt "@info"
msgid "These options are not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Te opcje nie są dostępne, ponieważ nadzorujesz drukarkę w chmurze."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:241
msgctxt "@info"
msgid "The webcam is not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Kamera nie jest dostępna, ponieważ nadzorujesz drukarkę w chmurze."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
msgctxt "@label:status"
msgid "Loading..."
-msgstr ""
+msgstr "Wczytywanie..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
msgctxt "@label:status"
@@ -1998,48 +1994,48 @@ msgstr "Niedostępne"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
msgctxt "@label:status"
msgid "Unreachable"
-msgstr ""
+msgstr "Nieosiągalna"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
msgctxt "@label:status"
msgid "Idle"
-msgstr ""
+msgstr "Zajęta"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:353
msgctxt "@label"
msgid "Untitled"
-msgstr ""
+msgstr "Bez tytułu"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
msgctxt "@label"
msgid "Anonymous"
-msgstr ""
+msgstr "Anonimowa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
msgctxt "@label:status"
msgid "Requires configuration changes"
-msgstr ""
+msgstr "Wymaga zmian konfiguracji"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
msgctxt "@action:button"
msgid "Details"
-msgstr ""
+msgstr "Szczegóły"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "Unavailable printer"
-msgstr ""
+msgstr "Drukarka niedostępna"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
msgctxt "@label"
msgid "First available"
-msgstr ""
+msgstr "Pierwsza dostępna"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:187
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:132
msgctxt "@label"
msgid "Glass"
-msgstr ""
+msgstr "Szkło"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:31
msgctxt "@label"
@@ -2049,27 +2045,27 @@ msgstr "W kolejce"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
msgid "Go to Cura Connect"
-msgstr ""
+msgstr "Idź do Cura Connect"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
msgctxt "@label"
msgid "Print jobs"
-msgstr ""
+msgstr "Zadania druku"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Total print time"
-msgstr ""
+msgstr "Łączny czas druku"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
msgctxt "@label"
msgid "Waiting for"
-msgstr ""
+msgstr "Oczekiwanie na"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
msgctxt "@label link to connect manager"
msgid "View print history"
-msgstr ""
+msgstr "Poważ historię druku"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
msgctxt "@window:title"
@@ -2195,17 +2191,17 @@ msgstr "Zakończono"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Preparing..."
-msgstr ""
+msgstr "Przygotowyję..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Aborting..."
-msgstr ""
+msgstr "Przerywanie..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
msgctxt "@label:status"
msgid "Pausing..."
-msgstr ""
+msgstr "Zatrzymywanie..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
msgctxt "@label:status"
@@ -2215,7 +2211,7 @@ msgstr "Wstrzymana"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
msgctxt "@label:status"
msgid "Resuming..."
-msgstr ""
+msgstr "Przywracanie..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
msgctxt "@label:status"
@@ -2225,7 +2221,7 @@ msgstr "Konieczne są działania"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
msgctxt "@label:status"
msgid "Finishes %1 at %2"
-msgstr ""
+msgstr "Zakończone %1 z %2"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:44
msgctxt "@action:button"
@@ -2261,12 +2257,12 @@ msgstr "Ponów"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:102
msgctxt "@label"
msgid "Pausing..."
-msgstr ""
+msgstr "Zatrzymywanie..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:104
msgctxt "@label"
msgid "Resuming..."
-msgstr ""
+msgstr "Przywracanie..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:106
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284
@@ -2278,7 +2274,7 @@ msgstr "Wstrzymaj"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
msgid "Aborting..."
-msgstr ""
+msgstr "Przerywanie..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
@@ -2319,54 +2315,54 @@ msgstr "Anuluj wydruk"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:20
msgctxt "@title:window"
msgid "Configuration Changes"
-msgstr ""
+msgstr "Zmiany konfiguracji"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:27
msgctxt "@action:button"
msgid "Override"
-msgstr ""
+msgstr "Nadpisz"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
msgctxt "@label"
msgid "The assigned printer, %1, requires the following configuration change:"
msgid_plural "The assigned printer, %1, requires the following configuration changes:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Przypisana drukarka, %1, wymaga następującej zmiany konfiguracji:"
+msgstr[1] "Przypisana drukarka, %1, wymaga następujących zmian konfiguracji:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
msgctxt "@label"
msgid "The printer %1 is assigned, but the job contains an unknown material configuration."
-msgstr ""
+msgstr "Drukarka %1 jest przypisana, ale zadanie zawiera nieznaną konfigurację materiału."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:78
msgctxt "@label"
msgid "Change material %1 from %2 to %3."
-msgstr ""
+msgstr "Zmień materiał %1 z %2 na %3."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:81
msgctxt "@label"
msgid "Load %3 as material %1 (This cannot be overridden)."
-msgstr ""
+msgstr "Załaduj %3 jako materiał %1 (Nie można nadpisać)."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:84
msgctxt "@label"
msgid "Change print core %1 from %2 to %3."
-msgstr ""
+msgstr "Zmień rdzeń drukujący %1 z %2 na %3."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:87
msgctxt "@label"
msgid "Change build plate to %1 (This cannot be overridden)."
-msgstr ""
+msgstr "Zmień stół na %1 (Nie można nadpisać)."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
-msgstr ""
+msgstr "Nadpisanie spowoduje użycie określonych ustawień w istniejącej konfiguracji drukarki. Może to spowodować niepowodzenie druku."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
msgctxt "@label"
msgid "Aluminum"
-msgstr ""
+msgstr "Aluminum"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:75
msgctxt "@info:tooltip"
@@ -2380,21 +2376,24 @@ msgid ""
"- Check if the printer is turned on.\n"
"- Check if the printer is connected to the network."
msgstr ""
+"Upewnij się czy drukarka jest połączona:\n"
+"- Sprawdź czy drukarka jest włączona.\n"
+"- Sprawdź czy drukarka jest podłączona do sieci."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
msgctxt "@info"
msgid "Please select a network connected printer to monitor."
-msgstr ""
+msgstr "Wybierz drukarkę połączoną z siecią, aby nadzorować."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
msgctxt "@info"
msgid "Please connect your Ultimaker printer to your local network."
-msgstr ""
+msgstr "Połącz drukarkę Ultimaker z twoją siecią lokalną."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
-msgstr ""
+msgstr "Pokaż instrukcję użytkownika online"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
@@ -2430,17 +2429,17 @@ msgstr "Tryb zgodności"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
msgctxt "@label"
msgid "Travels"
-msgstr ""
+msgstr "Ruchy"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
msgctxt "@label"
msgid "Helpers"
-msgstr ""
+msgstr "Pomoce"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
msgctxt "@label"
msgid "Shell"
-msgstr ""
+msgstr "Obrys"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
@@ -2516,17 +2515,17 @@ msgstr "Cura wysyła anonimowe dane do Ultimaker w celu polepszenia jakości wyd
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
msgctxt "@text:window"
msgid "I don't want to send this data"
-msgstr ""
+msgstr "Nie chcę wysyłać danych"
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
msgctxt "@text:window"
msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr ""
+msgstr "Pozwól wysłać te dane do Ultimakera i pomóż nam ulepszyć Curę"
#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
msgctxt "@label"
msgid "No print selected"
-msgstr ""
+msgstr "Żaden wydruk nie jest zaznaczony"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2788,108 +2787,108 @@ msgstr "Otwórz"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:28
msgctxt "@title"
msgid "My Backups"
-msgstr ""
+msgstr "Moje Kopie Zapasowe"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:38
msgctxt "@empty_state"
msgid "You don't have any backups currently. Use the 'Backup Now' button to create one."
-msgstr ""
+msgstr "Nie masz żadnych kopii zapasowych. Użyj przycisku „Utwórz kopię zapasową”, aby go utworzyć."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:60
msgctxt "@backup_limit_info"
msgid "During the preview phase, you'll be limited to 5 visible backups. Remove a backup to see older ones."
-msgstr ""
+msgstr "Podczas fazy podglądu będziesz ograniczony do 5 widocznych kopii zapasowych. Usuń kopię zapasową, aby zobaczyć starsze."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:34
msgctxt "@description"
msgid "Backup and synchronize your Cura settings."
-msgstr ""
+msgstr "Wykonaj kopię zapasową i zsynchronizuj ustawienia Cura."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
msgctxt "@button"
msgid "Sign in"
-msgstr ""
+msgstr "Zaloguj"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/main.qml:24
msgctxt "@title:window"
msgid "Cura Backups"
-msgstr ""
+msgstr "Kopie zapasowe cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:21
msgctxt "@backuplist:label"
msgid "Cura Version"
-msgstr ""
+msgstr "Wersja Cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:29
msgctxt "@backuplist:label"
msgid "Machines"
-msgstr ""
+msgstr "Drukarki"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:37
msgctxt "@backuplist:label"
msgid "Materials"
-msgstr ""
+msgstr "Materiały"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:45
msgctxt "@backuplist:label"
msgid "Profiles"
-msgstr ""
+msgstr "Profile"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:53
msgctxt "@backuplist:label"
msgid "Plugins"
-msgstr ""
+msgstr "Pluginy"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:71
msgctxt "@button"
msgid "Restore"
-msgstr ""
+msgstr "Przywróć"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:99
msgctxt "@dialog:title"
msgid "Delete Backup"
-msgstr ""
+msgstr "Usuń kopię zapasową"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:100
msgctxt "@dialog:info"
msgid "Are you sure you want to delete this backup? This cannot be undone."
-msgstr ""
+msgstr "Czy na pewno chcesz usunąć tę kopię zapasową? Tej czynności nie można cofnąć."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:108
msgctxt "@dialog:title"
msgid "Restore Backup"
-msgstr ""
+msgstr "Przywróć kopię zapasową"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:109
msgctxt "@dialog:info"
msgid "You will need to restart Cura before your backup is restored. Do you want to close Cura now?"
-msgstr ""
+msgstr "Musisz zrestartować Curę przed przywróceniem kopii zapasowej. Czy chcesz teraz zamknąć Curę?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:22
msgctxt "@button"
msgid "Want more?"
-msgstr ""
+msgstr "Chcesz więcej?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:31
msgctxt "@button"
msgid "Backup Now"
-msgstr ""
+msgstr "Utwórz kopię zapasową"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:43
msgctxt "@checkbox:description"
msgid "Auto Backup"
-msgstr ""
+msgstr "Automatyczne tworzenie kopii zapasowej"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:44
msgctxt "@checkbox:description"
msgid "Automatically create a backup each day that Cura is started."
-msgstr ""
+msgstr "Automatycznie twórz kopie zapasowe każdego dnia, w którym uruchomiono Curę."
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMainSettingsSelector.qml:75
msgctxt "@label"
msgid "Not supported"
-msgstr ""
+msgstr "Niewspierany"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:35
msgctxt "@action:button"
@@ -2974,99 +2973,6 @@ msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr "Płyta grzewcza (zestaw oficjalny lub własnej roboty)"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27
-msgctxt "@title"
-msgid "Check Printer"
-msgstr "Sprawdź drukarkę"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39
-msgctxt "@label"
-msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"
-msgstr "Dobrym pomysłem jest zrobienie kilku testów na swoim Ultimakera. Możesz pominąć ten krok, jeśli wiesz, że urządzenie jest funkcjonalne"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53
-msgctxt "@action:button"
-msgid "Start Printer Check"
-msgstr "Rozpocznij sprawdzanie drukarki"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80
-msgctxt "@label"
-msgid "Connection: "
-msgstr "Połączenie: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Connected"
-msgstr "Połączono"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Not connected"
-msgstr "Nie połączono"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99
-msgctxt "@label"
-msgid "Min endstop X: "
-msgstr "Krańcówka min. X: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-msgctxt "@info:status"
-msgid "Works"
-msgstr "Pracuje"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Not checked"
-msgstr "Niesprawdzone"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120
-msgctxt "@label"
-msgid "Min endstop Y: "
-msgstr "Krańcówka min. Y: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141
-msgctxt "@label"
-msgid "Min endstop Z: "
-msgstr "Krańcówka min. Z: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163
-msgctxt "@label"
-msgid "Nozzle temperature check: "
-msgstr "Sprawdzanie temperatury dyszy: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Stop Heating"
-msgstr "Zatrzymaj ogrzewanie"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Start Heating"
-msgstr "Rozpocznij ogrzewanie"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223
-msgctxt "@label"
-msgid "Build plate temperature check:"
-msgstr "Kontrola temperatury płyty konstrukcyjnej:"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Checked"
-msgstr "Sprawdzone"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284
-msgctxt "@label"
-msgid "Everything is in order! You're done with your CheckUp."
-msgstr "Wszystko w porządku! Skończono sprawdzenie."
-
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"
msgid "Not connected to a printer"
@@ -3638,7 +3544,7 @@ msgstr "Stwórz profil"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
msgctxt "@info"
msgid "Please provide a name for this profile."
-msgstr ""
+msgstr "Podaj nazwę tego profilu."
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
msgctxt "@title:window"
@@ -3668,7 +3574,7 @@ msgstr "Drukarka: %1"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
msgid "Default profiles"
-msgstr ""
+msgstr "Domyślne profile"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
@@ -3703,7 +3609,7 @@ msgstr "Ustawienia ogólne"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
msgctxt "@action:button"
msgid "Marketplace"
-msgstr ""
+msgstr "Marketplace"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:27
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:13
@@ -3726,7 +3632,7 @@ msgstr "&Widok"
#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:13
msgctxt "@title:menu menubar:toplevel"
msgid "&Settings"
-msgstr ""
+msgstr "Opcje"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:55
msgctxt "@title:menu menubar:toplevel"
@@ -3761,7 +3667,7 @@ msgstr "Bez tytułu"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:68
msgctxt "@label:textbox"
msgid "search settings"
-msgstr ""
+msgstr "ustawienia wyszukiwania"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
msgctxt "@action:menu"
@@ -3850,17 +3756,17 @@ msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
msgctxt "@button"
msgid "Recommended"
-msgstr ""
+msgstr "Polecane"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
msgctxt "@button"
msgid "Custom"
-msgstr ""
+msgstr "Niestandardowe"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:193
msgctxt "@label"
msgid "Gradual infill"
-msgstr ""
+msgstr "Stopniowe wypełnienie"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:232
msgctxt "@label"
@@ -3870,7 +3776,7 @@ msgstr "Stopniowe wypełnienie stopniowo zwiększa ilość wypełnień w górę.
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
msgctxt "@label"
msgid "Support"
-msgstr ""
+msgstr "Podpory"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
msgctxt "@label"
@@ -3885,7 +3791,7 @@ msgstr "Wybierz, który ekstruder ma służyć do drukowania podpór. Powoduje t
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
msgctxt "@label"
msgid "Adhesion"
-msgstr ""
+msgstr "Przyczepność"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
msgctxt "@label"
@@ -3905,7 +3811,7 @@ msgstr "Zmodyfikowałeś ustawienia profilu. Jeżeli chcesz je zmienić, przejd
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:355
msgctxt "@tooltip"
msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile"
-msgstr ""
+msgstr "Ten profil jakości nie jest dostępny dla bieżącej konfiguracji materiałów i dysz. Zmień je, aby włączyć ten profil jakości"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3915,17 +3821,17 @@ msgstr "Niestandardowy profil jest obecnie aktywny. Aby włączyć pasek jakośc
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:13
msgctxt "@label:Should be short"
msgid "On"
-msgstr ""
+msgstr "Wł"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:14
msgctxt "@label:Should be short"
msgid "Off"
-msgstr ""
+msgstr "Wył"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:27
msgctxt "@label"
msgid "Profile"
-msgstr ""
+msgstr "Profil"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:94
msgctxt "@tooltip"
@@ -3941,7 +3847,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label shown when we load a Gcode file"
msgid "Print setup disabled. G code file can not be modified."
-msgstr ""
+msgstr "Ustawienia druku niedostępne. Plik .gcode nie może być modyfikowany."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -4182,47 +4088,47 @@ msgstr "Liczba kopii"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/AutoConfiguration.qml:18
msgctxt "@header"
msgid "Configurations"
-msgstr ""
+msgstr "Konfiguracje"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:110
msgctxt "@label"
msgid "Select configuration"
-msgstr ""
+msgstr "Wybierz konfigurację"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
msgctxt "@label"
msgid "See the material compatibility chart"
-msgstr ""
+msgstr "Zobacz tabelę kompatybilności materiałów"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
msgctxt "@label"
msgid "Configurations"
-msgstr ""
+msgstr "Konfiguracje"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:57
msgctxt "@label"
msgid "Loading available configurations from the printer..."
-msgstr ""
+msgstr "Ładowanie dostępnych konfiguracji z drukarki..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:58
msgctxt "@label"
msgid "The configurations are not available because the printer is disconnected."
-msgstr ""
+msgstr "Konfiguracje są niedostępne, ponieważ drukarka jest odłączona."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:25
msgctxt "@header"
msgid "Custom"
-msgstr ""
+msgstr "Niestandardowe"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:61
msgctxt "@label"
msgid "Printer"
-msgstr ""
+msgstr "Drukarka"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
msgctxt "@label"
msgid "Enabled"
-msgstr ""
+msgstr "Włączona"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
msgctxt "@label"
@@ -4232,17 +4138,17 @@ msgstr "Materiał"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
-msgstr ""
+msgstr "Użyj kleju dla lepszej przyczepności dla tej kombinacji materiałów."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:128
msgctxt "@label"
msgid "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile."
-msgstr ""
+msgstr "Ta konfiguracja jest niedostępna, ponieważ %1 jest nierozpoznany. Przejdź do %2, aby pobrać prawidłowy profil materiału."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:129
msgctxt "@label"
msgid "Marketplace"
-msgstr ""
+msgstr "Marketplace"
#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:15
msgctxt "@title:menu menubar:file"
@@ -4272,37 +4178,37 @@ msgstr "Szacowany czas pozostały"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
msgid "View types"
-msgstr ""
+msgstr "Typy widoków"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
msgctxt "@label"
msgid "Hi "
-msgstr ""
+msgstr "Cześć "
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
msgctxt "@button"
msgid "Ultimaker account"
-msgstr ""
+msgstr "konto Ultimaker"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
msgctxt "@button"
msgid "Sign out"
-msgstr ""
+msgstr "Wyloguj"
#: /home/ruben/Projects/Cura/resources/qml/Account/AccountWidget.qml:24
msgctxt "@action:button"
msgid "Sign in"
-msgstr ""
+msgstr "Zaloguj"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
msgctxt "@label"
msgid "Ultimaker Cloud"
-msgstr ""
+msgstr "Chmura Ultimaker"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
-msgstr ""
+msgstr "Nowa generacja systemu drukowania 3D"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:51
msgctxt "@text"
@@ -4311,26 +4217,29 @@ msgid ""
"- Store your Ultimaker Cura settings in the cloud for use anywhere\n"
"- Get exclusive access to material profiles from leading brands"
msgstr ""
+"- Wysyłaj zadania druku do drukarek Ultimaker poza siecią lokalną\n"
+"- Przechowuj ustawienia Ultimaker Cura w chmurze, aby używać w każdym miejscu\n"
+"- Uzyskaj wyłączny dostęp do profili materiałów wiodących marek"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
msgid "Create account"
-msgstr ""
+msgstr "Utwórz konto"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
msgctxt "@label"
msgid "No time estimation available"
-msgstr ""
+msgstr "Szacunkowy czas niedostępny"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
msgctxt "@label"
msgid "No cost estimation available"
-msgstr ""
+msgstr "Szacunkowy koszt niedostępny"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
msgctxt "@button"
msgid "Preview"
-msgstr ""
+msgstr "Podgląd"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
msgctxt "@label:PrintjobStatus"
@@ -4345,27 +4254,27 @@ msgstr "Nie można pociąć"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
msgctxt "@button"
msgid "Slice"
-msgstr ""
+msgstr "Potnij"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
msgctxt "@label"
msgid "Start the slicing process"
-msgstr ""
+msgstr "Rozpocznij proces cięcia"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
msgctxt "@button"
msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
msgid "Time specification"
-msgstr ""
+msgstr "Specyfikacja czasu"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
msgid "Material specification"
-msgstr ""
+msgstr "Specyfikacja materiału"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4380,27 +4289,27 @@ msgstr "%1g"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Connected printers"
-msgstr ""
+msgstr "Podłączone drukarki"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Preset printers"
-msgstr ""
+msgstr "Zdefiniowane drukarki"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
msgctxt "@button"
msgid "Add printer"
-msgstr ""
+msgstr "Dodaj drukarkę"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
msgctxt "@button"
msgid "Manage printers"
-msgstr ""
+msgstr "Zarządzaj drukarkami"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
-msgstr ""
+msgstr "Pokaż przewodnik rozwiązywania problemów online"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
msgctxt "@action:inmenu"
@@ -4611,7 +4520,7 @@ msgstr "Pokaż folder konfiguracji"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
msgctxt "@action:menu"
msgid "&Marketplace"
-msgstr ""
+msgstr "&Marketplace"
#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
msgctxt "@title:window"
@@ -4730,7 +4639,7 @@ msgstr "Utwórz nowy profil"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
msgctxt "@title:tab"
msgid "Add a printer to Cura"
-msgstr ""
+msgstr "Dodaj drukarkę do Cura"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
msgctxt "@title:tab"
@@ -4739,16 +4648,19 @@ msgid ""
"\n"
"If your printer is not in the list, use the \"Custom FFF Printer\" from the \"Custom\" category and adjust the settings to match your printer in the next dialog."
msgstr ""
+"Z poniższej listy wybierz drukarkę, której chcesz użyć.\n"
+"\n"
+"Jeśli drukarki nie ma na liście, użyj „Niestandardowa drukarka FFF” z kategorii „Niestandardowy” i dostosuj ustawienia, aby pasowały do drukarki w następnym oknie dialogowym."
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
msgctxt "@label"
msgid "Manufacturer"
-msgstr ""
+msgstr "Producent"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
msgctxt "@label"
msgid "Printer Name"
-msgstr ""
+msgstr "Nazwa drukarki"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
msgctxt "@action:button"
@@ -4842,17 +4754,17 @@ msgstr "Wsparcie biblioteki do obsługi plików STL"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:147
msgctxt "@label"
msgid "Support library for handling planar objects"
-msgstr ""
+msgstr "Biblioteka pomocnicza do obsługi obiektów płaskich"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:148
msgctxt "@label"
msgid "Support library for handling triangular meshes"
-msgstr ""
+msgstr "Biblioteka pomocnicza do obsługi siatek trójkątów"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:149
msgctxt "@label"
msgid "Support library for analysis of complex networks"
-msgstr ""
+msgstr "Biblioteka pomocnicza do analizy złożonych sieci"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:150
msgctxt "@label"
@@ -4862,7 +4774,7 @@ msgstr "Wsparcie biblioteki do obsługi plików 3MF"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:151
msgctxt "@label"
msgid "Support library for file metadata and streaming"
-msgstr ""
+msgstr "Biblioteka pomocy dla metadanych plików i przesyłania strumieniowego"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:152
msgctxt "@label"
diff --git a/resources/i18n/pl_PL/fdmextruder.def.json.po b/resources/i18n/pl_PL/fdmextruder.def.json.po
index fc5bd13c35..ad470759e6 100644
--- a/resources/i18n/pl_PL/fdmextruder.def.json.po
+++ b/resources/i18n/pl_PL/fdmextruder.def.json.po
@@ -8,15 +8,15 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-03-30 20:33+0200\n"
-"Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
+"Last-Translator: Mariusz 'Virgin71' Matłosz \n"
"Language-Team: reprapy.pl\n"
"Language: pl_PL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Poedit 2.0.6\n"
+"X-Generator: Poedit 2.1.1\n"
#: fdmextruder.def.json
msgctxt "machine_settings label"
@@ -86,7 +86,7 @@ msgstr "Początkowy G-code Ekstrudera"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
-msgstr ""
+msgstr "Początkowy G-code do wykonania przy przełączeniu na ten ekstruder."
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_abs label"
@@ -126,7 +126,7 @@ msgstr "Końcowy G-code Ekstrudera"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_code description"
msgid "End g-code to execute when switching away from this extruder."
-msgstr ""
+msgstr "Końcowy G-code do wykonania przy przełączeniu na ten ekstruder."
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_abs label"
@@ -171,12 +171,12 @@ msgstr "Współrzędna Z, w której dysza jest czyszczona na początku wydruku."
#: fdmextruder.def.json
msgctxt "machine_extruder_cooling_fan_number label"
msgid "Extruder Print Cooling Fan"
-msgstr ""
+msgstr "Wentylator ekstrudera"
#: fdmextruder.def.json
msgctxt "machine_extruder_cooling_fan_number description"
msgid "The number of the print cooling fan associated with this extruder. Only change this from the default value of 0 when you have a different print cooling fan for each extruder."
-msgstr ""
+msgstr "Numer wentylatora przypisanego do ekstrudera. Zmień z domyślnej wartości 0, tylko w przypadku, kiedy posiadasz oddzielny wentylator dla każdego ekstrudera."
#: fdmextruder.def.json
msgctxt "platform_adhesion label"
diff --git a/resources/i18n/pl_PL/fdmprinter.def.json.po b/resources/i18n/pl_PL/fdmprinter.def.json.po
index 027d15ef2f..faa1b46754 100644
--- a/resources/i18n/pl_PL/fdmprinter.def.json.po
+++ b/resources/i18n/pl_PL/fdmprinter.def.json.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-21 21:52+0200\n"
-"Last-Translator: 'Jaguś' Paweł Jagusiak, Andrzej 'anraf1001' Rafalski and Jakub 'drzejkopf' Świeciński\n"
+"PO-Revision-Date: 2019-03-14 14:44+0100\n"
+"Last-Translator: Mariusz 'Virgin71' Matłosz \n"
"Language-Team: reprapy.pl\n"
"Language: pl_PL\n"
"MIME-Version: 1.0\n"
@@ -248,7 +248,7 @@ msgstr "Liczba zespołów ekstruderów, które są dostępne; automatycznie usta
#: fdmprinter.def.json
msgctxt "machine_nozzle_tip_outer_diameter label"
msgid "Outer nozzle diameter"
-msgstr "Zewn. średnica dyszy"
+msgstr "Zew. średnica dyszy"
#: fdmprinter.def.json
msgctxt "machine_nozzle_tip_outer_diameter description"
@@ -763,7 +763,7 @@ msgstr "Szerokość jednej linii ściany."
#: fdmprinter.def.json
msgctxt "wall_line_width_0 label"
msgid "Outer Wall Line Width"
-msgstr "Szerokość Linii Ściany Zewn."
+msgstr "Szerokość Linii Ścian(y) Zewnętrznych"
#: fdmprinter.def.json
msgctxt "wall_line_width_0 description"
@@ -773,7 +773,7 @@ msgstr "Szerokość zewnętrznej linii ściany. Przez obniżenie tej wartości w
#: fdmprinter.def.json
msgctxt "wall_line_width_x label"
msgid "Inner Wall(s) Line Width"
-msgstr "Szerokość Linii Ściany Wewn."
+msgstr "Szerokość Linii Ścian(y) Wewnętnych"
#: fdmprinter.def.json
msgctxt "wall_line_width_x description"
@@ -793,7 +793,7 @@ msgstr "Szerokość pojedynczej górnej/dolnej linii."
#: fdmprinter.def.json
msgctxt "infill_line_width label"
msgid "Infill Line Width"
-msgstr "Szerokość Linii Wypełn."
+msgstr "Szerokość Linii Wypełnienia"
#: fdmprinter.def.json
msgctxt "infill_line_width description"
@@ -853,7 +853,7 @@ msgstr "Szerokość pojedynczej linii podłoża podpory."
#: fdmprinter.def.json
msgctxt "prime_tower_line_width label"
msgid "Prime Tower Line Width"
-msgstr "Szerokość Linii Wieży Czyszcz."
+msgstr "Szerokość Linii Wieży Czyszczczenia"
#: fdmprinter.def.json
msgctxt "prime_tower_line_width description"
@@ -893,7 +893,7 @@ msgstr "Ekstruder używany do drukowania ścian. Używane w multi-esktruzji."
#: fdmprinter.def.json
msgctxt "wall_0_extruder_nr label"
msgid "Outer Wall Extruder"
-msgstr "Esktruder Zewn. Ściany"
+msgstr "Esktruder Zew. Ściany"
#: fdmprinter.def.json
msgctxt "wall_0_extruder_nr description"
@@ -903,7 +903,7 @@ msgstr "Esktruder używany do drukowania zewn. ściany. Używane w multi-ekstruz
#: fdmprinter.def.json
msgctxt "wall_x_extruder_nr label"
msgid "Inner Wall Extruder"
-msgstr "Ekstruder Wewn. Linii"
+msgstr "Ekstruder Wew. Linii"
#: fdmprinter.def.json
msgctxt "wall_x_extruder_nr description"
@@ -933,7 +933,7 @@ msgstr "Liczba ścian. Przy obliczaniu za pomocą grubości ściany, ta wartoś
#: fdmprinter.def.json
msgctxt "wall_0_wipe_dist label"
msgid "Outer Wall Wipe Distance"
-msgstr "Długość Czyszczenia Zewn. Ściana"
+msgstr "Długość Czyszczenia Zew. Ściana"
#: fdmprinter.def.json
msgctxt "wall_0_wipe_dist description"
@@ -1078,7 +1078,7 @@ msgstr "Połącz Górne/Dolne Wieloboki"
#: fdmprinter.def.json
msgctxt "connect_skin_polygons description"
msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happen midway over infill this feature can reduce the top surface quality."
-msgstr ""
+msgstr "Połącz górne/dolne ścieżki, które przebiegają koło siebie. Włączenie tej opcji powoduje ograniczenie czasu ruchów jałowych dla wzorca koncentrycznego, ale ze względu na możliwość pojawienia się połączeń w połowie ścieżki wypełnienia, opcja ta może obniżyć jakość górnego wykończenia."
#: fdmprinter.def.json
msgctxt "skin_angles label"
@@ -1093,7 +1093,7 @@ msgstr "Lista całkowitych kierunków linii używana kiedy górne/dolne warstwy
#: fdmprinter.def.json
msgctxt "wall_0_inset label"
msgid "Outer Wall Inset"
-msgstr "Wkład Zewn. Ściany"
+msgstr "Wkład Zew. Ściany"
#: fdmprinter.def.json
msgctxt "wall_0_inset description"
@@ -1113,7 +1113,7 @@ msgstr "Optymalizuje kolejność, w jakiej będą drukowane ścianki w celu zred
#: fdmprinter.def.json
msgctxt "outer_inset_first label"
msgid "Outer Before Inner Walls"
-msgstr "Zewn. Ściany przed Wewn."
+msgstr "Zew. Ściany Przed Wew"
#: fdmprinter.def.json
msgctxt "outer_inset_first description"
@@ -1143,7 +1143,7 @@ msgstr "Kompensuje przepływ dla części, których ściana jest drukowana kiedy
#: fdmprinter.def.json
msgctxt "travel_compensate_overlapping_walls_0_enabled label"
msgid "Compensate Outer Wall Overlaps"
-msgstr "Komp. Zewn. Nakład. się Ścian"
+msgstr "Komp. Zew. Nakład. się Ścian"
#: fdmprinter.def.json
msgctxt "travel_compensate_overlapping_walls_0_enabled description"
@@ -1153,7 +1153,7 @@ msgstr "Kompensuje przepływ dla części, których zewnętrzna ściana jest dru
#: fdmprinter.def.json
msgctxt "travel_compensate_overlapping_walls_x_enabled label"
msgid "Compensate Inner Wall Overlaps"
-msgstr "Komp. Wewn. Nakład. się Ścian"
+msgstr "Komp. Wew. Nakład. się Ścian"
#: fdmprinter.def.json
msgctxt "travel_compensate_overlapping_walls_x_enabled description"
@@ -1463,7 +1463,7 @@ msgstr "Wypełnienie"
#: fdmprinter.def.json
msgctxt "infill_extruder_nr label"
msgid "Infill Extruder"
-msgstr "Ekstruder Wypełn."
+msgstr "Ekstruder Wypełnienia"
#: fdmprinter.def.json
msgctxt "infill_extruder_nr description"
@@ -1473,7 +1473,7 @@ msgstr "Ekstruder używany do drukowania wypełnienia. Używane w multi-ekstruzj
#: fdmprinter.def.json
msgctxt "infill_sparse_density label"
msgid "Infill Density"
-msgstr "Gęstość Wypełn."
+msgstr "Gęstość Wypełnnienia"
#: fdmprinter.def.json
msgctxt "infill_sparse_density description"
@@ -1483,7 +1483,7 @@ msgstr "Dostosowuje gęstość wypełnienia wydruku."
#: fdmprinter.def.json
msgctxt "infill_line_distance label"
msgid "Infill Line Distance"
-msgstr "Odstęp Linii Wypełn."
+msgstr "Odstęp Linii Wypełnienia"
#: fdmprinter.def.json
msgctxt "infill_line_distance description"
@@ -1493,12 +1493,12 @@ msgstr "Odległość między drukowanymi liniami wypełnienia. To ustawienie jes
#: fdmprinter.def.json
msgctxt "infill_pattern label"
msgid "Infill Pattern"
-msgstr "Wzór Wypełn."
+msgstr "Wzorzec Wypełnienia"
#: fdmprinter.def.json
msgctxt "infill_pattern description"
msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Gyroid, cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction."
-msgstr ""
+msgstr "Wzorzec wypełnienia wydruku. Kierunek zamiany linii i zygzaka na alternatywnych warstwach, zmniejsza koszty materiałów. Wzorzec siatki, trójkąta, sześcianu, oktetu, ćwiartki sześciennej, krzyżyka i koncentryczny, są w pełni drukowane na każdej warstwie. Gyroid, sześcian, świartka sześcienna i oktet zmienia się z każdą warstwą, aby zapewnić bardziej równomierny rozkład sił w każdym kierunku."
#: fdmprinter.def.json
msgctxt "infill_pattern option grid"
@@ -1563,7 +1563,7 @@ msgstr "Krzyż 3D"
#: fdmprinter.def.json
msgctxt "infill_pattern option gyroid"
msgid "Gyroid"
-msgstr ""
+msgstr "Gyroid"
#: fdmprinter.def.json
msgctxt "zig_zaggify_infill label"
@@ -1588,7 +1588,7 @@ msgstr "Łączy ścieżki wypełnienia, gdy są one prowadzone obok siebie. Dla
#: fdmprinter.def.json
msgctxt "infill_angles label"
msgid "Infill Line Directions"
-msgstr "Kierunek Linii Wypełn."
+msgstr "Kierunek Linii Wypełnienia"
#: fdmprinter.def.json
msgctxt "infill_angles description"
@@ -1652,7 +1652,7 @@ msgstr "Dodatek do promienia od środka każdej kostki, aby sprawdzić granicę
#: fdmprinter.def.json
msgctxt "infill_overlap label"
msgid "Infill Overlap Percentage"
-msgstr "Procent Nałożenia Wypełn."
+msgstr "Procent Zachodzenia Wypełnienia"
#: fdmprinter.def.json
msgctxt "infill_overlap description"
@@ -1662,7 +1662,7 @@ msgstr "Ilość nałożenia pomiędzy wypełnieniem i ścianami w procentach sze
#: fdmprinter.def.json
msgctxt "infill_overlap_mm label"
msgid "Infill Overlap"
-msgstr "Nałożenie Wypełn."
+msgstr "Zachodzenie Wypełnienia"
#: fdmprinter.def.json
msgctxt "infill_overlap_mm description"
@@ -1677,7 +1677,7 @@ msgstr "Procent Nakładania się Skóry"
#: fdmprinter.def.json
msgctxt "skin_overlap description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines, as a percentage of the line widths of the skin lines and the innermost wall. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any percentage over 50% may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Dostosuj zachodzenie pomiędzy ścianami, a (punktami końcowymi) linią obrysu, jako procent szerokości linii obrysu i najbardziej wewnętrznej ściany. Niewielkie zachodzenie na siebie pozwala ścianom połączyć się mocno z obrysem. Zauważ, że przy równej szerokości obrysu i szerokości ściany, każdy procent powyżej 50% może spowodować przekroczenie ściany przez obrys, ponieważ pozycja dyszy ekstrudera obrysu może sięgać poza środek ściany."
#: fdmprinter.def.json
msgctxt "skin_overlap_mm label"
@@ -1687,12 +1687,12 @@ msgstr "Nakładanie się Skóry"
#: fdmprinter.def.json
msgctxt "skin_overlap_mm description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any value over half the width of the wall may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Dostosuj zachodzenie pomiędzy ścianami, a (punktami końcowymi) linią obrysu. Niewielkie zachodzenie na siebie pozwala ścianom połączyć się mocno z obrysem. Zauważ, że przy równej szerokości obrysu i szerokości ściany, każdy procent powyżej 50% może spowodować przekroczenie ściany przez obrys, ponieważ pozycja dyszy ekstrudera obrysu może sięgać poza środek ściany."
#: fdmprinter.def.json
msgctxt "infill_wipe_dist label"
msgid "Infill Wipe Distance"
-msgstr "Dług. Czyszczenia Wypełn."
+msgstr "Długość Czyszczenia Wypełnienia"
#: fdmprinter.def.json
msgctxt "infill_wipe_dist description"
@@ -1702,7 +1702,7 @@ msgstr "Odległość ruchu jałowego pomiędzy każdą linią wypełnienia, aby
#: fdmprinter.def.json
msgctxt "infill_sparse_thickness label"
msgid "Infill Layer Thickness"
-msgstr "Grubość Warstwy Wypełn."
+msgstr "Grubość Warstwy Wypełnienia"
#: fdmprinter.def.json
msgctxt "infill_sparse_thickness description"
@@ -1712,7 +1712,7 @@ msgstr "Grubość na warstwe materiału wypełniającego. Ta wartość powinna z
#: fdmprinter.def.json
msgctxt "gradual_infill_steps label"
msgid "Gradual Infill Steps"
-msgstr "Stopnie Stopniowego Wypełn."
+msgstr "Stopniowe Kroki Wypełnienia"
#: fdmprinter.def.json
msgctxt "gradual_infill_steps description"
@@ -1722,7 +1722,7 @@ msgstr "Liczba redukcji wypełnienia o połowę podczas drukowania poniżej gór
#: fdmprinter.def.json
msgctxt "gradual_infill_step_height label"
msgid "Gradual Infill Step Height"
-msgstr "Wys. Stopnia Stopniowego Wypełn."
+msgstr "Wysokość Kroku Stopniowego Wypełnienia"
#: fdmprinter.def.json
msgctxt "gradual_infill_step_height description"
@@ -1742,7 +1742,7 @@ msgstr "Wydrukuj wypełnienie przed wydrukowaniem ścian. Drukowanie ścian jako
#: fdmprinter.def.json
msgctxt "min_infill_area label"
msgid "Minimum Infill Area"
-msgstr "Min. Obszar Wypełn."
+msgstr "Min. Obszar Wypełnienia"
#: fdmprinter.def.json
msgctxt "min_infill_area description"
@@ -2127,7 +2127,7 @@ msgstr "Długość Retrakcji przy Zmianie Dyszy"
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_amount description"
msgid "The amount of retraction when switching extruders. Set to 0 for no retraction at all. This should generally be the same as the length of the heat zone."
-msgstr ""
+msgstr "Wielkość retrakcji przy przełączaniu ekstruderów. Ustaw na 0, aby wyłączyć retrakcję. Powinno być ustawione tak samo jak długość strefy grzania."
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_speeds label"
@@ -2182,7 +2182,7 @@ msgstr "Prędkość druku."
#: fdmprinter.def.json
msgctxt "speed_infill label"
msgid "Infill Speed"
-msgstr "Prędkość Wypełn."
+msgstr "Prędkość Wypełnienia"
#: fdmprinter.def.json
msgctxt "speed_infill description"
@@ -2202,7 +2202,7 @@ msgstr "Prędkość drukowania ścian."
#: fdmprinter.def.json
msgctxt "speed_wall_0 label"
msgid "Outer Wall Speed"
-msgstr "Prędkość Zewn. Ściany"
+msgstr "Prędkość Zew. Ściany"
#: fdmprinter.def.json
msgctxt "speed_wall_0 description"
@@ -2212,7 +2212,7 @@ msgstr "Szybkość, z jaką drukowane są ściany zewnętrzne. Drukując zewnęt
#: fdmprinter.def.json
msgctxt "speed_wall_x label"
msgid "Inner Wall Speed"
-msgstr "Prędkość Wewn. Ściany"
+msgstr "Prędkość Wew. Ściany"
#: fdmprinter.def.json
msgctxt "speed_wall_x description"
@@ -2292,7 +2292,7 @@ msgstr "Prędkość, z jaką drukowane jest podłoże podpory. Drukowanie z niż
#: fdmprinter.def.json
msgctxt "speed_prime_tower label"
msgid "Prime Tower Speed"
-msgstr "Prędkość Wieży Czyszcz."
+msgstr "Prędkość Wieży Czyszczenia"
#: fdmprinter.def.json
msgctxt "speed_prime_tower description"
@@ -2432,7 +2432,7 @@ msgstr "Przyspieszenie, z jakim drukowane są ściany."
#: fdmprinter.def.json
msgctxt "acceleration_wall_0 label"
msgid "Outer Wall Acceleration"
-msgstr "Przyspieszenie Ściany Zewn."
+msgstr "Przyspieszenie Ściany Zew"
#: fdmprinter.def.json
msgctxt "acceleration_wall_0 description"
@@ -2442,7 +2442,7 @@ msgstr "Przyspieszenia, z jakim drukowane są ściany zewn."
#: fdmprinter.def.json
msgctxt "acceleration_wall_x label"
msgid "Inner Wall Acceleration"
-msgstr "Przyspieszenie Ściany Wewn."
+msgstr "Przyspieszenie Ściany Wew"
#: fdmprinter.def.json
msgctxt "acceleration_wall_x description"
@@ -2622,7 +2622,7 @@ msgstr "Maksymalna zmiana prędkości chwilowej z jaką drukowane są ściany."
#: fdmprinter.def.json
msgctxt "jerk_wall_0 label"
msgid "Outer Wall Jerk"
-msgstr "Zryw Zewn. Ścian"
+msgstr "Zryw Zew. Ścian"
#: fdmprinter.def.json
msgctxt "jerk_wall_0 description"
@@ -2632,7 +2632,7 @@ msgstr "Maksymalna zmiana prędkości chwilowej z jaką drukowane są zewnętrzn
#: fdmprinter.def.json
msgctxt "jerk_wall_x label"
msgid "Inner Wall Jerk"
-msgstr "Zryw Wewn. Ścian"
+msgstr "Zryw Wew. Ścian"
#: fdmprinter.def.json
msgctxt "jerk_wall_x description"
@@ -2787,7 +2787,7 @@ msgstr "Tryb Kombinowania"
#: fdmprinter.def.json
msgctxt "retraction_combing description"
msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas or to only comb within the infill."
-msgstr ""
+msgstr "Combing utrzymuje dyszę w obszarach wydruku podczas poruszania. Powoduje to nieco dłuższe ruchy, ale zmniejsza potrzebę retrakcji. Jeśli Combing jest wyłączone, następuje retrakcja, a dysza przesuwa się w linii prostej do następnego punktu. Możliwe jest wyłączenie opcji górnych / dolnych obszarach obrysu lub utrzymanie dyszy w obrębie wypełnienia."
#: fdmprinter.def.json
msgctxt "retraction_combing option off"
@@ -2822,7 +2822,7 @@ msgstr "Przy wartości niezerowej, kombinowane ruchy jałowe o dystansie większ
#: fdmprinter.def.json
msgctxt "travel_retract_before_outer_wall label"
msgid "Retract Before Outer Wall"
-msgstr "Cofnij Przed Zewn. Ścianą"
+msgstr "Cofnij Przed Zew. Ścianą"
#: fdmprinter.def.json
msgctxt "travel_retract_before_outer_wall description"
@@ -3272,32 +3272,32 @@ msgstr "Orientacja wzoru wypełnienia dla podpór. Wzór podpory jest obracany w
#: fdmprinter.def.json
msgctxt "support_brim_enable label"
msgid "Enable Support Brim"
-msgstr ""
+msgstr "Włącz Obrys Podpór"
#: fdmprinter.def.json
msgctxt "support_brim_enable description"
msgid "Generate a brim within the support infill regions of the first layer. This brim is printed underneath the support, not around it. Enabling this setting increases the adhesion of support to the build plate."
-msgstr ""
+msgstr "Generuj obrys w obszarach wypełnienia podpory pierwszej warstwy. Obrys jest drukowany pod podporą, a nie wokół. Włączenie tej opcji zwiększa przyczepność podpór do stołu."
#: fdmprinter.def.json
msgctxt "support_brim_width label"
msgid "Support Brim Width"
-msgstr ""
+msgstr "Szerokość Obrysu Podpór"
#: fdmprinter.def.json
msgctxt "support_brim_width description"
msgid "The width of the brim to print underneath the support. A larger brim enhances adhesion to the build plate, at the cost of some extra material."
-msgstr ""
+msgstr "Szerokość obrysu, który ma być wydrukowany pod podporami. Szerszy obrys to większa przyczepność do stołu, kosztem zużytego materiału."
#: fdmprinter.def.json
msgctxt "support_brim_line_count label"
msgid "Support Brim Line Count"
-msgstr ""
+msgstr "Ilość Linii Obrysu Podpór"
#: fdmprinter.def.json
msgctxt "support_brim_line_count description"
msgid "The number of lines used for the support brim. More brim lines enhance adhesion to the build plate, at the cost of some extra material."
-msgstr ""
+msgstr "Liczba linii używanych do obrysu podpór. Większa ilość linii obrysu to większa przyczepność do stołu, kosztem zużytego materiału."
#: fdmprinter.def.json
msgctxt "support_z_distance label"
@@ -3442,12 +3442,12 @@ msgstr "Wysokość wypełnienia podpory o danej gęstości przed przełączeniem
#: fdmprinter.def.json
msgctxt "minimum_support_area label"
msgid "Minimum Support Area"
-msgstr ""
+msgstr "Minimalna Powierzchnia Podpór"
#: fdmprinter.def.json
msgctxt "minimum_support_area description"
msgid "Minimum area size for support polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Minimalny rozmiar powierzchni dla podpór. Obszary, które mają mniejszą powierzchnię od tej wartości, nie będą generowane."
#: fdmprinter.def.json
msgctxt "support_interface_enable label"
@@ -3677,62 +3677,62 @@ msgstr "Zygzak"
#: fdmprinter.def.json
msgctxt "minimum_interface_area label"
msgid "Minimum Support Interface Area"
-msgstr ""
+msgstr "Minimalna Powierzchnia Interfejsu Podpór"
#: fdmprinter.def.json
msgctxt "minimum_interface_area description"
msgid "Minimum area size for support interface polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Minimalny rozmiar obszaru dla interfejsu podpór. Obszary, które mają powierzchnię mniejszą od tej wartości, nie będą generowane."
#: fdmprinter.def.json
msgctxt "minimum_roof_area label"
msgid "Minimum Support Roof Area"
-msgstr ""
+msgstr "Minimalna Powierzchnia Dachu Podpór"
#: fdmprinter.def.json
msgctxt "minimum_roof_area description"
msgid "Minimum area size for the roofs of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Minimalny rozmiar obszaru dla dachu podpór. Obszary, które mają powierzchnię mniejszą od tej wartości, nie będą generowane."
#: fdmprinter.def.json
msgctxt "minimum_bottom_area label"
msgid "Minimum Support Floor Area"
-msgstr ""
+msgstr "Minimalna Powierzchnia Podłoża Podpór"
#: fdmprinter.def.json
msgctxt "minimum_bottom_area description"
msgid "Minimum area size for the floors of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Minimalny rozmiar obszaru dla podłoża podpór. Obszary, które mają powierzchnię mniejszą od tej wartości, nie będą generowane."
#: fdmprinter.def.json
msgctxt "support_interface_offset label"
msgid "Support Interface Horizontal Expansion"
-msgstr ""
+msgstr "Rozrost Poziomy Interfejsu Podpór"
#: fdmprinter.def.json
msgctxt "support_interface_offset description"
msgid "Amount of offset applied to the support interface polygons."
-msgstr ""
+msgstr "Wartość przesunięcia zastosowana do obszaru interfejsu podpór."
#: fdmprinter.def.json
msgctxt "support_roof_offset label"
msgid "Support Roof Horizontal Expansion"
-msgstr ""
+msgstr "Rozrost Poziomy Dachu Podpór"
#: fdmprinter.def.json
msgctxt "support_roof_offset description"
msgid "Amount of offset applied to the roofs of the support."
-msgstr ""
+msgstr "Wartość przesunięcia zastosowana do obszaru dachu podpór."
#: fdmprinter.def.json
msgctxt "support_bottom_offset label"
msgid "Support Floor Horizontal Expansion"
-msgstr ""
+msgstr "Rozrost Poziomy Podłoża Podpór"
#: fdmprinter.def.json
msgctxt "support_bottom_offset description"
msgid "Amount of offset applied to the floors of the support."
-msgstr ""
+msgstr "Wartość przesunięcia zastosowana do obszaru podłoża podpór."
#: fdmprinter.def.json
msgctxt "support_fan_enable label"
@@ -3742,7 +3742,7 @@ msgstr "Nadpisanie Prędkości Wentylatora"
#: fdmprinter.def.json
msgctxt "support_fan_enable description"
msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support."
-msgstr "Gdy załączone, prędkość wentylatora chłodzącego wydruk jest zmieniana dla obszarów leżących bezpośrednio ponad podporami,"
+msgstr "Gdy włączone, prędkość wentylatora chłodzącego wydruk jest zmieniana dla obszarów leżących bezpośrednio ponad podporami."
#: fdmprinter.def.json
msgctxt "support_supported_skin_fan_speed label"
@@ -3817,7 +3817,7 @@ msgstr "Przyczepność"
#: fdmprinter.def.json
msgctxt "prime_blob_enable label"
msgid "Enable Prime Blob"
-msgstr "Włącz Czyszcz. \"Blob\""
+msgstr "Włącz Czyszczenie \"Blob”ów"
#: fdmprinter.def.json
msgctxt "prime_blob_enable description"
@@ -3847,7 +3847,7 @@ msgstr "Współrzędna Y, w której dysza jest czyszczona na początku wydruku."
#: fdmprinter.def.json
msgctxt "adhesion_type label"
msgid "Build Plate Adhesion Type"
-msgstr "Typ Ulepszenia Przyczepności"
+msgstr "Typ Zwiększenia Przyczepności"
#: fdmprinter.def.json
msgctxt "adhesion_type description"
@@ -3877,7 +3877,7 @@ msgstr "Brak"
#: fdmprinter.def.json
msgctxt "adhesion_extruder_nr label"
msgid "Build Plate Adhesion Extruder"
-msgstr "Ekstruder Drukujący Ułatw. Przyczep."
+msgstr "Ekstruder Adhezji Pola Roboczego"
#: fdmprinter.def.json
msgctxt "adhesion_extruder_nr description"
@@ -3941,17 +3941,17 @@ msgstr "Liczba linii używana dla obrysu. Więcej linii obrysu poprawia przyczep
#: fdmprinter.def.json
msgctxt "brim_replaces_support label"
msgid "Brim Replaces Support"
-msgstr ""
+msgstr "Podpory Zastąp Obrysem"
#: fdmprinter.def.json
msgctxt "brim_replaces_support description"
msgid "Enforce brim to be printed around the model even if that space would otherwise be occupied by support. This replaces some regions of the first layer of support by brim regions."
-msgstr ""
+msgstr "Wymuś drukowanie obrysu wokół modelu, nawet jeśli powierzchnia byłaby zajęta przez podpory. Zastępuje obszary podpór przez obrys. Dotyczy pierwszej warstwy."
#: fdmprinter.def.json
msgctxt "brim_outside_only label"
msgid "Brim Only on Outside"
-msgstr "Obrys Tylko na Zewn."
+msgstr "Obrys Tylko na Zew"
#: fdmprinter.def.json
msgctxt "brim_outside_only description"
@@ -3976,7 +3976,7 @@ msgstr "Wygładzanie Tratwy"
#: fdmprinter.def.json
msgctxt "raft_smoothing description"
msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle."
-msgstr "To ustawienie kontroluje jak bardzo wewn. narożniki w zewn. krawędzi tratwy mają być zaokrąglone. Wewn. narożniki są zaokrąglane do półokręgów o promieniu równym wartości podanej tutaj. To ustawienie usuwa także otwory w zewn. krawędzi tratwy, które są mniejsze niż taki okrąg."
+msgstr "To ustawienie kontroluje jak bardzo wewn. narożniki w zewn. krawędzi tratwy mają być zaokrąglone. Wew. narożniki są zaokrąglane do półokręgów o promieniu równym wartości podanej tutaj. To ustawienie usuwa także otwory w zewn. krawędzi tratwy, które są mniejsze niż taki okrąg."
#: fdmprinter.def.json
msgctxt "raft_airgap label"
@@ -4271,7 +4271,7 @@ msgstr "Ustawienia używane do drukowania wieloma głowicami."
#: fdmprinter.def.json
msgctxt "prime_tower_enable label"
msgid "Enable Prime Tower"
-msgstr "Włącz Wieżę Czyszcz."
+msgstr "Włącz Wieżę Czyszczącą"
#: fdmprinter.def.json
msgctxt "prime_tower_enable description"
@@ -4291,7 +4291,7 @@ msgstr "Twórz wieżę czyszczącą o okrągłym kształcie."
#: fdmprinter.def.json
msgctxt "prime_tower_size label"
msgid "Prime Tower Size"
-msgstr "Rozmiar Wieży Czyszcz."
+msgstr "Rozmiar Wieży Czyszczącej"
#: fdmprinter.def.json
msgctxt "prime_tower_size description"
@@ -4301,7 +4301,7 @@ msgstr "Szerokość wieży czyszczącej."
#: fdmprinter.def.json
msgctxt "prime_tower_min_volume label"
msgid "Prime Tower Minimum Volume"
-msgstr "Min. Objętość Wieży Czyszcz."
+msgstr "Min. Objętość Wieży Czyszczącej"
#: fdmprinter.def.json
msgctxt "prime_tower_min_volume description"
@@ -4331,7 +4331,7 @@ msgstr "Współrzędna Y położenia wieży czyszczącej."
#: fdmprinter.def.json
msgctxt "prime_tower_flow label"
msgid "Prime Tower Flow"
-msgstr "Przepływ Wieży Czyszcz."
+msgstr "Przepływ Wieży Czyszczącej"
#: fdmprinter.def.json
msgctxt "prime_tower_flow description"
@@ -4341,7 +4341,7 @@ msgstr "Kompensacja przepływu: ilość ekstrudowanego materiału jest mnożona
#: fdmprinter.def.json
msgctxt "prime_tower_wipe_enabled label"
msgid "Wipe Inactive Nozzle on Prime Tower"
-msgstr "Wytrzyj Nieuż. Dyszą o Wieże Czyszcz."
+msgstr "Wytrzyj Nieużywaną Dyszę o Wieżę Czyszczącą"
#: fdmprinter.def.json
msgctxt "prime_tower_wipe_enabled description"
@@ -4421,7 +4421,7 @@ msgstr "Szerokie szwy próbują zszywać otwarte otwory w siatce przez zamknięc
#: fdmprinter.def.json
msgctxt "meshfix_keep_open_polygons label"
msgid "Keep Disconnected Faces"
-msgstr "Zachowaj Rozłączone Pow."
+msgstr "Zachowaj Rozłączone Powierzchnie"
#: fdmprinter.def.json
msgctxt "meshfix_keep_open_polygons description"
@@ -4501,7 +4501,7 @@ msgstr "Jeden na raz"
#: fdmprinter.def.json
msgctxt "infill_mesh label"
msgid "Infill Mesh"
-msgstr "Siatka Wypełn."
+msgstr "Siatka Wypełnienia"
#: fdmprinter.def.json
msgctxt "infill_mesh description"
@@ -4511,7 +4511,7 @@ msgstr "Użyj tej siatki, aby zmodyfikować wypełnienie innych siatek, z który
#: fdmprinter.def.json
msgctxt "infill_mesh_order label"
msgid "Infill Mesh Order"
-msgstr "Porządek Siatki Wypełn."
+msgstr "Porządek Siatki Wypełnienia"
#: fdmprinter.def.json
msgctxt "infill_mesh_order description"
@@ -4616,7 +4616,7 @@ msgstr "Oba"
#: fdmprinter.def.json
msgctxt "magic_spiralize label"
msgid "Spiralize Outer Contour"
-msgstr "Spiralizuj Zewn. Kontur"
+msgstr "Spiralizuj Zew. Kontur"
#: fdmprinter.def.json
msgctxt "magic_spiralize description"
@@ -5445,7 +5445,7 @@ msgstr "Długość końcówki wewnętrznej linii, która jest rozciągana podcza
#: fdmprinter.def.json
msgctxt "wireframe_roof_outer_delay label"
msgid "WP Roof Outer Delay"
-msgstr "DD Opóźnienie Zewn. Dachu"
+msgstr "DD Opóźnienie Zew. Dachu"
#: fdmprinter.def.json
msgctxt "wireframe_roof_outer_delay description"
diff --git a/resources/i18n/pt_BR/cura.po b/resources/i18n/pt_BR/cura.po
index 467c34786d..cb3182ffb6 100644
--- a/resources/i18n/pt_BR/cura.po
+++ b/resources/i18n/pt_BR/cura.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2018-11-06 02:20-0300\n"
+"PO-Revision-Date: 2019-03-18 11:26+0100\n"
"Last-Translator: Cláudio Sampaio \n"
"Language-Team: Cláudio Sampaio \n"
"Language: pt_BR\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 2.0.6\n"
+"X-Generator: Poedit 2.1.1\n"
#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
msgctxt "@action"
@@ -73,7 +73,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
msgctxt "@item:inmenu"
msgid "Changelog"
-msgstr ""
+msgstr "Registro de Alterações"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
msgctxt "@item:inmenu"
@@ -330,7 +330,7 @@ msgstr "Acesso à impressora confirmado"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
-msgstr "Sem acesso para imprimir por esta impressora. Incapaz de enviar o trabalho de impressão."
+msgstr "Sem acesso para imprimir por esta impressora. Não foi possível enviar o trabalho de impressão."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:114
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:65
@@ -347,7 +347,7 @@ msgstr "Envia pedido de acesso à impressora"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:201
msgctxt "@label"
msgid "Unable to start a new print job."
-msgstr "Incapaz de iniciar novo trabalho de impressão."
+msgstr "Não foi possível iniciar novo trabalho de impressão."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:203
msgctxt "@label"
@@ -492,100 +492,100 @@ msgstr "Impressão Concluída"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
msgctxt "@label:material"
msgid "Empty"
-msgstr ""
+msgstr "Vazio"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
msgctxt "@label:material"
msgid "Unknown"
-msgstr ""
+msgstr "Desconhecido"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
msgctxt "@action:button"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Imprimir por Nuvem"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Imprimir por Nuvem"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
msgctxt "@info:status"
msgid "Connected via Cloud"
-msgstr ""
+msgstr "Conectado por Nuvem"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
msgctxt "@info:title"
msgid "Cloud error"
-msgstr ""
+msgstr "Erro de nuvem"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
msgctxt "@info:status"
msgid "Could not export print job."
-msgstr ""
+msgstr "Não foi possível exportar o trabalho de impressão."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
-msgstr ""
+msgstr "Não foi possível transferir os dados para a impressora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:51
msgctxt "@info:status"
msgid "tomorrow"
-msgstr ""
+msgstr "amanhã"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:54
msgctxt "@info:status"
msgid "today"
-msgstr ""
+msgstr "hoje"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
-msgstr ""
+msgstr "Houve um erro ao conectar à nuvem."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
msgid "Sending data to remote cluster"
-msgstr ""
+msgstr "Enviando dados ao cluster remoto"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Envia e monitora trabalhos de impressão de qualquer lugar usando sua conta Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
msgctxt "@info:status"
msgid "Connect to Ultimaker Cloud"
-msgstr ""
+msgstr "Conectar à Ultimaker Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
msgctxt "@action"
msgid "Don't ask me again for this printer."
-msgstr ""
+msgstr "Não me pergunte novamente para esta impressora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
msgctxt "@action"
msgid "Get started"
-msgstr ""
+msgstr "Começar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Você agora pode enviar e monitorar trabalhoas de impressão de qualquer lugar usando sua conta Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
msgctxt "@info:status"
msgid "Connected!"
-msgstr ""
+msgstr "Conectado!"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
msgctxt "@action"
msgid "Review your connection"
-msgstr ""
+msgstr "Rever sua conexão"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py:30
msgctxt "@action"
@@ -637,12 +637,12 @@ msgstr "Visão Simulada"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:35
msgctxt "@item:inmenu"
msgid "Post Processing"
-msgstr ""
+msgstr "Pós-Processamento"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:36
msgctxt "@item:inmenu"
msgid "Modify G-Code"
-msgstr ""
+msgstr "Modificar G-Code"
#: /home/ruben/Projects/Cura/plugins/SupportEraser/__init__.py:12
msgctxt "@label"
@@ -692,7 +692,7 @@ msgstr "Perfis do Cura 15.04"
#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
msgctxt "@item:inmenu"
msgid "Evaluation"
-msgstr ""
+msgstr "Avaliação"
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
@@ -722,7 +722,7 @@ msgstr "Imagem GIF"
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
msgctxt "@info:status"
msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration."
-msgstr "Incapaz de fatiar com o material atual visto que é incompatível com a máquina ou configuração selecionada."
+msgstr "Não foi possível fatiar com o material atual visto que é incompatível com a máquina ou configuração selecionada."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365
@@ -732,35 +732,35 @@ msgstr "Incapaz de fatiar com o material atual visto que é incompatível com a
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:416
msgctxt "@info:title"
msgid "Unable to slice"
-msgstr "Incapaz de fatiar"
+msgstr "Não foi possível fatiar"
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:364
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to slice with the current settings. The following settings have errors: {0}"
-msgstr "Incapaz de fatiar com os ajustes atuais. Os seguintes ajustes têm erros: {0}"
+msgstr "Não foi possível fatiar com os ajustes atuais. Os seguintes ajustes têm erros: {0}"
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:388
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}"
-msgstr "Incapaz de fatiar devido a alguns ajustes por modelo. Os seguintes ajustes têm erros em um dos modelos ou mais: {error_labels}"
+msgstr "Não foi possível fatiar devido a alguns ajustes por modelo. Os seguintes ajustes têm erros em um dos modelos ou mais: {error_labels}"
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:397
msgctxt "@info:status"
msgid "Unable to slice because the prime tower or prime position(s) are invalid."
-msgstr "Incapaz de fatiar porque a torre de purga ou posição de purga são inválidas."
+msgstr "Não foi possível fatiar porque a torre de purga ou posição de purga são inválidas."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:406
#, python-format
msgctxt "@info:status"
msgid "Unable to slice because there are objects associated with disabled Extruder %s."
-msgstr "Incapaz de fatiar porque há objetos associados com o Extrusor desabilitado %s."
+msgstr "Não foi possível fatiar porque há objetos associados com o Extrusor desabilitado %s."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
msgctxt "@info:status"
msgid "Nothing to slice because none of the models fit the build volume or are assigned to a disabled extruder. Please scale or rotate models to fit, or enable an extruder."
-msgstr ""
+msgstr "Nada a fatiar porque nenhum dos modelos cabe no volume de construção ou está associado a um extrusor desabilitado. Por favor redimensione ou rotacione os modelos para caber, ou habilite um extrusor."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
@@ -845,7 +845,7 @@ msgstr "Assegure-se que o g-code é adequado para sua impressora e configuraçã
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:64
msgctxt "@item:inmenu"
msgid "Manage backups"
-msgstr ""
+msgstr "Gerenciar backups"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:107
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:113
@@ -858,32 +858,32 @@ msgstr "Backup"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:55
msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
-msgstr ""
+msgstr "Houve um erro ao listar seus backups."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
-msgstr ""
+msgstr "Houve um erro ao tentar restaurar seu backup."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:15
msgctxt "@info:title"
msgid "Backups"
-msgstr ""
+msgstr "Backups"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:27
msgctxt "@info:backup_status"
msgid "Uploading your backup..."
-msgstr ""
+msgstr "Enviando seu backup..."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:36
msgctxt "@info:backup_status"
msgid "There was an error while uploading your backup."
-msgstr ""
+msgstr "Houve um erro ao transferir seu backup."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:39
msgctxt "@info:backup_status"
msgid "Your backup has finished uploading."
-msgstr ""
+msgstr "Seu backup terminou de ser enviado."
#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14
#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14
@@ -919,7 +919,7 @@ msgstr "Erro ao escrever arquivo 3mf."
#: /home/ruben/Projects/Cura/plugins/PreviewStage/__init__.py:13
msgctxt "@item:inmenu"
msgid "Preview"
-msgstr ""
+msgstr "Pré-visualização"
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
@@ -927,11 +927,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr "Selecionar Atualizações"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr "Verificação"
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -1020,7 +1015,7 @@ msgstr "O arquivo {0} já existe. Tem certeza que quer sobr
#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
msgctxt "@info:status"
msgid "Invalid file URL:"
-msgstr ""
+msgstr "URL de arquivo inválida:"
#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
msgctxt "@menuitem"
@@ -1041,7 +1036,7 @@ msgstr "Ajustes atualizados"
#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
-msgstr ""
+msgstr "Extrusor(es) Desabilitado(s)"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
#, python-brace-format
@@ -1070,13 +1065,13 @@ msgstr "Exportação concluída"
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
-msgstr ""
+msgstr "Falha ao importar perfil de {0}: {1}"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Can't import profile from {0} before a printer is added."
-msgstr ""
+msgstr "Não foi possível importar perfil de {0} antes de uma impressora ser adicionada."
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
#, python-brace-format
@@ -1209,7 +1204,7 @@ msgstr "Tentativa de restauração de backup do Cura que não corresponde à ver
#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
-msgstr ""
+msgstr "Não foi possível contactar o servidor de contas da Ultimaker."
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
@@ -1219,14 +1214,14 @@ msgstr "Multiplicando e colocando objetos"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:28
msgctxt "@info:title"
msgid "Placing Objects"
-msgstr ""
+msgstr "Colocando Objetos"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:103
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:150
msgctxt "@info:status"
msgid "Unable to find a location within the build volume for all objects"
-msgstr "Incapaz de achar um lugar dentro do volume de construção para todos os objetos"
+msgstr "Não foi possível achar um lugar dentro do volume de construção para todos os objetos"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100
msgctxt "@info:title"
@@ -1635,7 +1630,7 @@ msgstr "Não foi possível conectar-se à base de dados de Pacotes do Cura. Por
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/SmallRatingWidget.qml:27
msgctxt "@label"
msgid "ratings"
-msgstr ""
+msgstr "notas"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
@@ -1654,7 +1649,7 @@ msgstr "Materiais"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:91
msgctxt "@label"
msgid "Your rating"
-msgstr ""
+msgstr "Sua nota"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
msgctxt "@label"
@@ -1687,7 +1682,7 @@ msgstr "Desconhecido"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
-msgstr ""
+msgstr "Entrar na conta é necessário para instalar ou atualizar"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
@@ -1710,7 +1705,7 @@ msgstr "Atualizado"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:13
msgctxt "@title"
msgid "Marketplace"
-msgstr ""
+msgstr "Mercado"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml:25
msgctxt "@action:button"
@@ -1745,12 +1740,12 @@ msgstr "Confirmar"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to login first before you can rate"
-msgstr ""
+msgstr "Você precisa entrar em sua conta para dar notas"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to install the package before you can rate"
-msgstr ""
+msgstr "Você precisa instalar o pacote para dar notas"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:19
msgctxt "@info"
@@ -1790,7 +1785,7 @@ msgstr "Será instalado ao reiniciar"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:53
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to update"
-msgstr ""
+msgstr "Entrar na conta é necessário para atualizar"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:71
msgctxt "@action:button"
@@ -1841,22 +1836,22 @@ msgstr "Compatibilidade"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:203
msgctxt "@action:label"
msgid "Technical Data Sheet"
-msgstr ""
+msgstr "Documento de Dados Técnicos"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:212
msgctxt "@action:label"
msgid "Safety Data Sheet"
-msgstr ""
+msgstr "Documento de Dados de Segurança"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:221
msgctxt "@action:label"
msgid "Printing Guidelines"
-msgstr ""
+msgstr "Diretrizes de Impressão"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:230
msgctxt "@action:label"
msgid "Website"
-msgstr ""
+msgstr "Sítio Web"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml:16
msgctxt "@info"
@@ -1978,17 +1973,17 @@ msgstr "Termos de Acordo do Usuário"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
msgctxt "@info"
msgid "These options are not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Estas opçÕes não estão disponíveis porque você está monitorando uma impressora de nuvem."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:241
msgctxt "@info"
msgid "The webcam is not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "A webcam não está disponível porque você está monitorando uma impressora de nuvem."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
msgctxt "@label:status"
msgid "Loading..."
-msgstr ""
+msgstr "Carregando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
msgctxt "@label:status"
@@ -1998,42 +1993,42 @@ msgstr "Indisponível"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
msgctxt "@label:status"
msgid "Unreachable"
-msgstr ""
+msgstr "Inacessivel"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
msgctxt "@label:status"
msgid "Idle"
-msgstr ""
+msgstr "Ocioso"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:353
msgctxt "@label"
msgid "Untitled"
-msgstr ""
+msgstr "Sem Título"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
msgctxt "@label"
msgid "Anonymous"
-msgstr ""
+msgstr "Anônimo"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
msgctxt "@label:status"
msgid "Requires configuration changes"
-msgstr ""
+msgstr "Requer mudanças na configuração"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
msgctxt "@action:button"
msgid "Details"
-msgstr ""
+msgstr "Detalhes"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "Unavailable printer"
-msgstr ""
+msgstr "Impressora indisponível"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
msgctxt "@label"
msgid "First available"
-msgstr ""
+msgstr "Primeira disponível"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:187
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:132
@@ -2049,27 +2044,27 @@ msgstr "Enfileirados"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
msgid "Go to Cura Connect"
-msgstr ""
+msgstr "Ir ao Cura Connect"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
msgctxt "@label"
msgid "Print jobs"
-msgstr ""
+msgstr "Trabalhos de impressão"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Total print time"
-msgstr ""
+msgstr "Tempo total de impressão"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
msgctxt "@label"
msgid "Waiting for"
-msgstr ""
+msgstr "Esperando por"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
msgctxt "@label link to connect manager"
msgid "View print history"
-msgstr ""
+msgstr "Ver histórico de impressão"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
msgctxt "@window:title"
@@ -2195,17 +2190,17 @@ msgstr "Finalizado"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Preparing..."
-msgstr ""
+msgstr "Preparando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Aborting..."
-msgstr ""
+msgstr "Abortando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
msgctxt "@label:status"
msgid "Pausing..."
-msgstr ""
+msgstr "Pausando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
msgctxt "@label:status"
@@ -2215,7 +2210,7 @@ msgstr "Pausado"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
msgctxt "@label:status"
msgid "Resuming..."
-msgstr ""
+msgstr "Continuando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
msgctxt "@label:status"
@@ -2225,7 +2220,7 @@ msgstr "Necessária uma ação"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
msgctxt "@label:status"
msgid "Finishes %1 at %2"
-msgstr ""
+msgstr "Termina %1 em %2"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:44
msgctxt "@action:button"
@@ -2261,12 +2256,12 @@ msgstr "Continuar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:102
msgctxt "@label"
msgid "Pausing..."
-msgstr ""
+msgstr "Pausando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:104
msgctxt "@label"
msgid "Resuming..."
-msgstr ""
+msgstr "Continuando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:106
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284
@@ -2278,7 +2273,7 @@ msgstr "Pausar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
msgid "Aborting..."
-msgstr ""
+msgstr "Abortando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
@@ -2319,24 +2314,24 @@ msgstr "Abortar impressão"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:20
msgctxt "@title:window"
msgid "Configuration Changes"
-msgstr ""
+msgstr "Alterações de Configuração"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:27
msgctxt "@action:button"
msgid "Override"
-msgstr ""
+msgstr "Sobrepor"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
msgctxt "@label"
msgid "The assigned printer, %1, requires the following configuration change:"
msgid_plural "The assigned printer, %1, requires the following configuration changes:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "A impressora associada, %1, requer a seguinte alteração de configuração:"
+msgstr[1] "A impressora associada, %1, requer as seguintes alterações de configuração:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
msgctxt "@label"
msgid "The printer %1 is assigned, but the job contains an unknown material configuration."
-msgstr "A impressora %1 está atribuída, mas o trabalho contém configuração de material desconhecida."
+msgstr "A impressora %1 está associada, mas o trabalho contém configuração de material desconhecida."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:78
msgctxt "@label"
@@ -2361,7 +2356,7 @@ msgstr "Alterar mesa de impressão para %1 (Isto não pode ser sobreposto)."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
-msgstr ""
+msgstr "Sobrepor irá usar os ajustes especificados com a configuração existente da impressora. Isto pode causar falha da impressão."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
msgctxt "@label"
@@ -2380,21 +2375,24 @@ msgid ""
"- Check if the printer is turned on.\n"
"- Check if the printer is connected to the network."
msgstr ""
+"Por favor certifique-se que sua impressora está conectada:\n"
+"- Verifique se a impressora está ligada.\n"
+"- Verifique se a impressora está conectada à rede."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
msgctxt "@info"
msgid "Please select a network connected printer to monitor."
-msgstr ""
+msgstr "Por favor selecione uma impressora conectada à rede para monitorar."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
msgctxt "@info"
msgid "Please connect your Ultimaker printer to your local network."
-msgstr ""
+msgstr "Por favor conecte sua impressora Ultimaker à sua rede local."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
-msgstr ""
+msgstr "Ver manuais de usuário online"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
@@ -2430,17 +2428,17 @@ msgstr "Modo de Compatibilidade"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
msgctxt "@label"
msgid "Travels"
-msgstr ""
+msgstr "Percursos"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
msgctxt "@label"
msgid "Helpers"
-msgstr ""
+msgstr "Assistentes"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
msgctxt "@label"
msgid "Shell"
-msgstr ""
+msgstr "Perímetro"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
@@ -2516,17 +2514,17 @@ msgstr "O Cura envia dados anonimamente para a Ultimaker de modo a aprimorar a q
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
msgctxt "@text:window"
msgid "I don't want to send this data"
-msgstr ""
+msgstr "Não desejo enviar estes dados"
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
msgctxt "@text:window"
msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr ""
+msgstr "Permitir enviar estes dados à Ultimaker para ajudar a melhorar o Cura"
#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
msgctxt "@label"
msgid "No print selected"
-msgstr ""
+msgstr "Nenhuma impressão selecionada"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2788,108 +2786,108 @@ msgstr "Abrir"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:28
msgctxt "@title"
msgid "My Backups"
-msgstr ""
+msgstr "Meus backups"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:38
msgctxt "@empty_state"
msgid "You don't have any backups currently. Use the 'Backup Now' button to create one."
-msgstr ""
+msgstr "Você não tem nenhum backup atualmente. Use o botão 'Backup Agora' para criar um."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:60
msgctxt "@backup_limit_info"
msgid "During the preview phase, you'll be limited to 5 visible backups. Remove a backup to see older ones."
-msgstr ""
+msgstr "Durante a fase de pré-visualização, você estará limitado a 5 backups visíveis. Remova um backup para ver os mais antigos."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:34
msgctxt "@description"
msgid "Backup and synchronize your Cura settings."
-msgstr ""
+msgstr "Fazer backup e sincronizar os ajustes do Cura."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
msgctxt "@button"
msgid "Sign in"
-msgstr ""
+msgstr "Entrar"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/main.qml:24
msgctxt "@title:window"
msgid "Cura Backups"
-msgstr ""
+msgstr "Backups do Cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:21
msgctxt "@backuplist:label"
msgid "Cura Version"
-msgstr ""
+msgstr "Versão do Cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:29
msgctxt "@backuplist:label"
msgid "Machines"
-msgstr ""
+msgstr "Máquinas"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:37
msgctxt "@backuplist:label"
msgid "Materials"
-msgstr ""
+msgstr "Materiais"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:45
msgctxt "@backuplist:label"
msgid "Profiles"
-msgstr ""
+msgstr "Perfis"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:53
msgctxt "@backuplist:label"
msgid "Plugins"
-msgstr ""
+msgstr "Complementos"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:71
msgctxt "@button"
msgid "Restore"
-msgstr ""
+msgstr "Restaurar"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:99
msgctxt "@dialog:title"
msgid "Delete Backup"
-msgstr ""
+msgstr "Apagar o Backup"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:100
msgctxt "@dialog:info"
msgid "Are you sure you want to delete this backup? This cannot be undone."
-msgstr ""
+msgstr "Você tem certeza que deseja apagar este backup? Isto não pode ser desfeito."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:108
msgctxt "@dialog:title"
msgid "Restore Backup"
-msgstr ""
+msgstr "Restaurar Backup"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:109
msgctxt "@dialog:info"
msgid "You will need to restart Cura before your backup is restored. Do you want to close Cura now?"
-msgstr ""
+msgstr "Você precisará reiniciar o Cura antes que seu backup seja restaurado. Deseja fechar o Cura agora?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:22
msgctxt "@button"
msgid "Want more?"
-msgstr ""
+msgstr "Quer mais?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:31
msgctxt "@button"
msgid "Backup Now"
-msgstr ""
+msgstr "Backup Agora"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:43
msgctxt "@checkbox:description"
msgid "Auto Backup"
-msgstr ""
+msgstr "Auto Backup"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:44
msgctxt "@checkbox:description"
msgid "Automatically create a backup each day that Cura is started."
-msgstr ""
+msgstr "Criar um backup automaticamente toda vez que o Cura iniciar."
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMainSettingsSelector.qml:75
msgctxt "@label"
msgid "Not supported"
-msgstr ""
+msgstr "Não suportado"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:35
msgctxt "@action:button"
@@ -2974,99 +2972,6 @@ msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr "Mesa de Impressão Aquecida (kit Oficial ou auto-construído)"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27
-msgctxt "@title"
-msgid "Check Printer"
-msgstr "Verificar Impressora"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39
-msgctxt "@label"
-msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"
-msgstr "É uma boa idéia fazer algumas verificações de sanidade em sua Ultimaker. Você pode pular este passo se você sabe que sua máquina está funcional"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53
-msgctxt "@action:button"
-msgid "Start Printer Check"
-msgstr "Iniciar Verificação da Impressora"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80
-msgctxt "@label"
-msgid "Connection: "
-msgstr "Conexão: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Connected"
-msgstr "Conectado"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Not connected"
-msgstr "Desconectado"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99
-msgctxt "@label"
-msgid "Min endstop X: "
-msgstr "Fim de curso mín. em X: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-msgctxt "@info:status"
-msgid "Works"
-msgstr "Funciona"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Not checked"
-msgstr "Não verificado"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120
-msgctxt "@label"
-msgid "Min endstop Y: "
-msgstr "Fim de curso mín. em Y: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141
-msgctxt "@label"
-msgid "Min endstop Z: "
-msgstr "Fim de curso mín. em Z: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163
-msgctxt "@label"
-msgid "Nozzle temperature check: "
-msgstr "Verificação da temperatura do bico: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Stop Heating"
-msgstr "Parar Aquecimento"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Start Heating"
-msgstr "Iniciar Aquecimento"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223
-msgctxt "@label"
-msgid "Build plate temperature check:"
-msgstr "Verificação da temperatura da mesa de impressão:"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Checked"
-msgstr "Verificado"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284
-msgctxt "@label"
-msgid "Everything is in order! You're done with your CheckUp."
-msgstr "Tudo está em ordem! A verificação terminou."
-
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"
msgid "Not connected to a printer"
@@ -3638,7 +3543,7 @@ msgstr "Criar Perfil"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
msgctxt "@info"
msgid "Please provide a name for this profile."
-msgstr ""
+msgstr "Por favor dê um nome a este perfil."
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
msgctxt "@title:window"
@@ -3668,7 +3573,7 @@ msgstr "Impressora: %1"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
msgid "Default profiles"
-msgstr ""
+msgstr "Perfis default"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
@@ -3703,7 +3608,7 @@ msgstr "Ajustes globais"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
msgctxt "@action:button"
msgid "Marketplace"
-msgstr ""
+msgstr "Mercado"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:27
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:13
@@ -3726,7 +3631,7 @@ msgstr "&Ver"
#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:13
msgctxt "@title:menu menubar:toplevel"
msgid "&Settings"
-msgstr ""
+msgstr "Aju&stes"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:55
msgctxt "@title:menu menubar:toplevel"
@@ -3761,7 +3666,7 @@ msgstr "Sem Título"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:68
msgctxt "@label:textbox"
msgid "search settings"
-msgstr ""
+msgstr "procurar nos ajustes"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
msgctxt "@action:menu"
@@ -3850,17 +3755,17 @@ msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
msgctxt "@button"
msgid "Recommended"
-msgstr ""
+msgstr "Recomendado"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
msgctxt "@button"
msgid "Custom"
-msgstr ""
+msgstr "Personalizado"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:193
msgctxt "@label"
msgid "Gradual infill"
-msgstr ""
+msgstr "Preenchimento gradual"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:232
msgctxt "@label"
@@ -3870,7 +3775,7 @@ msgstr "Preenchimento gradual aumentará gradualmente a quantidade de preenchime
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
msgctxt "@label"
msgid "Support"
-msgstr ""
+msgstr "Suporte"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
msgctxt "@label"
@@ -3885,7 +3790,7 @@ msgstr "Selecione qual extrusor a usar para o suporte. Isto construirá estrutur
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
msgctxt "@label"
msgid "Adhesion"
-msgstr ""
+msgstr "Aderência"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
msgctxt "@label"
@@ -3905,7 +3810,7 @@ msgstr "Você modificou alguns ajustes de perfil. Se você quiser alterá-los, u
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:355
msgctxt "@tooltip"
msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile"
-msgstr ""
+msgstr "Este perfil de qualidade não está disponível para sua configuração atual de material e bico. Por favor altere-os para habilitar este perfil de qualidade"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3915,17 +3820,17 @@ msgstr "Um perfil personalizado está atualmente ativo. Para habilitar o control
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:13
msgctxt "@label:Should be short"
msgid "On"
-msgstr ""
+msgstr "On"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:14
msgctxt "@label:Should be short"
msgid "Off"
-msgstr ""
+msgstr "Off"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:27
msgctxt "@label"
msgid "Profile"
-msgstr ""
+msgstr "Perfil"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:94
msgctxt "@tooltip"
@@ -3941,7 +3846,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label shown when we load a Gcode file"
msgid "Print setup disabled. G code file can not be modified."
-msgstr ""
+msgstr "Configuração de impressão desabilitada. Arquivo de G-Code não pode ser modificado."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -4182,47 +4087,47 @@ msgstr "Número de Cópias"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/AutoConfiguration.qml:18
msgctxt "@header"
msgid "Configurations"
-msgstr ""
+msgstr "Configurações"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:110
msgctxt "@label"
msgid "Select configuration"
-msgstr ""
+msgstr "Selecione configuração"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
msgctxt "@label"
msgid "See the material compatibility chart"
-msgstr ""
+msgstr "Veja o diagrama de compatibilidade de material"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
msgctxt "@label"
msgid "Configurations"
-msgstr ""
+msgstr "Configurações"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:57
msgctxt "@label"
msgid "Loading available configurations from the printer..."
-msgstr ""
+msgstr "Carregando configurações disponíveis da impressora..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:58
msgctxt "@label"
msgid "The configurations are not available because the printer is disconnected."
-msgstr ""
+msgstr "As configurações não estão disponíveis porque a impressora está desconectada."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:25
msgctxt "@header"
msgid "Custom"
-msgstr ""
+msgstr "Personalizado"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:61
msgctxt "@label"
msgid "Printer"
-msgstr ""
+msgstr "Impressora"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
msgctxt "@label"
msgid "Enabled"
-msgstr ""
+msgstr "Habilitado"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
msgctxt "@label"
@@ -4237,12 +4142,12 @@ msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:128
msgctxt "@label"
msgid "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile."
-msgstr ""
+msgstr "Esta configuração não está disponível porque %1 não foi reconhecido. Por favor visite %2 para baixar o perfil de materil correto."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:129
msgctxt "@label"
msgid "Marketplace"
-msgstr ""
+msgstr "Mercado"
#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:15
msgctxt "@title:menu menubar:file"
@@ -4272,37 +4177,37 @@ msgstr "Tempo restante estimado"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
msgid "View types"
-msgstr ""
+msgstr "Ver tipos"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
msgctxt "@label"
msgid "Hi "
-msgstr ""
+msgstr "Oi "
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
msgctxt "@button"
msgid "Ultimaker account"
-msgstr ""
+msgstr "Conta da Ultimaker"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
msgctxt "@button"
msgid "Sign out"
-msgstr ""
+msgstr "Sair da conta"
#: /home/ruben/Projects/Cura/resources/qml/Account/AccountWidget.qml:24
msgctxt "@action:button"
msgid "Sign in"
-msgstr ""
+msgstr "Entrar"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
msgctxt "@label"
msgid "Ultimaker Cloud"
-msgstr ""
+msgstr "Ultimaker Cloud"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
-msgstr ""
+msgstr "O fluxo de trabalho da próxima geração de impressão 3D"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:51
msgctxt "@text"
@@ -4311,26 +4216,29 @@ msgid ""
"- Store your Ultimaker Cura settings in the cloud for use anywhere\n"
"- Get exclusive access to material profiles from leading brands"
msgstr ""
+"- Envia trabalhos de impressão para impressoras Ultimaker fora da sua rede local\n"
+"- Guarda seus ajustes do Ultimaker Cura na nuvem para uso em qualquer lugar\n"
+"- Obtém acesso exclusivo a perfis de material de marcas reconhecidas"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
msgid "Create account"
-msgstr ""
+msgstr "Criar conta"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
msgctxt "@label"
msgid "No time estimation available"
-msgstr ""
+msgstr "Sem estimativa de tempo disponível"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
msgctxt "@label"
msgid "No cost estimation available"
-msgstr ""
+msgstr "Sem estimativa de custo disponível"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
msgctxt "@button"
msgid "Preview"
-msgstr ""
+msgstr "Pré-visualização"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
msgctxt "@label:PrintjobStatus"
@@ -4340,32 +4248,32 @@ msgstr "Fatiando..."
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:61
msgctxt "@label:PrintjobStatus"
msgid "Unable to Slice"
-msgstr "Incapaz de Fatiar"
+msgstr "Não Foi Possível Fatiar"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
msgctxt "@button"
msgid "Slice"
-msgstr ""
+msgstr "Fatiar"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
msgctxt "@label"
msgid "Start the slicing process"
-msgstr ""
+msgstr "Inicia o processo de fatiamento"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
msgctxt "@button"
msgid "Cancel"
-msgstr ""
+msgstr "Cancelar"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
msgid "Time specification"
-msgstr ""
+msgstr "Especificação de tempo"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
msgid "Material specification"
-msgstr ""
+msgstr "Especificação de material"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4380,27 +4288,27 @@ msgstr "%1g"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Connected printers"
-msgstr ""
+msgstr "Impressoras conectadas"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Preset printers"
-msgstr ""
+msgstr "Impressoras pré-ajustadas"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
msgctxt "@button"
msgid "Add printer"
-msgstr ""
+msgstr "Adicionar impressora"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
msgctxt "@button"
msgid "Manage printers"
-msgstr ""
+msgstr "Gerenciar impressoras"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
-msgstr ""
+msgstr "Mostra Guia de Resolução de Problemas Online"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
msgctxt "@action:inmenu"
@@ -4611,7 +4519,7 @@ msgstr "Exibir Pasta de Configuração"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
msgctxt "@action:menu"
msgid "&Marketplace"
-msgstr ""
+msgstr "&Mercado"
#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
msgctxt "@title:window"
@@ -4730,7 +4638,7 @@ msgstr "Criar Novo Perfil"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
msgctxt "@title:tab"
msgid "Add a printer to Cura"
-msgstr ""
+msgstr "Adiciona uma impressora ao Cura"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
msgctxt "@title:tab"
@@ -4739,16 +4647,19 @@ msgid ""
"\n"
"If your printer is not in the list, use the \"Custom FFF Printer\" from the \"Custom\" category and adjust the settings to match your printer in the next dialog."
msgstr ""
+"Selecione a impressora que deseja usar da lista abaixo.\n"
+"\n"
+"Se sua impressora não está na lista, use a \"Impressora FFF Personalizada\" da categoria \"Personalizado\" e ajuste de acordo com a sua impressora no diálogo a seguir."
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
msgctxt "@label"
msgid "Manufacturer"
-msgstr ""
+msgstr "Fabricante"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
msgctxt "@label"
msgid "Printer Name"
-msgstr ""
+msgstr "Nome da Impressora"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
msgctxt "@action:button"
@@ -4842,17 +4753,17 @@ msgstr "Biblioteca de suporte para manuseamento de arquivos STL"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:147
msgctxt "@label"
msgid "Support library for handling planar objects"
-msgstr ""
+msgstr "Biblioteca de suporte para manuseamento de objetos planares"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:148
msgctxt "@label"
msgid "Support library for handling triangular meshes"
-msgstr ""
+msgstr "Biblioteca de suporte para manuseamento de malhas triangulares"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:149
msgctxt "@label"
msgid "Support library for analysis of complex networks"
-msgstr ""
+msgstr "Biblioteca de suporte para análises de redes complexas"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:150
msgctxt "@label"
@@ -4862,7 +4773,7 @@ msgstr "Biblioteca de suporte para manuseamento de arquivos 3MF"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:151
msgctxt "@label"
msgid "Support library for file metadata and streaming"
-msgstr ""
+msgstr "Biblioteca de suporte para streaming e metadados de arquivo"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:152
msgctxt "@label"
diff --git a/resources/i18n/pt_BR/fdmextruder.def.json.po b/resources/i18n/pt_BR/fdmextruder.def.json.po
index c20de4d48f..8ea8ebea60 100644
--- a/resources/i18n/pt_BR/fdmextruder.def.json.po
+++ b/resources/i18n/pt_BR/fdmextruder.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-11-06 04:00-0300\n"
+"PO-Revision-Date: 2019-03-18 11:27+0100\n"
"Last-Translator: Cláudio Sampaio \n"
"Language-Team: Cláudio Sampaio \n"
"Language: pt_BR\n"
@@ -16,6 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 2.1.1\n"
#: fdmextruder.def.json
msgctxt "machine_settings label"
@@ -85,7 +86,7 @@ msgstr "G-Code Inicial do Extrusor"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
-msgstr ""
+msgstr "G-Code inicial a executar quando mudar para este extrusor."
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_abs label"
@@ -125,7 +126,7 @@ msgstr "G-Code Final do Extrusor"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_code description"
msgid "End g-code to execute when switching away from this extruder."
-msgstr ""
+msgstr "G-Code final a executar quando mudar deste extrusor para outro."
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_abs label"
diff --git a/resources/i18n/pt_BR/fdmprinter.def.json.po b/resources/i18n/pt_BR/fdmprinter.def.json.po
index 55b9bf812d..755dd6e802 100644
--- a/resources/i18n/pt_BR/fdmprinter.def.json.po
+++ b/resources/i18n/pt_BR/fdmprinter.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-10-06 04:30-0300\n"
+"PO-Revision-Date: 2019-03-18 11:27+0100\n"
"Last-Translator: Cláudio Sampaio \n"
"Language-Team: Cláudio Sampaio \n"
"Language: pt_BR\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 2.0.6\n"
+"X-Generator: Poedit 2.1.1\n"
#: fdmprinter.def.json
msgctxt "machine_settings label"
@@ -1678,7 +1678,7 @@ msgstr "Porcentagem de Sobreposição do Contorno"
#: fdmprinter.def.json
msgctxt "skin_overlap description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines, as a percentage of the line widths of the skin lines and the innermost wall. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any percentage over 50% may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Ajusta a quantidade de sobreposição entre as paredes e (os extremos de) linhas centrais do contorno, como uma porcentagem das larguras de filete de contorno e a parede mais interna. Uma sobreposição leve permite que as paredes se conectem firmemente ao contorno. Note que, dadas uma largura de contorno e filete de parede iguais, qualquer porcentagem acima de 50% pode fazer com que algum contorno ultrapasse a parede, pois a este ponto a posição do bico do extrusor de contorno pode já ter passado do meio da parede."
#: fdmprinter.def.json
msgctxt "skin_overlap_mm label"
@@ -1688,7 +1688,7 @@ msgstr "Sobreposição do Contorno"
#: fdmprinter.def.json
msgctxt "skin_overlap_mm description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any value over half the width of the wall may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Ajusta a quantidade de sobreposição entre as paredes e (os extermos de) linhas centrais do contorno. Uma sobreposição pequena permite que as paredes se conectem firmemente ao contorno. Note que, dados uma largura de contorno e filete de parede iguais, qualquer valor maior que metade da largura da parede pode fazer com que o contorno ultrapasse a parede, pois a este ponto a posição do bico do extrusor de contorno pode já ter passado do meio da parede."
#: fdmprinter.def.json
msgctxt "infill_wipe_dist label"
@@ -2128,7 +2128,7 @@ msgstr "Distância de Retração da Troca de Bico"
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_amount description"
msgid "The amount of retraction when switching extruders. Set to 0 for no retraction at all. This should generally be the same as the length of the heat zone."
-msgstr ""
+msgstr "A quantidade de retração ao mudar extrusores. Coloque em 0 para não haver retração. Isto deve geralmente ser o mesmo que o comprimento da zona de aquecimento do hotend."
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_speeds label"
@@ -2788,7 +2788,7 @@ msgstr "Modo de Combing"
#: fdmprinter.def.json
msgctxt "retraction_combing description"
msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas or to only comb within the infill."
-msgstr ""
+msgstr "O Combing mantém o bico dentro de áreas já impressas ao fazer o percurso. Isto causa movimentações de percurso um pouco mais demoradas mas reduz a necessidade de retrações. Se o combing estiver desligado, o material sofrerá retração eo bico se moverá em linha reta até o próximo ponto. É possível também evitar combing sobre contornos inferiores e superiores ou somente fazer combing dentro do preenchimento."
#: fdmprinter.def.json
msgctxt "retraction_combing option off"
@@ -3443,12 +3443,12 @@ msgstr "A altura do preenchimento de suporte de dada densidade antes de trocar p
#: fdmprinter.def.json
msgctxt "minimum_support_area label"
msgid "Minimum Support Area"
-msgstr ""
+msgstr "Área Mínima de Suporte"
#: fdmprinter.def.json
msgctxt "minimum_support_area description"
msgid "Minimum area size for support polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Área mínima para polígonos de suporte. Polígonos que tiverem uma área menor que essa não serão gerados."
#: fdmprinter.def.json
msgctxt "support_interface_enable label"
@@ -3678,62 +3678,62 @@ msgstr "Ziguezague"
#: fdmprinter.def.json
msgctxt "minimum_interface_area label"
msgid "Minimum Support Interface Area"
-msgstr ""
+msgstr "Área Mínima de Interface de Suporte"
#: fdmprinter.def.json
msgctxt "minimum_interface_area description"
msgid "Minimum area size for support interface polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Área mínima para polígonos de interface de suporte. Polígonos que tiverem uma área menor que este valor não serão gerados."
#: fdmprinter.def.json
msgctxt "minimum_roof_area label"
msgid "Minimum Support Roof Area"
-msgstr ""
+msgstr "Área Mínima de Teto de Suporte"
#: fdmprinter.def.json
msgctxt "minimum_roof_area description"
msgid "Minimum area size for the roofs of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Área mínima para os tetos do suporte. Polígonos que tiverem área menor que este valor são serão gerados."
#: fdmprinter.def.json
msgctxt "minimum_bottom_area label"
msgid "Minimum Support Floor Area"
-msgstr ""
+msgstr "Área Mínima de Base de Suporte"
#: fdmprinter.def.json
msgctxt "minimum_bottom_area description"
msgid "Minimum area size for the floors of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Área mínima para as bases do suporte. Polígonos que tiverem uma área menor que este valor não serão gerados."
#: fdmprinter.def.json
msgctxt "support_interface_offset label"
msgid "Support Interface Horizontal Expansion"
-msgstr ""
+msgstr "Expansão Horizontal da Interface de Suporte"
#: fdmprinter.def.json
msgctxt "support_interface_offset description"
msgid "Amount of offset applied to the support interface polygons."
-msgstr ""
+msgstr "Quantidade de deslocamento aplicado aos polígonos da interface de suporte."
#: fdmprinter.def.json
msgctxt "support_roof_offset label"
msgid "Support Roof Horizontal Expansion"
-msgstr ""
+msgstr "Expansão Horizontal do Teto de Suporte"
#: fdmprinter.def.json
msgctxt "support_roof_offset description"
msgid "Amount of offset applied to the roofs of the support."
-msgstr ""
+msgstr "Quantidade de deslocamento aplicado aos tetos do suporte."
#: fdmprinter.def.json
msgctxt "support_bottom_offset label"
msgid "Support Floor Horizontal Expansion"
-msgstr ""
+msgstr "Expansão Horizontal da Base do Suporte"
#: fdmprinter.def.json
msgctxt "support_bottom_offset description"
msgid "Amount of offset applied to the floors of the support."
-msgstr ""
+msgstr "Quantidade de deslocamento aplicado às bases do suporte."
#: fdmprinter.def.json
msgctxt "support_fan_enable label"
diff --git a/resources/i18n/pt_PT/cura.po b/resources/i18n/pt_PT/cura.po
index 1822188c5a..8a2edc0001 100644
--- a/resources/i18n/pt_PT/cura.po
+++ b/resources/i18n/pt_PT/cura.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2018-10-01 13:15+0100\n"
-"Last-Translator: Paulo Miranda \n"
+"PO-Revision-Date: 2019-03-14 14:15+0100\n"
+"Last-Translator: Portuguese \n"
"Language-Team: Paulo Miranda , Portuguese \n"
"Language: pt_PT\n"
"MIME-Version: 1.0\n"
@@ -65,16 +65,12 @@ msgid ""
"
{model_names}
\n"
"
Find out how to ensure the best possible print quality and reliability.
"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
msgctxt "@item:inmenu"
msgid "Changelog"
-msgstr ""
+msgstr "Lista das Alterações"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
msgctxt "@item:inmenu"
@@ -510,100 +506,100 @@ msgstr "Impressão terminada"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
msgctxt "@label:material"
msgid "Empty"
-msgstr ""
+msgstr "Vazio"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
msgctxt "@label:material"
msgid "Unknown"
-msgstr ""
+msgstr "Desconhecido"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
msgctxt "@action:button"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Imprimir através da cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Imprimir através da cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
msgctxt "@info:status"
msgid "Connected via Cloud"
-msgstr ""
+msgstr "Ligada através da cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
msgctxt "@info:title"
msgid "Cloud error"
-msgstr ""
+msgstr "Erro da cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
msgctxt "@info:status"
msgid "Could not export print job."
-msgstr ""
+msgstr "Não foi possível exportar o trabalho de impressão."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
-msgstr ""
+msgstr "Não foi possível carregar os dados para a impressora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:51
msgctxt "@info:status"
msgid "tomorrow"
-msgstr ""
+msgstr "amanhã"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:54
msgctxt "@info:status"
msgid "today"
-msgstr ""
+msgstr "hoje"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
-msgstr ""
+msgstr "Ocorreu um erro na ligação à cloud."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
msgid "Sending data to remote cluster"
-msgstr ""
+msgstr "A enviar dados para o cluster remoto"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Envie e monitorize trabalhos de impressão a partir de qualquer lugar através da sua conta Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
msgctxt "@info:status"
msgid "Connect to Ultimaker Cloud"
-msgstr ""
+msgstr "Ligar à Ultimaker Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
msgctxt "@action"
msgid "Don't ask me again for this printer."
-msgstr ""
+msgstr "Não perguntar novamente sobre esta impressora."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
msgctxt "@action"
msgid "Get started"
-msgstr ""
+msgstr "Iniciar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Agora pode enviar e monitorizar trabalhos de impressão a partir de qualquer lugar através da sua conta Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
msgctxt "@info:status"
msgid "Connected!"
-msgstr ""
+msgstr "Ligada!"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
msgctxt "@action"
msgid "Review your connection"
-msgstr ""
+msgstr "Reveja a sua ligação"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py:30
msgctxt "@action"
@@ -655,12 +651,12 @@ msgstr "Visualização por Camadas"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:35
msgctxt "@item:inmenu"
msgid "Post Processing"
-msgstr ""
+msgstr "Pós-Processamento"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:36
msgctxt "@item:inmenu"
msgid "Modify G-Code"
-msgstr ""
+msgstr "Modificar G-Code"
#: /home/ruben/Projects/Cura/plugins/SupportEraser/__init__.py:12
msgctxt "@label"
@@ -710,7 +706,7 @@ msgstr "Perfis Cura 15.04"
#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
msgctxt "@item:inmenu"
msgid "Evaluation"
-msgstr ""
+msgstr "Avaliação"
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
@@ -778,7 +774,7 @@ msgstr "Não é possível seccionar porque existem objetos associados à extruso
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
msgctxt "@info:status"
msgid "Nothing to slice because none of the models fit the build volume or are assigned to a disabled extruder. Please scale or rotate models to fit, or enable an extruder."
-msgstr ""
+msgstr "Sem conteúdo para segmentar porque nenhum dos modelos está dentro do volume de construção ou porque os mesmos estão atribuídos a um extrusor desativado. Dimensione ou rode os modelos para os adaptar ou ative o extrusor."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
@@ -863,7 +859,7 @@ msgstr "Certifique-se de que este g-code é apropriado para a sua impressora e r
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:64
msgctxt "@item:inmenu"
msgid "Manage backups"
-msgstr ""
+msgstr "Gerir cópias de segurança"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:107
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:113
@@ -876,32 +872,32 @@ msgstr "Backup"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:55
msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
-msgstr ""
+msgstr "Ocorreu um erro ao listar as suas cópias de segurança."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
-msgstr ""
+msgstr "Ocorreu um erro ao tentar restaurar a sua cópia de segurança."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:15
msgctxt "@info:title"
msgid "Backups"
-msgstr ""
+msgstr "Cópias de segurança"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:27
msgctxt "@info:backup_status"
msgid "Uploading your backup..."
-msgstr ""
+msgstr "A carregar a sua cópia de segurança..."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:36
msgctxt "@info:backup_status"
msgid "There was an error while uploading your backup."
-msgstr ""
+msgstr "Ocorreu um erro ao carregar a sua cópia de segurança."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:39
msgctxt "@info:backup_status"
msgid "Your backup has finished uploading."
-msgstr ""
+msgstr "A cópia de segurança terminou o seu carregamento."
#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14
#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14
@@ -937,7 +933,7 @@ msgstr "Erro ao gravar ficheiro 3mf."
#: /home/ruben/Projects/Cura/plugins/PreviewStage/__init__.py:13
msgctxt "@item:inmenu"
msgid "Preview"
-msgstr ""
+msgstr "Pré-visualizar"
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
@@ -945,11 +941,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr "Selecionar atualizações"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr "Checkup"
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -1038,7 +1029,7 @@ msgstr "O ficheiro {0} já existe. Tem a certeza de que des
#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
msgctxt "@info:status"
msgid "Invalid file URL:"
-msgstr ""
+msgstr "URL de ficheiro inválido:"
#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
msgctxt "@menuitem"
@@ -1059,7 +1050,7 @@ msgstr "Definições atualizadas"
#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
-msgstr ""
+msgstr "Extrusor(es) desativado(s)"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
#, python-brace-format
@@ -1088,13 +1079,13 @@ msgstr "Exportação bem-sucedida"
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
-msgstr ""
+msgstr "Falha ao importar perfil de {0}: {1}"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Can't import profile from {0} before a printer is added."
-msgstr ""
+msgstr "Não é possível importar o perfil de {0} antes de ser adicionada uma impressora."
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
#, python-brace-format
@@ -1229,7 +1220,7 @@ msgstr "Tentou restaurar um Cura backup que não corresponde á sua versão actu
#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
-msgstr ""
+msgstr "Não é possível aceder ao servidor da conta Ultimaker."
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
@@ -1239,7 +1230,7 @@ msgstr "Multiplicar e posicionar objetos"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:28
msgctxt "@info:title"
msgid "Placing Objects"
-msgstr ""
+msgstr "A posicionar objetos"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:103
@@ -1285,12 +1276,7 @@ msgid ""
"
Backups can be found in the configuration folder.
\n"
"
Please send us this Crash Report to fix the problem.
\n"
" "
-msgstr ""
-"
Ups, o Ultimaker Cura encontrou um possível problema.
\n"
-"
Foi encontrado um erro irrecuperável durante o arranque da aplicação. Este pode ter sido causado por alguns ficheiros de configuração incorrectos. Sugerimos que faça um backup e reponha a sua configuração.
\n"
-"
Os backups estão localizados na pasta de configuração.
\n"
-"
Por favor envie-nos este Relatório de Falhas para podermos resolver o problema.
\n"
-" "
+msgstr "
Ups, o Ultimaker Cura encontrou um possível problema.
\n
Foi encontrado um erro irrecuperável durante o arranque da aplicação. Este pode ter sido causado por alguns ficheiros de configuração incorrectos. Sugerimos que faça um backup e reponha a sua configuração.
\n
Os backups estão localizados na pasta de configuração.
\n
Por favor envie-nos este Relatório de Falhas para podermos resolver o problema.
A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem
\n"
"
Please use the \"Send report\" button to post a bug report automatically to our servers
\n"
" "
-msgstr ""
-"
Ocorreu um erro fatal no Cura. Por favor envie-nos este Relatório de Falhas para podermos resolver o problema
\n"
-"
Por favor utilize o botão \"Enviar relatório\" para publicar um relatório de erros automaticamente nos nossos servidores
\n"
-" "
+msgstr "
Ocorreu um erro fatal no Cura. Por favor envie-nos este Relatório de Falhas para podermos resolver o problema
\n
Por favor utilize o botão \"Enviar relatório\" para publicar um relatório de erros automaticamente nos nossos servidores
\n "
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:173
msgctxt "@title:groupbox"
@@ -1660,7 +1643,7 @@ msgstr "Não foi possível aceder á base de dados de Pacotes do Cura. Por favor
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/SmallRatingWidget.qml:27
msgctxt "@label"
msgid "ratings"
-msgstr ""
+msgstr "classificações"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
@@ -1679,7 +1662,7 @@ msgstr "Materiais"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:91
msgctxt "@label"
msgid "Your rating"
-msgstr ""
+msgstr "A sua classificação"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
msgctxt "@label"
@@ -1712,7 +1695,7 @@ msgstr "Desconhecido"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
-msgstr ""
+msgstr "É necessário Log in para instalar ou atualizar"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
@@ -1735,7 +1718,7 @@ msgstr "Atualizado"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:13
msgctxt "@title"
msgid "Marketplace"
-msgstr ""
+msgstr "Mercado"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml:25
msgctxt "@action:button"
@@ -1770,12 +1753,12 @@ msgstr "Confirmar"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to login first before you can rate"
-msgstr ""
+msgstr "É necessário iniciar sessão antes de atribuir a classificação"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to install the package before you can rate"
-msgstr ""
+msgstr "É necessário instalar o pacote antes de atribuir a classificação"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:19
msgctxt "@info"
@@ -1815,7 +1798,7 @@ msgstr "Será instalado após reiniciar"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:53
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to update"
-msgstr ""
+msgstr "É necessário Log in para atualizar"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:71
msgctxt "@action:button"
@@ -1838,10 +1821,7 @@ msgid ""
"This plugin contains a license.\n"
"You need to accept this license to install this plugin.\n"
"Do you agree with the terms below?"
-msgstr ""
-"Este plug-in contém uma licença.\n"
-"É necessário aceitar esta licença para instalar o plug-in.\n"
-"Concorda com os termos abaixo?"
+msgstr "Este plug-in contém uma licença.\nÉ necessário aceitar esta licença para instalar o plug-in.\nConcorda com os termos abaixo?"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:55
msgctxt "@action:button"
@@ -1866,22 +1846,22 @@ msgstr "Compatibilidade"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:203
msgctxt "@action:label"
msgid "Technical Data Sheet"
-msgstr ""
+msgstr "Ficha técnica"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:212
msgctxt "@action:label"
msgid "Safety Data Sheet"
-msgstr ""
+msgstr "Ficha de segurança"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:221
msgctxt "@action:label"
msgid "Printing Guidelines"
-msgstr ""
+msgstr "Instruções de impressão"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:230
msgctxt "@action:label"
msgid "Website"
-msgstr ""
+msgstr "Site"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml:16
msgctxt "@info"
@@ -2004,17 +1984,17 @@ msgstr "Contrato de Utilizador"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
msgctxt "@info"
msgid "These options are not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Estas opções não estão disponíveis pois está a monitorizar uma impressora na cloud."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:241
msgctxt "@info"
msgid "The webcam is not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Esta webcam não está disponível pois está a monitorizar uma impressora na cloud."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
msgctxt "@label:status"
msgid "Loading..."
-msgstr ""
+msgstr "A carregar..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
msgctxt "@label:status"
@@ -2024,42 +2004,42 @@ msgstr "Indisponível"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
msgctxt "@label:status"
msgid "Unreachable"
-msgstr ""
+msgstr "Inacessível"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
msgctxt "@label:status"
msgid "Idle"
-msgstr ""
+msgstr "Inativa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:353
msgctxt "@label"
msgid "Untitled"
-msgstr ""
+msgstr "Sem título"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
msgctxt "@label"
msgid "Anonymous"
-msgstr ""
+msgstr "Anónimo"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
msgctxt "@label:status"
msgid "Requires configuration changes"
-msgstr ""
+msgstr "Requer alterações na configuração"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
msgctxt "@action:button"
msgid "Details"
-msgstr ""
+msgstr "Detalhes"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "Unavailable printer"
-msgstr ""
+msgstr "Impressora indisponível"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
msgctxt "@label"
msgid "First available"
-msgstr ""
+msgstr "Primeira disponível"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:187
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:132
@@ -2075,27 +2055,27 @@ msgstr "Em fila"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
msgid "Go to Cura Connect"
-msgstr ""
+msgstr "Ir para o Cura Connect"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
msgctxt "@label"
msgid "Print jobs"
-msgstr ""
+msgstr "Trabalhos em Impressão"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Total print time"
-msgstr ""
+msgstr "Tempo de impressão total"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
msgctxt "@label"
msgid "Waiting for"
-msgstr ""
+msgstr "A aguardar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
msgctxt "@label link to connect manager"
msgid "View print history"
-msgstr ""
+msgstr "Ver histórico de impressão"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
msgctxt "@window:title"
@@ -2118,10 +2098,7 @@ msgid ""
"To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n"
"\n"
"Select your printer from the list below:"
-msgstr ""
-"Para imprimir diretamente para a sua impressora através da rede, certifique-se de que a sua impressora está ligada à rede por meio de um cabo de rede ou através de ligação à rede Wi-Fi. Se não ligar o Cura por rede à impressora, poderá ainda assim utilizar uma unidade USB para transferir ficheiros g-code para a impressora.\n"
-"\n"
-"Selecione a sua impressora na lista em baixo:"
+msgstr "Para imprimir diretamente para a sua impressora através da rede, certifique-se de que a sua impressora está ligada à rede por meio de um cabo de rede ou através de ligação à rede Wi-Fi. Se não ligar o Cura por rede à impressora, poderá ainda assim utilizar uma unidade USB para transferir ficheiros g-code para a impressora.\n\nSelecione a sua impressora na lista em baixo:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:87
#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44
@@ -2221,17 +2198,17 @@ msgstr "Impressão terminada"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Preparing..."
-msgstr ""
+msgstr "A preparar..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Aborting..."
-msgstr ""
+msgstr "A cancelar..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
msgctxt "@label:status"
msgid "Pausing..."
-msgstr ""
+msgstr "A colocar em pausa..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
msgctxt "@label:status"
@@ -2241,7 +2218,7 @@ msgstr "Em Pausa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
msgctxt "@label:status"
msgid "Resuming..."
-msgstr ""
+msgstr "A recomeçar..."
# rever!
# ver contexto!
@@ -2253,7 +2230,7 @@ msgstr "Ação necessária"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
msgctxt "@label:status"
msgid "Finishes %1 at %2"
-msgstr ""
+msgstr "Termina %1 a %2"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:44
msgctxt "@action:button"
@@ -2289,12 +2266,12 @@ msgstr "Retomar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:102
msgctxt "@label"
msgid "Pausing..."
-msgstr ""
+msgstr "A colocar em pausa..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:104
msgctxt "@label"
msgid "Resuming..."
-msgstr ""
+msgstr "A recomeçar..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:106
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284
@@ -2306,7 +2283,7 @@ msgstr "Colocar em pausa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
msgid "Aborting..."
-msgstr ""
+msgstr "A cancelar..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
@@ -2347,19 +2324,19 @@ msgstr "Cancelar impressão"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:20
msgctxt "@title:window"
msgid "Configuration Changes"
-msgstr ""
+msgstr "Alterações na configuração"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:27
msgctxt "@action:button"
msgid "Override"
-msgstr ""
+msgstr "Ignorar"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
msgctxt "@label"
msgid "The assigned printer, %1, requires the following configuration change:"
msgid_plural "The assigned printer, %1, requires the following configuration changes:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "A impressora atribuída %1 requer a seguinte alteração na configuração:"
+msgstr[1] "A impressora atribuída %1 requer as seguintes alterações na configuração:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
msgctxt "@label"
@@ -2389,7 +2366,7 @@ msgstr "Alterar placa de construção para %1 (isto não pode ser substituído).
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
-msgstr ""
+msgstr "Ignorar utilizará as definições especificadas com a configuração da impressora existente. Tal pode resultar numa falha de impressão."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
msgctxt "@label"
@@ -2407,22 +2384,22 @@ msgid ""
"Please make sure your printer has a connection:\n"
"- Check if the printer is turned on.\n"
"- Check if the printer is connected to the network."
-msgstr ""
+msgstr "Certifique-se de que é possível estabelecer ligação com a impressora:\n- Verifique se a impressora está ligada.\n- Verifique se a impressora está ligada à rede."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
msgctxt "@info"
msgid "Please select a network connected printer to monitor."
-msgstr ""
+msgstr "Selecione uma impressora ligada à rede para monitorizar."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
msgctxt "@info"
msgid "Please connect your Ultimaker printer to your local network."
-msgstr ""
+msgstr "Ligue a sua impressora Ultimaker à sua rede local."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
-msgstr ""
+msgstr "Ver manuais do utilizador online"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
@@ -2458,17 +2435,17 @@ msgstr "Modo Compatibilidade"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
msgctxt "@label"
msgid "Travels"
-msgstr ""
+msgstr "Deslocações"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
msgctxt "@label"
msgid "Helpers"
-msgstr ""
+msgstr "Auxiliares"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
msgctxt "@label"
msgid "Shell"
-msgstr ""
+msgstr "Invólucro"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
@@ -2547,17 +2524,17 @@ msgstr "O Cura envia informação anónima para a Ultimaker, para nos ajudar a a
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
msgctxt "@text:window"
msgid "I don't want to send this data"
-msgstr ""
+msgstr "Não pretendo enviar estes dados"
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
msgctxt "@text:window"
msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr ""
+msgstr "Permita o envio destes dados ao Ultimaker e ajude-nos a melhorar o Cura"
#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
msgctxt "@label"
msgid "No print selected"
-msgstr ""
+msgstr "Nenhuma impressão selecionada"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2822,108 +2799,108 @@ msgstr "Abrir"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:28
msgctxt "@title"
msgid "My Backups"
-msgstr ""
+msgstr "As minhas cópias de segurança"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:38
msgctxt "@empty_state"
msgid "You don't have any backups currently. Use the 'Backup Now' button to create one."
-msgstr ""
+msgstr "Atualmente não existem quaisquer cópias de segurança. Utilize o botão \"Efetuar cópia de segurança agora\" para criar uma."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:60
msgctxt "@backup_limit_info"
msgid "During the preview phase, you'll be limited to 5 visible backups. Remove a backup to see older ones."
-msgstr ""
+msgstr "Durante a fase de pré-visualização, terá um limite de 5 cópias de segurança visíveis. Remova uma cópia de segurança para ver as antigas."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:34
msgctxt "@description"
msgid "Backup and synchronize your Cura settings."
-msgstr ""
+msgstr "Efetue a cópia de segurança e sincronize as suas definições do Cura."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
msgctxt "@button"
msgid "Sign in"
-msgstr ""
+msgstr "Iniciar sessão"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/main.qml:24
msgctxt "@title:window"
msgid "Cura Backups"
-msgstr ""
+msgstr "Cópias de segurança do Cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:21
msgctxt "@backuplist:label"
msgid "Cura Version"
-msgstr ""
+msgstr "Versão do Cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:29
msgctxt "@backuplist:label"
msgid "Machines"
-msgstr ""
+msgstr "Máquinas"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:37
msgctxt "@backuplist:label"
msgid "Materials"
-msgstr ""
+msgstr "Materiais"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:45
msgctxt "@backuplist:label"
msgid "Profiles"
-msgstr ""
+msgstr "Perfis"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:53
msgctxt "@backuplist:label"
msgid "Plugins"
-msgstr ""
+msgstr "Plug-ins"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:71
msgctxt "@button"
msgid "Restore"
-msgstr ""
+msgstr "Restaurar"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:99
msgctxt "@dialog:title"
msgid "Delete Backup"
-msgstr ""
+msgstr "Eliminar cópia de segurança"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:100
msgctxt "@dialog:info"
msgid "Are you sure you want to delete this backup? This cannot be undone."
-msgstr ""
+msgstr "Tem a certeza de que pretende eliminar esta cópia de segurança? Esta ação não pode ser anulada."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:108
msgctxt "@dialog:title"
msgid "Restore Backup"
-msgstr ""
+msgstr "Restaurar cópia de segurança"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:109
msgctxt "@dialog:info"
msgid "You will need to restart Cura before your backup is restored. Do you want to close Cura now?"
-msgstr ""
+msgstr "É necessário reiniciar o Cura para restaurar a sua cópia de segurança. Pretende fechar o Cura agora?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:22
msgctxt "@button"
msgid "Want more?"
-msgstr ""
+msgstr "Deseja mais?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:31
msgctxt "@button"
msgid "Backup Now"
-msgstr ""
+msgstr "Efetuar cópia de segurança agora"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:43
msgctxt "@checkbox:description"
msgid "Auto Backup"
-msgstr ""
+msgstr "Efetuar cópia de segurança automaticamente"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:44
msgctxt "@checkbox:description"
msgid "Automatically create a backup each day that Cura is started."
-msgstr ""
+msgstr "Criar automaticamente uma cópia de segurança sempre que o Cura é iniciado."
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMainSettingsSelector.qml:75
msgctxt "@label"
msgid "Not supported"
-msgstr ""
+msgstr "Não suportado"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:35
msgctxt "@action:button"
@@ -3008,106 +2985,6 @@ msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr "Base de Construção Aquecida (kit oficial ou de construção própria)"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27
-msgctxt "@title"
-msgid "Check Printer"
-msgstr "Verificar Impressora"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39
-msgctxt "@label"
-msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"
-msgstr "É recomendado efetuar algumas verificações de teste à sua Ultimaker. Pode ignorar este passo se souber que a sua máquina está funcional"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53
-msgctxt "@action:button"
-msgid "Start Printer Check"
-msgstr "Iniciar Verificação da Impressora"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80
-msgctxt "@label"
-msgid "Connection: "
-msgstr "Ligação: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Connected"
-msgstr "Ligado"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Not connected"
-msgstr "Sem ligação"
-
-# rever!
-# contexto?!
-# X mín. de posição final:
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99
-msgctxt "@label"
-msgid "Min endstop X: "
-msgstr "Mín. endstop X: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-msgctxt "@info:status"
-msgid "Works"
-msgstr "Trabalhos"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Not checked"
-msgstr "Não verificado"
-
-# rever!
-# contexto?!
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120
-msgctxt "@label"
-msgid "Min endstop Y: "
-msgstr "Mín. endstop Y: "
-
-# rever!
-# contexto?!
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141
-msgctxt "@label"
-msgid "Min endstop Z: "
-msgstr "Mín. endstop Z: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163
-msgctxt "@label"
-msgid "Nozzle temperature check: "
-msgstr "Verificação da temperatura do nozzle: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Stop Heating"
-msgstr "Parar Aquecimento"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Start Heating"
-msgstr "Iniciar Aquecimento"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223
-msgctxt "@label"
-msgid "Build plate temperature check:"
-msgstr "Verificação da temperatura da base de construção:"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Checked"
-msgstr "Verificado"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284
-msgctxt "@label"
-msgid "Everything is in order! You're done with your CheckUp."
-msgstr "Está tudo em ordem! A verificação está concluída."
-
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"
msgid "Not connected to a printer"
@@ -3683,7 +3560,7 @@ msgstr "Criar Perfil"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
msgctxt "@info"
msgid "Please provide a name for this profile."
-msgstr ""
+msgstr "Forneça um nome para este perfil."
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
msgctxt "@title:window"
@@ -3713,7 +3590,7 @@ msgstr "Impressora: %1"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
msgid "Default profiles"
-msgstr ""
+msgstr "Perfis predefinidos"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
@@ -3748,7 +3625,7 @@ msgstr "Definições Globais"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
msgctxt "@action:button"
msgid "Marketplace"
-msgstr ""
+msgstr "Mercado"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:27
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:13
@@ -3771,7 +3648,7 @@ msgstr "&Visualizar"
#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:13
msgctxt "@title:menu menubar:toplevel"
msgid "&Settings"
-msgstr ""
+msgstr "&Definições"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:55
msgctxt "@title:menu menubar:toplevel"
@@ -3806,7 +3683,7 @@ msgstr "Sem título"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:68
msgctxt "@label:textbox"
msgid "search settings"
-msgstr ""
+msgstr "procurar definições"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
msgctxt "@action:menu"
@@ -3849,10 +3726,7 @@ msgid ""
"Some hidden settings use values different from their normal calculated value.\n"
"\n"
"Click to make these settings visible."
-msgstr ""
-"Algumas das definições invisíveis têm valores diferentes dos valores normais calculados automaticamente.\n"
-"\n"
-"Clique para tornar estas definições visíveis."
+msgstr "Algumas das definições invisíveis têm valores diferentes dos valores normais calculados automaticamente.\n\nClique para tornar estas definições visíveis."
# rever!
# Afeta?
@@ -3889,10 +3763,7 @@ msgid ""
"This setting has a value that is different from the profile.\n"
"\n"
"Click to restore the value of the profile."
-msgstr ""
-"Esta definição tem um valor que é diferente do perfil.\n"
-"\n"
-"Clique para restaurar o valor do perfil."
+msgstr "Esta definição tem um valor que é diferente do perfil.\n\nClique para restaurar o valor do perfil."
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:302
msgctxt "@label"
@@ -3900,25 +3771,22 @@ msgid ""
"This setting is normally calculated, but it currently has an absolute value set.\n"
"\n"
"Click to restore the calculated value."
-msgstr ""
-"Normalmente, o valor desta definição é calculado, mas atualmente tem definido um valor diferente.\n"
-"\n"
-"Clique para restaurar o valor calculado."
+msgstr "Normalmente, o valor desta definição é calculado, mas atualmente tem definido um valor diferente.\n\nClique para restaurar o valor calculado."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
msgctxt "@button"
msgid "Recommended"
-msgstr ""
+msgstr "Recomendado"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
msgctxt "@button"
msgid "Custom"
-msgstr ""
+msgstr "Personalizado"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:193
msgctxt "@label"
msgid "Gradual infill"
-msgstr ""
+msgstr "Enchimento gradual"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:232
msgctxt "@label"
@@ -3928,7 +3796,7 @@ msgstr "O enchimento gradual irá aumentar progressivamente a densidade do enchi
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
msgctxt "@label"
msgid "Support"
-msgstr ""
+msgstr "Suportes"
# rever!
# collapse ?
@@ -3951,7 +3819,7 @@ msgstr "Selecionar qual o extrusor usado para imprimir os suportes. Isto irá co
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
msgctxt "@label"
msgid "Adhesion"
-msgstr ""
+msgstr "Aderência à Base de Construção"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
msgctxt "@label"
@@ -3971,7 +3839,7 @@ msgstr "Algumas definições do perfil foram modificadas. Se pretender alterá-l
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:355
msgctxt "@tooltip"
msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile"
-msgstr ""
+msgstr "Este perfil de qualidade não se encontra disponível para a sua configuração atual de material e de bocal. Altere-a para ativar este perfil de qualidade"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3981,17 +3849,17 @@ msgstr "De momento está ativo um perfil personalizado. Para poder ativar o cont
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:13
msgctxt "@label:Should be short"
msgid "On"
-msgstr ""
+msgstr "Ligado"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:14
msgctxt "@label:Should be short"
msgid "Off"
-msgstr ""
+msgstr "Desligado"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:27
msgctxt "@label"
msgid "Profile"
-msgstr ""
+msgstr "Perfil"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:94
msgctxt "@tooltip"
@@ -3999,15 +3867,12 @@ msgid ""
"Some setting/override values are different from the values stored in the profile.\n"
"\n"
"Click to open the profile manager."
-msgstr ""
-"Alguns valores de definição/substituição são diferentes dos valores armazenados no perfil.\n"
-"\n"
-"Clique para abrir o gestor de perfis."
+msgstr "Alguns valores de definição/substituição são diferentes dos valores armazenados no perfil.\n\nClique para abrir o gestor de perfis."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label shown when we load a Gcode file"
msgid "Print setup disabled. G code file can not be modified."
-msgstr ""
+msgstr "Configuração de impressão desativada. O ficheiro G-code não pode ser modificado."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -4254,47 +4119,47 @@ msgstr "Número de Cópias"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/AutoConfiguration.qml:18
msgctxt "@header"
msgid "Configurations"
-msgstr ""
+msgstr "Configurações"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:110
msgctxt "@label"
msgid "Select configuration"
-msgstr ""
+msgstr "Selecionar configuração"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
msgctxt "@label"
msgid "See the material compatibility chart"
-msgstr ""
+msgstr "Ver o gráfico de compatibilidade de materiais"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
msgctxt "@label"
msgid "Configurations"
-msgstr ""
+msgstr "Configurações"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:57
msgctxt "@label"
msgid "Loading available configurations from the printer..."
-msgstr ""
+msgstr "A carregar as configurações disponíveis da impressora..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:58
msgctxt "@label"
msgid "The configurations are not available because the printer is disconnected."
-msgstr ""
+msgstr "As configurações não estão disponíveis porque a impressora está desligada."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:25
msgctxt "@header"
msgid "Custom"
-msgstr ""
+msgstr "Personalizado"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:61
msgctxt "@label"
msgid "Printer"
-msgstr ""
+msgstr "Impressora"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
msgctxt "@label"
msgid "Enabled"
-msgstr ""
+msgstr "Ativado"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
msgctxt "@label"
@@ -4304,17 +4169,17 @@ msgstr "Material"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
-msgstr ""
+msgstr "Utilizar cola para melhor aderência com esta combinação de materiais."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:128
msgctxt "@label"
msgid "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile."
-msgstr ""
+msgstr "Esta configuração não está disponível porque não foi possível reconhecer %1. Visite %2 para transferir o perfil de material correto."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:129
msgctxt "@label"
msgid "Marketplace"
-msgstr ""
+msgstr "Mercado"
#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:15
msgctxt "@title:menu menubar:file"
@@ -4344,37 +4209,37 @@ msgstr "Tempo restante estimado"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
msgid "View types"
-msgstr ""
+msgstr "Ver tipos"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
msgctxt "@label"
msgid "Hi "
-msgstr ""
+msgstr "Olá "
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
msgctxt "@button"
msgid "Ultimaker account"
-msgstr ""
+msgstr "Conta Ultimaker"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
msgctxt "@button"
msgid "Sign out"
-msgstr ""
+msgstr "Terminar sessão"
#: /home/ruben/Projects/Cura/resources/qml/Account/AccountWidget.qml:24
msgctxt "@action:button"
msgid "Sign in"
-msgstr ""
+msgstr "Iniciar sessão"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
msgctxt "@label"
msgid "Ultimaker Cloud"
-msgstr ""
+msgstr "Ultimaker Cloud"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
-msgstr ""
+msgstr "O fluxo de trabalho de impressão 3D da próxima geração"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:51
msgctxt "@text"
@@ -4382,27 +4247,27 @@ msgid ""
"- Send print jobs to Ultimaker printers outside your local network\n"
"- Store your Ultimaker Cura settings in the cloud for use anywhere\n"
"- Get exclusive access to material profiles from leading brands"
-msgstr ""
+msgstr "- Envie trabalhos de impressão para impressoras Ultimaker fora da sua rede local\n- Guarde as definições do seu Ultimaker Cura na cloud para utilizar em qualquer lugar\n- Obtenha acesso exclusivo a perfis de materiais de marcas de referência"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
msgid "Create account"
-msgstr ""
+msgstr "Criar conta"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
msgctxt "@label"
msgid "No time estimation available"
-msgstr ""
+msgstr "Nenhuma estimativa de tempo disponível"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
msgctxt "@label"
msgid "No cost estimation available"
-msgstr ""
+msgstr "Nenhuma estimativa de custos disponível"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
msgctxt "@button"
msgid "Preview"
-msgstr ""
+msgstr "Pré-visualizar"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
msgctxt "@label:PrintjobStatus"
@@ -4417,27 +4282,27 @@ msgstr "Não é possível Seccionar"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
msgctxt "@button"
msgid "Slice"
-msgstr ""
+msgstr "Segmentação"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
msgctxt "@label"
msgid "Start the slicing process"
-msgstr ""
+msgstr "Iniciar o processo de segmentação"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
msgctxt "@button"
msgid "Cancel"
-msgstr ""
+msgstr "Cancelar"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
msgid "Time specification"
-msgstr ""
+msgstr "Especificação de tempo"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
msgid "Material specification"
-msgstr ""
+msgstr "Especificação do material"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4452,27 +4317,27 @@ msgstr "%1 g"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Connected printers"
-msgstr ""
+msgstr "Impressoras ligadas"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Preset printers"
-msgstr ""
+msgstr "Impressoras predefinidas"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
msgctxt "@button"
msgid "Add printer"
-msgstr ""
+msgstr "Adicionar Impressora"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
msgctxt "@button"
msgid "Manage printers"
-msgstr ""
+msgstr "Gerir impressoras"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
-msgstr ""
+msgstr "Mostrar Guia de resolução de problemas online"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
msgctxt "@action:inmenu"
@@ -4685,7 +4550,7 @@ msgstr "Mostrar pasta de configuração"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
msgctxt "@action:menu"
msgid "&Marketplace"
-msgstr ""
+msgstr "&Mercado"
#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
msgctxt "@title:window"
@@ -4757,9 +4622,7 @@ msgctxt "@text:window"
msgid ""
"You have customized some profile settings.\n"
"Would you like to keep or discard those settings?"
-msgstr ""
-"Alterou algumas das definições do perfil.\n"
-"Gostaria de manter ou descartar essas alterações?"
+msgstr "Alterou algumas das definições do perfil.\nGostaria de manter ou descartar essas alterações?"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:110
msgctxt "@title:column"
@@ -4804,7 +4667,7 @@ msgstr "Criar novo perfil"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
msgctxt "@title:tab"
msgid "Add a printer to Cura"
-msgstr ""
+msgstr "Adicionar uma impressora ao Cura"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
msgctxt "@title:tab"
@@ -4812,17 +4675,17 @@ msgid ""
"Select the printer you want to use from the list below.\n"
"\n"
"If your printer is not in the list, use the \"Custom FFF Printer\" from the \"Custom\" category and adjust the settings to match your printer in the next dialog."
-msgstr ""
+msgstr "Selecione a impressora que deseja utilizar da lista abaixo.\n\nSe a sua impressora não constar da lista, utilize a opção \"Impressora FFF personalizada\" da categoria \"Personalizado\" e ajuste as definições para corresponder à sua impressora na próxima caixa de diálogo."
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
msgctxt "@label"
msgid "Manufacturer"
-msgstr ""
+msgstr "Fabricante"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
msgctxt "@label"
msgid "Printer Name"
-msgstr ""
+msgstr "Nome da impressora"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
msgctxt "@action:button"
@@ -4849,9 +4712,7 @@ msgctxt "@info:credit"
msgid ""
"Cura is developed by Ultimaker B.V. in cooperation with the community.\n"
"Cura proudly uses the following open source projects:"
-msgstr ""
-"O Cura foi desenvolvido pela Ultimaker B.V. em colaboração com a comunidade.\n"
-"O Cura tem o prazer de utilizar os seguintes projetos open source:"
+msgstr "O Cura foi desenvolvido pela Ultimaker B.V. em colaboração com a comunidade.\nO Cura tem o prazer de utilizar os seguintes projetos open source:"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:134
msgctxt "@label"
@@ -5273,6 +5134,7 @@ msgstr "X3GWriter"
#~ "Print Setup disabled\n"
#~ "G-code files cannot be modified"
#~ msgstr ""
+
#~ "Configuração da Impressão desativada\n"
#~ "Os ficheiros G-code não podem ser modificados"
@@ -5900,6 +5762,7 @@ msgstr "X3GWriter"
#~ "Could not export using \"{}\" quality!\n"
#~ "Felt back to \"{}\"."
#~ msgstr ""
+
#~ "Não foi possível exportar utilizando a qualidade \"{}\"!\n"
#~ "Foi revertido para \"{}\"."
@@ -6076,6 +5939,7 @@ msgstr "X3GWriter"
#~ "2) Turn the fan off (only if there are no tiny details on the model).\n"
#~ "3) Use a different material."
#~ msgstr ""
+
#~ "Alguns modelos poderão não ser impressos com a melhor qualidade devido ás dimensões do objecto e aos materiais escolhidos para os modelos: {model_names}.\n"
#~ "Sugestões que poderão ser úteis para melhorar a qualidade da impressão dos modelos:\n"
#~ "1) Utilize cantos arredondados.\n"
@@ -6092,6 +5956,7 @@ msgstr "X3GWriter"
#~ "\n"
#~ "Thanks!"
#~ msgstr ""
+
#~ "Não foram encontrados quaisquer modelos no seu desenho. Por favor verifique novamente o conteúdo do desenho e confirme que este inclui uma peça ou uma \"assembly\"?\n"
#~ "\n"
#~ "Obrigado!"
@@ -6102,6 +5967,7 @@ msgstr "X3GWriter"
#~ "\n"
#~ "Sorry!"
#~ msgstr ""
+
#~ "Foram encontradas mais do que uma peça ou uma \"assembly\" no seu desenho. De momento só são suportados ficheiros com uma só peça ou só uma \"assembly\".\n"
#~ "\n"
#~ "As nossa desculpas!"
@@ -6130,6 +5996,7 @@ msgstr "X3GWriter"
#~ "With kind regards\n"
#~ " - Thomas Karl Pietrowski"
#~ msgstr ""
+
#~ "Caro Cliente,\n"
#~ "Não foi possível encontrar uma instalação válida do SolidWorks no seu sistema. O que significa que o SolidWorks não está instalado ou não dispõe de uma licença válida. Por favor verifique se o próprio SolidWorks funciona sem qualquer problema e/ou contacte o seu ICT.\n"
#~ "\n"
@@ -6144,6 +6011,7 @@ msgstr "X3GWriter"
#~ "With kind regards\n"
#~ " - Thomas Karl Pietrowski"
#~ msgstr ""
+
#~ "Caro cliente,\n"
#~ "Está atualmente a executar este plug-in num sistema operativo que não o Windows. Este plug-in apenas funciona no Windows com o SolidWorks instalado e com uma licença válida. Instale este plug-in num computador com o Windows e com o SolidWorks instalado.\n"
#~ "\n"
@@ -6248,6 +6116,7 @@ msgstr "X3GWriter"
#~ "Open the directory\n"
#~ "with macro and icon"
#~ msgstr ""
+
#~ "Abrir o diretório\n"
#~ "com macro e ícone"
diff --git a/resources/i18n/pt_PT/fdmextruder.def.json.po b/resources/i18n/pt_PT/fdmextruder.def.json.po
index 0d6b9d521f..8da410c2cb 100644
--- a/resources/i18n/pt_PT/fdmextruder.def.json.po
+++ b/resources/i18n/pt_PT/fdmextruder.def.json.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 14:25+0100\n"
-"Last-Translator: Paulo Miranda \n"
+"PO-Revision-Date: 2019-03-14 14:15+0100\n"
+"Last-Translator: Portuguese \n"
"Language-Team: Paulo Miranda , Portuguese \n"
"Language: pt_PT\n"
"MIME-Version: 1.0\n"
@@ -86,7 +86,7 @@ msgstr "G-Code Inicial do Extrusor"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
-msgstr ""
+msgstr "G-code inicial para executar ao mudar para este extrusor."
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_abs label"
@@ -126,7 +126,7 @@ msgstr "G-Code Final do Extrusor"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_code description"
msgid "End g-code to execute when switching away from this extruder."
-msgstr ""
+msgstr "G-code final para executar ao mudar deste extrusor."
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_abs label"
diff --git a/resources/i18n/pt_PT/fdmprinter.def.json.po b/resources/i18n/pt_PT/fdmprinter.def.json.po
index 210ff9ba75..e7253bedd5 100644
--- a/resources/i18n/pt_PT/fdmprinter.def.json.po
+++ b/resources/i18n/pt_PT/fdmprinter.def.json.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-10-01 14:15+0100\n"
-"Last-Translator: Paulo Miranda \n"
+"PO-Revision-Date: 2019-03-14 14:15+0100\n"
+"Last-Translator: Portuguese \n"
"Language-Team: Paulo Miranda , Portuguese \n"
"Language: pt_PT\n"
"MIME-Version: 1.0\n"
@@ -58,9 +58,7 @@ msgctxt "machine_start_gcode description"
msgid ""
"G-code commands to be executed at the very start - separated by \n"
"."
-msgstr ""
-"Comandos G-code a serem executados no início – separados por \n"
-"."
+msgstr "Comandos G-code a serem executados no início – separados por \n."
#: fdmprinter.def.json
msgctxt "machine_end_gcode label"
@@ -72,9 +70,7 @@ msgctxt "machine_end_gcode description"
msgid ""
"G-code commands to be executed at the very end - separated by \n"
"."
-msgstr ""
-"Comandos G-code a serem executados no fim – separados por \n"
-"."
+msgstr "Comandos G-code a serem executados no fim – separados por \n."
#: fdmprinter.def.json
msgctxt "material_guid label"
@@ -1699,9 +1695,7 @@ msgctxt "infill_wall_line_count description"
msgid ""
"Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n"
"This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right."
-msgstr ""
-"Adicionar paredes adicionais em torno da área de enchimento. Essas paredes podem fazer com que as linhas de revestimento superiores/inferiores desçam menos, o que significa que são necessárias menos camadas de revestimento superior/inferior para a mesma qualidade à custa de algum material adicional.\n"
-"Esta funcionalidade pode ser combinada com a opção Ligar polígonos de enchimento para unir todo o enchimento num único caminho de extrusão sem necessidade de deslocações ou retrações, se configurado corretamente."
+msgstr "Adicionar paredes adicionais em torno da área de enchimento. Essas paredes podem fazer com que as linhas de revestimento superiores/inferiores desçam menos, o que significa que são necessárias menos camadas de revestimento superior/inferior para a mesma qualidade à custa de algum material adicional.\nEsta funcionalidade pode ser combinada com a opção Ligar polígonos de enchimento para unir todo o enchimento num único caminho de extrusão sem necessidade de deslocações ou retrações, se configurado corretamente."
#: fdmprinter.def.json
msgctxt "sub_div_rad_add label"
@@ -1741,7 +1735,7 @@ msgstr "Sobreposição Revestimento (%)"
#: fdmprinter.def.json
msgctxt "skin_overlap description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines, as a percentage of the line widths of the skin lines and the innermost wall. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any percentage over 50% may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Ajuste a quantidade de sobreposição entre as paredes e (as extremidades) das linhas centrais de revestimento, como percentagem das larguras de linha das linhas de revestimento e da parede mais interna. Uma ligeira sobreposição permite que as paredes se liguem firmemente ao revestimento. Observe que no caso de um revestimento e uma largura de revestimento da parede iguais, qualquer percentagem acima de 50% pode fazer com que o revestimento ultrapasse a parede, visto que a posição do bocal do extrusor de revestimento pode já ultrapassar o centro da parede neste ponto."
#: fdmprinter.def.json
msgctxt "skin_overlap_mm label"
@@ -1751,7 +1745,7 @@ msgstr "Sobreposição Revestimento (mm)"
#: fdmprinter.def.json
msgctxt "skin_overlap_mm description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any value over half the width of the wall may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Ajuste a quantidade de sobreposição entre as paredes e (as extremidades) das linhas centrais de revestimento. Uma ligeira sobreposição permite que as paredes se liguem firmemente ao revestimento. Observe que no caso de um revestimento e uma largura de revestimento da parede iguais, qualquer valor acima da metade da largura da parede pode fazer com que o revestimento ultrapasse a parede, visto que a posição do bocal do extrusor de revestimento pode já ultrapassar o centro da parede."
#: fdmprinter.def.json
msgctxt "infill_wipe_dist label"
@@ -2209,7 +2203,7 @@ msgstr "Distância de retração de substituição do nozzle"
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_amount description"
msgid "The amount of retraction when switching extruders. Set to 0 for no retraction at all. This should generally be the same as the length of the heat zone."
-msgstr ""
+msgstr "A quantidade de retração ao mudar de extrusor. Defina como 0 para não obter qualquer retração. Normalmente, esta deve ser a mesma que o comprimento da zona de aquecimento."
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_speeds label"
@@ -2900,7 +2894,7 @@ msgstr "Modo de Combing"
#: fdmprinter.def.json
msgctxt "retraction_combing description"
msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas or to only comb within the infill."
-msgstr ""
+msgstr "Combing mantém o bocal em áreas já impressas durante a deslocação. Isto resulta em movimentos de deslocação ligeiramente mais longos, mas reduz a necessidade de retrações. Se o combing estiver desativado, o material será retraído e o bocal irá deslocar-se em linha reta para o próximo ponto. Também é possível evitar o combing em áreas de revestimento superiores/inferiores ou apenas efetuar o combing no enchimento."
#: fdmprinter.def.json
msgctxt "retraction_combing option off"
@@ -3573,12 +3567,12 @@ msgstr "A altura do enchimento de suporte de uma determinada densidade antes de
#: fdmprinter.def.json
msgctxt "minimum_support_area label"
msgid "Minimum Support Area"
-msgstr ""
+msgstr "Área de suporte mínimo"
#: fdmprinter.def.json
msgctxt "minimum_support_area description"
msgid "Minimum area size for support polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Tamanho mínimo da área para polígonos de suporte. Os polígonos com uma área inferior a este valor não serão gerados."
#: fdmprinter.def.json
msgctxt "support_interface_enable label"
@@ -3811,62 +3805,62 @@ msgstr "Ziguezague"
#: fdmprinter.def.json
msgctxt "minimum_interface_area label"
msgid "Minimum Support Interface Area"
-msgstr ""
+msgstr "Área mínima da interface de suporte"
#: fdmprinter.def.json
msgctxt "minimum_interface_area description"
msgid "Minimum area size for support interface polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Tamanho mínimo da área para polígonos da interface de suporte. Os polígonos com uma área inferior a este valor não serão gerados."
#: fdmprinter.def.json
msgctxt "minimum_roof_area label"
msgid "Minimum Support Roof Area"
-msgstr ""
+msgstr "Área mínima do teto de suporte"
#: fdmprinter.def.json
msgctxt "minimum_roof_area description"
msgid "Minimum area size for the roofs of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Tamanho mínimo da área para os tetos de suporte. Os polígonos com uma área inferior a este valor não serão gerados."
#: fdmprinter.def.json
msgctxt "minimum_bottom_area label"
msgid "Minimum Support Floor Area"
-msgstr ""
+msgstr "Área mínima do piso de suporte"
#: fdmprinter.def.json
msgctxt "minimum_bottom_area description"
msgid "Minimum area size for the floors of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Tamanho mínimo da área para os pisos de suporte. Os polígonos com uma área inferior a este valor não serão gerados."
#: fdmprinter.def.json
msgctxt "support_interface_offset label"
msgid "Support Interface Horizontal Expansion"
-msgstr ""
+msgstr "Expansão horizontal da interface de suporte"
#: fdmprinter.def.json
msgctxt "support_interface_offset description"
msgid "Amount of offset applied to the support interface polygons."
-msgstr ""
+msgstr "Quantidade do desvio aplicado aos polígonos da interface de suporte."
#: fdmprinter.def.json
msgctxt "support_roof_offset label"
msgid "Support Roof Horizontal Expansion"
-msgstr ""
+msgstr "Expansão horizontal do teto de suporte"
#: fdmprinter.def.json
msgctxt "support_roof_offset description"
msgid "Amount of offset applied to the roofs of the support."
-msgstr ""
+msgstr "Quantidade do desvio aplicado aos tetos de suporte."
#: fdmprinter.def.json
msgctxt "support_bottom_offset label"
msgid "Support Floor Horizontal Expansion"
-msgstr ""
+msgstr "Expansão horizontal do piso de suporte"
#: fdmprinter.def.json
msgctxt "support_bottom_offset description"
msgid "Amount of offset applied to the floors of the support."
-msgstr ""
+msgstr "Quantidade do desvio aplicado aos pisos de suporte."
#: fdmprinter.def.json
msgctxt "support_fan_enable label"
@@ -4041,9 +4035,7 @@ msgctxt "skirt_gap description"
msgid ""
"The horizontal distance between the skirt and the first layer of the print.\n"
"This is the minimum distance. Multiple skirt lines will extend outwards from this distance."
-msgstr ""
-"A distância horizontal entre o contorno e o perímetro exterior da primeira camada da impressão.\n"
-"Esta é a distância mínima. Linhas múltiplas de contorno serão impressas para o exterior."
+msgstr "A distância horizontal entre o contorno e o perímetro exterior da primeira camada da impressão.\nEsta é a distância mínima. Linhas múltiplas de contorno serão impressas para o exterior."
#: fdmprinter.def.json
msgctxt "skirt_brim_minimal_length label"
@@ -5532,9 +5524,7 @@ msgctxt "wireframe_up_half_speed description"
msgid ""
"Distance of an upward move which is extruded with half speed.\n"
"This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing."
-msgstr ""
-"A distância de um movimento ascendente que é extrudido a metade da velocidade.\n"
-"Isto pode causar melhor aderência às camadas anteriores, sendo que o material nessas camadas não é demasiado aquecido. Aplica-se apenas à impressão de fios."
+msgstr "A distância de um movimento ascendente que é extrudido a metade da velocidade.\nIsto pode causar melhor aderência às camadas anteriores, sendo que o material nessas camadas não é demasiado aquecido. Aplica-se apenas à impressão de fios."
#: fdmprinter.def.json
msgctxt "wireframe_top_jump label"
diff --git a/resources/i18n/ru_RU/cura.po b/resources/i18n/ru_RU/cura.po
index 3ee414fb25..0439282dff 100644
--- a/resources/i18n/ru_RU/cura.po
+++ b/resources/i18n/ru_RU/cura.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2018-11-06 15:29+0100\n"
+"PO-Revision-Date: 2019-03-14 14:45+0100\n"
"Last-Translator: Bothof \n"
"Language-Team: Ruslan Popov , Russian \n"
"Language: ru_RU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.0.6\n"
+"X-Generator: Poedit 2.1.1\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
@@ -73,7 +73,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
msgctxt "@item:inmenu"
msgid "Changelog"
-msgstr ""
+msgstr "Журнал изменений"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
msgctxt "@item:inmenu"
@@ -492,100 +492,100 @@ msgstr "Печать завершена"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
msgctxt "@label:material"
msgid "Empty"
-msgstr ""
+msgstr "Пусто"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
msgctxt "@label:material"
msgid "Unknown"
-msgstr ""
+msgstr "Неизвестн"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
msgctxt "@action:button"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Печать через облако"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Печать через облако"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
msgctxt "@info:status"
msgid "Connected via Cloud"
-msgstr ""
+msgstr "Подключено через облако"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
msgctxt "@info:title"
msgid "Cloud error"
-msgstr ""
+msgstr "Ошибка облака"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
msgctxt "@info:status"
msgid "Could not export print job."
-msgstr ""
+msgstr "Облако не экспортировало задание печати."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
-msgstr ""
+msgstr "Облако не залило данные на принтер."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:51
msgctxt "@info:status"
msgid "tomorrow"
-msgstr ""
+msgstr "завтра"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:54
msgctxt "@info:status"
msgid "today"
-msgstr ""
+msgstr "сегодня"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
-msgstr ""
+msgstr "При подключении к облаку возникла ошибка."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
msgid "Sending data to remote cluster"
-msgstr ""
+msgstr "Отправка данных на удаленный кластер"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Отправляйте и отслеживайте задания печати из любого места с помощью вашей учетной записи Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
msgctxt "@info:status"
msgid "Connect to Ultimaker Cloud"
-msgstr ""
+msgstr "Подключиться к Ultimaker Cloud"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
msgctxt "@action"
msgid "Don't ask me again for this printer."
-msgstr ""
+msgstr "Не спрашивать меня снова для этого принтера."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
msgctxt "@action"
msgid "Get started"
-msgstr ""
+msgstr "Приступить"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Теперь вы можете отправлять и отслеживать задания печати из любого места с помощью вашей учетной записи Ultimaker."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
msgctxt "@info:status"
msgid "Connected!"
-msgstr ""
+msgstr "Подключено!"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
msgctxt "@action"
msgid "Review your connection"
-msgstr ""
+msgstr "Проверьте свое подключение"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py:30
msgctxt "@action"
@@ -637,12 +637,12 @@ msgstr "Вид моделирования"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:35
msgctxt "@item:inmenu"
msgid "Post Processing"
-msgstr ""
+msgstr "Пост-обработка"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:36
msgctxt "@item:inmenu"
msgid "Modify G-Code"
-msgstr ""
+msgstr "Изменить G-код"
#: /home/ruben/Projects/Cura/plugins/SupportEraser/__init__.py:12
msgctxt "@label"
@@ -692,7 +692,7 @@ msgstr "Профили Cura 15.04"
#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
msgctxt "@item:inmenu"
msgid "Evaluation"
-msgstr ""
+msgstr "Оценивание"
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
@@ -760,7 +760,7 @@ msgstr "Невозможно разделить на слои из-за нали
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
msgctxt "@info:status"
msgid "Nothing to slice because none of the models fit the build volume or are assigned to a disabled extruder. Please scale or rotate models to fit, or enable an extruder."
-msgstr ""
+msgstr "Нечего нарезать, так как ни одна модель не попадает в объем принтера либо она назначена отключенному экструдеру. Отмасштабируйте/поверните модели либо включите экструдер."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
@@ -845,7 +845,7 @@ msgstr "Перед отправкой G-code на принтер удостов
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:64
msgctxt "@item:inmenu"
msgid "Manage backups"
-msgstr ""
+msgstr "Управление резервными копиями"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:107
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:113
@@ -858,32 +858,32 @@ msgstr "Резервное копирование"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:55
msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
-msgstr ""
+msgstr "При составлении списка ваших резервных копий возникла ошибка."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
-msgstr ""
+msgstr "При попытке восстановления данных из резервной копии возникла ошибка."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:15
msgctxt "@info:title"
msgid "Backups"
-msgstr ""
+msgstr "Резервные копии"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:27
msgctxt "@info:backup_status"
msgid "Uploading your backup..."
-msgstr ""
+msgstr "Выполняется заливка вашей резервной копии..."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:36
msgctxt "@info:backup_status"
msgid "There was an error while uploading your backup."
-msgstr ""
+msgstr "При заливке вашей резервной копии возникла ошибка."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:39
msgctxt "@info:backup_status"
msgid "Your backup has finished uploading."
-msgstr ""
+msgstr "Заливка вашей резервной копии завершена."
#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14
#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14
@@ -919,7 +919,7 @@ msgstr "Ошибка в ходе записи файла 3MF."
#: /home/ruben/Projects/Cura/plugins/PreviewStage/__init__.py:13
msgctxt "@item:inmenu"
msgid "Preview"
-msgstr ""
+msgstr "Предварительный просмотр"
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
@@ -927,11 +927,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr "Выбор обновлений"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr "Проверка"
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -1020,7 +1015,7 @@ msgstr "Файл {0} уже существует. Вы ув
#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
msgctxt "@info:status"
msgid "Invalid file URL:"
-msgstr ""
+msgstr "Неправильный URL-адрес файла:"
#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
msgctxt "@menuitem"
@@ -1041,7 +1036,7 @@ msgstr "Настройки обновлены"
#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
-msgstr ""
+msgstr "Экструдер (-ы) отключен (-ы)"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
#, python-brace-format
@@ -1070,13 +1065,13 @@ msgstr "Экспорт успешно завершен"
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
-msgstr ""
+msgstr "Не удалось импортировать профиль из {0}: {1}"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Can't import profile from {0} before a printer is added."
-msgstr ""
+msgstr "Невозможно импортировать профиль из {0}, пока не добавлен принтер."
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
#, python-brace-format
@@ -1209,7 +1204,7 @@ msgstr "Попытка восстановить резервную копию Cu
#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
-msgstr ""
+msgstr "Нет связи с сервером учетных записей Ultimaker."
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
@@ -1219,7 +1214,7 @@ msgstr "Размножение и размещение объектов"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:28
msgctxt "@info:title"
msgid "Placing Objects"
-msgstr ""
+msgstr "Размещение объектов"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:103
@@ -1635,7 +1630,7 @@ msgstr "Не удалось подключиться к базе данных п
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/SmallRatingWidget.qml:27
msgctxt "@label"
msgid "ratings"
-msgstr ""
+msgstr "оценки"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
@@ -1654,7 +1649,7 @@ msgstr "Материалы"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:91
msgctxt "@label"
msgid "Your rating"
-msgstr ""
+msgstr "Ваша оценка"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
msgctxt "@label"
@@ -1687,7 +1682,7 @@ msgstr "Неизвестно"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
-msgstr ""
+msgstr "Для выполнения установки или обновления необходимо войти"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
@@ -1710,7 +1705,7 @@ msgstr "Обновлено"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:13
msgctxt "@title"
msgid "Marketplace"
-msgstr ""
+msgstr "Магазин"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml:25
msgctxt "@action:button"
@@ -1745,12 +1740,12 @@ msgstr "Подтвердить"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to login first before you can rate"
-msgstr ""
+msgstr "Для оценивания необходимо войти в систему"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/RatingWidget.qml:54
msgctxt "@label"
msgid "You need to install the package before you can rate"
-msgstr ""
+msgstr "Для оценивания необходимо установить пакет"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:19
msgctxt "@info"
@@ -1790,7 +1785,7 @@ msgstr "Установка выполнится при перезагрузке"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:53
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to update"
-msgstr ""
+msgstr "Для выполнения обновления необходимо войти"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:71
msgctxt "@action:button"
@@ -1841,22 +1836,22 @@ msgstr "Совместимость"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:203
msgctxt "@action:label"
msgid "Technical Data Sheet"
-msgstr ""
+msgstr "Таблица технических характеристик"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:212
msgctxt "@action:label"
msgid "Safety Data Sheet"
-msgstr ""
+msgstr "Паспорт безопасности"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:221
msgctxt "@action:label"
msgid "Printing Guidelines"
-msgstr ""
+msgstr "Инструкции по печати"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:230
msgctxt "@action:label"
msgid "Website"
-msgstr ""
+msgstr "Веб-сайт"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml:16
msgctxt "@info"
@@ -1978,17 +1973,17 @@ msgstr "Пользовательское соглашение"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
msgctxt "@info"
msgid "These options are not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Указанные опции недоступны, поскольку вы отслеживаете облачный принтер."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:241
msgctxt "@info"
msgid "The webcam is not available because you are monitoring a cloud printer."
-msgstr ""
+msgstr "Веб-камера недоступна, поскольку вы отслеживаете облачный принтер."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
msgctxt "@label:status"
msgid "Loading..."
-msgstr ""
+msgstr "Загрузка..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
msgctxt "@label:status"
@@ -1998,42 +1993,42 @@ msgstr "Недоступен"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
msgctxt "@label:status"
msgid "Unreachable"
-msgstr ""
+msgstr "Недостижимо"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
msgctxt "@label:status"
msgid "Idle"
-msgstr ""
+msgstr "Простой"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:353
msgctxt "@label"
msgid "Untitled"
-msgstr ""
+msgstr "Без имени"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
msgctxt "@label"
msgid "Anonymous"
-msgstr ""
+msgstr "Анонимн"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
msgctxt "@label:status"
msgid "Requires configuration changes"
-msgstr ""
+msgstr "Необходимо внести изменения конфигурации"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
msgctxt "@action:button"
msgid "Details"
-msgstr ""
+msgstr "Подробности"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "Unavailable printer"
-msgstr ""
+msgstr "Недоступный принтер"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
msgctxt "@label"
msgid "First available"
-msgstr ""
+msgstr "Первое доступное"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:187
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:132
@@ -2049,27 +2044,27 @@ msgstr "Запланировано"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
msgid "Go to Cura Connect"
-msgstr ""
+msgstr "Перейти к Cura Connect"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
msgctxt "@label"
msgid "Print jobs"
-msgstr ""
+msgstr "Задания печати"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Total print time"
-msgstr ""
+msgstr "Общее время печати"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
msgctxt "@label"
msgid "Waiting for"
-msgstr ""
+msgstr "Ожидание"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
msgctxt "@label link to connect manager"
msgid "View print history"
-msgstr ""
+msgstr "Просмотреть архив печати"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
msgctxt "@window:title"
@@ -2195,17 +2190,17 @@ msgstr "Завершено"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Preparing..."
-msgstr ""
+msgstr "Подготовка..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Aborting..."
-msgstr ""
+msgstr "Прерывается..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
msgctxt "@label:status"
msgid "Pausing..."
-msgstr ""
+msgstr "Приостановка..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
msgctxt "@label:status"
@@ -2215,7 +2210,7 @@ msgstr "Приостановлено"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
msgctxt "@label:status"
msgid "Resuming..."
-msgstr ""
+msgstr "Возобновляется..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
msgctxt "@label:status"
@@ -2225,7 +2220,7 @@ msgstr "Необходимое действие"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
msgctxt "@label:status"
msgid "Finishes %1 at %2"
-msgstr ""
+msgstr "Завершение %1 в %2"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:44
msgctxt "@action:button"
@@ -2261,12 +2256,12 @@ msgstr "Продолжить"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:102
msgctxt "@label"
msgid "Pausing..."
-msgstr ""
+msgstr "Приостановка..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:104
msgctxt "@label"
msgid "Resuming..."
-msgstr ""
+msgstr "Возобновляется..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:106
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284
@@ -2278,7 +2273,7 @@ msgstr "Пауза"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
msgid "Aborting..."
-msgstr ""
+msgstr "Прерывается..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:124
msgctxt "@label"
@@ -2319,20 +2314,20 @@ msgstr "Прервать печать"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:20
msgctxt "@title:window"
msgid "Configuration Changes"
-msgstr ""
+msgstr "Изменения конфигурации"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:27
msgctxt "@action:button"
msgid "Override"
-msgstr ""
+msgstr "Переопределить"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
msgctxt "@label"
msgid "The assigned printer, %1, requires the following configuration change:"
msgid_plural "The assigned printer, %1, requires the following configuration changes:"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Для назначенного принтера %1 требуется следующее изменение конфигурации:"
+msgstr[1] "Для назначенного принтера %1 требуются следующие изменения конфигурации:"
+msgstr[2] "Для назначенного принтера %1 требуются следующие изменения конфигурации:"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
msgctxt "@label"
@@ -2362,7 +2357,7 @@ msgstr "Заменить рабочий стол на %1 (переопредел
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
-msgstr ""
+msgstr "При переопределении к имеющейся конфигурации принтера будут применены указанные настройки. Это может привести к ошибке печати."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
msgctxt "@label"
@@ -2381,21 +2376,24 @@ msgid ""
"- Check if the printer is turned on.\n"
"- Check if the printer is connected to the network."
msgstr ""
+"Проверьте наличие подключения к принтеру:\n"
+"- Убедитесь, что принтер включен.\n"
+"- Проверьте, подключен ли принтер к сети."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
msgctxt "@info"
msgid "Please select a network connected printer to monitor."
-msgstr ""
+msgstr "Выберите принтер, подключенный к сети, который необходимо отслеживать."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
msgctxt "@info"
msgid "Please connect your Ultimaker printer to your local network."
-msgstr ""
+msgstr "Подключите ваш принтер Ultimaker к своей локальной сети."
#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
-msgstr ""
+msgstr "Просмотр руководств пользователей онлайн"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
@@ -2431,17 +2429,17 @@ msgstr "Режим совместимости"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
msgctxt "@label"
msgid "Travels"
-msgstr ""
+msgstr "Перемещения"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
msgctxt "@label"
msgid "Helpers"
-msgstr ""
+msgstr "Помощники"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
msgctxt "@label"
msgid "Shell"
-msgstr ""
+msgstr "Ограждение"
#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
@@ -2517,17 +2515,17 @@ msgstr "Cura отправляет анонимные данные в Ultimaker
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
msgctxt "@text:window"
msgid "I don't want to send this data"
-msgstr ""
+msgstr "Не хочу отправлять описанные данные"
#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
msgctxt "@text:window"
msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr ""
+msgstr "Разрешить отправку описанных данных в Ultimaker для улучшения Cura"
#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
msgctxt "@label"
msgid "No print selected"
-msgstr ""
+msgstr "Печать не выбрана"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2791,108 +2789,108 @@ msgstr "Открыть"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:28
msgctxt "@title"
msgid "My Backups"
-msgstr ""
+msgstr "Мои резервные копии"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:38
msgctxt "@empty_state"
msgid "You don't have any backups currently. Use the 'Backup Now' button to create one."
-msgstr ""
+msgstr "В данный момент у вас отсутствуют резервные копии. Для создания резервной копии нажмите кнопку «Создать резервную копию»."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/BackupsPage.qml:60
msgctxt "@backup_limit_info"
msgid "During the preview phase, you'll be limited to 5 visible backups. Remove a backup to see older ones."
-msgstr ""
+msgstr "На этапе предварительного просмотра отображается только 5 резервных копий. Для просмотра предыдущих резервных копий удалите одну копию."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:34
msgctxt "@description"
msgid "Backup and synchronize your Cura settings."
-msgstr ""
+msgstr "Резервное копирование и синхронизация ваших параметров Cura."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
msgctxt "@button"
msgid "Sign in"
-msgstr ""
+msgstr "Войти"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/main.qml:24
msgctxt "@title:window"
msgid "Cura Backups"
-msgstr ""
+msgstr "Резервные копии Cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:21
msgctxt "@backuplist:label"
msgid "Cura Version"
-msgstr ""
+msgstr "Версия Cura"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:29
msgctxt "@backuplist:label"
msgid "Machines"
-msgstr ""
+msgstr "Принтеры"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:37
msgctxt "@backuplist:label"
msgid "Materials"
-msgstr ""
+msgstr "Материалы"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:45
msgctxt "@backuplist:label"
msgid "Profiles"
-msgstr ""
+msgstr "Профили"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:53
msgctxt "@backuplist:label"
msgid "Plugins"
-msgstr ""
+msgstr "Плагины"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:71
msgctxt "@button"
msgid "Restore"
-msgstr ""
+msgstr "Восстановить"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:99
msgctxt "@dialog:title"
msgid "Delete Backup"
-msgstr ""
+msgstr "Удалить резервную копию"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:100
msgctxt "@dialog:info"
msgid "Are you sure you want to delete this backup? This cannot be undone."
-msgstr ""
+msgstr "Вы уверены, что хотите удалить указанную резервную копию? Данное действие невозможно отменить."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:108
msgctxt "@dialog:title"
msgid "Restore Backup"
-msgstr ""
+msgstr "Восстановить резервную копию"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListItem.qml:109
msgctxt "@dialog:info"
msgid "You will need to restart Cura before your backup is restored. Do you want to close Cura now?"
-msgstr ""
+msgstr "Вам потребуется перезапустить Cura, прежде чем данные будут восстановлены из резервной копии. Вы действительно хотите закрыть Cura прямо сейчас?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:22
msgctxt "@button"
msgid "Want more?"
-msgstr ""
+msgstr "Желаете большего?"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:31
msgctxt "@button"
msgid "Backup Now"
-msgstr ""
+msgstr "Создать резервную копию"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:43
msgctxt "@checkbox:description"
msgid "Auto Backup"
-msgstr ""
+msgstr "Автоматическое резервное копирование"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:44
msgctxt "@checkbox:description"
msgid "Automatically create a backup each day that Cura is started."
-msgstr ""
+msgstr "Автоматически создавать резервную копию в день запуска Cura."
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMainSettingsSelector.qml:75
msgctxt "@label"
msgid "Not supported"
-msgstr ""
+msgstr "Не поддерживается"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:35
msgctxt "@action:button"
@@ -2977,99 +2975,6 @@ msgctxt "@label"
msgid "Heated Build Plate (official kit or self-built)"
msgstr "Нагреваемый стол (официальный набор или самодельный)"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27
-msgctxt "@title"
-msgid "Check Printer"
-msgstr "Проверка принтера"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39
-msgctxt "@label"
-msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"
-msgstr "Хорошей идеей будет выполнить несколько проверок вашего Ultimaker. Вы можете пропустить этот шаг, если уверены в функциональности своего принтера"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53
-msgctxt "@action:button"
-msgid "Start Printer Check"
-msgstr "Начать проверку принтера"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80
-msgctxt "@label"
-msgid "Connection: "
-msgstr "Соединение: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Connected"
-msgstr "Подключен"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89
-msgctxt "@info:status"
-msgid "Not connected"
-msgstr "Не подключен"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99
-msgctxt "@label"
-msgid "Min endstop X: "
-msgstr "Минимальный концевик на оси X: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-msgctxt "@info:status"
-msgid "Works"
-msgstr "Работает"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Not checked"
-msgstr "Не проверен"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120
-msgctxt "@label"
-msgid "Min endstop Y: "
-msgstr "Минимальный концевик на оси Y: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141
-msgctxt "@label"
-msgid "Min endstop Z: "
-msgstr "Минимальный концевик на оси Z: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163
-msgctxt "@label"
-msgid "Nozzle temperature check: "
-msgstr "Проверка температуры сопла: "
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Stop Heating"
-msgstr "Завершение нагрева"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248
-msgctxt "@action:button"
-msgid "Start Heating"
-msgstr "Начало нагрева"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223
-msgctxt "@label"
-msgid "Build plate temperature check:"
-msgstr "Проверка температуры стола:"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234
-msgctxt "@info:status"
-msgid "Checked"
-msgstr "Проверена"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284
-msgctxt "@label"
-msgid "Everything is in order! You're done with your CheckUp."
-msgstr "Всё в порядке! Проверка завершена."
-
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119
msgctxt "@label:MonitorStatus"
msgid "Not connected to a printer"
@@ -3641,7 +3546,7 @@ msgstr "Создать профиль"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
msgctxt "@info"
msgid "Please provide a name for this profile."
-msgstr ""
+msgstr "Укажите имя для данного профиля."
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
msgctxt "@title:window"
@@ -3671,7 +3576,7 @@ msgstr "Принтер: %1"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
msgid "Default profiles"
-msgstr ""
+msgstr "Профили по умолчанию"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
msgctxt "@label"
@@ -3706,7 +3611,7 @@ msgstr "Общие параметры"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
msgctxt "@action:button"
msgid "Marketplace"
-msgstr ""
+msgstr "Магазин"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:27
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:13
@@ -3729,7 +3634,7 @@ msgstr "Вид"
#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:13
msgctxt "@title:menu menubar:toplevel"
msgid "&Settings"
-msgstr ""
+msgstr "&Параметры"
#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:55
msgctxt "@title:menu menubar:toplevel"
@@ -3764,7 +3669,7 @@ msgstr "Без имени"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:68
msgctxt "@label:textbox"
msgid "search settings"
-msgstr ""
+msgstr "параметры поиска"
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
msgctxt "@action:menu"
@@ -3795,7 +3700,7 @@ msgstr "Оставить этот параметр видимым"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417
msgctxt "@action:menu"
msgid "Configure setting visibility..."
-msgstr "Видимость параметров…"
+msgstr "Видимость параметров..."
#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:237
msgctxt "@label"
@@ -3853,17 +3758,17 @@ msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
msgctxt "@button"
msgid "Recommended"
-msgstr ""
+msgstr "Рекомендован"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
msgctxt "@button"
msgid "Custom"
-msgstr ""
+msgstr "Свое"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:193
msgctxt "@label"
msgid "Gradual infill"
-msgstr ""
+msgstr "Постепенное заполнение"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:232
msgctxt "@label"
@@ -3873,7 +3778,7 @@ msgstr "Постепенное заполнение будет постепен
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
msgctxt "@label"
msgid "Support"
-msgstr ""
+msgstr "Поддержки"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
msgctxt "@label"
@@ -3888,7 +3793,7 @@ msgstr "Выбирает, какой экструдер следует испо
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
msgctxt "@label"
msgid "Adhesion"
-msgstr ""
+msgstr "Прилипание"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
msgctxt "@label"
@@ -3908,7 +3813,7 @@ msgstr "В некоторые настройки профиля были вне
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:355
msgctxt "@tooltip"
msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile"
-msgstr ""
+msgstr "Этот профиль качества недоступен для вашей текущей конфигурации материала и сопла. Измените эти настройки для задействования данного профиля качества"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3918,17 +3823,17 @@ msgstr "В настоящее время активен пользователь
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:13
msgctxt "@label:Should be short"
msgid "On"
-msgstr ""
+msgstr "Вкл"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:14
msgctxt "@label:Should be short"
msgid "Off"
-msgstr ""
+msgstr "Выкл"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:27
msgctxt "@label"
msgid "Profile"
-msgstr ""
+msgstr "Профиль"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml:94
msgctxt "@tooltip"
@@ -3944,7 +3849,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label shown when we load a Gcode file"
msgid "Print setup disabled. G code file can not be modified."
-msgstr ""
+msgstr "Настройка печати отключена. Невозможно изменить файл с G-кодом."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -4146,22 +4051,22 @@ msgstr "Показывать все настройки"
#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingVisibilityPresetsMenu.qml:53
msgctxt "@action:inmenu"
msgid "Manage Setting Visibility..."
-msgstr "Управление видимостью настроек…"
+msgstr "Управление видимостью настроек..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:32
msgctxt "@title:menu menubar:file"
msgid "&Save..."
-msgstr "&Сохранить…"
+msgstr "&Сохранить..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:53
msgctxt "@title:menu menubar:file"
msgid "&Export..."
-msgstr "&Экспорт…"
+msgstr "&Экспорт..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/FileMenu.qml:64
msgctxt "@action:inmenu menubar:file"
msgid "Export Selection..."
-msgstr "Экспорт выбранного…"
+msgstr "Экспорт выбранного..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:27
msgctxt "@label"
@@ -4187,47 +4092,47 @@ msgstr "Количество копий"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/AutoConfiguration.qml:18
msgctxt "@header"
msgid "Configurations"
-msgstr ""
+msgstr "Конфигурации"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:110
msgctxt "@label"
msgid "Select configuration"
-msgstr ""
+msgstr "Выберите конфигурации"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
msgctxt "@label"
msgid "See the material compatibility chart"
-msgstr ""
+msgstr "См. таблицу совместимости материалов"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
msgctxt "@label"
msgid "Configurations"
-msgstr ""
+msgstr "Конфигурации"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:57
msgctxt "@label"
msgid "Loading available configurations from the printer..."
-msgstr ""
+msgstr "Загрузка доступных конфигураций из принтера..."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:58
msgctxt "@label"
msgid "The configurations are not available because the printer is disconnected."
-msgstr ""
+msgstr "Конфигурации недоступны, поскольку принтер отключен."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:25
msgctxt "@header"
msgid "Custom"
-msgstr ""
+msgstr "Свое"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:61
msgctxt "@label"
msgid "Printer"
-msgstr ""
+msgstr "Принтер"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
msgctxt "@label"
msgid "Enabled"
-msgstr ""
+msgstr "Включено"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
msgctxt "@label"
@@ -4237,17 +4142,17 @@ msgstr "Материал"
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
-msgstr ""
+msgstr "Использовать клей для лучшего прилипания с этой комбинацией материалов."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:128
msgctxt "@label"
msgid "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile."
-msgstr ""
+msgstr "Данная конфигурация недоступна, поскольку %1 не распознан. Посетите %2 и загрузите подходящий профиль материала."
#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:129
msgctxt "@label"
msgid "Marketplace"
-msgstr ""
+msgstr "Магазин"
#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:15
msgctxt "@title:menu menubar:file"
@@ -4277,37 +4182,37 @@ msgstr "Осталось примерно"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
msgid "View types"
-msgstr ""
+msgstr "Просмотр типов"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
msgctxt "@label"
msgid "Hi "
-msgstr ""
+msgstr "Приветствуем! "
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
msgctxt "@button"
msgid "Ultimaker account"
-msgstr ""
+msgstr "Учетная запись Ultimaker"
#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
msgctxt "@button"
msgid "Sign out"
-msgstr ""
+msgstr "Выйти"
#: /home/ruben/Projects/Cura/resources/qml/Account/AccountWidget.qml:24
msgctxt "@action:button"
msgid "Sign in"
-msgstr ""
+msgstr "Войти"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
msgctxt "@label"
msgid "Ultimaker Cloud"
-msgstr ""
+msgstr "Ultimaker Cloud"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
-msgstr ""
+msgstr "Рабочий процесс трехмерной печати следующего поколения"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:51
msgctxt "@text"
@@ -4316,26 +4221,29 @@ msgid ""
"- Store your Ultimaker Cura settings in the cloud for use anywhere\n"
"- Get exclusive access to material profiles from leading brands"
msgstr ""
+"- Отправляйте задания печати на принтеры Ultimaker за пределами вашей локальной сети\n"
+"- Храните параметры Ultimaker Cura в облаке, чтобы применять их из любого места\n"
+"- Получите эксклюзивный доступ к профилям материалов от лидирующих производителей"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
msgid "Create account"
-msgstr ""
+msgstr "Создать учетную запись"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
msgctxt "@label"
msgid "No time estimation available"
-msgstr ""
+msgstr "Оценка времени недоступна"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
msgctxt "@label"
msgid "No cost estimation available"
-msgstr ""
+msgstr "Оценка расходов недоступна"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
msgctxt "@button"
msgid "Preview"
-msgstr ""
+msgstr "Предварительный просмотр"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
msgctxt "@label:PrintjobStatus"
@@ -4350,27 +4258,27 @@ msgstr "Невозможно нарезать"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
msgctxt "@button"
msgid "Slice"
-msgstr ""
+msgstr "Нарезка на слои"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
msgctxt "@label"
msgid "Start the slicing process"
-msgstr ""
+msgstr "Запустить нарезку на слои"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
msgctxt "@button"
msgid "Cancel"
-msgstr ""
+msgstr "Отмена"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
msgid "Time specification"
-msgstr ""
+msgstr "Настройка расчета времени"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
msgid "Material specification"
-msgstr ""
+msgstr "Характеристики материала"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4385,27 +4293,27 @@ msgstr "%1 г"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Connected printers"
-msgstr ""
+msgstr "Подключенные принтеры"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelectorList.qml:19
msgctxt "@label"
msgid "Preset printers"
-msgstr ""
+msgstr "Предварительно настроенные принтеры"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
msgctxt "@button"
msgid "Add printer"
-msgstr ""
+msgstr "Добавить принтер"
#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
msgctxt "@button"
msgid "Manage printers"
-msgstr ""
+msgstr "Управление принтерами"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
-msgstr ""
+msgstr "Показать онлайн-руководство по решению проблем"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
msgctxt "@action:inmenu"
@@ -4455,7 +4363,7 @@ msgstr "Вид справа"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:155
msgctxt "@action:inmenu"
msgid "Configure Cura..."
-msgstr "Настроить Cura…"
+msgstr "Настроить Cura..."
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162
msgctxt "@action:inmenu menubar:printer"
@@ -4470,7 +4378,7 @@ msgstr "Управление принтерами..."
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175
msgctxt "@action:inmenu"
msgid "Manage Materials..."
-msgstr "Управление материалами…"
+msgstr "Управление материалами..."
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:184
msgctxt "@action:inmenu menubar:profile"
@@ -4485,7 +4393,7 @@ msgstr "Сбросить текущие параметры"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:204
msgctxt "@action:inmenu menubar:profile"
msgid "&Create profile from current settings/overrides..."
-msgstr "Создать профиль из текущих параметров…"
+msgstr "Создать профиль из текущих параметров..."
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210
msgctxt "@action:inmenu menubar:profile"
@@ -4619,7 +4527,7 @@ msgstr "Показать конфигурационный каталог"
#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
msgctxt "@action:menu"
msgid "&Marketplace"
-msgstr ""
+msgstr "&Магазин"
#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
msgctxt "@title:window"
@@ -4739,7 +4647,7 @@ msgstr "Создать новый профиль"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
msgctxt "@title:tab"
msgid "Add a printer to Cura"
-msgstr ""
+msgstr "Добавить принтер к Cura"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
msgctxt "@title:tab"
@@ -4748,16 +4656,19 @@ msgid ""
"\n"
"If your printer is not in the list, use the \"Custom FFF Printer\" from the \"Custom\" category and adjust the settings to match your printer in the next dialog."
msgstr ""
+"Выберите желаемый принтер в списке ниже.\n"
+"\n"
+"Если принтер отсутствует в списке, воспользуйтесь опцией «Собственный принтер FFF» из категории «Свое». Затем в открывшемся диалоговом окне настройте параметры в соответствии с характеристиками вашего принтера."
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
msgctxt "@label"
msgid "Manufacturer"
-msgstr ""
+msgstr "Производитель"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
msgctxt "@label"
msgid "Printer Name"
-msgstr ""
+msgstr "Имя принтера"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
msgctxt "@action:button"
@@ -5143,7 +5054,7 @@ msgstr "X3GWriter"
#~ msgctxt "@label:MonitorStatus"
#~ msgid "Aborting print..."
-#~ msgstr "Прерывание печати…"
+#~ msgstr "Прерывание печати..."
#~ msgctxt "@label"
#~ msgid "Protected profiles"
@@ -7612,7 +7523,7 @@ msgstr "X3GWriter"
#~ msgctxt "@action:inmenu menubar:profile"
#~ msgid "&Create profile from current settings..."
-#~ msgstr "Создать профиль из текущих параметров…"
+#~ msgstr "Создать профиль из текущих параметров..."
#~ msgctxt "@action:inmenu"
#~ msgid "&Duplicate Model"
diff --git a/resources/i18n/ru_RU/fdmextruder.def.json.po b/resources/i18n/ru_RU/fdmextruder.def.json.po
index 146dd5aa9d..ccdf4ddd7c 100644
--- a/resources/i18n/ru_RU/fdmextruder.def.json.po
+++ b/resources/i18n/ru_RU/fdmextruder.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-09-28 14:25+0100\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Ruslan Popov , Russian \n"
"Language: ru_RU\n"
@@ -86,7 +86,7 @@ msgstr "Стартовый G-код экструдера"
#: fdmextruder.def.json
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
-msgstr ""
+msgstr "Стартовый G-код, запускающийся при переключении на данный экструдер."
#: fdmextruder.def.json
msgctxt "machine_extruder_start_pos_abs label"
@@ -126,7 +126,7 @@ msgstr "Завершающий G-код экструдера"
#: fdmextruder.def.json
msgctxt "machine_extruder_end_code description"
msgid "End g-code to execute when switching away from this extruder."
-msgstr ""
+msgstr "Завершающий G-код, запускающийся при переключении с данного экструдера."
#: fdmextruder.def.json
msgctxt "machine_extruder_end_pos_abs label"
@@ -1277,6 +1277,7 @@ msgstr "Укажите диаметр используемой нити."
#~ "The horizontal distance between the skirt and the first layer of the print.\n"
#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance."
#~ msgstr ""
+
#~ "Расстояние по горизонтали между юбкой и первым слоем печатаемого объекта.\n"
#~ "Это минимальное расстояние, следующие линии юбки будут печататься наружу."
@@ -1673,6 +1674,7 @@ msgstr "Укажите диаметр используемой нити."
#~ "Distance of an upward move which is extruded with half speed.\n"
#~ "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing."
#~ msgstr ""
+
#~ "Расстояние движения вверх, при котором выдавливание идёт на половине скорости.\n"
#~ "Это может улучшить прилипание к предыдущим слоям, не перегревая материал тех слоёв. Применяется только при нитевой печати."
diff --git a/resources/i18n/ru_RU/fdmprinter.def.json.po b/resources/i18n/ru_RU/fdmprinter.def.json.po
index 790dc4c3aa..d05ec7c614 100644
--- a/resources/i18n/ru_RU/fdmprinter.def.json.po
+++ b/resources/i18n/ru_RU/fdmprinter.def.json.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2018-11-06 15:29+0100\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Ruslan Popov , Russian \n"
"Language: ru_RU\n"
@@ -58,9 +58,7 @@ msgctxt "machine_start_gcode description"
msgid ""
"G-code commands to be executed at the very start - separated by \n"
"."
-msgstr ""
-"Команды в G-коде, которые будут выполнены в самом начале, разделенные с помощью \n"
-"."
+msgstr "Команды в G-коде, которые будут выполнены в самом начале, разделенные с помощью \n."
#: fdmprinter.def.json
msgctxt "machine_end_gcode label"
@@ -72,9 +70,7 @@ msgctxt "machine_end_gcode description"
msgid ""
"G-code commands to be executed at the very end - separated by \n"
"."
-msgstr ""
-"Команды в G-коде, которые будут выполнены в самом конце, разделенные с помощью \n"
-"."
+msgstr "Команды в G-коде, которые будут выполнены в самом конце, разделенные с помощью \n."
#: fdmprinter.def.json
msgctxt "material_guid label"
@@ -1636,9 +1632,7 @@ msgctxt "infill_wall_line_count description"
msgid ""
"Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n"
"This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right."
-msgstr ""
-"Добавление дополнительных стенок вокруг области заполнения. Эти стенки могут уменьшить провисание верхних/нижних линий оболочки, что уменьшает необходимое количество верхних/нижних слоев оболочки без ухудшения качества за счет небольшого увеличения количества материала.\n"
-"Эта функция может сочетаться с соединением полигонов заполнения для соединения всего участка заполнения в один путь экструзии без необходимости в движениях или откатах в случае правильной настройки."
+msgstr "Добавление дополнительных стенок вокруг области заполнения. Эти стенки могут уменьшить провисание верхних/нижних линий оболочки, что уменьшает необходимое количество верхних/нижних слоев оболочки без ухудшения качества за счет небольшого увеличения количества материала.\nЭта функция может сочетаться с соединением полигонов заполнения для соединения всего участка заполнения в один путь экструзии без необходимости в движениях или откатах в случае правильной настройки."
#: fdmprinter.def.json
msgctxt "sub_div_rad_add label"
@@ -1678,7 +1672,7 @@ msgstr "Процент перекрытия оболочек"
#: fdmprinter.def.json
msgctxt "skin_overlap description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines, as a percentage of the line widths of the skin lines and the innermost wall. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any percentage over 50% may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Настройте величину перекрытия между стенками и центральными линиями оболочки (конечными точками) в виде процентного отношения значений ширины линии для линий оболочки и внутренней стенки. Небольшое перекрытие позволяет стенкам надежно соединяться с оболочкой. Обратите внимание, что при одинаковой толщине оболочки и ширине линии стенки любое процентное значение, превышающее 50%, может привести к размещению любой оболочки за пределами стенки. Это обусловлено тем, что в этот момент расположение сопла экструдера оболочки может сместиться за середину стенки."
#: fdmprinter.def.json
msgctxt "skin_overlap_mm label"
@@ -1688,7 +1682,7 @@ msgstr "Перекрытие оболочек"
#: fdmprinter.def.json
msgctxt "skin_overlap_mm description"
msgid "Adjust the amount of overlap between the walls and (the endpoints of) the skin-centerlines. A slight overlap allows the walls to connect firmly to the skin. Note that, given an equal skin and wall line-width, any value over half the width of the wall may already cause any skin to go past the wall, because at that point the position of the nozzle of the skin-extruder may already reach past the middle of the wall."
-msgstr ""
+msgstr "Настройте величину перекрытия между стенками и центральными линиями оболочки (конечными точками). Небольшое перекрытие позволяет стенкам надежно соединяться с оболочкой. Обратите внимание, что при одинаковой толщине оболочки и ширине линии стенки любое значение, превышающее половину ширины стенки, может привести к размещению любой оболочки за пределами стенки. Это обусловлено тем, что в этот момент расположение сопла экструдера оболочки может сместиться за середину стенки."
#: fdmprinter.def.json
msgctxt "infill_wipe_dist label"
@@ -2128,7 +2122,7 @@ msgstr "Величина отката при смене экструдера"
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_amount description"
msgid "The amount of retraction when switching extruders. Set to 0 for no retraction at all. This should generally be the same as the length of the heat zone."
-msgstr ""
+msgstr "Величина отката при переключении экструдеров. Установите 0 для отключения отката. Обычно соответствует длине зоны нагрева."
#: fdmprinter.def.json
msgctxt "switch_extruder_retraction_speeds label"
@@ -2788,7 +2782,7 @@ msgstr "Режим комбинга"
#: fdmprinter.def.json
msgctxt "retraction_combing description"
msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas or to only comb within the infill."
-msgstr ""
+msgstr "Комбинг удерживает сопло внутри напечатанных зон при перемещении. Это выражается в небольшом увеличении пути, но уменьшает необходимость в откатах. При отключенном комбинге выполняется откат материала, а сопло передвигается в следующую точку по прямой. Также можно не применять комбинг над верхними/нижними областями оболочки либо разрешить комбинг только в области заполнения."
#: fdmprinter.def.json
msgctxt "retraction_combing option off"
@@ -3443,12 +3437,12 @@ msgstr "Высота заполнения поддержек, по достиж
#: fdmprinter.def.json
msgctxt "minimum_support_area label"
msgid "Minimum Support Area"
-msgstr ""
+msgstr "Минимальная зона поддержек"
#: fdmprinter.def.json
msgctxt "minimum_support_area description"
msgid "Minimum area size for support polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Минимальная площадь зоны для полигонов поддержек. Полигоны с площадью меньше данного значения не будут генерироваться."
#: fdmprinter.def.json
msgctxt "support_interface_enable label"
@@ -3678,62 +3672,62 @@ msgstr "Зигзаг"
#: fdmprinter.def.json
msgctxt "minimum_interface_area label"
msgid "Minimum Support Interface Area"
-msgstr ""
+msgstr "Минимальная зона связующего слоя"
#: fdmprinter.def.json
msgctxt "minimum_interface_area description"
msgid "Minimum area size for support interface polygons. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Минимальная площадь зоны для полигонов связующего слоя. Полигоны с площадью меньше данного значения не будут генерироваться."
#: fdmprinter.def.json
msgctxt "minimum_roof_area label"
msgid "Minimum Support Roof Area"
-msgstr ""
+msgstr "Минимальная зона верхней части поддержек"
#: fdmprinter.def.json
msgctxt "minimum_roof_area description"
msgid "Minimum area size for the roofs of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Минимальная площадь зоны для верхних частей поддержек. Полигоны с площадью меньше данного значения не будут генерироваться."
#: fdmprinter.def.json
msgctxt "minimum_bottom_area label"
msgid "Minimum Support Floor Area"
-msgstr ""
+msgstr "Минимальная зона нижней части поддержек"
#: fdmprinter.def.json
msgctxt "minimum_bottom_area description"
msgid "Minimum area size for the floors of the support. Polygons which have an area smaller than this value will not be generated."
-msgstr ""
+msgstr "Минимальная площадь зоны для нижних частей поддержек. Полигоны с площадью меньше данного значения не будут генерироваться."
#: fdmprinter.def.json
msgctxt "support_interface_offset label"
msgid "Support Interface Horizontal Expansion"
-msgstr ""
+msgstr "Горизонтальное расширение связующего слоя"
#: fdmprinter.def.json
msgctxt "support_interface_offset description"
msgid "Amount of offset applied to the support interface polygons."
-msgstr ""
+msgstr "Величина смещения, применяемая к полигонам связующего слоя."
#: fdmprinter.def.json
msgctxt "support_roof_offset label"
msgid "Support Roof Horizontal Expansion"
-msgstr ""
+msgstr "Горизонтальное расширение верхней части поддержек"
#: fdmprinter.def.json
msgctxt "support_roof_offset description"
msgid "Amount of offset applied to the roofs of the support."
-msgstr ""
+msgstr "Величина смещения, применяемая к верхней части поддержек."
#: fdmprinter.def.json
msgctxt "support_bottom_offset label"
msgid "Support Floor Horizontal Expansion"
-msgstr ""
+msgstr "Горизонтальное расширение нижней части поддержек"
#: fdmprinter.def.json
msgctxt "support_bottom_offset description"
msgid "Amount of offset applied to the floors of the support."
-msgstr ""
+msgstr "Величина смещения, применяемая к нижней части поддержек."
#: fdmprinter.def.json
msgctxt "support_fan_enable label"
@@ -3905,9 +3899,7 @@ msgctxt "skirt_gap description"
msgid ""
"The horizontal distance between the skirt and the first layer of the print.\n"
"This is the minimum distance. Multiple skirt lines will extend outwards from this distance."
-msgstr ""
-"Горизонтальное расстояние между юбкой и первым слоем печати.\n"
-"Минимальное расстояние. Несколько линий юбки будут расширяться от этого расстояния."
+msgstr "Горизонтальное расстояние между юбкой и первым слоем печати.\nМинимальное расстояние. Несколько линий юбки будут расширяться от этого расстояния."
#: fdmprinter.def.json
msgctxt "skirt_brim_minimal_length label"
@@ -5354,9 +5346,7 @@ msgctxt "wireframe_up_half_speed description"
msgid ""
"Distance of an upward move which is extruded with half speed.\n"
"This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing."
-msgstr ""
-"Расстояние движения вверх, при котором выдавливание идёт на половине скорости.\n"
-"Это может улучшить прилипание к предыдущим слоям, не перегревая материал тех слоёв. Применяется только при каркасной печати."
+msgstr "Расстояние движения вверх, при котором выдавливание идёт на половине скорости.\nЭто может улучшить прилипание к предыдущим слоям, не перегревая материал тех слоёв. Применяется только при каркасной печати."
#: fdmprinter.def.json
msgctxt "wireframe_top_jump label"
@@ -5910,6 +5900,7 @@ msgstr "Матрица преобразования, применяемая к
#~ "Gcode commands to be executed at the very start - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "Команды в G-коде, которые будут выполнены при старте печати, разделённые \n"
#~ "."
@@ -5922,6 +5913,7 @@ msgstr "Матрица преобразования, применяемая к
#~ "Gcode commands to be executed at the very end - separated by \n"
#~ "."
#~ msgstr ""
+
#~ "Команды в G-коде, которые будут выполнены в конце печати, разделённые \n"
#~ "."
@@ -5978,6 +5970,7 @@ msgstr "Матрица преобразования, применяемая к
#~ "The horizontal distance between the skirt and the first layer of the print.\n"
#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance."
#~ msgstr ""
+
#~ "Расстояние по горизонтали между юбкой и первым слоем печатаемого объекта.\n"
#~ "Это минимальное расстояние, следующие линии юбки будут печататься наружу."
diff --git a/resources/i18n/tr_TR/cura.po b/resources/i18n/tr_TR/cura.po
index ce577a92b0..17662cc54c 100644
--- a/resources/i18n/tr_TR/cura.po
+++ b/resources/i18n/tr_TR/cura.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: Cura 4.0\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2018-11-06 15:33+0100\n"
+"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
@@ -64,16 +64,12 @@ msgid ""
"
{model_names}
\n"
"
Find out how to ensure the best possible print quality and reliability.
"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
msgctxt "@item:inmenu"
msgid "Changelog"
-msgstr ""
+msgstr "Değişiklik Günlüğü"
#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
msgctxt "@item:inmenu"
@@ -492,100 +488,100 @@ msgstr "Baskı tamamlandı"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
msgctxt "@label:material"
msgid "Empty"
-msgstr ""
+msgstr "Boş"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
msgctxt "@label:material"
msgid "Unknown"
-msgstr ""
+msgstr "Bilinmiyor"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
msgctxt "@action:button"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Bulut üzerinden yazdır"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
-msgstr ""
+msgstr "Bulut üzerinden yazdır"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
msgctxt "@info:status"
msgid "Connected via Cloud"
-msgstr ""
+msgstr "Bulut üzerinden bağlı"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
msgctxt "@info:title"
msgid "Cloud error"
-msgstr ""
+msgstr "Bulut hatası"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
msgctxt "@info:status"
msgid "Could not export print job."
-msgstr ""
+msgstr "Yazdırma görevi dışa aktarılamadı."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
-msgstr ""
+msgstr "Veri yazıcıya yüklenemedi."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:51
msgctxt "@info:status"
msgid "tomorrow"
-msgstr ""
+msgstr "yarın"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/Utils.py:54
msgctxt "@info:status"
msgid "today"
-msgstr ""
+msgstr "bugün"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
-msgstr ""
+msgstr "Buluta bağlanırken hata oluştu."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
msgid "Sending data to remote cluster"
-msgstr ""
+msgstr "Veri uzak kümeye gönderiliyor"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Ultimaker hesabınızı kullanarak yazdırma görevlerini dilediğiniz yerden gönderin ve görüntüleyin."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
msgctxt "@info:status"
msgid "Connect to Ultimaker Cloud"
-msgstr ""
+msgstr "Ultimaker Cloud Platformuna Bağlan"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
msgctxt "@action"
msgid "Don't ask me again for this printer."
-msgstr ""
+msgstr "Bu yazıcı için bir daha sorma."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
msgctxt "@action"
msgid "Get started"
-msgstr ""
+msgstr "Başlayın"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
-msgstr ""
+msgstr "Artık, Ultimaker hesabınızı kullanarak yazdırma görevlerini dilediğiniz yerden gönderebilir ve görüntüleyebilirsiniz."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
msgctxt "@info:status"
msgid "Connected!"
-msgstr ""
+msgstr "Bağlı!"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
msgctxt "@action"
msgid "Review your connection"
-msgstr ""
+msgstr "Bağlantınızı inceleyin"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py:30
msgctxt "@action"
@@ -637,12 +633,12 @@ msgstr "Simülasyon Görünümü"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:35
msgctxt "@item:inmenu"
msgid "Post Processing"
-msgstr ""
+msgstr "Son İşleme"
#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:36
msgctxt "@item:inmenu"
msgid "Modify G-Code"
-msgstr ""
+msgstr "G-Code Öğesini Değiştir"
#: /home/ruben/Projects/Cura/plugins/SupportEraser/__init__.py:12
msgctxt "@label"
@@ -692,7 +688,7 @@ msgstr "Cura 15.04 profilleri"
#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
msgctxt "@item:inmenu"
msgid "Evaluation"
-msgstr ""
+msgstr "Değerlendirme"
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
@@ -760,7 +756,7 @@ msgstr "Etkisizleştirilmiş Extruder %s ile ilgili nesneler olduğundan dilimle
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
msgctxt "@info:status"
msgid "Nothing to slice because none of the models fit the build volume or are assigned to a disabled extruder. Please scale or rotate models to fit, or enable an extruder."
-msgstr ""
+msgstr "Modeller yapı hacmine sığmadığı veya devre dışı bırakılmış bir ekstrüdere atandığı için dilimlenecek öğe yok. Modellerin sığması için lütfen ölçeklendirin veya döndürün ya da ekstrüderi etkinleştirin."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
@@ -845,7 +841,7 @@ msgstr "Dosya göndermeden önce g-code’un yazıcınız ve yazıcı yapıland
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:64
msgctxt "@item:inmenu"
msgid "Manage backups"
-msgstr ""
+msgstr "Yedeklemeleri yönet"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:107
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DrivePluginExtension.py:113
@@ -858,32 +854,32 @@ msgstr "Yedekle"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:55
msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
-msgstr ""
+msgstr "Yedeklemeleriniz listelenirken bir hata oluştu."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
-msgstr ""
+msgstr "Yedeklemeniz geri yüklenirken bir hata oluştu."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:15
msgctxt "@info:title"
msgid "Backups"
-msgstr ""
+msgstr "Yedeklemeler"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:27
msgctxt "@info:backup_status"
msgid "Uploading your backup..."
-msgstr ""
+msgstr "Yedeklemeniz yükleniyor..."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:36
msgctxt "@info:backup_status"
msgid "There was an error while uploading your backup."
-msgstr ""
+msgstr "Yedeklemeniz yüklenirken bir hata oluştu."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/UploadBackupJob.py:39
msgctxt "@info:backup_status"
msgid "Your backup has finished uploading."
-msgstr ""
+msgstr "Yedeklemenizin yüklenmesi tamamlandı."
#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14
#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14
@@ -919,7 +915,7 @@ msgstr "3mf dosyasını yazarken hata oluştu."
#: /home/ruben/Projects/Cura/plugins/PreviewStage/__init__.py:13
msgctxt "@item:inmenu"
msgid "Preview"
-msgstr ""
+msgstr "Önizleme"
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
@@ -927,11 +923,6 @@ msgctxt "@action"
msgid "Select upgrades"
msgstr "Yükseltmeleri seçin"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14
-msgctxt "@action"
-msgid "Checkup"
-msgstr "Kontrol"
-
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:21
msgctxt "@action"
msgid "Level build plate"
@@ -1020,7 +1011,7 @@ msgstr "Dosya {0} zaten mevcut. Üstüne yazmak istediğini
#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
msgctxt "@info:status"
msgid "Invalid file URL:"
-msgstr ""
+msgstr "Geçersiz dosya URL’si:"
#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
msgctxt "@menuitem"
@@ -1041,7 +1032,7 @@ msgstr "Ayarlar güncellendi"
#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
-msgstr ""
+msgstr "Ekstrüder(ler) Devre Dışı Bırakıldı"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
#, python-brace-format
@@ -1070,13 +1061,13 @@ msgstr "Dışa aktarma başarılı"
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
-msgstr ""
+msgstr "{0} dosyasından profil içe aktarımı başarısız oldu: {1}"
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Can't import profile from {0} before a printer is added."
-msgstr ""
+msgstr "Yazıcı eklenmeden önce profil, {0} dosyasından içe aktarılamaz."
#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
#, python-brace-format
@@ -1209,7 +1200,7 @@ msgstr "Geçerli sürümünüzle eşleşmeyen bir Cura yedeği geri yüklenmeye
#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
-msgstr ""
+msgstr "Ultimaker hesabı sunucusuna ulaşılamadı."
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
@@ -1219,7 +1210,7 @@ msgstr "Nesneler çoğaltılıyor ve yerleştiriliyor"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:28
msgctxt "@info:title"
msgid "Placing Objects"
-msgstr ""
+msgstr "Nesneler Yerleştiriliyor"
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:103
@@ -1264,12 +1255,7 @@ msgid ""
"
Backups can be found in the configuration folder.
\n"
"
Please send us this Crash Report to fix the problem.
\n"
" "
-msgstr ""
-"
Ultimaker Cura doğru görünmeyen bir şeyle karşılaştı.
\n"
-"
Başlatma esnasında kurtarılamaz bir hata ile karşılaştık. Muhtemelen bazı hatalı yapılandırma dosyalarından kaynaklanıyordu. Yapılandırmanızı yedekleyip sıfırlamanızı öneriyoruz.
\n"
-"
Yedekler yapılandırma klasöründe bulunabilir.
\n"
-"
Sorunu düzeltmek için lütfen bu Çökme Raporunu bize gönderin.
\n"
-" "
+msgstr "
Ultimaker Cura doğru görünmeyen bir şeyle karşılaştı.
\n
Başlatma esnasında kurtarılamaz bir hata ile karşılaştık. Muhtemelen bazı hatalı yapılandırma dosyalarından kaynaklanıyordu. Yapılandırmanızı yedekleyip sıfırlamanızı öneriyoruz.
\n
Yedekler yapılandırma klasöründe bulunabilir.
\n
Sorunu düzeltmek için lütfen bu Çökme Raporunu bize gönderin.
\n"
#~ " "
@@ -6828,6 +6709,7 @@ msgstr "X3GWriter"
#~ "You need to accept this license to install this plugin.\n"
#~ "Do you agree with the terms below?"
#~ msgstr ""
+
#~ " eklenti lisans içerir.\n"
#~ "Bu eklentiyi kurmak için bu lisans kabul etmeniz gerekir.\n"
#~ "Aşağıdaki koşulları kabul ediyor musunuz?"
@@ -7355,6 +7237,7 @@ msgstr "X3GWriter"
#~ msgid "Print Selected Model with %1"
#~ msgid_plural "Print Selected Models With %1"
#~ msgstr[0] "Seçili Modeli %1 ile Yazdır"
+
#~ msgstr[1] "Seçili Modelleri %1 ile Yazdır"
#~ msgctxt "@info:status"
@@ -7384,6 +7267,7 @@ msgstr "X3GWriter"
#~ "
".arg(catalog.i18nc("@label", "This setting is not used because all the settings that it influences are overridden."))
+ }
+
if (affects_list != "")
{
- tooltip += " %1\n
\n%2
".arg(catalog.i18nc("@label Header for list of settings.", "Affects")).arg(affects_list)
+ tooltip += "%1
%2
".arg(catalog.i18nc("@label Header for list of settings.", "Affects")).arg(affects_list)
}
if (affected_by_list != "")
{
- tooltip += " %1\n
\n%2
".arg(catalog.i18nc("@label Header for list of settings.", "Affected By")).arg(affected_by_list)
+ tooltip += "%1
%2
".arg(catalog.i18nc("@label Header for list of settings.", "Affected By")).arg(affected_by_list)
}
return tooltip
@@ -213,7 +218,7 @@ Item
UM.SimpleButton
{
- // This button shows when the setting has an inherited function, but is overriden by profile.
+ // This button shows when the setting has an inherited function, but is overridden by profile.
id: inheritButton
// Inherit button needs to be visible if;
// - User made changes that override any loaded settings
diff --git a/resources/qml/Settings/SettingOptionalExtruder.qml b/resources/qml/Settings/SettingOptionalExtruder.qml
index b73c7498ae..714e49e500 100644
--- a/resources/qml/Settings/SettingOptionalExtruder.qml
+++ b/resources/qml/Settings/SettingOptionalExtruder.qml
@@ -45,7 +45,7 @@ SettingItem
{
if (propertyProvider.properties.value == -1)
{
- control.currentIndex = model.count - 1; // we know the last item is "Not overriden"
+ control.currentIndex = model.count - 1; // we know the last item is "Not overridden"
}
else
{
diff --git a/resources/qml/ViewsSelector.qml b/resources/qml/ViewsSelector.qml
index 0e9be649db..af98469921 100644
--- a/resources/qml/ViewsSelector.qml
+++ b/resources/qml/ViewsSelector.qml
@@ -47,7 +47,7 @@ Cura.ExpandablePopup
Label
{
id: title
- text: catalog.i18nc("@label", "View types")
+ text: catalog.i18nc("@label", "View type")
verticalAlignment: Text.AlignVCenter
height: parent.height
elide: Text.ElideRight
diff --git a/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml b/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml
new file mode 100644
index 0000000000..cb0bad67ea
--- /dev/null
+++ b/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml
@@ -0,0 +1,228 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.0 as Cura
+
+
+//
+// This is the scroll view widget for adding a (local) printer. This scroll view shows a list view with printers
+// categorized into 3 categories: "Ultimaker", "Custom", and "Other".
+//
+Item
+{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ id: base
+ height: childrenRect.height
+
+ // The currently selected machine item in the local machine list.
+ property var currentItem: (machineList.currentIndex >= 0)
+ ? machineList.model.getItem(machineList.currentIndex)
+ : null
+ // The currently active (expanded) section/category, where section/category is the grouping of local machine items.
+ property string currentSection: preferredCategory
+ // By default (when this list shows up) we always expand the "Ultimaker" section.
+ property string preferredCategory: "Ultimaker"
+
+ property int maxItemCountAtOnce: 10 // show at max 10 items at once, otherwise you need to scroll.
+
+ // User-editable printer name
+ property alias printerName: printerNameTextField.text
+ property alias isPrinterNameValid: printerNameTextField.acceptableInput
+
+ onCurrentItemChanged:
+ {
+ printerName = currentItem == null ? "" : currentItem.name
+ }
+
+ function updateCurrentItemUponSectionChange()
+ {
+ // Find the first machine from this section
+ for (var i = 0; i < machineList.count; i++)
+ {
+ var item = machineList.model.getItem(i)
+ if (item.section == base.currentSection)
+ {
+ machineList.currentIndex = i
+ break
+ }
+ }
+ }
+
+ Component.onCompleted:
+ {
+ updateCurrentItemUponSectionChange()
+ }
+
+ Item
+ {
+ id: localPrinterSelectionItem
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+ height: childrenRect.height
+
+ // ScrollView + ListView for selecting a local printer to add
+ ScrollView
+ {
+ id: scrollView
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+
+ height: maxItemCountAtOnce * UM.Theme.getSize("action_button").height
+
+ ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
+ ScrollBar.vertical.policy: ScrollBar.AsNeeded
+
+ clip: true
+
+ ListView
+ {
+ id: machineList
+
+ cacheBuffer: 0 // Workaround for https://bugreports.qt.io/browse/QTBUG-49224
+
+ model: UM.DefinitionContainersModel
+ {
+ id: machineDefinitionsModel
+ filter: { "visible": true }
+ sectionProperty: "category"
+ preferredSectionValue: preferredCategory
+ }
+
+ section.property: "section"
+ section.delegate: sectionHeader
+ delegate: machineButton
+ }
+
+ Component
+ {
+ id: sectionHeader
+
+ Button
+ {
+ id: button
+ width: ListView.view.width
+ height: UM.Theme.getSize("action_button").height
+ text: section
+
+ property bool isActive: base.currentSection == section
+
+ background: Rectangle
+ {
+ anchors.fill: parent
+ color: isActive ? UM.Theme.getColor("setting_control_highlight") : "transparent"
+ }
+
+ contentItem: Item
+ {
+ width: childrenRect.width
+ height: UM.Theme.getSize("action_button").height
+
+ UM.RecolorImage
+ {
+ id: arrow
+ anchors.left: parent.left
+ width: UM.Theme.getSize("standard_arrow").width
+ height: UM.Theme.getSize("standard_arrow").height
+ sourceSize.width: width
+ sourceSize.height: height
+ color: UM.Theme.getColor("text")
+ source: base.currentSection == section ? UM.Theme.getIcon("arrow_bottom") : UM.Theme.getIcon("arrow_right")
+ }
+
+ Label
+ {
+ id: label
+ anchors.left: arrow.right
+ anchors.leftMargin: UM.Theme.getSize("default_margin").width
+ verticalAlignment: Text.AlignVCenter
+ text: button.text
+ font: UM.Theme.getFont("default_bold")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+ }
+
+ onClicked:
+ {
+ base.currentSection = section
+ base.updateCurrentItemUponSectionChange()
+ }
+ }
+ }
+
+ Component
+ {
+ id: machineButton
+
+ Cura.RadioButton
+ {
+ id: radioButton
+ anchors.left: parent.left
+ anchors.leftMargin: UM.Theme.getSize("standard_list_lineheight").width
+ anchors.right: parent.right
+ anchors.rightMargin: UM.Theme.getSize("default_margin").width
+ height: visible ? UM.Theme.getSize("standard_list_lineheight").height : 0
+
+ checked: ListView.view.currentIndex == index
+ text: name
+ visible: base.currentSection == section
+ onClicked: ListView.view.currentIndex = index
+ }
+ }
+ }
+ }
+
+ // Horizontal line
+ Rectangle
+ {
+ id: horizontalLine
+ anchors.top: localPrinterSelectionItem.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ height: UM.Theme.getSize("default_lining").height
+ color: UM.Theme.getColor("lining")
+ }
+
+ // User-editable printer name row
+ Row
+ {
+ anchors.top: horizontalLine.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.topMargin: UM.Theme.getSize("default_lining").height
+ anchors.leftMargin: UM.Theme.getSize("default_margin").width
+
+ spacing: UM.Theme.getSize("default_margin").width
+
+ Label
+ {
+ text: catalog.i18nc("@label", "Printer name")
+ anchors.verticalCenter: parent.verticalCenter
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
+ }
+
+ Cura.TextField
+ {
+ id: printerNameTextField
+ anchors.verticalCenter: parent.verticalCenter
+ width: (parent.width / 2) | 0
+ placeholderText: catalog.i18nc("@text", "Please give your printer a name")
+ maximumLength: 40
+ validator: RegExpValidator
+ {
+ regExp: printerNameTextField.machineNameValidator.machineNameRegex
+ }
+ property var machineNameValidator: Cura.MachineNameValidator { }
+ }
+ }
+}
diff --git a/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml b/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml
new file mode 100644
index 0000000000..81dd345f3f
--- /dev/null
+++ b/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml
@@ -0,0 +1,160 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// This component contains the content for the "Add a printer" (network) page of the welcome on-boarding process.
+//
+Item
+{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ Label
+ {
+ id: titleLabel
+ anchors.top: parent.top
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: catalog.i18nc("@label", "Add a printer")
+ color: UM.Theme.getColor("primary_button")
+ font: UM.Theme.getFont("huge")
+ renderType: Text.NativeRendering
+ }
+
+ DropDownWidget
+ {
+ id: addNetworkPrinterDropDown
+
+ anchors.top: titleLabel.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.topMargin: UM.Theme.getSize("wide_margin").height
+
+ title: catalog.i18nc("@label", "Add a networked printer")
+ contentShown: true // by default expand the network printer list
+
+ onClicked:
+ {
+ addLocalPrinterDropDown.contentShown = !contentShown
+ }
+
+ contentComponent: networkPrinterListComponent
+
+ Component
+ {
+ id: networkPrinterListComponent
+
+ AddNetworkPrinterScrollView
+ {
+ id: networkPrinterScrollView
+
+ maxItemCountAtOnce: 10 // show at max 10 items at once, otherwise you need to scroll.
+
+ onRefreshButtonClicked:
+ {
+ UM.OutputDeviceManager.startDiscovery()
+ }
+
+ onAddByIpButtonClicked:
+ {
+ base.goToPage("add_printer_by_ip")
+ }
+ }
+ }
+ }
+
+ DropDownWidget
+ {
+ id: addLocalPrinterDropDown
+
+ anchors.top: addNetworkPrinterDropDown.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.topMargin: UM.Theme.getSize("default_margin").height
+
+ title: catalog.i18nc("@label", "Add a non-networked printer")
+
+ onClicked:
+ {
+ addNetworkPrinterDropDown.contentShown = !contentShown
+ }
+
+ contentComponent: localPrinterListComponent
+
+ Component
+ {
+ id: localPrinterListComponent
+
+ AddLocalPrinterScrollView
+ {
+ id: localPrinterView
+ }
+ }
+ }
+
+ // This "Back" button only shows in the "Add Machine" dialog, which has "previous_page_button_text" set to "Cancel"
+ Cura.SecondaryButton
+ {
+ id: backButton
+ anchors.left: parent.left
+ anchors.bottom: parent.bottom
+ visible: base.currentItem.previous_page_button_text ? true : false
+ text: base.currentItem.previous_page_button_text ? base.currentItem.previous_page_button_text : ""
+ onClicked:
+ {
+ base.endWizard()
+ }
+ }
+
+ Cura.PrimaryButton
+ {
+ id: nextButton
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ enabled:
+ {
+ // If the network printer dropdown is expanded, make sure that there is a selected item
+ if (addNetworkPrinterDropDown.contentShown)
+ {
+ return addNetworkPrinterDropDown.contentItem.currentItem != null
+ }
+ else
+ {
+ // Printer name cannot be empty
+ const localPrinterItem = addLocalPrinterDropDown.contentItem.currentItem
+ const isPrinterNameValid = addLocalPrinterDropDown.contentItem.isPrinterNameValid
+ return localPrinterItem != null && isPrinterNameValid
+ }
+ }
+
+ text: base.currentItem.next_page_button_text
+ onClicked:
+ {
+ // Create a network printer or a local printer according to the selection
+ if (addNetworkPrinterDropDown.contentShown)
+ {
+ // Create a network printer
+ const networkPrinterItem = addNetworkPrinterDropDown.contentItem.currentItem
+ CuraApplication.getDiscoveredPrintersModel().createMachineFromDiscoveredPrinter(networkPrinterItem)
+
+ // If we have created a machine, go to the last page, which is the "cloud" page.
+ base.goToPage("cloud")
+ }
+ else
+ {
+ // Create a local printer
+ const localPrinterItem = addLocalPrinterDropDown.contentItem.currentItem
+ const printerName = addLocalPrinterDropDown.contentItem.printerName
+ Cura.MachineManager.addMachine(localPrinterItem.id, printerName)
+
+ base.showNextPage()
+ }
+ }
+ }
+}
diff --git a/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml b/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml
new file mode 100644
index 0000000000..6d8f75c3f5
--- /dev/null
+++ b/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml
@@ -0,0 +1,251 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+//
+// This is the widget for adding a network printer. There are 2 parts in this widget. One is a scroll view of a list
+// of discovered network printers. Beneath the scroll view is a container with 3 buttons: "Refresh", "Add by IP", and
+// "Troubleshooting".
+//
+Item
+{
+ id: base
+ height: networkPrinterInfo.height + controlsRectangle.height
+
+ property alias maxItemCountAtOnce: networkPrinterScrollView.maxItemCountAtOnce
+ property var currentItem: (networkPrinterListView.currentIndex >= 0)
+ ? networkPrinterListView.model[networkPrinterListView.currentIndex]
+ : null
+
+ signal refreshButtonClicked()
+ signal addByIpButtonClicked()
+
+ Item
+ {
+ id: networkPrinterInfo
+ height: networkPrinterScrollView.visible ? networkPrinterScrollView.height : noPrinterLabel.height
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+
+ Label
+ {
+ id: noPrinterLabel
+ height: UM.Theme.getSize("setting_control").height + UM.Theme.getSize("default_margin").height
+ anchors.left: parent.left
+ anchors.leftMargin: UM.Theme.getSize("default_margin").width
+ text: catalog.i18nc("@label", "There is no printer found over your network.")
+ renderType: Text.NativeRendering
+ verticalAlignment: Text.AlignVCenter
+ visible: networkPrinterListView.count == 0 // Do not show if there are discovered devices.
+ }
+
+ ScrollView
+ {
+ id: networkPrinterScrollView
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+
+ ScrollBar.horizontal.policy: ScrollBar.AsNeeded
+ ScrollBar.vertical.policy: ScrollBar.AsNeeded
+
+ property int maxItemCountAtOnce: 8 // show at max 8 items at once, otherwise you need to scroll.
+ height: Math.min(contentHeight, maxItemCountAtOnce * UM.Theme.getSize("action_button").height)
+
+ visible: networkPrinterListView.count > 0
+
+ clip: true
+
+ ListView
+ {
+ id: networkPrinterListView
+ anchors.fill: parent
+ model: CuraApplication.getDiscoveredPrintersModel().discoveredPrinters
+
+ section.property: "modelData.sectionName"
+ section.criteria: ViewSection.FullString
+ section.delegate: sectionHeading
+
+ cacheBuffer: 0 // Workaround for https://bugreports.qt.io/browse/QTBUG-49224
+
+ Component.onCompleted:
+ {
+ var toSelectIndex = -1
+ // Select the first one that's not "unknown" and is the host a group by default.
+ for (var i = 0; i < count; i++)
+ {
+ if (!model[i].isUnknownMachineType && model[i].isHostOfGroup)
+ {
+ toSelectIndex = i
+ break
+ }
+ }
+ currentIndex = toSelectIndex
+ }
+
+ // CURA-6483 For some reason currentIndex can be reset to 0. This check is here to prevent automatically
+ // selecting an unknown or non-host printer.
+ onCurrentIndexChanged:
+ {
+ var item = model[currentIndex]
+ if (!item || item.isUnknownMachineType || !item.isHostOfGroup)
+ {
+ currentIndex = -1
+ }
+ }
+
+ Component
+ {
+ id: sectionHeading
+
+ Label
+ {
+ anchors.left: parent.left
+ anchors.leftMargin: UM.Theme.getSize("default_margin").width
+ height: UM.Theme.getSize("setting_control").height
+ text: section
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("small_button_text")
+ verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
+ }
+ }
+
+ delegate: Cura.MachineSelectorButton
+ {
+ text: modelData.device.name
+
+ width: networkPrinterListView.width
+ outputDevice: modelData.device
+
+ enabled: !modelData.isUnknownMachineType && modelData.isHostOfGroup
+
+ printerTypeLabelAutoFit: true
+
+ // update printer types for all items in the list
+ updatePrinterTypesOnlyWhenChecked: false
+ updatePrinterTypesFunction: updateMachineTypes
+ // show printer type as it is
+ printerTypeLabelConversionFunction: function(value) { return value }
+
+ function updateMachineTypes()
+ {
+ printerTypesList = [ modelData.readableMachineType ]
+ }
+
+ checkable: false
+ selected: ListView.view.currentIndex == model.index
+ onClicked:
+ {
+ ListView.view.currentIndex = index
+ }
+ }
+ }
+ }
+ }
+
+ // Horizontal line separating the buttons (below) and the discovered network printers (above)
+ Rectangle
+ {
+ id: separator
+ anchors.left: parent.left
+ anchors.top: networkPrinterInfo.bottom
+ anchors.right: parent.right
+ height: UM.Theme.getSize("default_lining").height
+ color: UM.Theme.getColor("lining")
+ }
+
+ Item
+ {
+ id: controlsRectangle
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: separator.bottom
+
+ height: UM.Theme.getSize("message_action_button").height + UM.Theme.getSize("default_margin").height
+
+ Cura.SecondaryButton
+ {
+ id: refreshButton
+ anchors.left: parent.left
+ anchors.leftMargin: UM.Theme.getSize("default_margin").width
+ anchors.verticalCenter: parent.verticalCenter
+ text: catalog.i18nc("@label", "Refresh")
+ height: UM.Theme.getSize("message_action_button").height
+ onClicked: base.refreshButtonClicked()
+ }
+
+ Cura.SecondaryButton
+ {
+ id: addPrinterByIpButton
+ anchors.left: refreshButton.right
+ anchors.leftMargin: UM.Theme.getSize("default_margin").width
+ anchors.verticalCenter: parent.verticalCenter
+ text: catalog.i18nc("@label", "Add printer by IP")
+ height: UM.Theme.getSize("message_action_button").height
+ onClicked: base.addByIpButtonClicked()
+ }
+
+ Item
+ {
+ id: troubleshootingButton
+
+ anchors.right: parent.right
+ anchors.rightMargin: UM.Theme.getSize("default_margin").width
+ anchors.verticalCenter: parent.verticalCenter
+ height: troubleshootingLinkIcon.height
+ width: troubleshootingLinkIcon.width + troubleshootingLabel.width + UM.Theme.getSize("default_margin").width
+
+ UM.RecolorImage
+ {
+ id: troubleshootingLinkIcon
+ anchors.right: troubleshootingLabel.left
+ anchors.rightMargin: UM.Theme.getSize("default_margin").width
+ anchors.verticalCenter: parent.verticalCenter
+ height: troubleshootingLabel.height
+ width: height
+ sourceSize.height: width
+ color: UM.Theme.getColor("text_link")
+ source: UM.Theme.getIcon("external_link")
+ }
+
+ Label
+ {
+ id: troubleshootingLabel
+ anchors.right: parent.right
+ anchors.verticalCenter: parent.verticalCenter
+ text: catalog.i18nc("@label", "Troubleshooting")
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text_link")
+ linkColor: UM.Theme.getColor("text_link")
+ renderType: Text.NativeRendering
+ }
+
+ MouseArea
+ {
+ anchors.fill: parent
+ hoverEnabled: true
+ onClicked:
+ {
+ // open the troubleshooting URL with web browser
+ const url = "https://ultimaker.com/in/cura/troubleshooting/network"
+ Qt.openUrlExternally(url)
+ }
+ onEntered:
+ {
+ troubleshootingLabel.font.underline = true
+ }
+ onExited:
+ {
+ troubleshootingLabel.font.underline = false
+ }
+ }
+ }
+ }
+}
diff --git a/resources/qml/WelcomePages/AddPrinterByIpContent.qml b/resources/qml/WelcomePages/AddPrinterByIpContent.qml
new file mode 100644
index 0000000000..4aec5879c1
--- /dev/null
+++ b/resources/qml/WelcomePages/AddPrinterByIpContent.qml
@@ -0,0 +1,351 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+import QtQuick.Layouts 1.3
+
+import UM 1.3 as UM
+import Cura 1.5 as Cura
+
+
+//
+// This component contains the content for the 'by IP' page of the "Add New Printer" flow of the on-boarding process.
+//
+Item
+{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ id: addPrinterByIpScreen
+
+ // If there's a manual address resolve request in progress.
+ property bool hasRequestInProgress: CuraApplication.getDiscoveredPrintersModel().hasManualDeviceRequestInProgress
+ // Indicates if a request has finished.
+ property bool hasRequestFinished: false
+ property string currentRequestAddress: ""
+
+ property var discoveredPrinter: null
+ property bool isPrinterDiscovered: discoveredPrinter != null
+ // A printer can only be added if it doesn't have an unknown type and it's the host of a group.
+ property bool canAddPrinter: isPrinterDiscovered && !discoveredPrinter.isUnknownMachineType && discoveredPrinter.isHostOfGroup
+
+ // For validating IP address
+ property var networkingUtil: Cura.NetworkingUtil {}
+
+ // CURA-6483
+ // For a manually added UM printer, the UM3OutputDevicePlugin will first create a LegacyUM device for it. Later,
+ // when it gets more info from the printer, it will first REMOVE the LegacyUM device and then add a ClusterUM device.
+ // The Add-by-IP page needs to make sure that the user do not add an unknown printer or a printer that's not the
+ // host of a group. Because of the device list change, this page needs to react upon DiscoveredPrintersChanged so
+ // it has the correct information.
+ Connections
+ {
+ target: CuraApplication.getDiscoveredPrintersModel()
+ onDiscoveredPrintersChanged:
+ {
+ if (hasRequestFinished && currentRequestAddress)
+ {
+ var printer = CuraApplication.getDiscoveredPrintersModel().discoveredPrintersByAddress[currentRequestAddress]
+ printer = printer ? printer : null
+ discoveredPrinter = printer
+ }
+ }
+ }
+
+ // Make sure to cancel the current request when this page closes.
+ onVisibleChanged:
+ {
+ if (!visible)
+ {
+ CuraApplication.getDiscoveredPrintersModel().cancelCurrentManualDeviceRequest()
+ }
+ }
+
+ Label
+ {
+ id: titleLabel
+ anchors.top: parent.top
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: catalog.i18nc("@label", "Add printer by IP address")
+ color: UM.Theme.getColor("primary_button")
+ font: UM.Theme.getFont("huge")
+ renderType: Text.NativeRendering
+ }
+
+ Item
+ {
+ anchors.top: titleLabel.bottom
+ anchors.bottom: connectButton.top
+ anchors.topMargin: UM.Theme.getSize("default_margin").height
+ anchors.bottomMargin: UM.Theme.getSize("default_margin").height
+ anchors.left: parent.left
+ anchors.right: parent.right
+
+ Item
+ {
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: UM.Theme.getSize("default_margin").width
+
+ Label
+ {
+ id: explainLabel
+ height: contentHeight
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ text: catalog.i18nc("@label", "Enter the IP address or hostname of your printer on the network.")
+ }
+
+ Item
+ {
+ id: userInputFields
+ height: childrenRect.height
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: explainLabel.bottom
+ anchors.topMargin: UM.Theme.getSize("default_margin").width
+
+ Cura.TextField
+ {
+ id: hostnameField
+ width: (parent.width / 2) | 0
+ height: addPrinterButton.height
+ anchors.verticalCenter: addPrinterButton.verticalCenter
+ anchors.left: parent.left
+
+ signal invalidInputDetected()
+
+ onInvalidInputDetected: invalidInputLabel.visible = true
+
+ validator: RegExpValidator
+ {
+ regExp: /([a-fA-F0-9.:]+)?/
+ }
+
+ onTextEdited: invalidInputLabel.visible = false
+
+ placeholderText: catalog.i18nc("@text", "Place enter your printer's IP address.")
+
+ enabled: { ! (addPrinterByIpScreen.hasRequestInProgress || addPrinterByIpScreen.isPrinterDiscovered) }
+ onAccepted: addPrinterButton.clicked()
+ }
+
+ Label
+ {
+ id: invalidInputLabel
+ anchors.top: hostnameField.bottom
+ anchors.topMargin: UM.Theme.getSize("default_margin").height
+ anchors.left: parent.left
+ visible: false
+ text: catalog.i18nc("@text", "Please enter a valid IP address.")
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+
+ Cura.SecondaryButton
+ {
+ id: addPrinterButton
+ anchors.top: parent.top
+ anchors.left: hostnameField.right
+ anchors.leftMargin: UM.Theme.getSize("default_margin").width
+ text: catalog.i18nc("@button", "Add")
+ enabled: !addPrinterByIpScreen.hasRequestInProgress && !addPrinterByIpScreen.isPrinterDiscovered && (hostnameField.state != "invalid" && hostnameField.text != "")
+ onClicked:
+ {
+ const address = hostnameField.text
+ if (!networkingUtil.isValidIP(address))
+ {
+ hostnameField.invalidInputDetected()
+ return
+ }
+
+ // This address is already in the discovered printer model, no need to add a manual discovery.
+ if (CuraApplication.getDiscoveredPrintersModel().discoveredPrintersByAddress[address])
+ {
+ addPrinterByIpScreen.discoveredPrinter = CuraApplication.getDiscoveredPrintersModel().discoveredPrintersByAddress[address]
+ addPrinterByIpScreen.hasRequestFinished = true
+ return
+ }
+
+ addPrinterByIpScreen.currentRequestAddress = address
+ CuraApplication.getDiscoveredPrintersModel().checkManualDevice(address)
+ }
+ busy: addPrinterByIpScreen.hasRequestInProgress
+ }
+ }
+
+ Item
+ {
+ width: parent.width
+ anchors.top: userInputFields.bottom
+ anchors.margins: UM.Theme.getSize("default_margin").width
+
+ Label
+ {
+ id: waitResponseLabel
+ anchors.top: parent.top
+ anchors.margins: UM.Theme.getSize("default_margin").width
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+
+ visible: addPrinterByIpScreen.hasRequestInProgress || (addPrinterByIpScreen.hasRequestFinished && !addPrinterByIpScreen.isPrinterDiscovered)
+ text:
+ {
+ if (addPrinterByIpScreen.hasRequestFinished)
+ {
+ catalog.i18nc("@label", "Could not connect to device.")
+ }
+ else
+ {
+ catalog.i18nc("@label", "The printer at this address has not responded yet.")
+ }
+ }
+ }
+
+ Item
+ {
+ id: printerInfoLabels
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+ anchors.margins: UM.Theme.getSize("default_margin").width
+
+ visible: addPrinterByIpScreen.isPrinterDiscovered
+
+ Label
+ {
+ id: printerNameLabel
+ anchors.top: parent.top
+ font: UM.Theme.getFont("large")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+
+ text: !addPrinterByIpScreen.isPrinterDiscovered ? "???" : addPrinterByIpScreen.discoveredPrinter.name
+ }
+
+ Label
+ {
+ id: printerCannotBeAddedLabel
+ width: parent.width
+ anchors.top: printerNameLabel.bottom
+ anchors.topMargin: UM.Theme.getSize("default_margin").height
+ text: catalog.i18nc("@label", "This printer cannot be added because it's an unknown printer or it's not the host of a group.")
+ visible: addPrinterByIpScreen.hasRequestFinished && !addPrinterByIpScreen.canAddPrinter
+ font: UM.Theme.getFont("default_bold")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ wrapMode: Text.WordWrap
+ }
+
+ GridLayout
+ {
+ id: printerInfoGrid
+ anchors.top: printerCannotBeAddedLabel ? printerCannotBeAddedLabel.bottom : printerNameLabel.bottom
+ anchors.margins: UM.Theme.getSize("default_margin").width
+ columns: 2
+ columnSpacing: UM.Theme.getSize("default_margin").width
+
+ Label
+ {
+ text: catalog.i18nc("@label", "Type")
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+ Label
+ {
+ id: typeText
+ text: !addPrinterByIpScreen.isPrinterDiscovered ? "?" : addPrinterByIpScreen.discoveredPrinter.readableMachineType
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+
+ Label
+ {
+ text: catalog.i18nc("@label", "Firmware version")
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+ Label
+ {
+ id: firmwareText
+ text: !addPrinterByIpScreen.isPrinterDiscovered ? "0.0.0.0" : addPrinterByIpScreen.discoveredPrinter.device.getProperty("firmware_version")
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+
+ Label
+ {
+ text: catalog.i18nc("@label", "Address")
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+ Label
+ {
+ id: addressText
+ text: !addPrinterByIpScreen.isPrinterDiscovered ? "0.0.0.0" : addPrinterByIpScreen.discoveredPrinter.address
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+ }
+
+ Connections
+ {
+ target: CuraApplication.getDiscoveredPrintersModel()
+ onManualDeviceRequestFinished:
+ {
+ var discovered_printers_model = CuraApplication.getDiscoveredPrintersModel()
+ var printer = discovered_printers_model.discoveredPrintersByAddress[hostnameField.text]
+ if (printer)
+ {
+ addPrinterByIpScreen.discoveredPrinter = printer
+ }
+ addPrinterByIpScreen.hasRequestFinished = true
+ }
+ }
+ }
+ }
+ }
+ }
+
+ Cura.SecondaryButton
+ {
+ id: backButton
+ anchors.left: parent.left
+ anchors.bottom: parent.bottom
+ text: catalog.i18nc("@button", "Back")
+ onClicked:
+ {
+ CuraApplication.getDiscoveredPrintersModel().cancelCurrentManualDeviceRequest()
+ base.showPreviousPage()
+ }
+ }
+
+ Cura.PrimaryButton
+ {
+ id: connectButton
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ text: catalog.i18nc("@button", "Connect")
+ onClicked:
+ {
+ CuraApplication.getDiscoveredPrintersModel().createMachineFromDiscoveredPrinter(discoveredPrinter)
+ base.showNextPage()
+ }
+
+ enabled: addPrinterByIpScreen.canAddPrinter
+ }
+}
diff --git a/resources/qml/WelcomePages/CloudContent.qml b/resources/qml/WelcomePages/CloudContent.qml
new file mode 100644
index 0000000000..e9b6df94e0
--- /dev/null
+++ b/resources/qml/WelcomePages/CloudContent.qml
@@ -0,0 +1,152 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// This component contains the content for the "Ultimaker Cloud" page of the welcome on-boarding process.
+//
+Item
+{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ property bool isLoggedIn: Cura.API.account.isLoggedIn
+
+ onIsLoggedInChanged:
+ {
+ if(isLoggedIn)
+ {
+ // If the user created an account or logged in by pressing any button on this page, all the actions that
+ // need / can be done by this page are completed, so we can just go to the next (if any).
+ base.showNextPage()
+ }
+ }
+
+ Label
+ {
+ id: titleLabel
+ anchors.top: parent.top
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: catalog.i18nc("@label", "Ultimaker Cloud")
+ color: UM.Theme.getColor("primary_button")
+ font: UM.Theme.getFont("huge")
+ renderType: Text.NativeRendering
+ }
+
+ // Area where the cloud contents can be put. Pictures, texts and such.
+ Item
+ {
+ id: cloudContentsArea
+ anchors
+ {
+ top: titleLabel.bottom
+ bottom: finishButton.top
+ left: parent.left
+ right: parent.right
+ topMargin: UM.Theme.getSize("default_margin").height
+ }
+
+ // Pictures and texts are arranged using Columns with spacing. The whole picture and text area is centered in
+ // the cloud contents area.
+ Column
+ {
+ anchors.centerIn: parent
+ width: parent.width
+ height: childrenRect.height
+
+ spacing: 20 * screenScaleFactor
+
+ Image // Cloud image
+ {
+ id: cloudImage
+ anchors.horizontalCenter: parent.horizontalCenter
+ source: UM.Theme.getImage("first_run_ultimaker_cloud")
+ }
+
+ Label // A title-ish text
+ {
+ id: highlightTextLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: catalog.i18nc("@text", "The next generation 3D printing workflow")
+ textFormat: Text.RichText
+ color: UM.Theme.getColor("primary")
+ font: UM.Theme.getFont("medium")
+ renderType: Text.NativeRendering
+ }
+
+ Label // A number of text items
+ {
+ id: textLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ text:
+ {
+ // There are 3 text items, each of which is translated separately as a single piece of text.
+ var full_text = ""
+ var t = ""
+
+ t = catalog.i18nc("@text", "- Send print jobs to Ultimaker printers outside your local network")
+ full_text += "
" + t + "
"
+
+ t = catalog.i18nc("@text", "- Store your Ultimaker Cura settings in the cloud for use anywhere")
+ full_text += "
" + t + "
"
+
+ t = catalog.i18nc("@text", "- Get exclusive access to print profiles from leading brands")
+ full_text += "
" + t + "
"
+
+ return full_text
+ }
+ textFormat: Text.RichText
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+ }
+ }
+
+ // Bottom buttons go here
+ Cura.PrimaryButton
+ {
+ id: finishButton
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ text: catalog.i18nc("@button", "Finish")
+ onClicked: base.showNextPage()
+ }
+
+ Cura.SecondaryButton
+ {
+ id: createAccountButton
+ anchors.left: parent.left
+ anchors.verticalCenter: finishButton.verticalCenter
+ text: catalog.i18nc("@button", "Create an account")
+ onClicked: Qt.openUrlExternally(CuraApplication.ultimakerCloudAccountRootUrl + "/app/create")
+ }
+
+ Label
+ {
+ id: signInButton
+ anchors.left: createAccountButton.right
+ anchors.verticalCenter: finishButton.verticalCenter
+ anchors.leftMargin: UM.Theme.getSize("default_margin").width
+ text: catalog.i18nc("@button", "Sign in")
+ color: UM.Theme.getColor("secondary_button_text")
+ font: UM.Theme.getFont("medium")
+ renderType: Text.NativeRendering
+
+ MouseArea
+ {
+ anchors.fill: parent
+ hoverEnabled: true
+ onClicked: Cura.API.account.login()
+ onEntered: parent.font.underline = true
+ onExited: parent.font.underline = false
+ }
+ }
+}
diff --git a/resources/qml/WelcomePages/DataCollectionsContent.qml b/resources/qml/WelcomePages/DataCollectionsContent.qml
new file mode 100644
index 0000000000..be4d09e876
--- /dev/null
+++ b/resources/qml/WelcomePages/DataCollectionsContent.qml
@@ -0,0 +1,126 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// This component contains the content for the "Help us to improve Ultimaker Cura" page of the welcome on-boarding process.
+//
+Item
+{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ Label
+ {
+ id: titleLabel
+ anchors.top: parent.top
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: catalog.i18nc("@label", "Help us to improve Ultimaker Cura")
+ color: UM.Theme.getColor("primary_button")
+ font: UM.Theme.getFont("huge")
+ renderType: Text.NativeRendering
+ }
+
+ // Area where the cloud contents can be put. Pictures, texts and such.
+ Item
+ {
+ id: contentsArea
+
+ anchors
+ {
+ top: titleLabel.bottom
+ bottom: getStartedButton.top
+ left: parent.left
+ right: parent.right
+ topMargin: UM.Theme.getSize("default_margin").width
+ }
+
+ Column
+ {
+ anchors.centerIn: parent
+ width: parent.width
+
+ spacing: UM.Theme.getSize("wide_margin").height
+
+ Label
+ {
+ id: topLabel
+ width: parent.width
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: catalog.i18nc("@text", "Ultimaker Cura collects anonymous data to improve print quality and user experience, including:")
+ wrapMode: Text.WordWrap
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+
+ Grid {
+ columns: 2
+ spacing: UM.Theme.getSize("wide_margin").height
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ ImageTile
+ {
+ text: catalog.i18nc("@text", "Machine types")
+ imageSource: UM.Theme.getImage("first_run_machine_types")
+ }
+
+ ImageTile
+ {
+ text: catalog.i18nc("@text", "Material usage")
+ imageSource: UM.Theme.getImage("first_run_material_usage")
+ }
+
+ ImageTile
+ {
+ text: catalog.i18nc("@text", "Number of slices")
+ imageSource: UM.Theme.getImage("first_run_number_slices")
+ }
+
+ ImageTile
+ {
+ text: catalog.i18nc("@text", "Print settings")
+ imageSource: UM.Theme.getImage("first_run_print_settings")
+ }
+ }
+
+ Label
+ {
+ id: bottomLabel
+ width: parent.width
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text:
+ {
+ var t = catalog.i18nc("@text", "Data collected by Ultimaker Cura will not contain any personal information.")
+ var t2 = catalog.i18nc("@text", "More information")
+ t += " " + t2 + ""
+ return t
+ }
+ textFormat: Text.RichText
+ wrapMode: Text.WordWrap
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ linkColor: UM.Theme.getColor("text_link")
+ onLinkActivated: CuraApplication.showMoreInformationDialogForAnonymousDataCollection()
+ renderType: Text.NativeRendering
+ }
+ }
+ }
+
+ Cura.PrimaryButton
+ {
+ id: getStartedButton
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ text: catalog.i18nc("@button", "Next")
+ onClicked: base.showNextPage()
+ }
+}
diff --git a/resources/qml/WelcomePages/DropDownHeader.qml b/resources/qml/WelcomePages/DropDownHeader.qml
new file mode 100644
index 0000000000..88da32c879
--- /dev/null
+++ b/resources/qml/WelcomePages/DropDownHeader.qml
@@ -0,0 +1,73 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+import ".."
+
+
+//
+// This is DropDown Header bar of the expandable drop down list. See comments in DropDownWidget for details.
+//
+Cura.RoundedRectangle
+{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ id: base
+
+ border.width: UM.Theme.getSize("default_lining").width
+ border.color: UM.Theme.getColor("lining")
+ color: UM.Theme.getColor("secondary")
+ radius: UM.Theme.getSize("default_radius").width
+
+ cornerSide: contentShown ? Cura.RoundedRectangle.Direction.Up : Cura.RoundedRectangle.Direction.All
+
+ property string title: ""
+ property url rightIconSource: UM.Theme.getIcon("arrow_bottom")
+
+ // If the tab is under hovering state
+ property bool hovered: false
+ // If the content is shown
+ property bool contentShown: false
+
+ signal clicked()
+
+ MouseArea
+ {
+ anchors.fill: parent
+ hoverEnabled: true
+ onEntered: base.hovered = true
+ onExited: base.hovered = false
+
+ onClicked: base.clicked()
+ }
+
+ Label
+ {
+ id: title
+ anchors.left: parent.left
+ anchors.leftMargin: UM.Theme.getSize("default_margin").width
+ anchors.verticalCenter: parent.verticalCenter
+ verticalAlignment: Text.AlignVCenter
+ text: base.title
+ font: UM.Theme.getFont("medium")
+ renderType: Text.NativeRendering
+ color: base.hovered ? UM.Theme.getColor("small_button_text_hover") : UM.Theme.getColor("small_button_text")
+ }
+
+ UM.RecolorImage
+ {
+ id: rightIcon
+ anchors.right: parent.right
+ anchors.rightMargin: UM.Theme.getSize("default_margin").width
+ anchors.verticalCenter: parent.verticalCenter
+ width: UM.Theme.getSize("message_close").width
+ height: UM.Theme.getSize("message_close").height
+ color: base.hovered ? UM.Theme.getColor("small_button_text_hover") : UM.Theme.getColor("small_button_text")
+ source: base.rightIconSource
+ }
+}
diff --git a/resources/qml/WelcomePages/DropDownWidget.qml b/resources/qml/WelcomePages/DropDownWidget.qml
new file mode 100644
index 0000000000..526027ea53
--- /dev/null
+++ b/resources/qml/WelcomePages/DropDownWidget.qml
@@ -0,0 +1,102 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// This is the dropdown list widget in the welcome wizard. The dropdown list has a header bar which is always present,
+// and its content whose visibility can be toggled by clicking on the header bar. The content is displayed as an
+// expandable dropdown box that will appear below the header bar.
+//
+// The content is configurable via the property "contentComponent", which will be loaded by a Loader when set.
+//
+Item
+{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ id: base
+
+ implicitWidth: 200 * screenScaleFactor
+ height: header.contentShown ? (header.height + contentRectangle.height) : header.height
+
+ property var contentComponent: null
+ property alias contentItem: contentLoader.item
+
+ property alias title: header.title
+ property bool contentShown: false // indicates if this dropdown widget is expanded to show its content
+
+ signal clicked()
+
+ Connections
+ {
+ target: header
+ onClicked:
+ {
+ base.contentShown = !base.contentShown
+ clicked()
+ }
+ }
+
+ DropDownHeader
+ {
+ id: header
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+ height: UM.Theme.getSize("expandable_component_content_header").height
+ rightIconSource: contentShown ? UM.Theme.getIcon("arrow_bottom") : UM.Theme.getIcon("arrow_left")
+ contentShown: base.contentShown
+ }
+
+ Cura.RoundedRectangle
+ {
+ id: contentRectangle
+ // Move up a bit (exaclty the width of the border) to avoid double line
+ y: header.height - UM.Theme.getSize("default_lining").width
+ anchors.left: header.left
+ anchors.right: header.right
+ // Add 2x lining, because it needs a bit of space on the top and the bottom.
+ height: contentLoader.item.height + 2 * UM.Theme.getSize("thick_lining").height
+
+ border.width: UM.Theme.getSize("default_lining").width
+ border.color: UM.Theme.getColor("lining")
+ color: UM.Theme.getColor("main_background")
+ radius: UM.Theme.getSize("default_radius").width
+ visible: base.contentShown
+ cornerSide: Cura.RoundedRectangle.Direction.Down
+
+ Loader
+ {
+ id: contentLoader
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+ // Keep a small margin with the Rectangle container so its content will not overlap with the Rectangle
+ // border.
+ anchors.margins: UM.Theme.getSize("default_lining").width
+ sourceComponent: base.contentComponent != null ? base.contentComponent : emptyComponent
+ }
+
+ // This is the empty component/placeholder that will be shown when the widget gets expanded.
+ // It contains a text line "Empty"
+ Component
+ {
+ id: emptyComponent
+
+ Label
+ {
+ text: catalog.i18nc("@label", "Empty")
+ height: UM.Theme.getSize("action_button").height
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ font: UM.Theme.getFont("medium")
+ renderType: Text.NativeRendering
+ }
+ }
+ }
+}
diff --git a/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml b/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml
new file mode 100644
index 0000000000..53504d7e92
--- /dev/null
+++ b/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml
@@ -0,0 +1,80 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// This component contains the content for the "What's new in Ultimaker Cura" page of the welcome on-boarding process.
+//
+Item
+{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ property var machineActionsModel: CuraApplication.getFirstStartMachineActionsModel()
+
+ Component.onCompleted:
+ {
+ // Reset the action to start from the beginning when it is shown.
+ machineActionsModel.reset()
+ }
+
+ // Go to the next page when all machine actions have been finished
+ Connections
+ {
+ target: machineActionsModel
+ onAllFinished:
+ {
+ if (visible)
+ {
+ base.showNextPage()
+ }
+ }
+ }
+
+ Label
+ {
+ id: titleLabel
+ anchors.top: parent.top
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: machineActionsModel.currentItem.title == undefined ? "" : machineActionsModel.currentItem.title
+ color: UM.Theme.getColor("primary_button")
+ font: UM.Theme.getFont("huge")
+ renderType: Text.NativeRendering
+ }
+
+ Item
+ {
+ anchors
+ {
+ top: titleLabel.bottom
+ topMargin: UM.Theme.getSize("default_margin").height
+ bottom: nextButton.top
+ bottomMargin: UM.Theme.getSize("default_margin").height
+ left: parent.left
+ right: parent.right
+ }
+
+ data: machineActionsModel.currentItem.content == undefined ? emptyItem : machineActionsModel.currentItem.content
+ }
+
+ // An empty item in case there's no currentItem.content to show
+ Item
+ {
+ id: emptyItem
+ }
+
+ Cura.PrimaryButton
+ {
+ id: nextButton
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ text: catalog.i18nc("@button", "Next")
+ onClicked: machineActionsModel.goToNextAction()
+ }
+}
diff --git a/resources/qml/WelcomePages/ImageTile.qml b/resources/qml/WelcomePages/ImageTile.qml
new file mode 100644
index 0000000000..7ed07304e6
--- /dev/null
+++ b/resources/qml/WelcomePages/ImageTile.qml
@@ -0,0 +1,39 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+
+
+//
+// This component places a text on top of an image.
+//
+Column
+{
+ leftPadding: UM.Theme.getSize("default_margin").width
+ rightPadding: UM.Theme.getSize("default_margin").width
+ spacing: UM.Theme.getSize("default_margin").height
+ property alias text: label.text
+ property alias imageSource: image.source
+
+ Label
+ {
+ id: label
+ width: image.width
+ anchors.horizontalCenter: image.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: ""
+ wrapMode: Text.WordWrap
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+
+ Image
+ {
+ id: image
+ source: ""
+ }
+}
\ No newline at end of file
diff --git a/resources/qml/WelcomePages/UserAgreementContent.qml b/resources/qml/WelcomePages/UserAgreementContent.qml
new file mode 100644
index 0000000000..c6fb03ccd4
--- /dev/null
+++ b/resources/qml/WelcomePages/UserAgreementContent.qml
@@ -0,0 +1,77 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+//
+// This component contains the content for the "User Agreement" page of the welcome on-boarding process.
+//
+Item
+{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ Label
+ {
+ id: titleLabel
+ anchors.top: parent.top
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: catalog.i18nc("@label", "User Agreement")
+ color: UM.Theme.getColor("primary_button")
+ font: UM.Theme.getFont("huge")
+ renderType: Text.NativeRendering
+ }
+
+ Label
+ {
+ id: disclaimerLineLabel
+ anchors
+ {
+ top: titleLabel.bottom
+ topMargin: UM.Theme.getSize("wide_margin").height
+ left: parent.left
+ right: parent.right
+ }
+
+ text: "
Disclaimer by Ultimaker
"
+ + "
Please read this disclaimer carefully.
"
+ + "
Except when otherwise stated in writing, Ultimaker provides any Ultimaker software or third party software \"As is\" without warranty of any kind. The entire risk as to the quality and performance of Ultimaker software is with you.
"
+ + "
Unless required by applicable law or agreed to in writing, in no event will Ultimaker be liable to you for damages, including any general, special, incidental, or consequential damages arising out of the use or inability to use any Ultimaker software or third party software.
"
+ textFormat: Text.RichText
+ wrapMode: Text.WordWrap
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+
+ Cura.PrimaryButton
+ {
+ id: agreeButton
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ text: catalog.i18nc("@button", "Agree")
+ onClicked:
+ {
+ CuraApplication.writeToLog("i", "User accepted the User-Agreement.")
+ CuraApplication.setNeedToShowUserAgreement(false)
+ base.showNextPage()
+ }
+ }
+
+ Cura.SecondaryButton
+ {
+ id: declineButton
+ anchors.left: parent.left
+ anchors.bottom: parent.bottom
+ text: catalog.i18nc("@button", "Decline and close")
+ onClicked:
+ {
+ CuraApplication.writeToLog("i", "User declined the User Agreement.")
+ CuraApplication.closeApplication() // NOTE: Hard exit, don't use if anything needs to be saved!
+ }
+ }
+}
diff --git a/resources/qml/WelcomePages/WelcomeContent.qml b/resources/qml/WelcomePages/WelcomeContent.qml
new file mode 100644
index 0000000000..1464e363a8
--- /dev/null
+++ b/resources/qml/WelcomePages/WelcomeContent.qml
@@ -0,0 +1,62 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// This component contains the content for the "Welcome" page of the welcome on-boarding process.
+//
+Item
+{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ Column // Arrange the items vertically and put everything in the center
+ {
+ anchors.centerIn: parent
+ width: parent.width
+ spacing: 2 * UM.Theme.getSize("wide_margin").height
+
+ Label
+ {
+ id: titleLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: catalog.i18nc("@label", "Welcome to Ultimaker Cura")
+ color: UM.Theme.getColor("primary_button")
+ font: UM.Theme.getFont("huge")
+ renderType: Text.NativeRendering
+ }
+
+ Image
+ {
+ id: curaImage
+ anchors.horizontalCenter: parent.horizontalCenter
+ source: UM.Theme.getImage("first_run_welcome_cura")
+ }
+
+ Label
+ {
+ id: textLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: catalog.i18nc("@text", "Please follow these steps to set up\nUltimaker Cura. This will only take a few moments.")
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+
+ Cura.PrimaryButton
+ {
+ id: getStartedButton
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.margins: UM.Theme.getSize("wide_margin").width
+ text: catalog.i18nc("@button", "Get started")
+ onClicked: base.showNextPage()
+ }
+ }
+}
diff --git a/resources/qml/WelcomePages/WelcomeDialogItem.qml b/resources/qml/WelcomePages/WelcomeDialogItem.qml
new file mode 100644
index 0000000000..7da4c6e897
--- /dev/null
+++ b/resources/qml/WelcomePages/WelcomeDialogItem.qml
@@ -0,0 +1,66 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+import QtQuick.Window 2.2
+import QtGraphicalEffects 1.0 // For the DropShadow
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// This is an Item that tries to mimic a dialog for showing the welcome process.
+//
+Item
+{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ id: dialog
+
+ anchors.centerIn: parent
+
+ width: 580 * screenScaleFactor
+ height: 600 * screenScaleFactor
+
+ property int shadowOffset: 1 * screenScaleFactor
+
+ property alias progressBarVisible: wizardPanel.progressBarVisible
+ property var model: CuraApplication.getWelcomePagesModel()
+
+ onVisibleChanged:
+ {
+ if (visible)
+ {
+ model.resetState()
+ }
+ }
+
+ WizardPanel
+ {
+ id: wizardPanel
+ anchors.fill: parent
+ model: dialog.model
+ }
+
+ // Drop shadow around the panel
+ DropShadow
+ {
+ id: shadow
+ radius: UM.Theme.getSize("first_run_shadow_radius").width
+ anchors.fill: wizardPanel
+ source: wizardPanel
+ horizontalOffset: shadowOffset
+ verticalOffset: shadowOffset
+ color: UM.Theme.getColor("first_run_shadow")
+ transparentBorder: true
+ }
+
+ // Close this dialog when there's no more page to show
+ Connections
+ {
+ target: model
+ onAllFinished: dialog.visible = false
+ }
+}
diff --git a/resources/qml/WelcomePages/WhatsNewContent.qml b/resources/qml/WelcomePages/WhatsNewContent.qml
new file mode 100644
index 0000000000..51a347779a
--- /dev/null
+++ b/resources/qml/WelcomePages/WhatsNewContent.qml
@@ -0,0 +1,57 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// This component contains the content for the "What's new in Ultimaker Cura" page of the welcome on-boarding process.
+//
+Item
+{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ Label
+ {
+ id: titleLabel
+ anchors.top: parent.top
+ anchors.horizontalCenter: parent.horizontalCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: catalog.i18nc("@label", "What's new in Ultimaker Cura")
+ color: UM.Theme.getColor("primary_button")
+ font: UM.Theme.getFont("huge")
+ renderType: Text.NativeRendering
+ }
+
+ Cura.ScrollableTextArea
+ {
+ id: whatsNewTextArea
+
+ anchors.top: titleLabel.bottom
+ anchors.bottom: getStartedButton.top
+ anchors.topMargin: UM.Theme.getSize("wide_margin").height
+ anchors.bottomMargin: UM.Theme.getSize("wide_margin").height
+ anchors.left: parent.left
+ anchors.right: parent.right
+
+ ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
+
+ textArea.text: CuraApplication.getTextManager().getChangeLogText()
+ textArea.textFormat: Text.RichText
+ textArea.wrapMode: Text.WordWrap
+ textArea.readOnly: true
+ }
+
+ Cura.PrimaryButton
+ {
+ id: getStartedButton
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ text: base.currentItem.next_page_button_text
+ onClicked: base.showNextPage()
+ }
+}
diff --git a/resources/qml/WelcomePages/WizardDialog.qml b/resources/qml/WelcomePages/WizardDialog.qml
new file mode 100644
index 0000000000..c81f9daff0
--- /dev/null
+++ b/resources/qml/WelcomePages/WizardDialog.qml
@@ -0,0 +1,56 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+import QtQuick.Window 2.2
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// This is a dialog for showing a set of processes that's defined in a WelcomePagesModel or some other Qt ListModel with
+// a compatible interface.
+//
+Window
+{
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ id: dialog
+
+ flags: Qt.Dialog
+ modality: Qt.ApplicationModal
+
+ minimumWidth: 580 * screenScaleFactor
+ minimumHeight: 600 * screenScaleFactor
+ maximumWidth: minimumWidth
+ maximumHeight: minimumHeight
+
+ color: UM.Theme.getColor("main_background")
+
+ property var model: null // Needs to be set by whoever is using this dialog.
+ property alias progressBarVisible: wizardPanel.progressBarVisible
+
+ onVisibilityChanged:
+ {
+ if (visible)
+ {
+ model.resetState()
+ }
+ }
+
+ WizardPanel
+ {
+ id: wizardPanel
+ anchors.fill: parent
+ model: dialog.model
+ }
+
+ // Close this dialog when there's no more page to show
+ Connections
+ {
+ target: model
+ onAllFinished: dialog.hide()
+ }
+}
diff --git a/resources/qml/WelcomePages/WizardPanel.qml b/resources/qml/WelcomePages/WizardPanel.qml
new file mode 100644
index 0000000000..d4ec116d65
--- /dev/null
+++ b/resources/qml/WelcomePages/WizardPanel.qml
@@ -0,0 +1,76 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// This item is a wizard panel that contains a progress bar at the top and a content area that's beneath the progress
+// bar.
+//
+Item
+{
+ id: base
+
+ clip: true
+
+ property var currentItem: (model == null) ? null : model.getItem(model.currentPageIndex)
+ property var model: null
+
+ // Convenience properties
+ property var progressValue: model == null ? 0 : model.currentProgress
+ property string pageUrl: currentItem == null ? "" : currentItem.page_url
+
+ property alias progressBarVisible: progressBar.visible
+ property alias backgroundColor: panelBackground.color
+
+ signal showNextPage()
+ signal showPreviousPage()
+ signal goToPage(string page_id) // Go to a specific page by the given page_id.
+ signal endWizard()
+
+ // Call the corresponding functions in the model
+ onShowNextPage: model.goToNextPage()
+ onShowPreviousPage: model.goToPreviousPage()
+ onGoToPage: model.goToPage(page_id)
+ onEndWizard: model.atEnd()
+
+ Rectangle // Panel background
+ {
+ id: panelBackground
+ anchors.fill: parent
+ radius: UM.Theme.getSize("default_radius").width
+ color: UM.Theme.getColor("main_background")
+
+ UM.ProgressBar
+ {
+ id: progressBar
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+
+ height: UM.Theme.getSize("progressbar").height
+
+ value: base.progressValue
+ }
+
+ Loader
+ {
+ id: contentLoader
+ anchors
+ {
+ margins: UM.Theme.getSize("wide_margin").width
+ bottomMargin: UM.Theme.getSize("default_margin").width
+ top: progressBar.bottom
+ bottom: parent.bottom
+ left: parent.left
+ right: parent.right
+ }
+ source: base.pageUrl
+ }
+ }
+}
diff --git a/resources/qml/Widgets/CheckBox.qml b/resources/qml/Widgets/CheckBox.qml
new file mode 100644
index 0000000000..1de0e4addd
--- /dev/null
+++ b/resources/qml/Widgets/CheckBox.qml
@@ -0,0 +1,77 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// ComboBox with Cura styling.
+//
+CheckBox
+{
+ id: control
+
+ hoverEnabled: true
+
+ indicator: Rectangle
+ {
+ width: control.height
+ height: control.height
+
+ color:
+ {
+ if (!control.enabled)
+ {
+ return UM.Theme.getColor("setting_control_disabled")
+ }
+ if (control.hovered || control.activeFocus)
+ {
+ return UM.Theme.getColor("setting_control_highlight")
+ }
+ return UM.Theme.getColor("setting_control")
+ }
+
+ radius: UM.Theme.getSize("setting_control_radius").width
+ border.width: UM.Theme.getSize("default_lining").width
+ border.color:
+ {
+ if (!enabled)
+ {
+ return UM.Theme.getColor("setting_control_disabled_border")
+ }
+ if (control.hovered || control.activeFocus)
+ {
+ return UM.Theme.getColor("setting_control_border_highlight")
+ }
+ return UM.Theme.getColor("setting_control_border")
+ }
+
+ UM.RecolorImage
+ {
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.horizontalCenter: parent.horizontalCenter
+ width: Math.round(parent.width / 2.5)
+ height: Math.round(parent.height / 2.5)
+ sourceSize.height: width
+ color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text")
+ source: UM.Theme.getIcon("check")
+ opacity: control.checked ? 1 : 0
+ Behavior on opacity { NumberAnimation { duration: 100; } }
+ }
+ }
+
+ contentItem: Label
+ {
+ id: textLabel
+ leftPadding: control.indicator.width + control.spacing
+ text: control.text
+ font: control.font
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ verticalAlignment: Text.AlignVCenter
+ }
+}
diff --git a/resources/qml/Widgets/ComboBox.qml b/resources/qml/Widgets/ComboBox.qml
new file mode 100644
index 0000000000..6ce7c6da45
--- /dev/null
+++ b/resources/qml/Widgets/ComboBox.qml
@@ -0,0 +1,152 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// ComboBox with Cura styling.
+//
+ComboBox
+{
+ id: control
+
+ background: Rectangle
+ {
+ color:
+ {
+ if (!enabled)
+ {
+ return UM.Theme.getColor("setting_control_disabled")
+ }
+
+ if (control.hovered || control.activeFocus)
+ {
+ return UM.Theme.getColor("setting_control_highlight")
+ }
+
+ return UM.Theme.getColor("setting_control")
+ }
+
+ radius: UM.Theme.getSize("setting_control_radius").width
+ border.width: UM.Theme.getSize("default_lining").width
+ border.color:
+ {
+ if (!enabled)
+ {
+ return UM.Theme.getColor("setting_control_disabled_border")
+ }
+
+ if (control.hovered || control.activeFocus)
+ {
+ return UM.Theme.getColor("setting_control_border_highlight")
+ }
+
+ return UM.Theme.getColor("setting_control_border")
+ }
+ }
+
+ indicator: UM.RecolorImage
+ {
+ id: downArrow
+ x: control.width - width - control.rightPadding
+ y: control.topPadding + Math.round((control.availableHeight - height) / 2)
+
+ source: UM.Theme.getIcon("arrow_bottom")
+ width: UM.Theme.getSize("standard_arrow").width
+ height: UM.Theme.getSize("standard_arrow").height
+ sourceSize.width: width + 5 * screenScaleFactor
+ sourceSize.height: width + 5 * screenScaleFactor
+
+ color: UM.Theme.getColor("setting_control_button")
+ }
+
+ contentItem: Label
+ {
+ anchors.left: parent.left
+ anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.right: downArrow.left
+
+ text: control.currentText
+ textFormat: Text.PlainText
+ renderType: Text.NativeRendering
+ font: UM.Theme.getFont("default")
+ color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text")
+ elide: Text.ElideRight
+ verticalAlignment: Text.AlignVCenter
+ }
+
+ popup: Popup
+ {
+ y: control.height - UM.Theme.getSize("default_lining").height
+ width: control.width
+ implicitHeight: contentItem.implicitHeight + 2 * UM.Theme.getSize("default_lining").width
+ padding: UM.Theme.getSize("default_lining").width
+
+ contentItem: ListView
+ {
+ clip: true
+ implicitHeight: contentHeight
+ model: control.popup.visible ? control.delegateModel : null
+ currentIndex: control.highlightedIndex
+
+ ScrollIndicator.vertical: ScrollIndicator { }
+ }
+
+ background: Rectangle
+ {
+ color: UM.Theme.getColor("setting_control")
+ border.color: UM.Theme.getColor("setting_control_border")
+ }
+ }
+
+ delegate: ItemDelegate
+ {
+ id: delegateItem
+ width: control.width - 2 * UM.Theme.getSize("default_lining").width
+ height: control.height
+ highlighted: control.highlightedIndex == index
+ text:
+ // FIXME: Maybe there is a better way to do this. Check model and modelData doc page:
+ // https://doc.qt.io/qt-5/qtquick-modelviewsdata-modelview.html
+ {
+ var _val = undefined
+ if (typeof _val === 'undefined') // try to get textRole from "model".
+ {
+ _val = model[textRole]
+ }
+ if (typeof _val === 'undefined') // try to get textRole from "modelData" if it's still undefined.
+ {
+ _val = modelData[textRole]
+ }
+ return (typeof _val !== 'undefined') ? _val : ""
+ }
+
+ contentItem: Label
+ {
+ // FIXME: Somehow the top/bottom anchoring is not correct on Linux and it results in invisible texts.
+ anchors.fill: parent
+ anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width
+ anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width
+
+ text: delegateItem.text
+ textFormat: Text.PlainText
+ renderType: Text.NativeRendering
+ color: control.contentItem.color
+ font: UM.Theme.getFont("default")
+ elide: Text.ElideRight
+ verticalAlignment: Text.AlignVCenter
+ }
+
+ background: Rectangle
+ {
+ color: parent.highlighted ? UM.Theme.getColor("setting_control_highlight") : "transparent"
+ border.color: parent.highlighted ? UM.Theme.getColor("setting_control_border_highlight") : "transparent"
+ }
+ }
+}
diff --git a/resources/qml/Widgets/NotificationIcon.qml b/resources/qml/Widgets/NotificationIcon.qml
new file mode 100644
index 0000000000..5cf4d17777
--- /dev/null
+++ b/resources/qml/Widgets/NotificationIcon.qml
@@ -0,0 +1,40 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.4 as UM
+
+
+//
+// A notification icon which is a circle with a number at the center, that can be used to indicate, for example, how
+// many new messages that are available.
+//
+Rectangle
+{
+ id: notificationIcon
+ color: UM.Theme.getColor("notification_icon")
+ width: UM.Theme.getSize("notification_icon").width
+ height: UM.Theme.getSize("notification_icon").height
+ radius: (0.5 * width) | 0
+
+ property alias labelText: notificationLabel.text
+ property alias labelFont: notificationLabel.font
+
+ Label
+ {
+ id: notificationLabel
+ anchors.fill: parent
+ color: UM.Theme.getColor("primary_text")
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ font: UM.Theme.getFont("default")
+ renderType: Text.NativeRendering
+
+ // This is a bit of a hack, but we don't really have enough room for 2 characters (eg 9+). The default font
+ // does have a tad bit to much spacing. So instead of adding a whole new font, we just modify it a bit for this
+ // specific instance.
+ Component.onCompleted: font.letterSpacing = -1
+ }
+}
diff --git a/resources/qml/Widgets/RadioButton.qml b/resources/qml/Widgets/RadioButton.qml
new file mode 100644
index 0000000000..13aee7ba90
--- /dev/null
+++ b/resources/qml/Widgets/RadioButton.qml
@@ -0,0 +1,55 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.0 as Cura
+
+
+//
+// Cura-style RadioButton.
+//
+RadioButton
+{
+ id: radioButton
+
+ font: UM.Theme.getFont("default")
+
+ background: Item
+ {
+ anchors.fill: parent
+ }
+
+ indicator: Rectangle
+ {
+ implicitWidth: UM.Theme.getSize("radio_button").width
+ implicitHeight: UM.Theme.getSize("radio_button").height
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.alignWhenCentered: false
+ radius: width / 2
+ border.width: UM.Theme.getSize("default_lining").width
+ border.color: radioButton.hovered ? UM.Theme.getColor("small_button_text") : UM.Theme.getColor("small_button_text_hover")
+
+ Rectangle
+ {
+ width: (parent.width / 2) | 0
+ height: width
+ anchors.centerIn: parent
+ radius: width / 2
+ color: radioButton.hovered ? UM.Theme.getColor("primary_button_hover") : UM.Theme.getColor("primary_button")
+ visible: radioButton.checked
+ }
+ }
+
+ contentItem: Label
+ {
+ verticalAlignment: Text.AlignVCenter
+ leftPadding: radioButton.indicator.width + radioButton.spacing
+ text: radioButton.text
+ font: radioButton.font
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+ }
+}
diff --git a/resources/qml/Widgets/ScrollableTextArea.qml b/resources/qml/Widgets/ScrollableTextArea.qml
new file mode 100644
index 0000000000..b806087f9a
--- /dev/null
+++ b/resources/qml/Widgets/ScrollableTextArea.qml
@@ -0,0 +1,36 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// Cura-style TextArea with scrolls
+//
+ScrollView
+{
+ property alias textArea: _textArea
+
+ clip: true
+
+ background: Rectangle // Border
+ {
+ color: UM.Theme.getColor("main_background")
+ border.color: UM.Theme.getColor("lining")
+ border.width: UM.Theme.getSize("default_lining").width
+ }
+
+ TextArea
+ {
+ id: _textArea
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ textFormat: TextEdit.PlainText
+ renderType: Text.NativeRendering
+ selectByMouse: true
+ }
+}
diff --git a/resources/qml/Widgets/TextField.qml b/resources/qml/Widgets/TextField.qml
new file mode 100644
index 0000000000..28074d4415
--- /dev/null
+++ b/resources/qml/Widgets/TextField.qml
@@ -0,0 +1,71 @@
+// Copyright (c) 2019 Ultimaker B.V.
+// Cura is released under the terms of the LGPLv3 or higher.
+
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.3 as UM
+import Cura 1.1 as Cura
+
+
+//
+// Cura-style TextField
+//
+TextField
+{
+ id: textField
+
+ UM.I18nCatalog { id: catalog; name: "cura" }
+
+ hoverEnabled: true
+ selectByMouse: true
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ renderType: Text.NativeRendering
+
+ states: [
+ State
+ {
+ name: "disabled"
+ when: !textField.enabled
+ PropertyChanges { target: backgroundRectangle.border; color: UM.Theme.getColor("setting_control_disabled_border")}
+ PropertyChanges { target: backgroundRectangle; color: UM.Theme.getColor("setting_control_disabled")}
+ },
+ State
+ {
+ name: "invalid"
+ when: !textField.acceptableInput
+ PropertyChanges { target: backgroundRectangle.border; color: UM.Theme.getColor("setting_validation_error")}
+ PropertyChanges { target: backgroundRectangle; color: UM.Theme.getColor("setting_validation_error_background")}
+ },
+ State
+ {
+ name: "hovered"
+ when: textField.hovered || textField.activeFocus
+ PropertyChanges { target: backgroundRectangle.border; color: UM.Theme.getColor("setting_control_border_highlight") }
+ }
+ ]
+
+ background: Rectangle
+ {
+ id: backgroundRectangle
+
+ color: UM.Theme.getColor("main_background")
+
+ anchors.margins: Math.round(UM.Theme.getSize("default_lining").width)
+ radius: UM.Theme.getSize("setting_control_radius").width
+
+ border.color:
+ {
+ if (!textField.enabled)
+ {
+ return UM.Theme.getColor("setting_control_disabled_border")
+ }
+ if (textField.hovered || textField.activeFocus)
+ {
+ return UM.Theme.getColor("setting_control_border_highlight")
+ }
+ return UM.Theme.getColor("setting_control_border")
+ }
+ }
+}
diff --git a/resources/qml/qmldir b/resources/qml/qmldir
index 62997cc27a..dcc2e410c9 100644
--- a/resources/qml/qmldir
+++ b/resources/qml/qmldir
@@ -1,6 +1,7 @@
module Cura
MachineSelector 1.0 MachineSelector.qml
+MachineSelectorButton 1.0 MachineSelectorButton.qml
CustomConfigurationSelector 1.0 CustomConfigurationSelector.qml
PrintSetupSelector 1.0 PrintSetupSelector.qml
ActionButton 1.0 ActionButton.qml
@@ -17,3 +18,29 @@ SettingView 1.0 SettingView.qml
ProfileMenu 1.0 ProfileMenu.qml
CheckBoxWithTooltip 1.0 CheckBoxWithTooltip.qml
ToolTip 1.0 ToolTip.qml
+
+
+# Cura/WelcomePages
+
+WizardPanel 1.0 WizardPanel.qml
+WizardDialog 1.0 WizardDialog.qml
+
+
+# Cura/Widgets
+
+CheckBox 1.0 CheckBox.qml
+ComboBox 1.0 ComboBox.qml
+NotificationIcon 1.0 NotificationIcon.qml
+RadioButton 1.0 RadioButton.qml
+Scrollable 1.0 Scrollable.qml
+TabButton 1.0 TabButton.qml
+TextField 1.0 TextField.qml
+
+
+# Cura/MachineSettings
+
+ComboBoxWithOptions 1.0 ComboBoxWithOptions.qml
+GcodeTextArea 1.0 GcodeTextArea.qml
+NumericTextFieldWithUnit 1.0 NumericTextFieldWithUnit.qml
+PrintHeadMinMaxTextField 1.0 PrintHeadMinMaxTextField.qml
+SimpleCheckBox 1.0 SimpleCheckBox.qml
diff --git a/resources/quality/anycubic_chiron/anycubic_chiron_draft.inst.cfg b/resources/quality/anycubic_chiron/anycubic_chiron_draft.inst.cfg
new file mode 100644
index 0000000000..6011fdbb32
--- /dev/null
+++ b/resources/quality/anycubic_chiron/anycubic_chiron_draft.inst.cfg
@@ -0,0 +1,61 @@
+[general]
+version = 4
+name = Draft
+definition = anycubic_chiron
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = draft
+weight = -2
+global_quality = True
+
+[values]
+acceleration_enabled = True
+acceleration_print = 1800
+acceleration_travel = 3000
+adhesion_type = skirt
+brim_width = 4.0
+cool_fan_full_at_height = 0.5
+cool_fan_speed = 100
+cool_fan_speed_0 = 100
+infill_overlap = 15
+infill_pattern = zigzag
+infill_sparse_density = 25
+initial_layer_line_width_factor = 140
+jerk_enabled = True
+jerk_print = 8
+jerk_travel = 10
+layer_height = 0.3
+layer_height_0 = 0.3
+material_bed_temperature = 60
+material_diameter = 1.75
+material_print_temperature = 200
+material_print_temperature_layer_0 = 0
+retract_at_layer_change = False
+retraction_amount = 6
+retraction_hop = 0.075
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = True
+retraction_min_travel = 1.5
+retraction_speed = 40
+skirt_brim_speed = 40
+skirt_gap = 5
+skirt_line_count = 3
+speed_infill = =speed_print
+speed_print = 60
+speed_support = 60
+speed_topbottom = =math.ceil(speed_print * 30 / 60)
+speed_travel = 100
+speed_wall = =speed_print
+speed_wall_x = =speed_print
+support_angle = 60
+support_enable = True
+support_interface_enable = True
+support_pattern = triangles
+support_roof_enable = True
+support_type = everywhere
+support_use_towers = False
+support_xy_distance = 0.7
+top_bottom_thickness = 1.2
+wall_thickness = 1.2
diff --git a/resources/quality/anycubic_chiron/anycubic_chiron_high.inst.cfg b/resources/quality/anycubic_chiron/anycubic_chiron_high.inst.cfg
new file mode 100644
index 0000000000..93561d9956
--- /dev/null
+++ b/resources/quality/anycubic_chiron/anycubic_chiron_high.inst.cfg
@@ -0,0 +1,61 @@
+[general]
+version = 4
+name = High
+definition = anycubic_chiron
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = high
+weight = 1
+global_quality = True
+
+[values]
+acceleration_enabled = True
+acceleration_print = 1800
+acceleration_travel = 3000
+adhesion_type = skirt
+brim_width = 4.0
+cool_fan_full_at_height = 0.5
+cool_fan_speed = 100
+cool_fan_speed_0 = 100
+infill_overlap = 15
+infill_pattern = zigzag
+infill_sparse_density = 25
+initial_layer_line_width_factor = 140
+jerk_enabled = True
+jerk_print = 8
+jerk_travel = 10
+layer_height = 0.1
+layer_height_0 = 0.1
+material_bed_temperature = 60
+material_diameter = 1.75
+material_print_temperature = 200
+material_print_temperature_layer_0 = 0
+retract_at_layer_change = False
+retraction_amount = 6
+retraction_hop = 0.075
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = True
+retraction_min_travel = 1.5
+retraction_speed = 40
+skirt_brim_speed = 40
+skirt_gap = 5
+skirt_line_count = 3
+speed_infill = =speed_print
+speed_print = 50
+speed_support = 30
+speed_topbottom = =math.ceil(speed_print * 20 / 50)
+speed_travel = 50
+speed_wall = =speed_print
+speed_wall_x = =speed_print
+support_angle = 60
+support_enable = True
+support_interface_enable = True
+support_pattern = triangles
+support_roof_enable = True
+support_type = everywhere
+support_use_towers = False
+support_xy_distance = 0.7
+top_bottom_thickness = 1.2
+wall_thickness = 1.2
diff --git a/resources/quality/anycubic_chiron/anycubic_chiron_normal.inst.cfg b/resources/quality/anycubic_chiron/anycubic_chiron_normal.inst.cfg
new file mode 100644
index 0000000000..d1496ff187
--- /dev/null
+++ b/resources/quality/anycubic_chiron/anycubic_chiron_normal.inst.cfg
@@ -0,0 +1,61 @@
+[general]
+version = 4
+name = Normal
+definition = anycubic_chiron
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = normal
+weight = 0
+global_quality = True
+
+[values]
+acceleration_enabled = True
+acceleration_print = 1800
+acceleration_travel = 3000
+adhesion_type = skirt
+brim_width = 4.0
+cool_fan_full_at_height = 0.5
+cool_fan_speed = 100
+cool_fan_speed_0 = 100
+infill_overlap = 15
+infill_pattern = zigzag
+infill_sparse_density = 25
+initial_layer_line_width_factor = 140
+jerk_enabled = True
+jerk_print = 8
+jerk_travel = 10
+layer_height = 0.2
+layer_height_0 = 0.2
+material_bed_temperature = 60
+material_diameter = 1.75
+material_print_temperature = 200
+material_print_temperature_layer_0 = 0
+retract_at_layer_change = False
+retraction_amount = 6
+retraction_hop = 0.075
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = True
+retraction_min_travel = 1.5
+retraction_speed = 40
+skirt_brim_speed = 40
+skirt_gap = 5
+skirt_line_count = 3
+speed_infill = =speed_print
+speed_print = 50
+speed_support = 30
+speed_topbottom = =math.ceil(speed_print * 20 / 50)
+speed_travel = 100
+speed_wall = =speed_print
+speed_wall_x = =speed_print
+support_angle = 60
+support_enable = True
+support_interface_enable = True
+support_pattern = triangles
+support_roof_enable = True
+support_type = everywhere
+support_use_towers = False
+support_xy_distance = 0.7
+top_bottom_thickness = 1.2
+wall_thickness = 1.2
diff --git a/resources/quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg
old mode 100644
new mode 100755
index 9ac0791b7d..3defed4dbc
--- a/resources/quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg
+++ b/resources/quality/deltacomb/deltacomb_abs_Draft_Quality.inst.cfg
@@ -13,7 +13,7 @@ material = generic_abs
[values]
adhesion_type = raft
cool_fan_enabled = True
-cool_fan_full_at_height = =layer_height * 2
+cool_fan_full_at_height = =layer_height * 6
cool_fan_speed = 50
cool_fan_speed_max = 50
cool_fan_speed_min = 50
diff --git a/resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg
old mode 100644
new mode 100755
index 43d6bfb778..bcbeba5964
--- a/resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg
+++ b/resources/quality/deltacomb/deltacomb_abs_Fast_Quality.inst.cfg
@@ -13,7 +13,7 @@ material = generic_abs
[values]
adhesion_type = raft
cool_fan_enabled = True
-cool_fan_full_at_height = =layer_height * 2
+cool_fan_full_at_height = =layer_height * 6
cool_fan_speed = 50
cool_fan_speed_max = 50
cool_fan_speed_min = 50
diff --git a/resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg
old mode 100644
new mode 100755
index 7116247ca3..d4b9185108
--- a/resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg
+++ b/resources/quality/deltacomb/deltacomb_abs_High_Quality.inst.cfg
@@ -7,13 +7,13 @@ definition = deltacomb
setting_version = 7
type = quality
quality_type = high
-weight = 1
+weight = 0
material = generic_abs
[values]
adhesion_type = raft
cool_fan_enabled = True
-cool_fan_full_at_height = =layer_height * 2
+cool_fan_full_at_height = =layer_height * 6
cool_fan_speed = 50
cool_fan_speed_max = 50
cool_fan_speed_min = 50
diff --git a/resources/quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg
old mode 100644
new mode 100755
index 9b968e1a47..843176f4a1
--- a/resources/quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg
+++ b/resources/quality/deltacomb/deltacomb_abs_Normal_Quality.inst.cfg
@@ -13,7 +13,7 @@ material = generic_abs
[values]
adhesion_type = raft
cool_fan_enabled = True
-cool_fan_full_at_height = =layer_height * 2
+cool_fan_full_at_height = =layer_height * 6
cool_fan_speed = 50
cool_fan_speed_max = 50
cool_fan_speed_min = 50
diff --git a/resources/quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg
old mode 100644
new mode 100755
index 68846ce68b..5035bad786
--- a/resources/quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg
+++ b/resources/quality/deltacomb/deltacomb_abs_Verydraft_Quality.inst.cfg
@@ -13,7 +13,7 @@ material = generic_abs
[values]
adhesion_type = raft
cool_fan_enabled = True
-cool_fan_full_at_height = =layer_height * 2
+cool_fan_full_at_height = =layer_height * 6
cool_fan_speed = 50
cool_fan_speed_max = 50
cool_fan_speed_min = 50
diff --git a/resources/quality/deltacomb/deltacomb_global_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_global_High_Quality.inst.cfg
index 6495b09042..9b8c8080a2 100755
--- a/resources/quality/deltacomb/deltacomb_global_High_Quality.inst.cfg
+++ b/resources/quality/deltacomb/deltacomb_global_High_Quality.inst.cfg
@@ -7,7 +7,7 @@ definition = deltacomb
setting_version = 7
type = quality
quality_type = high
-weight = 1
+weight = 0
global_quality = True
[values]
diff --git a/resources/quality/deltacomb/deltacomb_petg_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_Draft_Quality.inst.cfg
new file mode 100644
index 0000000000..003f312fa8
--- /dev/null
+++ b/resources/quality/deltacomb/deltacomb_petg_Draft_Quality.inst.cfg
@@ -0,0 +1,25 @@
+[general]
+version = 4
+name = Fast
+definition = deltacomb
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = draft
+weight = -2
+material = generic_petg
+
+[values]
+adhesion_type = skirt
+cool_fan_enabled = True
+cool_fan_full_at_height = =layer_height * 4
+cool_fan_speed = 60
+cool_fan_speed_max = 100
+cool_fan_speed_min = 60
+cool_min_layer_time = 5
+cool_min_speed = 20
+speed_print = 50
+default_material_print_temperature = 235
+material_standby_temperature = 215
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
diff --git a/resources/quality/deltacomb/deltacomb_petg_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_Fast_Quality.inst.cfg
new file mode 100644
index 0000000000..6dbdb759d1
--- /dev/null
+++ b/resources/quality/deltacomb/deltacomb_petg_Fast_Quality.inst.cfg
@@ -0,0 +1,25 @@
+[general]
+version = 4
+name = Normal
+definition = deltacomb
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = fast
+weight = -1
+material = generic_petg
+
+[values]
+adhesion_type = skirt
+cool_fan_enabled = True
+cool_fan_full_at_height = =layer_height * 4
+cool_fan_speed = 60
+cool_fan_speed_max = 100
+cool_fan_speed_min = 60
+cool_min_layer_time = 5
+cool_min_speed = 20
+speed_print = 50
+default_material_print_temperature = 235
+material_standby_temperature = 215
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
diff --git a/resources/quality/deltacomb/deltacomb_petg_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_High_Quality.inst.cfg
new file mode 100644
index 0000000000..275edfe4d1
--- /dev/null
+++ b/resources/quality/deltacomb/deltacomb_petg_High_Quality.inst.cfg
@@ -0,0 +1,25 @@
+[general]
+version = 4
+name = Extra Fine
+definition = deltacomb
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = high
+weight = 0
+material = generic_petg
+
+[values]
+adhesion_type = skirt
+cool_fan_enabled = True
+cool_fan_full_at_height = =layer_height * 4
+cool_fan_speed = 60
+cool_fan_speed_max = 100
+cool_fan_speed_min = 60
+cool_min_layer_time = 5
+cool_min_speed = 20
+speed_print = 50
+default_material_print_temperature = 235
+material_standby_temperature = 215
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
diff --git a/resources/quality/deltacomb/deltacomb_petg_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_Normal_Quality.inst.cfg
new file mode 100644
index 0000000000..5d746aad68
--- /dev/null
+++ b/resources/quality/deltacomb/deltacomb_petg_Normal_Quality.inst.cfg
@@ -0,0 +1,25 @@
+[general]
+version = 4
+name = Fine
+definition = deltacomb
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = normal
+weight = 0
+material = generic_petg
+
+[values]
+adhesion_type = skirt
+cool_fan_enabled = True
+cool_fan_full_at_height = =layer_height * 4
+cool_fan_speed = 60
+cool_fan_speed_max = 100
+cool_fan_speed_min = 60
+cool_min_layer_time = 5
+cool_min_speed = 20
+speed_print = 50
+default_material_print_temperature = 235
+material_standby_temperature = 215
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
diff --git a/resources/quality/deltacomb/deltacomb_petg_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_petg_Verydraft_Quality.inst.cfg
new file mode 100644
index 0000000000..8dd0f1fbb6
--- /dev/null
+++ b/resources/quality/deltacomb/deltacomb_petg_Verydraft_Quality.inst.cfg
@@ -0,0 +1,25 @@
+[general]
+version = 4
+name = Extra Fast
+definition = deltacomb
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = verydraft
+weight = -3
+material = generic_petg
+
+[values]
+adhesion_type = skirt
+cool_fan_enabled = True
+cool_fan_full_at_height = =layer_height * 4
+cool_fan_speed = 60
+cool_fan_speed_max = 100
+cool_fan_speed_min = 60
+cool_min_layer_time = 5
+cool_min_speed = 20
+speed_print = 50
+default_material_print_temperature = 235
+material_standby_temperature = 215
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
diff --git a/resources/quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg
old mode 100644
new mode 100755
index d5387f3014..9c966d726c
--- a/resources/quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg
+++ b/resources/quality/deltacomb/deltacomb_pla_Draft_Quality.inst.cfg
@@ -13,7 +13,7 @@ material = generic_pla
[values]
adhesion_type = skirt
cool_fan_enabled = True
-cool_fan_full_at_height = =layer_height
+cool_fan_full_at_height = =layer_height * 4
cool_fan_speed = 100
cool_fan_speed_max = 100
cool_fan_speed_min = 100
diff --git a/resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg
old mode 100644
new mode 100755
index b41eb9d81f..a1a1fde055
--- a/resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg
+++ b/resources/quality/deltacomb/deltacomb_pla_Fast_Quality.inst.cfg
@@ -13,7 +13,7 @@ material = generic_pla
[values]
adhesion_type = skirt
cool_fan_enabled = True
-cool_fan_full_at_height = =layer_height
+cool_fan_full_at_height = =layer_height * 4
cool_fan_speed = 100
cool_fan_speed_max = 100
cool_fan_speed_min = 100
diff --git a/resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg
old mode 100644
new mode 100755
index ceaeb4667e..0872d6d0a2
--- a/resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg
+++ b/resources/quality/deltacomb/deltacomb_pla_High_Quality.inst.cfg
@@ -7,13 +7,13 @@ definition = deltacomb
setting_version = 7
type = quality
quality_type = high
-weight = 1
+weight = 0
material = generic_pla
[values]
adhesion_type = skirt
cool_fan_enabled = True
-cool_fan_full_at_height = =layer_height
+cool_fan_full_at_height = =layer_height * 4
cool_fan_speed = 100
cool_fan_speed_max = 100
cool_fan_speed_min = 100
diff --git a/resources/quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg
old mode 100644
new mode 100755
index ba82feb97d..cae00671c4
--- a/resources/quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg
+++ b/resources/quality/deltacomb/deltacomb_pla_Normal_Quality.inst.cfg
@@ -13,7 +13,7 @@ material = generic_pla
[values]
adhesion_type = skirt
cool_fan_enabled = True
-cool_fan_full_at_height = =layer_height
+cool_fan_full_at_height = =layer_height * 4
cool_fan_speed = 100
cool_fan_speed_max = 100
cool_fan_speed_min = 100
diff --git a/resources/quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg
old mode 100644
new mode 100755
index f312c27233..c26cec5127
--- a/resources/quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg
+++ b/resources/quality/deltacomb/deltacomb_pla_Verydraft_Quality.inst.cfg
@@ -13,7 +13,7 @@ material = generic_pla
[values]
adhesion_type = skirt
cool_fan_enabled = True
-cool_fan_full_at_height = =layer_height
+cool_fan_full_at_height = =layer_height * 4
cool_fan_speed = 100
cool_fan_speed_max = 100
cool_fan_speed_min = 100
diff --git a/resources/quality/deltacomb/deltacomb_tpu_Draft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_Draft_Quality.inst.cfg
new file mode 100755
index 0000000000..5fcbd76229
--- /dev/null
+++ b/resources/quality/deltacomb/deltacomb_tpu_Draft_Quality.inst.cfg
@@ -0,0 +1,27 @@
+[general]
+version = 4
+name = Fast
+definition = deltacomb
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = draft
+weight = -2
+material = generic_tpu
+
+[values]
+adhesion_type = skirt
+cool_fan_enabled = True
+cool_fan_full_at_height = =layer_height * 6
+cool_fan_speed = 100
+cool_fan_speed_max = 100
+cool_fan_speed_min = 70
+cool_min_layer_time = 5
+cool_min_speed = 20
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
+speed_print = 25
+speed_travel = 300
+acceleration_travel = 10000
+retraction_amount = 5
+retraction_hop_enabled = False
diff --git a/resources/quality/deltacomb/deltacomb_tpu_Fast_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_Fast_Quality.inst.cfg
new file mode 100755
index 0000000000..299d12ac00
--- /dev/null
+++ b/resources/quality/deltacomb/deltacomb_tpu_Fast_Quality.inst.cfg
@@ -0,0 +1,27 @@
+[general]
+version = 4
+name = Normal
+definition = deltacomb
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = fast
+weight = -1
+material = generic_tpu
+
+[values]
+adhesion_type = skirt
+cool_fan_enabled = True
+cool_fan_full_at_height = =layer_height * 6
+cool_fan_speed = 100
+cool_fan_speed_max = 100
+cool_fan_speed_min = 70
+cool_min_layer_time = 5
+cool_min_speed = 20
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
+speed_print = 25
+speed_travel = 300
+acceleration_travel = 10000
+retraction_amount = 5
+retraction_hop_enabled = False
diff --git a/resources/quality/deltacomb/deltacomb_tpu_High_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_High_Quality.inst.cfg
new file mode 100755
index 0000000000..32b2aadd0b
--- /dev/null
+++ b/resources/quality/deltacomb/deltacomb_tpu_High_Quality.inst.cfg
@@ -0,0 +1,27 @@
+[general]
+version = 4
+name = Extra Fine
+definition = deltacomb
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = high
+weight = 0
+material = generic_tpu
+
+[values]
+adhesion_type = skirt
+cool_fan_enabled = True
+cool_fan_full_at_height = =layer_height * 6
+cool_fan_speed = 100
+cool_fan_speed_max = 100
+cool_fan_speed_min = 70
+cool_min_layer_time = 5
+cool_min_speed = 20
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
+speed_print = 25
+speed_travel = 300
+acceleration_travel = 10000
+retraction_amount = 5
+retraction_hop_enabled = False
diff --git a/resources/quality/deltacomb/deltacomb_tpu_Normal_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_Normal_Quality.inst.cfg
new file mode 100755
index 0000000000..880c35c14e
--- /dev/null
+++ b/resources/quality/deltacomb/deltacomb_tpu_Normal_Quality.inst.cfg
@@ -0,0 +1,27 @@
+[general]
+version = 4
+name = Fine
+definition = deltacomb
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = normal
+weight = 0
+material = generic_tpu
+
+[values]
+adhesion_type = skirt
+cool_fan_enabled = True
+cool_fan_full_at_height = =layer_height * 6
+cool_fan_speed = 100
+cool_fan_speed_max = 100
+cool_fan_speed_min = 70
+cool_min_layer_time = 5
+cool_min_speed = 20
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
+speed_print = 25
+speed_travel = 300
+acceleration_travel = 10000
+retraction_amount = 5
+retraction_hop_enabled = False
diff --git a/resources/quality/deltacomb/deltacomb_tpu_Verydraft_Quality.inst.cfg b/resources/quality/deltacomb/deltacomb_tpu_Verydraft_Quality.inst.cfg
new file mode 100755
index 0000000000..104df50eee
--- /dev/null
+++ b/resources/quality/deltacomb/deltacomb_tpu_Verydraft_Quality.inst.cfg
@@ -0,0 +1,27 @@
+[general]
+version = 4
+name = Extra Fast
+definition = deltacomb
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = verydraft
+weight = -3
+material = generic_tpu
+
+[values]
+adhesion_type = skirt
+cool_fan_enabled = True
+cool_fan_full_at_height = =layer_height * 6
+cool_fan_speed = 100
+cool_fan_speed_max = 100
+cool_fan_speed_min = 70
+cool_min_layer_time = 5
+cool_min_speed = 20
+material_print_temperature_layer_0 = =default_material_print_temperature + 5
+speed_print = 25
+speed_travel = 300
+acceleration_travel = 10000
+retraction_amount = 5
+retraction_hop_enabled = False
diff --git a/resources/quality/hms434/hms434_global_Coarse_Quality.inst.cfg b/resources/quality/hms434/hms434_global_Coarse_Quality.inst.cfg
new file mode 100644
index 0000000000..9bdd52a6be
--- /dev/null
+++ b/resources/quality/hms434/hms434_global_Coarse_Quality.inst.cfg
@@ -0,0 +1,15 @@
+[general]
+version = 4
+name = Coarse
+definition = hms434
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = coarse
+weight = -3
+global_quality = True
+
+[values]
+layer_height = 0.4
+layer_height_0 = 0.4
diff --git a/resources/quality/hms434/hms434_global_Extra_Coarse_Quality.inst.cfg b/resources/quality/hms434/hms434_global_Extra_Coarse_Quality.inst.cfg
new file mode 100644
index 0000000000..e997f8297f
--- /dev/null
+++ b/resources/quality/hms434/hms434_global_Extra_Coarse_Quality.inst.cfg
@@ -0,0 +1,15 @@
+[general]
+version = 4
+name = Extra Coarse
+definition = hms434
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = extra coarse
+weight = -4
+global_quality = True
+
+[values]
+layer_height = 0.6
+layer_height_0 = 0.6
diff --git a/resources/quality/hms434/hms434_global_High_Quality.inst.cfg b/resources/quality/hms434/hms434_global_High_Quality.inst.cfg
new file mode 100644
index 0000000000..4515c1199b
--- /dev/null
+++ b/resources/quality/hms434/hms434_global_High_Quality.inst.cfg
@@ -0,0 +1,16 @@
+[general]
+version = 4
+name = High
+definition = hms434
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = high
+weight = 1
+global_quality = True
+
+[values]
+layer_height = 0.1
+layer_height_0 = 0.2
+
diff --git a/resources/quality/hms434/hms434_global_Normal_Quality.inst.cfg b/resources/quality/hms434/hms434_global_Normal_Quality.inst.cfg
new file mode 100644
index 0000000000..931e8db9f0
--- /dev/null
+++ b/resources/quality/hms434/hms434_global_Normal_Quality.inst.cfg
@@ -0,0 +1,15 @@
+[general]
+version = 4
+name = Normal
+definition = hms434
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = normal
+weight = 0
+global_quality = True
+
+[values]
+layer_height = 0.2
+layer_height_0 = 0.2
diff --git a/resources/quality/hms434/hms434_global_Super_Coarse_Quality.inst.cfg b/resources/quality/hms434/hms434_global_Super_Coarse_Quality.inst.cfg
new file mode 100644
index 0000000000..d6647df7a7
--- /dev/null
+++ b/resources/quality/hms434/hms434_global_Super_Coarse_Quality.inst.cfg
@@ -0,0 +1,16 @@
+[general]
+version = 4
+name = Super Coarse
+definition = hms434
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = super coarse
+weight = -4
+global_quality = True
+
+[values]
+layer_height = 0.8
+layer_height_0 = 0.8
+
diff --git a/resources/quality/hms434/hms434_global_Ultra_Coarse_Quality.inst.cfg b/resources/quality/hms434/hms434_global_Ultra_Coarse_Quality.inst.cfg
new file mode 100644
index 0000000000..5640ca21cc
--- /dev/null
+++ b/resources/quality/hms434/hms434_global_Ultra_Coarse_Quality.inst.cfg
@@ -0,0 +1,15 @@
+[general]
+version = 4
+name = Ultra Coarse
+definition = hms434
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = ultra coarse
+weight = -4
+global_quality = True
+
+[values]
+layer_height = 1.0
+layer_height_0 = 1.0
diff --git a/resources/quality/katihal/alya3dp_normal.inst.cfg b/resources/quality/katihal/alya3dp_normal.inst.cfg
new file mode 100644
index 0000000000..43be7e92a0
--- /dev/null
+++ b/resources/quality/katihal/alya3dp_normal.inst.cfg
@@ -0,0 +1,57 @@
+[general]
+version = 4
+name = Normal
+definition = alya3dp
+
+[metadata]
+setting_version = 5
+type = quality
+quality_type = alya_normal
+weight = 0
+global_quality = True
+
+[values]
+layer_height = 0.16
+layer_height_0 = 0.1
+adhesion_type = raft
+skirt_line_count = 2
+skirt_gap = 2
+fill_outline_gaps = True
+infill_angles = [0,90 ]
+infill_sparse_density = 15
+retraction_min_travel = 0.8
+skin_angles = [0,90]
+top_layers = 6
+wall_line_count = 2
+infill_pattern = grid
+skin_line_width = 0.4
+raft_base_line_spacing = 2.6
+raft_base_line_width = 1.2
+raft_base_thickness = 0.3
+raft_interface_line_width = 0.4
+raft_interface_thickness = 0.3
+raft_interface_line_spacing = 0.8
+raft_margin = 5
+raft_surface_layers = 3
+raft_surface_line_width = 0.4
+raft_surface_thickness = 0.2
+retract_at_layer_change = true
+retraction_hop = 0.5
+retraction_hop_enabled = true
+support_type = everywhere
+support_interface_pattern =lines
+support_top_distance = 0.15
+support_z_distance = 0.25
+support_bottom_distance = 0.15
+support_brim_width = 6
+support_infill_rate = =15 if support_enable else 0 if support_tree_enable else 15
+support_line_distance = 1.7
+support_line_width = 0.25
+support_initial_layer_line_distance = 2.7
+support_xy_distance = 0.7
+infill_line_width = 0.4
+line_width = 0.4
+optimize_wall_printing_order = True
+support_angle = 70
+wall_line_width_x = 0.4
+wall_line_width_0 = 0.35
\ No newline at end of file
diff --git a/resources/quality/katihal/alya3dp_normal_generic_pla.inst.cfg b/resources/quality/katihal/alya3dp_normal_generic_pla.inst.cfg
new file mode 100644
index 0000000000..bec4107baf
--- /dev/null
+++ b/resources/quality/katihal/alya3dp_normal_generic_pla.inst.cfg
@@ -0,0 +1,32 @@
+[general]
+version = 4
+definition = alya3dp
+name = Normal
+
+[metadata]
+setting_version = 5
+type = quality
+quality_type = alya_normal
+weight = 3
+material = generic_pla
+
+[values]
+material_diameter = 1.75
+speed_print = 40
+speed_topbottom = 30
+speed_wall_0 = 35
+speed_infill = 45
+speed_layer_0 = 25
+speed_support = 45
+speed_support_interface = 35
+speed_travel = 60
+raft_airgap = 0.15
+layer_0_z_overlap = 0.04
+raft_base_speed = 15
+raft_interface_speed = 20
+raft_surface_speed = 35
+raft_surface_fan_speed = 100
+raft_base_fan_speed = 0
+raft_interface_fan_speed = 0
+cool_fan_speed = 100
+cool_fan_speed_0 = 100
\ No newline at end of file
diff --git a/resources/quality/katihal/alyanx3dp_normal.inst.cfg b/resources/quality/katihal/alyanx3dp_normal.inst.cfg
new file mode 100644
index 0000000000..e86a6a3255
--- /dev/null
+++ b/resources/quality/katihal/alyanx3dp_normal.inst.cfg
@@ -0,0 +1,57 @@
+[general]
+version = 4
+name = Normal
+definition = alyanx3dp
+
+[metadata]
+setting_version = 5
+type = quality
+quality_type = alyanx_normal
+weight = 0
+global_quality = True
+
+[values]
+layer_height = 0.16
+layer_height_0 = 0.1
+adhesion_type = raft
+skirt_line_count = 2
+skirt_gap = 2
+fill_outline_gaps = True
+infill_angles = [0,90 ]
+infill_sparse_density = 15
+retraction_min_travel = 0.8
+skin_angles = [0,90]
+top_layers = 6
+wall_line_count = 2
+infill_pattern = grid
+skin_line_width = 0.4
+raft_base_line_spacing = 2.6
+raft_base_line_width = 1.2
+raft_base_thickness = 0.3
+raft_interface_line_width = 0.4
+raft_interface_thickness = 0.3
+raft_interface_line_spacing = 0.8
+raft_margin = 5
+raft_surface_layers = 3
+raft_surface_line_width = 0.4
+raft_surface_thickness = 0.2
+retract_at_layer_change = true
+retraction_hop = 0.5
+retraction_hop_enabled = true
+support_type = everywhere
+support_interface_pattern =lines
+support_top_distance = 0.15
+support_z_distance = 0.25
+support_bottom_distance = 0.15
+support_brim_width = 6
+support_infill_rate = =15 if support_enable else 0 if support_tree_enable else 15
+support_line_distance = 1.7
+support_line_width = 0.25
+support_initial_layer_line_distance = 2.7
+support_xy_distance = 0.7
+infill_line_width = 0.4
+line_width = 0.4
+optimize_wall_printing_order = True
+support_angle = 70
+wall_line_width_x = 0.4
+wall_line_width_0 = 0.35
\ No newline at end of file
diff --git a/resources/quality/katihal/alyanx3dp_normal_generic_pla.inst.cfg b/resources/quality/katihal/alyanx3dp_normal_generic_pla.inst.cfg
new file mode 100644
index 0000000000..4c79a3ac78
--- /dev/null
+++ b/resources/quality/katihal/alyanx3dp_normal_generic_pla.inst.cfg
@@ -0,0 +1,32 @@
+[general]
+version = 4
+definition = alyanx3dp
+name = Normal
+
+[metadata]
+setting_version = 6
+type = quality
+quality_type = alyanx_normal
+weight = 2
+material = generic_pla
+
+[values]
+material_diameter = 1.75
+speed_print = 40
+speed_topbottom = 30
+speed_wall_0 = 35
+speed_infill = 45
+speed_layer_0 = 25
+speed_support = 45
+speed_support_interface = 35
+speed_travel = 60
+raft_airgap = 0.15
+layer_0_z_overlap = 0.04
+raft_base_speed = 15
+raft_interface_speed = 20
+raft_surface_speed = 35
+raft_surface_fan_speed = 100
+raft_base_fan_speed = 0
+raft_interface_fan_speed = 0
+cool_fan_speed = 100
+cool_fan_speed_0 = 100
\ No newline at end of file
diff --git a/resources/quality/katihal/kupido_normal.inst.cfg b/resources/quality/katihal/kupido_normal.inst.cfg
new file mode 100644
index 0000000000..541eb93473
--- /dev/null
+++ b/resources/quality/katihal/kupido_normal.inst.cfg
@@ -0,0 +1,57 @@
+[general]
+version = 4
+name = Normal
+definition = kupido
+
+[metadata]
+setting_version = 5
+type = quality
+quality_type = kupido_normal
+weight = 0
+global_quality = True
+
+[values]
+layer_height = 0.16
+layer_height_0 = 0.1
+adhesion_type = raft
+skirt_line_count = 2
+skirt_gap = 2
+fill_outline_gaps = True
+infill_angles = [0,90 ]
+infill_sparse_density = 15
+retraction_min_travel = 0.8
+skin_angles = [0,90]
+top_layers = 6
+wall_line_count = 2
+infill_pattern = grid
+skin_line_width = 0.4
+raft_base_line_spacing = 2.6
+raft_base_line_width = 1.2
+raft_base_thickness = 0.3
+raft_interface_line_width = 0.4
+raft_interface_thickness = 0.3
+raft_interface_line_spacing = 0.8
+raft_margin = 5
+raft_surface_layers = 3
+raft_surface_line_width = 0.4
+raft_surface_thickness = 0.2
+retract_at_layer_change = true
+retraction_hop = 0.5
+retraction_hop_enabled = true
+support_type = everywhere
+support_interface_pattern =lines
+support_top_distance = 0.15
+support_z_distance = 0.25
+support_bottom_distance = 0.15
+support_brim_width = 6
+support_infill_rate = =15 if support_enable else 0 if support_tree_enable else 15
+support_line_distance = 1.7
+support_line_width = 0.25
+support_initial_layer_line_distance = 2.7
+support_xy_distance = 0.7
+infill_line_width = 0.4
+line_width = 0.4
+optimize_wall_printing_order = True
+support_angle = 70
+wall_line_width_x = 0.4
+wall_line_width_0 = 0.35
\ No newline at end of file
diff --git a/resources/quality/katihal/kupido_normal_generic_abs.inst.cfg b/resources/quality/katihal/kupido_normal_generic_abs.inst.cfg
new file mode 100644
index 0000000000..674b620174
--- /dev/null
+++ b/resources/quality/katihal/kupido_normal_generic_abs.inst.cfg
@@ -0,0 +1,32 @@
+[general]
+version = 4
+definition = kupido
+name = Normal
+
+[metadata]
+setting_version = 5
+type = quality
+quality_type = kupido_normal
+weight = 3
+material = generic_abs
+
+[values]
+material_diameter = 1.75
+speed_print = 40
+speed_topbottom = 30
+speed_wall_0 = 35
+speed_infill = 45
+speed_layer_0 = 25
+speed_support = 45
+speed_support_interface = 35
+speed_travel = 60
+raft_airgap = 0.1
+layer_0_z_overlap = 0.04
+raft_base_speed = 15
+raft_interface_speed = 20
+raft_surface_speed = 35
+raft_surface_fan_speed = 100
+raft_base_fan_speed = 0
+raft_interface_fan_speed = 0
+cool_fan_speed = 30
+cool_fan_speed_0 = 30
\ No newline at end of file
diff --git a/resources/quality/katihal/kupido_normal_generic_pla.inst.cfg b/resources/quality/katihal/kupido_normal_generic_pla.inst.cfg
new file mode 100644
index 0000000000..a6f6fa47a3
--- /dev/null
+++ b/resources/quality/katihal/kupido_normal_generic_pla.inst.cfg
@@ -0,0 +1,32 @@
+[general]
+version = 4
+definition = kupido
+name = Normal
+
+[metadata]
+setting_version = 5
+type = quality
+quality_type = kupido_normal
+weight = 3
+material = generic_pla
+
+[values]
+material_diameter = 1.75
+speed_print = 40
+speed_topbottom = 30
+speed_wall_0 = 35
+speed_infill = 45
+speed_layer_0 = 25
+speed_support = 45
+speed_support_interface = 35
+speed_travel = 60
+raft_airgap = 0.15
+layer_0_z_overlap = 0.04
+raft_base_speed = 15
+raft_interface_speed = 20
+raft_surface_speed = 35
+raft_surface_fan_speed = 100
+raft_base_fan_speed = 0
+raft_interface_fan_speed = 0
+cool_fan_speed = 100
+cool_fan_speed_0 = 100
\ No newline at end of file
diff --git a/resources/quality/nwa3d_a5/nwa3d_a5_best.inst.cfg b/resources/quality/nwa3d_a5/nwa3d_a5_best.inst.cfg
index 0024fb140e..8eabfa8141 100644
--- a/resources/quality/nwa3d_a5/nwa3d_a5_best.inst.cfg
+++ b/resources/quality/nwa3d_a5/nwa3d_a5_best.inst.cfg
@@ -96,7 +96,7 @@ support_angle = 50
support_pattern = grid
support_wall_count = 0
zig_zaggify_support = False
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_infill_angle = 0
support_brim_enable = True
support_brim_line_count = 5
diff --git a/resources/quality/nwa3d_a5/nwa3d_a5_fast.inst.cfg b/resources/quality/nwa3d_a5/nwa3d_a5_fast.inst.cfg
index 400dff7dff..ae6411f4f1 100644
--- a/resources/quality/nwa3d_a5/nwa3d_a5_fast.inst.cfg
+++ b/resources/quality/nwa3d_a5/nwa3d_a5_fast.inst.cfg
@@ -96,7 +96,7 @@ support_angle = 50
support_pattern = grid
support_wall_count = 0
zig_zaggify_support = False
-support_infill_rate = 15
+support_infill_rate = =15 if support_enable else 0 if support_tree_enable else 15
support_infill_angle = 0
support_brim_enable = True
support_brim_line_count = 5
diff --git a/resources/quality/nwa3d_a5/nwa3d_a5_normal.inst.cfg b/resources/quality/nwa3d_a5/nwa3d_a5_normal.inst.cfg
index 635cde4494..d825c8b85e 100644
--- a/resources/quality/nwa3d_a5/nwa3d_a5_normal.inst.cfg
+++ b/resources/quality/nwa3d_a5/nwa3d_a5_normal.inst.cfg
@@ -96,7 +96,7 @@ support_angle = 50
support_pattern = grid
support_wall_count = 0
zig_zaggify_support = False
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_infill_angle = 0
support_brim_enable = True
support_brim_line_count = 5
diff --git a/resources/quality/tizyx/tizyx_evy_dual/abs/tizyx_evy_dual_classic_abs_high.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/abs/tizyx_evy_dual_classic_abs_high.inst.cfg
new file mode 100644
index 0000000000..0f1f26af8b
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/abs/tizyx_evy_dual_classic_abs_high.inst.cfg
@@ -0,0 +1,42 @@
+[general]
+version = 4
+name = High
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = high
+weight = 1
+material = generic_abs
+variant = Classic Extruder
+
+[values]
+cool_fan_speed_0 = 100
+cool_min_layer_time = 10
+default_material_print_temperature = 210
+fill_outline_gaps = True
+infill_angles = []
+infill_sparse_density = 15
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 100
+prime_tower_min_volume = 80
+prime_tower_wipe_enabled = False
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_min_travel = 2
+retraction_speed = 30
+skin_angles = []
+skirt_line_count = 2
+speed_print = 60
+speed_topbottom = 50
+speed_wall_0 = 40
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
+top_layers = 4
+wall_line_count = 2
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/abs/tizyx_evy_dual_classic_abs_normal.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/abs/tizyx_evy_dual_classic_abs_normal.inst.cfg
new file mode 100644
index 0000000000..8c124c55dd
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/abs/tizyx_evy_dual_classic_abs_normal.inst.cfg
@@ -0,0 +1,42 @@
+[general]
+version = 4
+name = Normal
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = normal
+weight = 0
+material = generic_abs
+variant = Classic Extruder
+
+[values]
+cool_fan_speed_0 = 100
+cool_min_layer_time = 10
+default_material_print_temperature = 210
+fill_outline_gaps = True
+infill_angles = []
+infill_sparse_density = 15
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 100
+prime_tower_min_volume = 80
+prime_tower_wipe_enabled = False
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_min_travel = 2
+retraction_speed = 30
+skin_angles = []
+skirt_line_count = 2
+speed_print = 60
+speed_topbottom = 50
+speed_wall_0 = 40
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
+top_layers = 4
+wall_line_count = 2
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/abs/tizyx_evy_dual_direct_drive_abs_high.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/abs/tizyx_evy_dual_direct_drive_abs_high.inst.cfg
new file mode 100644
index 0000000000..937d35e1c3
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/abs/tizyx_evy_dual_direct_drive_abs_high.inst.cfg
@@ -0,0 +1,32 @@
+[general]
+version = 4
+name = High
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = high
+weight = 1
+material = generic_abs
+variant = Direct Drive
+
+[values]
+default_material_print_temperature = 210
+infill_angles = []
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 110
+prime_tower_min_volume = 50
+prime_tower_wipe_enabled = True
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_extra_prime_amount = 0
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_speed = 30
+skirt_brim_minimal_length = 100
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/abs/tizyx_evy_dual_direct_drive_abs_normal.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/abs/tizyx_evy_dual_direct_drive_abs_normal.inst.cfg
new file mode 100644
index 0000000000..1876e4188f
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/abs/tizyx_evy_dual_direct_drive_abs_normal.inst.cfg
@@ -0,0 +1,32 @@
+[general]
+version = 4
+name = Normal
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = normal
+weight = 0
+material = generic_abs
+variant = Direct Drive
+
+[values]
+default_material_print_temperature = 210
+infill_angles = []
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 110
+prime_tower_min_volume = 50
+prime_tower_wipe_enabled = True
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_extra_prime_amount = 0
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_speed = 30
+skirt_brim_minimal_length = 100
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/petg/tizyx_evy_dual_classic_petg_high.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/petg/tizyx_evy_dual_classic_petg_high.inst.cfg
new file mode 100644
index 0000000000..7f15b3428e
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/petg/tizyx_evy_dual_classic_petg_high.inst.cfg
@@ -0,0 +1,42 @@
+[general]
+version = 4
+name = High
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = high
+weight = 1
+material = generic_petg
+variant = Classic Extruder
+
+[values]
+cool_fan_speed_0 = 100
+cool_min_layer_time = 10
+default_material_print_temperature = 210
+fill_outline_gaps = True
+infill_angles = []
+infill_sparse_density = 15
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 100
+prime_tower_min_volume = 80
+prime_tower_wipe_enabled = False
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_min_travel = 2
+retraction_speed = 30
+skin_angles = []
+skirt_line_count = 2
+speed_print = 60
+speed_topbottom = 50
+speed_wall_0 = 40
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
+top_layers = 4
+wall_line_count = 2
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/petg/tizyx_evy_dual_classic_petg_normal.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/petg/tizyx_evy_dual_classic_petg_normal.inst.cfg
new file mode 100644
index 0000000000..8d500dbb49
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/petg/tizyx_evy_dual_classic_petg_normal.inst.cfg
@@ -0,0 +1,42 @@
+[general]
+version = 4
+name = Normal
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = normal
+weight = 0
+material = generic_petg
+variant = Classic Extruder
+
+[values]
+cool_fan_speed_0 = 100
+cool_min_layer_time = 10
+default_material_print_temperature = 210
+fill_outline_gaps = True
+infill_angles = []
+infill_sparse_density = 15
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 100
+prime_tower_min_volume = 80
+prime_tower_wipe_enabled = False
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_min_travel = 2
+retraction_speed = 30
+skin_angles = []
+skirt_line_count = 2
+speed_print = 60
+speed_topbottom = 50
+speed_wall_0 = 40
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
+top_layers = 4
+wall_line_count = 2
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/petg/tizyx_evy_dual_direct_drive_petg_high.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/petg/tizyx_evy_dual_direct_drive_petg_high.inst.cfg
new file mode 100644
index 0000000000..6ca3a99f5b
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/petg/tizyx_evy_dual_direct_drive_petg_high.inst.cfg
@@ -0,0 +1,32 @@
+[general]
+version = 4
+name = High
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = high
+weight = 1
+material = generic_petg
+variant = Direct Drive
+
+[values]
+default_material_print_temperature = 210
+infill_angles = []
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 110
+prime_tower_min_volume = 50
+prime_tower_wipe_enabled = True
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_extra_prime_amount = 0
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_speed = 30
+skirt_brim_minimal_length = 100
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/petg/tizyx_evy_dual_direct_drive_petg_normal.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/petg/tizyx_evy_dual_direct_drive_petg_normal.inst.cfg
new file mode 100644
index 0000000000..1356fdcf2e
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/petg/tizyx_evy_dual_direct_drive_petg_normal.inst.cfg
@@ -0,0 +1,32 @@
+[general]
+version = 4
+name = Normal
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = normal
+weight = 0
+material = generic_petg
+variant = Direct Drive
+
+[values]
+default_material_print_temperature = 210
+infill_angles = []
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 110
+prime_tower_min_volume = 50
+prime_tower_wipe_enabled = True
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_extra_prime_amount = 0
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_speed = 30
+skirt_brim_minimal_length = 100
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_classic_pla_flex.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_classic_pla_flex.inst.cfg
new file mode 100644
index 0000000000..a90290c052
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_classic_pla_flex.inst.cfg
@@ -0,0 +1,42 @@
+[general]
+version = 4
+name = Flex and PLA
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = draft
+weight = -2
+material = generic_pla
+variant = Classic Extruder
+
+[values]
+cool_fan_speed_0 = 100
+cool_min_layer_time = 10
+default_material_print_temperature = 210
+fill_outline_gaps = True
+infill_angles = []
+infill_sparse_density = 15
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 100
+prime_tower_min_volume = 80
+prime_tower_wipe_enabled = False
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_min_travel = 2
+retraction_speed = 30
+skin_angles = []
+skirt_line_count = 2
+speed_print = 60
+speed_topbottom = 50
+speed_wall_0 = 40
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
+top_layers = 4
+wall_line_count = 2
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_classic_pla_flex_only.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_classic_pla_flex_only.inst.cfg
new file mode 100644
index 0000000000..fde4138322
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_classic_pla_flex_only.inst.cfg
@@ -0,0 +1,14 @@
+[general]
+version = 4
+name = Flex Only
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = coarse
+weight = -3
+material = generic_pla
+variant = Classic Extruder
+
+[values]
diff --git a/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_classic_pla_high.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_classic_pla_high.inst.cfg
new file mode 100644
index 0000000000..7890aa4744
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_classic_pla_high.inst.cfg
@@ -0,0 +1,42 @@
+[general]
+version = 4
+name = High
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = high
+weight = 1
+material = generic_pla
+variant = Classic Extruder
+
+[values]
+cool_fan_speed_0 = 100
+cool_min_layer_time = 10
+default_material_print_temperature = 210
+fill_outline_gaps = True
+infill_angles = []
+infill_sparse_density = 15
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 100
+prime_tower_min_volume = 80
+prime_tower_wipe_enabled = False
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_min_travel = 2
+retraction_speed = 30
+skin_angles = []
+skirt_line_count = 2
+speed_print = 60
+speed_topbottom = 50
+speed_wall_0 = 40
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
+top_layers = 4
+wall_line_count = 2
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_classic_pla_normal.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_classic_pla_normal.inst.cfg
new file mode 100644
index 0000000000..2088da4363
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_classic_pla_normal.inst.cfg
@@ -0,0 +1,42 @@
+[general]
+version = 4
+name = Normal
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = normal
+weight = 0
+material = generic_pla
+variant = Classic Extruder
+
+[values]
+cool_fan_speed_0 = 100
+cool_min_layer_time = 10
+default_material_print_temperature = 210
+fill_outline_gaps = True
+infill_angles = []
+infill_sparse_density = 15
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 100
+prime_tower_min_volume = 80
+prime_tower_wipe_enabled = False
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_min_travel = 2
+retraction_speed = 30
+skin_angles = []
+skirt_line_count = 2
+speed_print = 60
+speed_topbottom = 50
+speed_wall_0 = 40
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
+top_layers = 4
+wall_line_count = 2
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_direct_drive_pla_flex.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_direct_drive_pla_flex.inst.cfg
new file mode 100644
index 0000000000..42520b06e1
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_direct_drive_pla_flex.inst.cfg
@@ -0,0 +1,33 @@
+[general]
+version = 4
+name = Flex and PLA
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = draft
+weight = -2
+material = generic_pla
+variant = Direct Drive
+
+[values]
+default_material_print_temperature = 210
+infill_angles = []
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 110
+prime_tower_min_volume = 50
+prime_tower_wipe_enabled = True
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_extra_prime_amount = 0
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_speed = 30
+speed_print = 30
+skirt_brim_minimal_length = 100
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_direct_drive_pla_flex_only.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_direct_drive_pla_flex_only.inst.cfg
new file mode 100644
index 0000000000..4c8c8e7f57
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_direct_drive_pla_flex_only.inst.cfg
@@ -0,0 +1,14 @@
+[general]
+version = 4
+name = Flex Only
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = coarse
+weight = -3
+material = generic_pla
+variant = Direct Drive
+
+[values]
diff --git a/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_direct_drive_pla_high.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_direct_drive_pla_high.inst.cfg
new file mode 100644
index 0000000000..af3db653db
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_direct_drive_pla_high.inst.cfg
@@ -0,0 +1,32 @@
+[general]
+version = 4
+name = High
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = high
+weight = 1
+material = generic_pla
+variant = Direct Drive
+
+[values]
+default_material_print_temperature = 210
+infill_angles = []
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 110
+prime_tower_min_volume = 50
+prime_tower_wipe_enabled = True
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_extra_prime_amount = 0
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_speed = 30
+skirt_brim_minimal_length = 100
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_direct_drive_pla_normal.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_direct_drive_pla_normal.inst.cfg
new file mode 100644
index 0000000000..d119879e80
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/pla/tizyx_evy_dual_direct_drive_pla_normal.inst.cfg
@@ -0,0 +1,32 @@
+[general]
+version = 4
+name = Normal
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = normal
+weight = 0
+material = generic_pla
+variant = Direct Drive
+
+[values]
+default_material_print_temperature = 210
+infill_angles = []
+material_final_print_temperature = 210
+material_initial_print_temperature = 210
+material_standby_temperature = 210
+prime_tower_flow = 110
+prime_tower_min_volume = 50
+prime_tower_wipe_enabled = True
+retract_at_layer_change = True
+retraction_amount = 2.5
+retraction_enable = True
+retraction_extra_prime_amount = 0
+retraction_hop_enabled = True
+retraction_hop_only_when_collides = False
+retraction_speed = 30
+skirt_brim_minimal_length = 100
+switch_extruder_retraction_amount = 0
+switch_extruder_retraction_speeds = 40
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_Flex_Only_Quality.inst.CFG b/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_Flex_Only_Quality.inst.CFG
new file mode 100644
index 0000000000..9dd69c246a
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_Flex_Only_Quality.inst.CFG
@@ -0,0 +1,30 @@
+[general]
+version = 4
+name = Flex Only
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = coarse
+weight = -3
+global_quality = True
+
+[values]
+layer_height = 0.2
+layer_height_0 = 0.25
+adhesion_extruder_nr = 1
+adhesion_type = skirt
+skirt_line_count = 2
+skirt_gap = 2
+fill_outline_gaps = True
+infill_sparse_density = 15
+retraction_amount = 2.5
+retraction_min_travel = 2
+retraction_speed = 30
+speed_print = 30
+speed_topbottom = 50
+speed_wall_0 = 40
+top_layers = 4
+wall_line_count = 2
+cool_min_layer_time = 11
\ No newline at end of file
diff --git a/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_Flex_Quality.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_Flex_Quality.inst.cfg
new file mode 100644
index 0000000000..f2e8e574b6
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_Flex_Quality.inst.cfg
@@ -0,0 +1,22 @@
+[general]
+version = 4
+name = Flex and PLA
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = draft
+weight = -2
+global_quality = True
+
+[values]
+adhesion_extruder_nr = 0
+adhesion_type = skirt
+layer_height = 0.2
+layer_height_0 = 0.25
+prime_tower_circular = True
+prime_tower_enable = True
+prime_tower_position_x = 180
+prime_tower_position_y = 180
+prime_tower_size = 29
diff --git a/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_High_Quality.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_High_Quality.inst.cfg
new file mode 100644
index 0000000000..1abaff2a06
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_High_Quality.inst.cfg
@@ -0,0 +1,22 @@
+[general]
+version = 4
+name = High
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = high
+weight = 1
+global_quality = True
+
+[values]
+adhesion_extruder_nr = 0
+adhesion_type = skirt
+layer_height = 0.1
+layer_height_0 = 0.1
+prime_tower_circular = True
+prime_tower_enable = True
+prime_tower_position_x = 180
+prime_tower_position_y = 180
+prime_tower_size = 29
diff --git a/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_Normal_Quality.inst.cfg b/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_Normal_Quality.inst.cfg
new file mode 100644
index 0000000000..143589f53c
--- /dev/null
+++ b/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_Normal_Quality.inst.cfg
@@ -0,0 +1,22 @@
+[general]
+version = 4
+name = Normal
+definition = tizyx_evy_dual
+
+[metadata]
+setting_version = 7
+type = quality
+quality_type = normal
+weight = 0
+global_quality = True
+
+[values]
+adhesion_extruder_nr = 0
+adhesion_type = skirt
+layer_height = 0.2
+layer_height_0 = 0.25
+prime_tower_circular = True
+prime_tower_enable = True
+prime_tower_position_x = 180
+prime_tower_position_y = 180
+prime_tower_size = 29
diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg
index 03e21b62cf..7269389352 100644
--- a/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg
@@ -23,4 +23,4 @@ speed_wall = =math.ceil(speed_print * 30 / 45)
top_bottom_thickness = 0.72
wall_thickness = 1.05
speed_topbottom = =math.ceil(speed_print * 15 / 45)
-speed_infill = =math.ceil(speed_print * 80 / 45)
+speed_infill = =math.ceil(speed_print * 45 / 45)
diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg
index ee65c14ac3..a545dd9217 100644
--- a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg
@@ -23,7 +23,7 @@ speed_travel = 150
speed_wall = =math.ceil(speed_print * 40 / 45)
top_bottom_thickness = 0.75
wall_thickness = 0.7
-speed_wall_0 = =math.ceil(speed_print * 40 / 45)
+speed_wall_0 = =math.ceil(speed_print * 30 / 45)
speed_topbottom = =math.ceil(speed_print * 30 / 45)
-speed_wall_x = =math.ceil(speed_print * 80 / 45)
-speed_infill = =math.ceil(speed_print * 100 / 45)
+speed_wall_x = =math.ceil(speed_print * 40 / 45)
+speed_infill = =math.ceil(speed_print * 45 / 45)
diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg
index 26f8b4ba24..50b066bfbd 100644
--- a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg
@@ -23,4 +23,4 @@ speed_wall = =math.ceil(speed_print * 30 / 45)
top_bottom_thickness = 0.72
wall_thickness = 1.05
speed_topbottom = =math.ceil(speed_print * 15 / 45)
-speed_infill = =math.ceil(speed_print * 80 / 45)
+speed_infill = =math.ceil(speed_print * 45 / 45)
diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg
index 6147f5d138..85c0199afd 100644
--- a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg
@@ -35,7 +35,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 25)
speed_wall_x = =speed_print
support_angle = 45
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_pattern = lines
support_z_distance = 0.26
top_bottom_thickness = 1.5
diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg
index fa54b0f89e..44bba4b31a 100644
--- a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg
@@ -35,7 +35,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 35)
speed_wall_x = =math.ceil(speed_print * 30 / 35)
support_angle = 45
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_pattern = lines
support_z_distance = 0.26
top_bottom_thickness = 1.5
diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg
index f795f07013..a8d23e44e2 100644
--- a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg
@@ -37,7 +37,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 25)
speed_wall_x = =speed_print
support_angle = 45
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_line_distance = 2.85
support_pattern = lines
support_xy_distance = 0.6
diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg
index faf1b2d18d..d357268ddb 100644
--- a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg
@@ -37,7 +37,7 @@ speed_wall_0 = =math.ceil(speed_print * 30 / 35)
speed_wall_x = =speed_print
support_angle = 45
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_line_distance = 2.85
support_pattern = lines
support_xy_distance = 0.6
diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg
index 5edd73eeba..e2bd504105 100644
--- a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg
@@ -34,7 +34,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 25)
speed_wall_x = =speed_print
support_angle = 45
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_pattern = lines
support_z_distance = 0.26
top_bottom_thickness = 1.2
diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg
index 7772ba72d6..67afe33eae 100644
--- a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg
@@ -34,7 +34,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 30)
speed_wall_x = =speed_print
support_angle = 45
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_pattern = lines
support_z_distance = 0.26
top_bottom_thickness = 1.2
diff --git a/resources/quality/ultimaker2_plus/um2p_global_Slightly_Coarse_Quality.inst.cfg b/resources/quality/ultimaker2_plus/um2p_global_Slightly_Coarse_Quality.inst.cfg
index 35dbbeedd7..02de795579 100644
--- a/resources/quality/ultimaker2_plus/um2p_global_Slightly_Coarse_Quality.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_global_Slightly_Coarse_Quality.inst.cfg
@@ -4,7 +4,7 @@ name = Coarse Quality
definition = ultimaker2_plus
[metadata]
-setting_version = 6
+setting_version = 7
type = quality
quality_type = slightlycoarse
weight = -4
diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg
index 0389a8fec3..fc90b2b6e9 100644
--- a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg
@@ -35,10 +35,10 @@ speed_travel = 150
speed_wall_0 = =math.ceil(speed_print * 20 / 40)
speed_wall_x = =speed_print
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_pattern = lines
support_xy_distance = 0.6
support_z_distance = =layer_height * 2
top_bottom_thickness = 1.2
wall_thickness = 1
-speed_infill = =math.ceil(speed_print * 80 / 40)
+speed_infill = =math.ceil(speed_print * 40 / 40)
diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg
index f227afc3e9..42b5bfc3c9 100644
--- a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg
@@ -35,7 +35,7 @@ speed_travel = 150
speed_wall_0 = =math.ceil(speed_print * 20 / 40)
speed_wall_x = =speed_print
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_pattern = lines
support_xy_distance = 0.6
support_z_distance = =layer_height * 2
diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg
index c903c03394..347e613811 100644
--- a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg
@@ -34,12 +34,12 @@ speed_travel = 150
speed_wall = =math.ceil(speed_print * 40 / 45)
support_angle = 45
support_enable = True
-support_infill_rate = 25
+support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25
support_pattern = lines
support_xy_distance = 0.6
support_z_distance = =layer_height * 2
top_bottom_thickness = 0.75
wall_thickness = 1.06
-speed_wall_0 = =math.ceil(speed_print * 40 / 45)
-speed_wall_x = =math.ceil(speed_print * 80 / 45)
-speed_infill = =math.ceil(speed_print * 100 / 45)
+speed_wall_0 = =math.ceil(speed_print * 30 / 45)
+speed_wall_x = =math.ceil(speed_print * 40 / 45)
+speed_infill = =math.ceil(speed_print * 45 / 45)
diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg
index fd4f6c0513..44d25a9301 100644
--- a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg
@@ -33,7 +33,7 @@ speed_travel = 150
speed_wall = =math.ceil(speed_print * 40 / 45)
support_angle = 45
support_enable = True
-support_infill_rate = 25
+support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25
support_pattern = lines
support_xy_distance = 0.6
support_z_distance = =layer_height * 2
diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg
index 3aaa8f9485..926bc4ab74 100644
--- a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg
@@ -38,11 +38,11 @@ speed_wall_x = =math.ceil(speed_print * 40 / 55)
support_angle = 45
support_bottom_distance = 0.55
support_enable = True
-support_infill_rate = 25
+support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25
support_pattern = lines
support_top_distance = 0.55
support_xy_distance = 0.7
support_z_distance = =layer_height * 2
top_bottom_thickness = 1.2
wall_thickness = 1.2
-speed_infill = =math.ceil(speed_print * 100 / 55)
+speed_infill = =math.ceil(speed_print * 55 / 55)
diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg
index d863dda7d9..6682e1c592 100644
--- a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg
@@ -37,7 +37,7 @@ speed_wall_0 = =math.ceil(speed_print * 15 / 55)
speed_wall_x = =math.ceil(speed_print * 40 / 55)
support_angle = 45
support_enable = True
-support_infill_rate = 25
+support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25
support_pattern = lines
support_xy_distance = 0.7
support_z_distance = =layer_height * 2
diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg
index 4b039087e8..9ebbd2bc90 100644
--- a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg
@@ -37,7 +37,7 @@ speed_wall_x = =math.ceil(speed_print * 40 / 55)
support_angle = 45
support_bottom_distance = 0.65
support_enable = True
-support_infill_rate = 25
+support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25
support_pattern = lines
support_top_distance = 0.5
support_xy_distance = 0.75
diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg
index 0cd87ce0e2..d84afd92cb 100644
--- a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg
@@ -37,7 +37,7 @@ speed_wall_x = =math.ceil(speed_print * 40 / 55)
support_angle = 45
support_bottom_distance = 0.65
support_enable = True
-support_infill_rate = 25
+support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25
support_pattern = lines
support_top_distance = 0.5
support_xy_distance = 0.75
diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg
index b95d11ea6f..ebbf156286 100644
--- a/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg
@@ -31,7 +31,7 @@ raft_surface_line_width = 0.2
speed_layer_0 = =round(speed_print * 30 / 30)
speed_print = 30
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_pattern = lines
support_z_distance = 0.19
wall_thickness = 0.88
diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg
index 90c0987ddf..025f653e3f 100644
--- a/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg
@@ -31,7 +31,7 @@ raft_surface_line_width = 0.2
speed_layer_0 = =round(speed_print * 30 / 30)
speed_print = 30
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_pattern = lines
support_z_distance = 0.19
wall_thickness = 0.88
diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg
index d530103a1c..71cef62f9d 100644
--- a/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg
@@ -32,9 +32,9 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 45)
speed_wall_x = =math.ceil(speed_print * 30 / 45)
support_angle = 45
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_pattern = lines
support_z_distance = 0.19
wall_thickness = 1.2
speed_topbottom = =math.ceil(speed_print * 30 / 45)
-speed_infill = =math.ceil(speed_print * 100 / 45)
+speed_infill = =math.ceil(speed_print * 45 / 45)
diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg
index 43b6363236..de171408c4 100644
--- a/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg
@@ -32,7 +32,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 45)
speed_wall_x = =math.ceil(speed_print * 30 / 45)
support_angle = 45
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_pattern = lines
support_z_distance = 0.19
wall_thickness = 1.2
diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg
index 577180dfcb..5c0b67f0e7 100644
--- a/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg
@@ -36,10 +36,10 @@ speed_wall_0 = =math.ceil(speed_print * 30 / 45)
speed_wall_x = =math.ceil(speed_print * 40 / 45)
support_angle = 45
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_line_distance = 3.5333
support_pattern = lines
support_z_distance = 0.21
top_bottom_thickness = 0.75
wall_thickness = 1.06
-speed_infill = =math.ceil(speed_print * 100 / 45)
+speed_infill = =math.ceil(speed_print * 45 / 45)
diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg
index dce492e90b..54b1488bc6 100644
--- a/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg
@@ -36,7 +36,7 @@ speed_wall_0 = =math.ceil(speed_print * 30 / 45)
speed_wall_x = =math.ceil(speed_print * 40 / 45)
support_angle = 45
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_line_distance = 3.5333
support_pattern = lines
support_z_distance = 0.21
diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg
index dcd83b8679..04a21a1571 100644
--- a/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg
@@ -31,7 +31,7 @@ speed_layer_0 = =round(speed_print * 30 / 40)
speed_print = 40
support_angle = 45
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_pattern = lines
support_z_distance = 0.26
top_bottom_thickness = 2.0
diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg
index 43f35b62f0..78c71ef4ff 100644
--- a/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg
@@ -31,7 +31,7 @@ speed_layer_0 = =round(speed_print * 30 / 40)
speed_print = 40
support_angle = 45
support_enable = True
-support_infill_rate = 20
+support_infill_rate = =20 if support_enable else 0 if support_tree_enable else 20
support_pattern = lines
support_z_distance = 0.26
top_bottom_thickness = 1.2
diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg
index 4f80772074..595ee79135 100644
--- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg
@@ -68,5 +68,5 @@ travel_avoid_distance = 3
wall_0_inset = 0
wall_line_width_x = =round(line_width * 0.38 / 0.38, 2)
wall_thickness = 0.76
-speed_wall_x = =math.ceil(speed_print * 80 / 25)
-speed_infill = =math.ceil(speed_print * 100 / 25)
+speed_wall_x = =math.ceil(speed_print * 25 / 25)
+speed_infill = =math.ceil(speed_print * 25 / 25)
diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg
index 9d8d10cd11..614bfbafcd 100644
--- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg
@@ -69,5 +69,5 @@ travel_avoid_distance = 3
wall_0_inset = 0
wall_line_width_x = =round(line_width * 0.57 / 0.57, 2)
wall_thickness = 1.14
-speed_wall_x = =math.ceil(speed_print * 80 / 25)
-speed_infill = =math.ceil(speed_print * 100 / 25)
+speed_wall_x = =math.ceil(speed_print * 25 / 25)
+speed_infill = =math.ceil(speed_print * 25 / 25)
diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg
index 86da345cb9..1ac5dedc81 100644
--- a/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg
@@ -35,9 +35,9 @@ speed_wall_0 = =math.ceil(speed_print * 15 / 40)
speed_wall_x = =math.ceil(speed_print * 38 / 40)
support_angle = 45
support_enable = True
-support_infill_rate = 25
+support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25
support_xy_distance = 0.6
support_z_distance = =layer_height * 2
top_bottom_thickness = 1.2
wall_thickness = 0.88
-speed_infill = =math.ceil(speed_print * 80 / 40)
+speed_infill = =math.ceil(speed_print * 40 / 40)
diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg
index a9c9765bcd..07b90ad10a 100644
--- a/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg
@@ -33,7 +33,7 @@ speed_wall_0 = =math.ceil(speed_print * 20 / 40)
speed_wall_x = =math.ceil(speed_print * 35 / 40)
support_angle = 45
support_enable = True
-support_infill_rate = 25
+support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25
support_xy_distance = 0.65
support_z_distance = =layer_height * 2
top_bottom_thickness = 1.2
diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg
index 9a13f180ce..736c42d294 100644
--- a/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg
+++ b/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg
@@ -37,9 +37,9 @@ speed_wall_0 = =math.ceil(speed_print * 15 / 45)
speed_wall_x = =math.ceil(speed_print * 40 / 45)
support_angle = 45
support_enable = True
-support_infill_rate = 25
+support_infill_rate = =25 if support_enable else 0 if support_tree_enable else 25
support_xy_distance = 0.7
support_z_distance = =layer_height * 2
top_bottom_thickness = 1.2
wall_thickness = 1.14
-speed_infill = =math.ceil(speed_print * 100 / 45)
+speed_infill = =math.ceil(speed_print * 45 / 45)
diff --git a/resources/quality/ultimaker3/um3_aa0.4_BAM_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_BAM_Draft_Print.inst.cfg
index d102abe5ee..37c4f1effe 100644
--- a/resources/quality/ultimaker3/um3_aa0.4_BAM_Draft_Print.inst.cfg
+++ b/resources/quality/ultimaker3/um3_aa0.4_BAM_Draft_Print.inst.cfg
@@ -37,4 +37,4 @@ support_angle = 45
support_join_distance = 5
support_offset = 2
support_pattern = triangles
-support_infill_rate = 10
+support_infill_rate = =10 if support_enable else 0 if support_tree_enable else 10
diff --git a/resources/quality/ultimaker3/um3_aa0.4_BAM_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_BAM_Fast_Print.inst.cfg
index 57ec919e46..be88b3bcec 100644
--- a/resources/quality/ultimaker3/um3_aa0.4_BAM_Fast_Print.inst.cfg
+++ b/resources/quality/ultimaker3/um3_aa0.4_BAM_Fast_Print.inst.cfg
@@ -36,4 +36,4 @@ support_angle = 45
support_join_distance = 5
support_offset = 2
support_pattern = triangles
-support_infill_rate = 10
+support_infill_rate = =10 if support_enable else 0 if support_tree_enable else 10
diff --git a/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg
index c5782aa9bc..46885141b7 100644
--- a/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg
+++ b/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg
@@ -32,6 +32,6 @@ support_angle = 45
support_join_distance = 5
support_offset = 2
support_pattern = triangles
-support_infill_rate = 10
+support_infill_rate = =10 if support_enable else 0 if support_tree_enable else 10
top_bottom_thickness = 1
wall_thickness = 1
diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_BAM_Draft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_BAM_Draft_Print.inst.cfg
index b49dbd674d..73ac26f806 100644
--- a/resources/quality/ultimaker_s5/um_s5_aa0.4_BAM_Draft_Print.inst.cfg
+++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_BAM_Draft_Print.inst.cfg
@@ -37,4 +37,4 @@ support_angle = 45
support_join_distance = 5
support_offset = 2
support_pattern = triangles
-support_infill_rate = 10
+support_infill_rate = =10 if support_enable else 0 if support_tree_enable else 10
diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_BAM_Fast_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_BAM_Fast_Print.inst.cfg
index 6d4f7206f3..030f4f7652 100644
--- a/resources/quality/ultimaker_s5/um_s5_aa0.4_BAM_Fast_Print.inst.cfg
+++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_BAM_Fast_Print.inst.cfg
@@ -36,4 +36,4 @@ support_angle = 45
support_join_distance = 5
support_offset = 2
support_pattern = triangles
-support_infill_rate = 10
+support_infill_rate = =10 if support_enable else 0 if support_tree_enable else 10
diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_BAM_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_BAM_Normal_Quality.inst.cfg
index e590a56028..c0f3dd0ac9 100644
--- a/resources/quality/ultimaker_s5/um_s5_aa0.4_BAM_Normal_Quality.inst.cfg
+++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_BAM_Normal_Quality.inst.cfg
@@ -33,6 +33,6 @@ support_angle = 45
support_join_distance = 5
support_offset = 2
support_pattern = triangles
-support_infill_rate = 10
+support_infill_rate = =10 if support_enable else 0 if support_tree_enable else 10
top_bottom_thickness = 1
wall_thickness = 1
diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg
index d83a7775c5..c8d13a1836 100644
--- a/resources/setting_visibility/expert.cfg
+++ b/resources/setting_visibility/expert.cfg
@@ -199,6 +199,7 @@ retraction_hop_enabled
retraction_hop_only_when_collides
retraction_hop
retraction_hop_after_extruder_switch
+retraction_hop_after_extruder_switch_height
[cooling]
cool_fan_enabled
@@ -347,6 +348,7 @@ infill_enable_travel_optimization
material_flow_dependent_temperature
material_flow_temp_graph
meshfix_maximum_resolution
+meshfix_maximum_deviation
support_skip_some_zags
support_skip_zag_per_mm
support_zag_skip_count
@@ -382,3 +384,18 @@ adaptive_layer_height_enabled
adaptive_layer_height_variation
adaptive_layer_height_variation_step
adaptive_layer_height_threshold
+clean_between_layers
+max_extrusion_before_wipe
+wipe_retraction_enable
+wipe_retraction_amount
+wipe_retraction_extra_prime_amount
+wipe_retraction_speed
+wipe_retraction_retract_speed
+wipe_retraction_prime_speed
+wipe_pause
+wipe_hop_enable
+wipe_hop_amount
+wipe_hop_speed
+wipe_brush_pos_x
+wipe_repeat_count
+wipe_move_distance
diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/resources/texts/change_log.txt
old mode 100755
new mode 100644
similarity index 91%
rename from plugins/ChangeLogPlugin/ChangeLog.txt
rename to resources/texts/change_log.txt
index 651abb0cac..f50913cbb4
--- a/plugins/ChangeLogPlugin/ChangeLog.txt
+++ b/resources/texts/change_log.txt
@@ -1,3 +1,88 @@
+[4.0.0]
+*Updated user interface
+Ultimaker Cura is a very powerful tool with many features to support users’ needs. In the new UI, we present these features in a better, more intuitive way based on the workflow of our users. The Marketplace and user account control have been integrated into the main interface to easily access material profiles and plugins. Three stages are shown in the header to give a clear guidance of the flow. The stage menu is populated with collapsible panels that allow users to focus on the 3D view when needed, while still showing important information at the same time, such as slicing configuration and settings. Users can now easily go to the preview stage to examine the layer view after slicing the model, which previously was less obvious or hidden. The new UI also creates more distinction between recommended and custom mode. Novice users or users who are not interested in all the settings can easily prepare a file, relying on the strength of expert-configured print profiles. Experienced users who want greater control can configure over 300 settings to their needs.
+
+*Redesigned "Add Printer" dialog
+Updated one of the first dialogs a new user is presented with. The layout is loosely modeled on the layout of the Ultimaker 3/Ultimaker S5 "Connect to Network" dialog, and adds some instructions and intention to the dialog. Contributed by fieldOfView.
+
+*Updated custom mode panel
+Based on feedback from 4.0 beta, the custom mode panel is now resizable to make more settings visible. The set position will persist between sessions.
+
+*Monitor tab
+Updated the monitor tab interface for better alignment with Cura Connect interface.
+
+*Remote printing
+Use your Ultimaker S5 printer with an Ultimaker account to send and monitor print jobs from outside your local network. Requires firmware 5.2 (coming soon).
+
+*User ratings for plugins
+With an Ultimaker account, users can now give feedback on their experience by rating their favourite plugins.
+
+*Integrated backups
+‘Cura backups’ has been integrated into Ultimaker Cura and can be found in the ‘extensions’ menu. With this feature, users can use their Ultimaker account to backup their Ultimaker Cura configurations to the cloud for easy, convenient retrieval.
+
+*Plugin versioning
+Newer plug-ins can't load in older versions if they use newer features, while old plug-ins may still load in newer versions.
+
+*LAN and cloud printer icons
+Users can now quickly see if their printer is network or cloud enabled with new icons.
+
+*Improved UI speed
+This version switches faster between extruders and printers. Your mileage may vary depending on your system specifications.
+
+*Floats precision
+No settings in Ultimaker Cura require more than three digits of precision, so floats in setting input fields have been limited to three digits only. Contributed by fieldOfView.
+
+*Minimum support area
+This feature allows set minimum area size for support and support interface polygons. Polygons which area are smaller than set value will not be generated. Contributed by vgribinchuk/Desktop Metal.
+
+*Lazy Tree Support calculation
+In previous versions, 95% of Tree Support’s computation time was used to calculate the collision volumes to make sure that the branches avoid collisions with the meshes. Now it calculates these volumes only when necessary, reducing the computation time. Contributed by bjude.
+
+*CPE and CPE+ comb retractions
+Changed all CPE and CPE+ profiles to travel up to 50 mm without retraction, decreasing blobs caused by combing long distances.
+
+*Marketplace improvements
+Added optimizations to show a support site instead of an email address, increased the number of lines that are shown for the description, and show a 'website' link so people can order material directly.
+
+*Arduino drivers silent install
+Previous versions stopped silent installation because the Arduino drivers packaged with Cura are not signed. Arduino drivers are now skipped when performing a silent install.
+
+*New third-party definitions
+- Wanhao. Updated printer profiles to use new travel_speed macro (Contributed by forkineye).
+- JGAurora A1, A5 and Z-603S (Contributed by pinchies).
+- Alfawise U20 (Contributed by pinchies).
+- Cocoon Create ModelMaker (Contributed by pinchies).
+- Ender-3. Updates to the printer definition (Contributed by stelgenhof).
+
+*Bug fixes
+- Fixed an issue which prevented slicing when per extruder settings were changed with a disabled extruder.
+- Improved handling of non-Ultimaker network connected printers within Ultimaker Cura. Contributed by fieldOfView
+- Fixed an issue where printing with the second extruder only would retract material unnecessarily.
+- Fixed an issue where outdated plugins remained partially activated.
+- Fixed an issue where combing was not working when tweaking Retraction minimum travel.
+- Fixed an oversized print head collision zone when using print one-at-a-time mode.
+- Due to inaccuracy of floats in very large prints, the position is reset again several times using "G92 E0" commands.
+- Improved update checker text for better readability.
+- Updated the implementation of 3MF in Ultimaker Cura for better consistency with 3MF consortium specifications.
+- Removed all final and initial print temperature offsets, and increased first layer print temperature to fix under-extrusion problems.
+- Holding shift and rotating a model on its axis for fine-grained rotations would sometimes pan the camera. This has now been fixed.
+- Added file type associations for .gcode and .g extensions.
+- Marked some more profiles as experimental.
+- Fixed an issue where duplicated PLA with a different label would replace the original PLA entry.
+- Updated which profile new materials are based when you create a brand new material. Contributed by fieldOfView.
+- Fixed adhesion type errors on startup.
+- Fixed an issue where system tray icons would remain when Ultimaker Cura is closed until mouse-over.
+- Added extra tooltip to give extra information about start/end g-codes.
+- Fixed an issue where clicking 'Create Account' would go to login instead of sign-up.
+- Fixed an issue where the legacy profile importer would generate corrupt profiles.
+- Fixed an issue where Ultimaker Cura could crash on start-up during the upgrading of your configuration to the newest version for some people.
+- Fixed an issue where Ultimaker Cura would crash after downloading plugin from Marketplace.
+- Ignores plugins folder when checking files for version upgrade. Start-up is now much faster if you've installed a lot of plugins or have used many versions of Ultimaker Cura.
+- Fixed an issue where the firmware checker shows up when there is no internet connection.
+- Fixed an issue where settings could not be made visible again after hiding all settings.
+- Fixed false configuration error for CC Red 0.6 core after a version upgrade.
+- Fixed an issue where a warning is issued when selecting a printer with no material loaded. The extruder will now be disabled instead.
+
[3.6.0]
*Gyroid infill
New infill pattern with enhanced strength properties. Gyroid infill is one of the strongest infill types for a given weight, has isotropic properties, and prints relatively fast with reduced material use and a fully connected part interior. Note: Slicing time can increase up to 40 seconds or more, depending on the model. Contributed by smartavionics.
diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json
index aed45e8a71..84f06bee0e 100644
--- a/resources/themes/cura-dark/theme.json
+++ b/resources/themes/cura-dark/theme.json
@@ -94,8 +94,8 @@
"action_button_active": [39, 44, 48, 30],
"action_button_active_text": [255, 255, 255, 255],
"action_button_active_border": [255, 255, 255, 100],
- "action_button_disabled": [39, 44, 48, 255],
- "action_button_disabled_text": [255, 255, 255, 80],
+ "action_button_disabled": [19, 24, 28, 255],
+ "action_button_disabled_text": [200, 200, 200, 80],
"action_button_disabled_border": [255, 255, 255, 30],
"scrollbar_background": [39, 44, 48, 0],
@@ -214,7 +214,6 @@
"toolbox_header_button_text_active": [255, 255, 255, 255],
"toolbox_header_button_text_inactive": [128, 128, 128, 255],
- "toolbox_header_button_text_hovered": [255, 255, 255, 255],
"monitor_printer_family_tag": [86, 86, 106, 255],
"monitor_text_primary": [229, 229, 229, 255],
diff --git a/resources/themes/cura-light/images/first_run_machine_types.svg b/resources/themes/cura-light/images/first_run_machine_types.svg
new file mode 100644
index 0000000000..630fc426b6
--- /dev/null
+++ b/resources/themes/cura-light/images/first_run_machine_types.svg
@@ -0,0 +1,33 @@
+
+
\ No newline at end of file
diff --git a/resources/themes/cura-light/images/first_run_material_usage.svg b/resources/themes/cura-light/images/first_run_material_usage.svg
new file mode 100644
index 0000000000..19be250c88
--- /dev/null
+++ b/resources/themes/cura-light/images/first_run_material_usage.svg
@@ -0,0 +1,67 @@
+
+
\ No newline at end of file
diff --git a/resources/themes/cura-light/images/first_run_number_slices.svg b/resources/themes/cura-light/images/first_run_number_slices.svg
new file mode 100644
index 0000000000..e8a7124ebc
--- /dev/null
+++ b/resources/themes/cura-light/images/first_run_number_slices.svg
@@ -0,0 +1,31 @@
+
+
\ No newline at end of file
diff --git a/resources/themes/cura-light/images/first_run_print_settings.svg b/resources/themes/cura-light/images/first_run_print_settings.svg
new file mode 100644
index 0000000000..21ed4030e2
--- /dev/null
+++ b/resources/themes/cura-light/images/first_run_print_settings.svg
@@ -0,0 +1,29 @@
+
+
\ No newline at end of file
diff --git a/resources/themes/cura-light/images/first_run_ultimaker_cloud.svg b/resources/themes/cura-light/images/first_run_ultimaker_cloud.svg
new file mode 100644
index 0000000000..1e9b313862
--- /dev/null
+++ b/resources/themes/cura-light/images/first_run_ultimaker_cloud.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/resources/themes/cura-light/images/first_run_welcome_cura.svg b/resources/themes/cura-light/images/first_run_welcome_cura.svg
new file mode 100644
index 0000000000..fddb073c82
--- /dev/null
+++ b/resources/themes/cura-light/images/first_run_welcome_cura.svg
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/resources/themes/cura-light/styles.qml b/resources/themes/cura-light/styles.qml
index 121f604362..2cf3b0ed58 100755
--- a/resources/themes/cura-light/styles.qml
+++ b/resources/themes/cura-light/styles.qml
@@ -103,33 +103,29 @@ QtObject
// This property will be back-propagated when the width of the label is calculated
property var buttonWidth: 0
- background: Item
+ background: Rectangle
{
+ id: backgroundRectangle
implicitHeight: control.height
implicitWidth: buttonWidth
- Rectangle
- {
- id: buttonFace
- implicitHeight: parent.height
- implicitWidth: parent.width
- radius: UM.Theme.getSize("action_button_radius").width
+ radius: UM.Theme.getSize("action_button_radius").width
- color:
+ color:
+ {
+ if (control.checked)
{
- if (control.checked)
+ return UM.Theme.getColor("main_window_header_button_background_active")
+ }
+ else
+ {
+ if (control.hovered)
{
- return UM.Theme.getColor("main_window_header_button_background_active")
- }
- else
- {
- if (control.hovered)
- {
- return UM.Theme.getColor("main_window_header_button_background_hovered")
- }
- return UM.Theme.getColor("main_window_header_button_background_inactive")
+ return UM.Theme.getColor("main_window_header_button_background_hovered")
}
+ return UM.Theme.getColor("main_window_header_button_background_inactive")
}
}
+
}
label: Item
@@ -168,6 +164,8 @@ QtObject
buttonWidth = width
}
}
+
+
}
}
@@ -398,73 +396,6 @@ QtObject
}
}
- // Combobox with items with colored rectangles
- property Component combobox_color: Component
- {
-
- ComboBoxStyle
- {
-
- background: Rectangle
- {
- color: !enabled ? UM.Theme.getColor("setting_control_disabled") : control._hovered ? UM.Theme.getColor("setting_control_highlight") : UM.Theme.getColor("setting_control")
- border.width: UM.Theme.getSize("default_lining").width
- border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : control._hovered ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border")
- radius: UM.Theme.getSize("setting_control_radius").width
- }
-
- label: Item
- {
- Label
- {
- anchors.left: parent.left
- anchors.leftMargin: UM.Theme.getSize("default_lining").width
- anchors.right: swatch.left
- anchors.rightMargin: UM.Theme.getSize("default_lining").width
- anchors.verticalCenter: parent.verticalCenter
-
- text: control.currentText
- font: UM.Theme.getFont("default")
- color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text")
-
- elide: Text.ElideRight
- verticalAlignment: Text.AlignVCenter
- }
-
- UM.RecolorImage
- {
- id: swatch
- height: Math.round(control.height / 2)
- width: height
- anchors.right: downArrow.left
- anchors.verticalCenter: parent.verticalCenter
- anchors.rightMargin: UM.Theme.getSize("default_margin").width
-
- sourceSize.width: width
- sourceSize.height: height
- source: UM.Theme.getIcon("extruder_button")
- color: (control.color_override !== "") ? control.color_override : control.color
- }
-
- UM.RecolorImage
- {
- id: downArrow
- anchors.right: parent.right
- anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2
- anchors.verticalCenter: parent.verticalCenter
-
- source: UM.Theme.getIcon("arrow_bottom")
- width: UM.Theme.getSize("standard_arrow").width
- height: UM.Theme.getSize("standard_arrow").height
- sourceSize.width: width + 5 * screenScaleFactor
- sourceSize.height: width + 5 * screenScaleFactor
-
- color: UM.Theme.getColor("setting_control_button")
- }
- }
- }
- }
-
property Component checkbox: Component
{
CheckBoxStyle
diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json
index 76a0a5e8e0..218055ba6e 100644
--- a/resources/themes/cura-light/theme.json
+++ b/resources/themes/cura-light/theme.json
@@ -29,6 +29,11 @@
"weight": 63,
"family": "Noto Sans"
},
+ "huge": {
+ "size": 1.8,
+ "weight": 50,
+ "family": "Noto Sans"
+ },
"medium": {
"size": 1.16,
"weight": 40,
@@ -187,10 +192,16 @@
"action_panel_secondary": [27, 95, 202, 255],
+ "first_run_shadow": [50, 50, 50, 255],
+
"toolbar_background": [255, 255, 255, 255],
+ "notification_icon": [255, 0, 0, 255],
+
"printer_type_label_background": [228, 228, 242, 255],
+ "window_disabled_background": [0, 0, 0, 255],
+
"text": [25, 25, 25, 255],
"text_detail": [174, 174, 174, 128],
"text_link": [50, 130, 255, 255],
@@ -382,9 +393,7 @@
"printer_config_matched": [50, 130, 255, 255],
"printer_config_mismatch": [127, 127, 127, 255],
- "toolbox_header_button_text_active": [0, 0, 0, 255],
"toolbox_header_button_text_inactive": [0, 0, 0, 255],
- "toolbox_header_button_text_hovered": [0, 0, 0, 255],
"favorites_header_bar": [245, 245, 245, 255],
"favorites_header_hover": [245, 245, 245, 255],
@@ -424,7 +433,7 @@
"monitor_skeleton_loading": [238, 238, 238, 255],
"monitor_placeholder_image": [230, 230, 230, 255],
"monitor_image_overlay": [0, 0, 0, 255],
- "monitor_shadow": [220, 220, 220, 255],
+ "monitor_shadow": [200, 200, 200, 255],
"monitor_carousel_dot": [216, 216, 216, 255],
"monitor_carousel_dot_current": [119, 119, 119, 255]
@@ -509,6 +518,8 @@
"action_button_icon": [1.0, 1.0],
"action_button_radius": [0.15, 0.15],
+ "radio_button": [1.3, 1.3],
+
"small_button": [2, 2],
"small_button_icon": [1.5, 1.5],
@@ -552,6 +563,7 @@
"save_button_specs_icons": [1.4, 1.4],
"job_specs_button": [2.7, 2.7],
+ "first_run_shadow_radius": [1.2, 1.2],
"monitor_preheat_temperature_control": [4.5, 2.0],
@@ -579,10 +591,8 @@
"toolbox_thumbnail_large": [12.0, 10.0],
"toolbox_footer": [1.0, 4.5],
"toolbox_footer_button": [8.0, 2.5],
- "toolbox_showcase_spacing": [1.0, 1.0],
- "toolbox_header_tab": [8.0, 4.0],
+ "toolbox_header_tab": [12.0, 4.0],
"toolbox_detail_header": [1.0, 14.0],
- "toolbox_detail_tile": [1.0, 8.0],
"toolbox_back_column": [6.0, 1.0],
"toolbox_back_button": [6.0, 2.0],
"toolbox_installed_tile": [1.0, 8.0],
@@ -590,11 +600,12 @@
"toolbox_heading_label": [1.0, 3.8],
"toolbox_header": [1.0, 4.0],
"toolbox_header_highlight": [0.25, 0.25],
- "toolbox_progress_bar": [8.0, 0.5],
"toolbox_chart_row": [1.0, 2.0],
"toolbox_action_button": [8.0, 2.5],
"toolbox_loader": [2.0, 2.0],
+ "notification_icon": [1.5, 1.5],
+
"avatar_image": [6.8, 6.8],
"monitor_config_override_box": [1.0, 14.0],
diff --git a/resources/variants/Mark2_for_Ultimaker2_0.25.inst.cfg b/resources/variants/Mark2_for_Ultimaker2_0.25.inst.cfg
new file mode 100644
index 0000000000..32d12214b2
--- /dev/null
+++ b/resources/variants/Mark2_for_Ultimaker2_0.25.inst.cfg
@@ -0,0 +1,19 @@
+[general]
+name = 0.25 mm
+version = 4
+definition = Mark2_for_Ultimaker2
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+coasting_min_volume = 0.17
+coasting_volume = 0.1
+machine_nozzle_size = 0.25
+machine_nozzle_tip_outer_diameter = 0.8
+raft_airgap = 0.25
+speed_topbottom = =round(speed_print / 1.5, 1)
+speed_wall = =round(speed_print / 1.2, 1)
+speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5)
diff --git a/resources/variants/Mark2_for_Ultimaker2_0.4.inst.cfg b/resources/variants/Mark2_for_Ultimaker2_0.4.inst.cfg
new file mode 100644
index 0000000000..5a04878a4e
--- /dev/null
+++ b/resources/variants/Mark2_for_Ultimaker2_0.4.inst.cfg
@@ -0,0 +1,17 @@
+[general]
+name = 0.4 mm
+version = 4
+definition = Mark2_for_Ultimaker2
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.4
+machine_nozzle_tip_outer_diameter = 1.05
+speed_wall = =round(speed_print / 1.25, 1)
+speed_wall_0 = =max(speed_wall - 10, 1)
+speed_topbottom = =round(speed_print / 2.25, 1)
+
diff --git a/resources/variants/Mark2_for_Ultimaker2_0.6.inst.cfg b/resources/variants/Mark2_for_Ultimaker2_0.6.inst.cfg
new file mode 100644
index 0000000000..b9e1745174
--- /dev/null
+++ b/resources/variants/Mark2_for_Ultimaker2_0.6.inst.cfg
@@ -0,0 +1,18 @@
+[general]
+name = 0.6 mm
+version = 4
+definition = Mark2_for_Ultimaker2
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.6
+machine_nozzle_tip_outer_diameter = 1.25
+coasting_volume = 1.36
+speed_wall = =round(speed_print * 4 / 3, 1)
+speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10)
+speed_topbottom = =round(speed_print / 2, 1)
+
diff --git a/resources/variants/Mark2_for_Ultimaker2_0.8.inst.cfg b/resources/variants/Mark2_for_Ultimaker2_0.8.inst.cfg
new file mode 100644
index 0000000000..4656c9f502
--- /dev/null
+++ b/resources/variants/Mark2_for_Ultimaker2_0.8.inst.cfg
@@ -0,0 +1,18 @@
+[general]
+name = 0.8 mm
+version = 4
+definition = Mark2_for_Ultimaker2
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.8
+machine_nozzle_tip_outer_diameter = 1.35
+coasting_volume = 3.22
+speed_wall = =round(speed_print * 4 / 3, 1)
+speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10)
+speed_topbottom = =round(speed_print / 2, 1)
+
diff --git a/resources/variants/deltacomb_025_e3d.inst.cfg b/resources/variants/deltacomb_025_e3d.inst.cfg
new file mode 100755
index 0000000000..fd6575bf9a
--- /dev/null
+++ b/resources/variants/deltacomb_025_e3d.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+name = E3D 0.25mm
+version = 4
+definition = deltacomb
+
+[metadata]
+author = Deltacomb 3D
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.25
diff --git a/resources/variants/deltacomb_040_e3d.inst.cfg b/resources/variants/deltacomb_040_e3d.inst.cfg
new file mode 100755
index 0000000000..3fab3e74c7
--- /dev/null
+++ b/resources/variants/deltacomb_040_e3d.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+name = E3D 0.40mm
+version = 4
+definition = deltacomb
+
+[metadata]
+author = Deltacomb 3D
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.4
diff --git a/resources/variants/deltacomb_080_e3d.inst.cfg b/resources/variants/deltacomb_080_e3d.inst.cfg
new file mode 100755
index 0000000000..61f8226280
--- /dev/null
+++ b/resources/variants/deltacomb_080_e3d.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+name = E3D 0.80mm
+version = 4
+definition = deltacomb
+
+[metadata]
+author = Deltacomb 3D
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.8
diff --git a/resources/variants/hms434_0.25tpnozzle.inst.cfg b/resources/variants/hms434_0.25tpnozzle.inst.cfg
new file mode 100644
index 0000000000..72e4afe87a
--- /dev/null
+++ b/resources/variants/hms434_0.25tpnozzle.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+name = 0.25mm TP extruder
+version = 4
+definition = hms434
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.25
+machine_nozzle_tip_outer_diameter = 1.05
diff --git a/resources/variants/hms434_0.4tpnozzle.inst.cfg b/resources/variants/hms434_0.4tpnozzle.inst.cfg
new file mode 100644
index 0000000000..64bf1d6e63
--- /dev/null
+++ b/resources/variants/hms434_0.4tpnozzle.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+name = 0.4mm TP extruder
+version = 4
+definition = hms434
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.4
+machine_nozzle_tip_outer_diameter = 1.05
diff --git a/resources/variants/hms434_0.6tpnozzle.inst.cfg b/resources/variants/hms434_0.6tpnozzle.inst.cfg
new file mode 100644
index 0000000000..e7bcdd5fd4
--- /dev/null
+++ b/resources/variants/hms434_0.6tpnozzle.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+name = 0.6mm TP extruder
+version = 4
+definition = hms434
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.6
+machine_nozzle_tip_outer_diameter = 1.05
diff --git a/resources/variants/hms434_0.8tpnozzle.inst.cfg b/resources/variants/hms434_0.8tpnozzle.inst.cfg
new file mode 100644
index 0000000000..1a09188dc4
--- /dev/null
+++ b/resources/variants/hms434_0.8tpnozzle.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+name = 0.8mm TP extruder
+version = 4
+definition = hms434
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.8
+machine_nozzle_tip_outer_diameter = 1.05
diff --git a/resources/variants/hms434_1.2tpnozzle.inst.cfg b/resources/variants/hms434_1.2tpnozzle.inst.cfg
new file mode 100644
index 0000000000..21ef8f2a17
--- /dev/null
+++ b/resources/variants/hms434_1.2tpnozzle.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+name = 1.2mm TP extruder
+version = 4
+definition = hms434
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 1.2
+machine_nozzle_tip_outer_diameter = 1.3
diff --git a/resources/variants/hms434_1.5tpnozzle.inst.cfg b/resources/variants/hms434_1.5tpnozzle.inst.cfg
new file mode 100644
index 0000000000..23aeffaee5
--- /dev/null
+++ b/resources/variants/hms434_1.5tpnozzle.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+name = 1.5mm TP extruder
+version = 4
+definition = hms434
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 1.5
+machine_nozzle_tip_outer_diameter = 1.6
diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.20.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.20.inst.cfg
new file mode 100644
index 0000000000..bd67b654cd
--- /dev/null
+++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.20.inst.cfg
@@ -0,0 +1,14 @@
+[general]
+name = 0.20mm (Clear)
+version = 4
+definition = structur3d_discov3ry1_complete_um2plus
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_id = 0.20mm (Clear)
+machine_nozzle_size = 0.20
+machine_nozzle_tip_outer_diameter = 0.30
diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.25.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.25.inst.cfg
new file mode 100644
index 0000000000..389984f293
--- /dev/null
+++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.25.inst.cfg
@@ -0,0 +1,14 @@
+[general]
+name = 0.25mm (Red)
+version = 4
+definition = structur3d_discov3ry1_complete_um2plus
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_id = 0.25mm (Red)
+machine_nozzle_size = 0.25
+machine_nozzle_tip_outer_diameter = 0.35
diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.41.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.41.inst.cfg
new file mode 100644
index 0000000000..f6936233e9
--- /dev/null
+++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.41.inst.cfg
@@ -0,0 +1,14 @@
+[general]
+name = 0.41mm (Blue)
+version = 4
+definition = structur3d_discov3ry1_complete_um2plus
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_id = 0.41mm (Blue)
+machine_nozzle_size = 0.41
+machine_nozzle_tip_outer_diameter = 0.51
diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.58.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.58.inst.cfg
new file mode 100644
index 0000000000..b30770afc4
--- /dev/null
+++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.58.inst.cfg
@@ -0,0 +1,14 @@
+[general]
+name = 0.58mm (Pink)
+version = 4
+definition = structur3d_discov3ry1_complete_um2plus
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_id = 0.58mm (Pink)
+machine_nozzle_size = 0.58
+machine_nozzle_tip_outer_diameter = 0.68
diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_0.84.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.84.inst.cfg
new file mode 100644
index 0000000000..b83bef727d
--- /dev/null
+++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_0.84.inst.cfg
@@ -0,0 +1,14 @@
+[general]
+name = 0.84mm (Green)
+version = 4
+definition = structur3d_discov3ry1_complete_um2plus
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_id = 0.84mm (Green)
+machine_nozzle_size = 0.84
+machine_nozzle_tip_outer_diameter = 0.94
diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_1.19.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_1.19.inst.cfg
new file mode 100644
index 0000000000..9a0f4922ef
--- /dev/null
+++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_1.19.inst.cfg
@@ -0,0 +1,14 @@
+[general]
+name = 1.19mm (Grey)
+version = 4
+definition = structur3d_discov3ry1_complete_um2plus
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_id = 1.19mm (Grey)
+machine_nozzle_size = 1.19
+machine_nozzle_tip_outer_diameter = 1.29
diff --git a/resources/variants/structur3d_discov3ry1_complete_um2plus_1.60.inst.cfg b/resources/variants/structur3d_discov3ry1_complete_um2plus_1.60.inst.cfg
new file mode 100644
index 0000000000..a235f406c0
--- /dev/null
+++ b/resources/variants/structur3d_discov3ry1_complete_um2plus_1.60.inst.cfg
@@ -0,0 +1,14 @@
+[general]
+name = 1.60mm (Olive)
+version = 4
+definition = structur3d_discov3ry1_complete_um2plus
+
+[metadata]
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_id = 1.60mm (Olive)
+machine_nozzle_size = 1.60
+machine_nozzle_tip_outer_diameter = 1.70
diff --git a/resources/variants/tizyx_evy_0.2.inst.cfg b/resources/variants/tizyx_evy_0.2.inst.cfg
index 802031778c..94a72926a5 100644
--- a/resources/variants/tizyx_evy_0.2.inst.cfg
+++ b/resources/variants/tizyx_evy_0.2.inst.cfg
@@ -5,10 +5,9 @@ definition = tizyx_evy
[metadata]
author = TiZYX
-setting_version = 5
+setting_version = 7
type = variant
hardware_type = nozzle
[values]
machine_nozzle_size = 0.2
-
diff --git a/resources/variants/tizyx_evy_0.3.inst.cfg b/resources/variants/tizyx_evy_0.3.inst.cfg
index 10c4fae6d4..4a1594b625 100644
--- a/resources/variants/tizyx_evy_0.3.inst.cfg
+++ b/resources/variants/tizyx_evy_0.3.inst.cfg
@@ -5,7 +5,7 @@ definition = tizyx_evy
[metadata]
author = TiZYX
-setting_version = 5
+setting_version = 7
type = variant
hardware_type = nozzle
diff --git a/resources/variants/tizyx_evy_0.4.inst.cfg b/resources/variants/tizyx_evy_0.4.inst.cfg
index e5e0e6eb8f..ab67d2492e 100644
--- a/resources/variants/tizyx_evy_0.4.inst.cfg
+++ b/resources/variants/tizyx_evy_0.4.inst.cfg
@@ -5,7 +5,7 @@ definition = tizyx_evy
[metadata]
author = TiZYX
-setting_version = 5
+setting_version = 7
type = variant
hardware_type = nozzle
diff --git a/resources/variants/tizyx_evy_0.5.inst.cfg b/resources/variants/tizyx_evy_0.5.inst.cfg
index e0ec423b5f..6b1cf6b0fb 100644
--- a/resources/variants/tizyx_evy_0.5.inst.cfg
+++ b/resources/variants/tizyx_evy_0.5.inst.cfg
@@ -5,7 +5,7 @@ definition = tizyx_evy
[metadata]
author = TiZYX
-setting_version = 5
+setting_version = 7
type = variant
hardware_type = nozzle
diff --git a/resources/variants/tizyx_evy_0.6.inst.cfg b/resources/variants/tizyx_evy_0.6.inst.cfg
index a72ae828f9..58368245cf 100644
--- a/resources/variants/tizyx_evy_0.6.inst.cfg
+++ b/resources/variants/tizyx_evy_0.6.inst.cfg
@@ -5,7 +5,7 @@ definition = tizyx_evy
[metadata]
author = TiZYX
-setting_version = 5
+setting_version = 7
type = variant
hardware_type = nozzle
diff --git a/resources/variants/tizyx_evy_0.8.inst.cfg b/resources/variants/tizyx_evy_0.8.inst.cfg
index 584c8b7c19..8f6d8ce633 100644
--- a/resources/variants/tizyx_evy_0.8.inst.cfg
+++ b/resources/variants/tizyx_evy_0.8.inst.cfg
@@ -5,7 +5,7 @@ definition = tizyx_evy
[metadata]
author = TiZYX
-setting_version = 5
+setting_version = 7
type = variant
hardware_type = nozzle
diff --git a/resources/variants/tizyx_evy_1.0.inst.cfg b/resources/variants/tizyx_evy_1.0.inst.cfg
index 8949667197..7e00752a90 100644
--- a/resources/variants/tizyx_evy_1.0.inst.cfg
+++ b/resources/variants/tizyx_evy_1.0.inst.cfg
@@ -5,7 +5,7 @@ definition = tizyx_evy
[metadata]
author = TiZYX
-setting_version = 5
+setting_version = 7
type = variant
hardware_type = nozzle
diff --git a/resources/variants/tizyx_evy_dual_classic.inst.cfg b/resources/variants/tizyx_evy_dual_classic.inst.cfg
new file mode 100644
index 0000000000..00b7a7745a
--- /dev/null
+++ b/resources/variants/tizyx_evy_dual_classic.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+name = Classic Extruder
+version = 4
+definition = tizyx_evy_dual
+
+[metadata]
+author = TiZYX
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.4
\ No newline at end of file
diff --git a/resources/variants/tizyx_evy_dual_direct_drive.inst.cfg b/resources/variants/tizyx_evy_dual_direct_drive.inst.cfg
new file mode 100644
index 0000000000..7bc450607e
--- /dev/null
+++ b/resources/variants/tizyx_evy_dual_direct_drive.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+name = Direct Drive
+version = 4
+definition = tizyx_evy_dual
+
+[metadata]
+author = TiZYX
+setting_version = 7
+type = variant
+hardware_type = nozzle
+
+[values]
+machine_nozzle_size = 0.4
\ No newline at end of file
diff --git a/tests/Machines/Models/TestDiscoveredPrintersModel.py b/tests/Machines/Models/TestDiscoveredPrintersModel.py
new file mode 100644
index 0000000000..8d9a770c2a
--- /dev/null
+++ b/tests/Machines/Models/TestDiscoveredPrintersModel.py
@@ -0,0 +1,28 @@
+from unittest.mock import MagicMock, PropertyMock
+
+import pytest
+
+from cura.Machines.Models.DiscoveredPrintersModel import DiscoveredPrintersModel
+
+
+@pytest.fixture()
+def discovered_printer_model(application) -> DiscoveredPrintersModel:
+ return DiscoveredPrintersModel(application)
+
+
+def test_discoveredPrinters(discovered_printer_model):
+ mocked_device = MagicMock()
+ cluster_size = PropertyMock(return_value = 1)
+ type(mocked_device).clusterSize = cluster_size
+
+ mocked_callback = MagicMock()
+ discovered_printer_model.addDiscoveredPrinter("ip", "key", "name", mocked_callback, "machine_type", mocked_device)
+ device = discovered_printer_model.discoveredPrinters[0]
+ discovered_printer_model.createMachineFromDiscoveredPrinter(device)
+ mocked_callback.assert_called_with("key")
+
+ assert len(discovered_printer_model.discoveredPrinters) == 1
+
+ # Test if removing it works
+ discovered_printer_model.removeDiscoveredPrinter("ip")
+ assert len(discovered_printer_model.discoveredPrinters) == 0
diff --git a/tests/PrinterOutput/TestPrintJobOutputModel.py b/tests/PrinterOutput/Models/TestPrintJobOutputModel.py
similarity index 87%
rename from tests/PrinterOutput/TestPrintJobOutputModel.py
rename to tests/PrinterOutput/Models/TestPrintJobOutputModel.py
index 658cff7a7e..b70883dd82 100644
--- a/tests/PrinterOutput/TestPrintJobOutputModel.py
+++ b/tests/PrinterOutput/Models/TestPrintJobOutputModel.py
@@ -2,16 +2,16 @@ from unittest.mock import MagicMock
import pytest
-from cura.PrinterOutput.ConfigurationModel import ConfigurationModel
-from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
-from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
+from cura.PrinterOutput.Models.PrinterConfigurationModel import PrinterConfigurationModel
+from cura.PrinterOutput.Models.PrintJobOutputModel import PrintJobOutputModel
+from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel
test_validate_data_get_set = [
{"attribute": "compatibleMachineFamilies", "value": ["yay"]},
]
test_validate_data_get_update = [
- {"attribute": "configuration", "value": ConfigurationModel()},
+ {"attribute": "configuration", "value": PrinterConfigurationModel()},
{"attribute": "owner", "value": "WHOO"},
{"attribute": "assignedPrinter", "value": PrinterOutputModel(MagicMock())},
{"attribute": "key", "value": "YAY"},
diff --git a/tests/PrinterOutput/TestConfigurationModel.py b/tests/PrinterOutput/Models/TestPrinterConfigurationModel.py
similarity index 84%
rename from tests/PrinterOutput/TestConfigurationModel.py
rename to tests/PrinterOutput/Models/TestPrinterConfigurationModel.py
index d6b7b885c2..84b1d1b5bf 100644
--- a/tests/PrinterOutput/TestConfigurationModel.py
+++ b/tests/PrinterOutput/Models/TestPrinterConfigurationModel.py
@@ -4,8 +4,8 @@ from unittest.mock import MagicMock
import pytest
-from cura.PrinterOutput.ConfigurationModel import ConfigurationModel
-from cura.PrinterOutput.ExtruderConfigurationModel import ExtruderConfigurationModel
+from cura.PrinterOutput.Models.PrinterConfigurationModel import PrinterConfigurationModel
+from cura.PrinterOutput.Models.ExtruderConfigurationModel import ExtruderConfigurationModel
test_validate_data_get_set = [
{"attribute": "extruderConfigurations", "value": [ExtruderConfigurationModel()]},
@@ -16,7 +16,7 @@ test_validate_data_get_set = [
@pytest.mark.parametrize("data", test_validate_data_get_set)
def test_getAndSet(data):
- model = ConfigurationModel()
+ model = PrinterConfigurationModel()
# Convert the first letter into a capital
attribute = list(data["attribute"])
diff --git a/tests/PrinterOutput/TestPrinterOutputModel.py b/tests/PrinterOutput/Models/TestPrinterOutputModel.py
similarity index 94%
rename from tests/PrinterOutput/TestPrinterOutputModel.py
rename to tests/PrinterOutput/Models/TestPrinterOutputModel.py
index f42149d50f..3fdb61adbd 100644
--- a/tests/PrinterOutput/TestPrinterOutputModel.py
+++ b/tests/PrinterOutput/Models/TestPrinterOutputModel.py
@@ -4,8 +4,8 @@ from unittest.mock import MagicMock
import pytest
-from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
-from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
+from cura.PrinterOutput.Models.PrintJobOutputModel import PrintJobOutputModel
+from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel
test_validate_data_get_set = [
{"attribute": "name", "value": "YAY"},
diff --git a/tests/PrinterOutput/TestNetworkedPrinterOutputDevice.py b/tests/PrinterOutput/TestNetworkedPrinterOutputDevice.py
index b3f7277051..da3ce66ac4 100644
--- a/tests/PrinterOutput/TestNetworkedPrinterOutputDevice.py
+++ b/tests/PrinterOutput/TestNetworkedPrinterOutputDevice.py
@@ -4,7 +4,7 @@ from unittest.mock import MagicMock
from PyQt5.QtNetwork import QNetworkAccessManager
from PyQt5.QtCore import QUrl
from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice, AuthState
-from cura.PrinterOutputDevice import ConnectionState
+from cura.PrinterOutput.PrinterOutputDevice import ConnectionState
def test_properties():
diff --git a/tests/TestPrinterOutputDevice.py b/tests/PrinterOutput/TestPrinterOutputDevice.py
similarity index 90%
rename from tests/TestPrinterOutputDevice.py
rename to tests/PrinterOutput/TestPrinterOutputDevice.py
index 9d3a337c21..4c12a34859 100644
--- a/tests/TestPrinterOutputDevice.py
+++ b/tests/PrinterOutput/TestPrinterOutputDevice.py
@@ -1,7 +1,7 @@
from unittest.mock import MagicMock
import pytest
-from cura.PrinterOutputDevice import PrinterOutputDevice
+from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice
test_validate_data_get_set = [
{"attribute": "connectionText", "value": "yay"},
@@ -34,4 +34,4 @@ def test_getAndSet(data):
# Attempt to set the value again
getattr(model, "set" + attribute)(data["value"])
# The signal should not fire again
- assert signal.emit.call_count == 1
\ No newline at end of file
+ assert signal.emit.call_count == 1
diff --git a/tests/Settings/TestContainerManager.py b/tests/Settings/TestContainerManager.py
new file mode 100644
index 0000000000..f4aa140b6b
--- /dev/null
+++ b/tests/Settings/TestContainerManager.py
@@ -0,0 +1,76 @@
+from unittest import TestCase
+from unittest.mock import MagicMock
+
+from PyQt5.QtCore import QUrl
+
+from UM.MimeTypeDatabase import MimeTypeDatabase
+from cura.Settings.ContainerManager import ContainerManager
+import tempfile
+import os
+
+class TestContainerManager(TestCase):
+ def setUp(self):
+
+ self._application = MagicMock()
+ self._container_registry = MagicMock()
+ self._machine_manager = MagicMock()
+
+ self._mocked_mime = MagicMock()
+ self._mocked_mime.preferredSuffix = "omg"
+ self._mocked_mime.suffixes = ["omg"]
+ self._mocked_mime.comment = "UnitTest!"
+
+ self._mocked_container = MagicMock()
+ self._mocked_container_data = "SOME DATA :D"
+ self._mocked_container.serialize = MagicMock(return_value = self._mocked_container_data)
+
+ self._containers_meta_data = [{"id": "test", "test_data": "omg"}]
+ self._container_registry.findContainersMetadata = MagicMock(return_value = self._containers_meta_data)
+ self._container_registry.getMimeTypeForContainer = MagicMock(return_value = self._mocked_mime)
+ self._container_registry.findContainers = MagicMock(return_value = [self._mocked_container])
+ self._application.getContainerRegistry = MagicMock(return_value = self._container_registry)
+ self._application.getMachineManager = MagicMock(return_value = self._machine_manager)
+
+ # Destroy the previous instance of the container manager
+ if ContainerManager.getInstance() is not None:
+ ContainerManager._ContainerManager__instance = None
+
+ self._container_manager = ContainerManager(self._application)
+ MimeTypeDatabase.addMimeType(self._mocked_mime)
+
+ def tearDown(self):
+ MimeTypeDatabase.removeMimeType(self._mocked_mime)
+
+ def test_getContainerMetaDataEntry(self):
+ assert self._container_manager.getContainerMetaDataEntry("test", "test_data") == "omg"
+ assert self._container_manager.getContainerMetaDataEntry("test", "entry_that_is_not_defined") == ""
+
+ def test_clearUserContainer(self):
+ self._container_manager.clearUserContainers()
+ assert self._machine_manager.activeMachine.userChanges.clear.call_count == 1
+
+ def test_getContainerNameFilters(self):
+ # If nothing is added, we still expect to get the all files filter
+ assert self._container_manager.getContainerNameFilters("") == ['All Files (*)']
+
+ # Pretend that a new type was added.
+ self._container_registry.getContainerTypes = MagicMock(return_value=[("None", None)])
+ assert self._container_manager.getContainerNameFilters("") == ['UnitTest! (*.omg)', 'All Files (*)']
+
+ def test_exportContainerUnknownFileType(self):
+ # The filetype is not known, so this should cause an error!
+ assert self._container_manager.exportContainer("test", "zomg", "whatever")["status"] == "error"
+
+ def test_exportContainerInvalidPath(self):
+ assert self._container_manager.exportContainer("test", "zomg", "")["status"] == "error"
+ assert self._container_manager.exportContainer("test", "zomg", QUrl())["status"] == "error"
+
+ def test_exportContainerInvalidId(self):
+ assert self._container_manager.exportContainer("", "whatever", "whatever")["status"] == "error"
+
+ def test_exportContainer(self):
+ with tempfile.TemporaryDirectory() as tmpdirname:
+ result = self._container_manager.exportContainer("test", "whatever", os.path.join(tmpdirname, "whatever.omg"))
+ assert(os.path.exists(result["path"]))
+ with open(result["path"], "r", encoding="utf-8") as f:
+ assert f.read() == self._mocked_container_data
diff --git a/tests/Settings/TestCuraContainerRegistry.py b/tests/Settings/TestCuraContainerRegistry.py
index 7a3bd94b68..1308e3d4df 100644
--- a/tests/Settings/TestCuraContainerRegistry.py
+++ b/tests/Settings/TestCuraContainerRegistry.py
@@ -1,7 +1,8 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import os #To find the directory with test files and find the test files.
+import pytest #To parameterize tests.
import unittest.mock #To mock and monkeypatch stuff.
from UM.Settings.DefinitionContainer import DefinitionContainer
@@ -119,3 +120,62 @@ def test_addContainerBadSettingVersion(container_registry, definition_container)
container_registry.addContainer(instance)
mock_super_add_container.assert_not_called() #Should not get passed on to UM.Settings.ContainerRegistry.addContainer, because the setting_version doesn't match its definition!
+
+test_loadMetaDataValidation_data = [
+ {
+ "id": "valid_container",
+ "is_valid": True,
+ "metadata": {
+ "id": "valid_container",
+ "setting_version": None, #The tests sets this to the current version so it's always correct.
+ "foo": "bar"
+ }
+ },
+ {
+ "id": "wrong_setting_version",
+ "is_valid": False,
+ "metadata": {
+ "id": "wrong_setting_version",
+ "setting_version": "5",
+ "foo": "bar"
+ }
+ },
+ {
+ "id": "missing_setting_version",
+ "is_valid": False,
+ "metadata": {
+ "id": "missing_setting_version",
+ "foo": "bar"
+ }
+ },
+ {
+ "id": "unparsable_setting_version",
+ "is_valid": False,
+ "metadata": {
+ "id": "unparsable_setting_version",
+ "setting_version": "Not an integer!",
+ "foo": "bar"
+ }
+ }
+]
+
+@pytest.mark.parametrize("parameters", test_loadMetaDataValidation_data)
+def test_loadMetadataValidation(container_registry, definition_container, parameters):
+ from cura.CuraApplication import CuraApplication
+ definition_container.getMetaData()["setting_version"] = CuraApplication.SettingVersion
+ container_registry.addContainer(definition_container)
+ if "setting_version" in parameters["metadata"] and parameters["metadata"]["setting_version"] is None: #Signal that the setting_version must be set to the currently correct version.
+ parameters["metadata"]["setting_version"] = CuraApplication.SettingVersion
+
+ mock_provider = unittest.mock.MagicMock()
+ mock_provider.getAllIds = unittest.mock.MagicMock(return_value = [parameters["id"]])
+ mock_provider.loadMetadata = unittest.mock.MagicMock(return_value = parameters["metadata"])
+ container_registry._providers = [mock_provider]
+
+ container_registry.loadAllMetadata() #Run the test.
+
+ if parameters["is_valid"]:
+ assert parameters["id"] in container_registry.metadata
+ assert container_registry.metadata[parameters["id"]] == parameters["metadata"]
+ else:
+ assert parameters["id"] not in container_registry.metadata
\ No newline at end of file
diff --git a/tests/Settings/TestProfiles.py b/tests/Settings/TestProfiles.py
index f0fea06a4f..570a2c9964 100644
--- a/tests/Settings/TestProfiles.py
+++ b/tests/Settings/TestProfiles.py
@@ -82,7 +82,7 @@ def test_validateQualityProfiles(file_name):
except Exception as e:
# File can't be read, header sections missing, whatever the case, this shouldn't happen!
- print("Go an Exception while reading he file [%s]: %s" % (file_name, e))
+ print("Got an Exception while reading he file [%s]: %s" % (file_name, e))
assert False
@@ -110,5 +110,5 @@ def test_validateVariantProfiles(file_name):
assert False
except Exception as e:
# File can't be read, header sections missing, whatever the case, this shouldn't happen!
- print("Go an Exception while reading he file [%s]: %s" % (file_name, e))
+ print("Got an Exception while reading he file [%s]: %s" % (file_name, e))
assert False
diff --git a/tests/Settings/conftest.py b/tests/Settings/conftest.py
index c2d8854f05..d7494dabf8 100644
--- a/tests/Settings/conftest.py
+++ b/tests/Settings/conftest.py
@@ -1,5 +1,5 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Uranium is released under the terms of the LGPLv3 or higher.
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
# The purpose of this class is to create fixtures or methods that can be shared among all settings tests.
@@ -49,6 +49,6 @@ def global_stack(definition_changes_container) -> GlobalStack:
# There is a restriction here that the definition changes cannot be an empty container. Added in CURA-5281
@pytest.fixture()
def extruder_stack(definition_changes_container) -> ExtruderStack:
- extruder_stack= ExtruderStack("TestExtruderStack")
+ extruder_stack = ExtruderStack("TestExtruderStack")
extruder_stack._containers[cura.Settings.CuraContainerStack._ContainerIndexes.DefinitionChanges] = definition_changes_container
return extruder_stack
\ No newline at end of file
diff --git a/tests/TestArrange.py b/tests/TestArrange.py
index 7de3ec1d8d..a00b544936 100755
--- a/tests/TestArrange.py
+++ b/tests/TestArrange.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import numpy
@@ -10,35 +10,29 @@ from cura.Arranging.ShapeArray import ShapeArray
def gimmeTriangle():
return numpy.array([[-3, 1], [3, 1], [0, -3]], dtype=numpy.int32)
-
## Boring square
def gimmeSquare():
return numpy.array([[-2, -2], [2, -2], [2, 2], [-2, 2]], dtype=numpy.int32)
-
## Triangle of area 12
def gimmeShapeArray(scale = 1.0):
vertices = gimmeTriangle()
shape_arr = ShapeArray.fromPolygon(vertices, scale = scale)
return shape_arr
-
## Boring square
def gimmeShapeArraySquare(scale = 1.0):
vertices = gimmeSquare()
shape_arr = ShapeArray.fromPolygon(vertices, scale = scale)
return shape_arr
-
## Smoke test for Arrange
def test_smoke_arrange():
- ar = Arrange.create(fixed_nodes = [])
-
+ Arrange.create(fixed_nodes = [])
## Smoke test for ShapeArray
def test_smoke_ShapeArray():
- shape_arr = gimmeShapeArray()
-
+ gimmeShapeArray()
## Test ShapeArray
def test_ShapeArray():
@@ -47,12 +41,9 @@ def test_ShapeArray():
ar.centerFirst()
shape_arr = gimmeShapeArray(scale)
- print(shape_arr.arr)
count = len(numpy.where(shape_arr.arr == 1)[0])
- print(count)
assert count >= 10 # should approach 12
-
## Test ShapeArray with scaling
def test_ShapeArray_scaling():
scale = 2
@@ -60,12 +51,9 @@ def test_ShapeArray_scaling():
ar.centerFirst()
shape_arr = gimmeShapeArray(scale)
- print(shape_arr.arr)
count = len(numpy.where(shape_arr.arr == 1)[0])
- print(count)
assert count >= 40 # should approach 2*2*12 = 48
-
## Test ShapeArray with scaling
def test_ShapeArray_scaling2():
scale = 0.5
@@ -73,12 +61,9 @@ def test_ShapeArray_scaling2():
ar.centerFirst()
shape_arr = gimmeShapeArray(scale)
- print(shape_arr.arr)
count = len(numpy.where(shape_arr.arr == 1)[0])
- print(count)
assert count >= 1 # should approach 3, but it can be inaccurate due to pixel rounding
-
## Test centerFirst
def test_centerFirst():
ar = Arrange(300, 300, 150, 150, scale = 1)
@@ -90,7 +75,6 @@ def test_centerFirst():
assert ar._priority[150][150] < ar._priority[150][130]
assert ar._priority[150][150] < ar._priority[130][130]
-
## Test centerFirst
def test_centerFirst_rectangular():
ar = Arrange(400, 300, 200, 150, scale = 1)
@@ -102,12 +86,10 @@ def test_centerFirst_rectangular():
assert ar._priority[150][200] < ar._priority[130][200]
assert ar._priority[150][200] < ar._priority[130][180]
-
## Test centerFirst
def test_centerFirst_rectangular2():
ar = Arrange(10, 20, 5, 10, scale = 1)
ar.centerFirst()
- print(ar._priority)
assert ar._priority[10][5] < ar._priority[10][7]
@@ -120,7 +102,6 @@ def test_backFirst():
assert ar._priority[150][150] > ar._priority[130][150]
assert ar._priority[150][150] > ar._priority[130][130]
-
## See if the result of bestSpot has the correct form
def test_smoke_bestSpot():
ar = Arrange(30, 30, 15, 15, scale = 1)
@@ -133,7 +114,6 @@ def test_smoke_bestSpot():
assert hasattr(best_spot, "penalty_points")
assert hasattr(best_spot, "priority")
-
## Real life test
def test_bestSpot():
ar = Arrange(16, 16, 8, 8, scale = 1)
@@ -151,9 +131,6 @@ def test_bestSpot():
assert best_spot.x != 0 or best_spot.y != 0 # it can't be on the same location
ar.place(best_spot.x, best_spot.y, shape_arr)
- print(ar._occupied) # For debugging
-
-
## Real life test rectangular build plate
def test_bestSpot_rectangular_build_plate():
ar = Arrange(16, 40, 8, 20, scale = 1)
@@ -187,9 +164,6 @@ def test_bestSpot_rectangular_build_plate():
best_spot_x = ar.bestSpot(shape_arr)
ar.place(best_spot_x.x, best_spot_x.y, shape_arr)
- print(ar._occupied) # For debugging
-
-
## Real life test
def test_bestSpot_scale():
scale = 0.5
@@ -202,17 +176,12 @@ def test_bestSpot_scale():
assert best_spot.y == 0
ar.place(best_spot.x, best_spot.y, shape_arr)
- print(ar._occupied)
-
# Place object a second time
best_spot = ar.bestSpot(shape_arr)
assert best_spot.x is not None # we found a location
assert best_spot.x != 0 or best_spot.y != 0 # it can't be on the same location
ar.place(best_spot.x, best_spot.y, shape_arr)
- print(ar._occupied) # For debugging
-
-
## Real life test
def test_bestSpot_scale_rectangular():
scale = 0.5
@@ -227,8 +196,6 @@ def test_bestSpot_scale_rectangular():
assert best_spot.y == 0
ar.place(best_spot.x, best_spot.y, shape_arr_square)
- print(ar._occupied)
-
# Place object a second time
best_spot = ar.bestSpot(shape_arr)
assert best_spot.x is not None # we found a location
@@ -238,9 +205,6 @@ def test_bestSpot_scale_rectangular():
best_spot = ar.bestSpot(shape_arr_square)
ar.place(best_spot.x, best_spot.y, shape_arr_square)
- print(ar._occupied) # For debugging
-
-
## Try to place an object and see if something explodes
def test_smoke_place():
ar = Arrange(30, 30, 15, 15)
@@ -252,7 +216,6 @@ def test_smoke_place():
ar.place(0, 0, shape_arr)
assert numpy.any(ar._occupied)
-
## See of our center has less penalty points than out of the center
def test_checkShape():
ar = Arrange(30, 30, 15, 15)
@@ -265,12 +228,10 @@ def test_checkShape():
assert points2 > points
assert points3 > points
-
## See of our center has less penalty points than out of the center
def test_checkShape_rectangular():
ar = Arrange(20, 30, 10, 15)
ar.centerFirst()
- print(ar._priority)
shape_arr = gimmeShapeArray()
points = ar.checkShape(0, 0, shape_arr)
@@ -279,20 +240,18 @@ def test_checkShape_rectangular():
assert points2 > points
assert points3 > points
-
## Check that placing an object on occupied place returns None.
def test_checkShape_place():
ar = Arrange(30, 30, 15, 15)
ar.centerFirst()
shape_arr = gimmeShapeArray()
- points = ar.checkShape(3, 6, shape_arr)
+ ar.checkShape(3, 6, shape_arr)
ar.place(3, 6, shape_arr)
points2 = ar.checkShape(3, 6, shape_arr)
assert points2 is None
-
## Test the whole sequence
def test_smoke_place_objects():
ar = Arrange(20, 20, 10, 10, scale = 1)
@@ -303,35 +262,30 @@ def test_smoke_place_objects():
best_spot_x, best_spot_y, score, prio = ar.bestSpot(shape_arr)
ar.place(best_spot_x, best_spot_y, shape_arr)
-
# Test some internals
def test_compare_occupied_and_priority_tables():
ar = Arrange(10, 15, 5, 7)
ar.centerFirst()
assert ar._priority.shape == ar._occupied.shape
-
## Polygon -> array
def test_arrayFromPolygon():
vertices = numpy.array([[-3, 1], [3, 1], [0, -3]])
array = ShapeArray.arrayFromPolygon([5, 5], vertices)
assert numpy.any(array)
-
## Polygon -> array
def test_arrayFromPolygon2():
vertices = numpy.array([[-3, 1], [3, 1], [2, -3]])
array = ShapeArray.arrayFromPolygon([5, 5], vertices)
assert numpy.any(array)
-
## Polygon -> array
def test_fromPolygon():
vertices = numpy.array([[0, 0.5], [0, 0], [0.5, 0]])
array = ShapeArray.fromPolygon(vertices, scale=0.5)
assert numpy.any(array.arr)
-
## Line definition -> array with true/false
def test_check():
base_array = numpy.zeros([5, 5], dtype=float)
@@ -342,7 +296,6 @@ def test_check():
assert check_array[3][0]
assert not check_array[0][3]
-
## Line definition -> array with true/false
def test_check2():
base_array = numpy.zeros([5, 5], dtype=float)
@@ -353,22 +306,17 @@ def test_check2():
assert not check_array[3][0]
assert check_array[3][4]
-
## Just adding some stuff to ensure fromNode works as expected. Some parts should actually be in UM
def test_parts_of_fromNode():
from UM.Math.Polygon import Polygon
p = Polygon(numpy.array([[-2, -2], [2, -2], [2, 2], [-2, 2]], dtype=numpy.int32))
offset = 1
- print(p._points)
p_offset = p.getMinkowskiHull(Polygon.approximatedCircle(offset))
- print("--------------")
- print(p_offset._points)
assert len(numpy.where(p_offset._points[:, 0] >= 2.9)) > 0
assert len(numpy.where(p_offset._points[:, 0] <= -2.9)) > 0
assert len(numpy.where(p_offset._points[:, 1] >= 2.9)) > 0
assert len(numpy.where(p_offset._points[:, 1] <= -2.9)) > 0
-
def test_parts_of_fromNode2():
from UM.Math.Polygon import Polygon
p = Polygon(numpy.array([[-2, -2], [2, -2], [2, 2], [-2, 2]], dtype=numpy.int32) * 2) # 4x4
@@ -378,4 +326,4 @@ def test_parts_of_fromNode2():
shape_arr1 = ShapeArray.fromPolygon(p._points, scale = scale)
shape_arr2 = ShapeArray.fromPolygon(p_offset._points, scale = scale)
assert shape_arr1.arr.shape[0] >= (4 * scale) - 1 # -1 is to account for rounding errors
- assert shape_arr2.arr.shape[0] >= (2 * offset + 4) * scale - 1
+ assert shape_arr2.arr.shape[0] >= (2 * offset + 4) * scale - 1
\ No newline at end of file
diff --git a/tests/TestMachineAction.py b/tests/TestMachineAction.py
index f1487a1d9f..9b0cb0a4a0 100755
--- a/tests/TestMachineAction.py
+++ b/tests/TestMachineAction.py
@@ -4,7 +4,7 @@
import pytest
from cura.MachineAction import MachineAction
-from cura.MachineActionManager import NotUniqueMachineActionError, UnknownMachineActionError
+from cura.UI.MachineActionManager import NotUniqueMachineActionError, UnknownMachineActionError
from cura.Settings.GlobalStack import GlobalStack
diff --git a/tests/TestMachineManager.py b/tests/TestMachineManager.py
index b989a6ee79..6de6fdd941 100644
--- a/tests/TestMachineManager.py
+++ b/tests/TestMachineManager.py
@@ -7,20 +7,31 @@ from cura.Settings.ExtruderManager import ExtruderManager
from cura.Settings.MachineManager import MachineManager
+@pytest.fixture()
+def global_stack():
+ return MagicMock(name="Global Stack")
+
@pytest.fixture()
def container_registry() -> ContainerRegistry:
- return MagicMock()
+ return MagicMock(name = "ContainerRegistry")
+
@pytest.fixture()
def extruder_manager(application, container_registry) -> ExtruderManager:
+ if ExtruderManager.getInstance() is not None:
+ # Reset the data
+ ExtruderManager._ExtruderManager__instance = None
+
with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)):
with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
- manager = ExtruderManager()
+ manager = ExtruderManager()
return manager
+
@pytest.fixture()
-def machine_manager(application, extruder_manager, container_registry) -> MachineManager:
+def machine_manager(application, extruder_manager, container_registry, global_stack) -> MachineManager:
application.getExtruderManager = MagicMock(return_value = extruder_manager)
+ application.getGlobalContainerStack = MagicMock(return_value = global_stack)
with patch("cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
manager = MachineManager(application)
@@ -41,3 +52,13 @@ def test_setActiveMachine(machine_manager):
# Although we mocked the application away, we still want to know if it was notified about the attempted change.
machine_manager._application.setGlobalContainerStack.assert_called_with(mocked_global_stack)
+
+def test_hasUserSettings(machine_manager, application):
+ mocked_stack = application.getGlobalContainerStack()
+
+ mocked_instance_container = MagicMock(name="UserSettingContainer")
+ mocked_instance_container.getNumInstances = MagicMock(return_value = 12)
+ mocked_stack.getTop = MagicMock(return_value = mocked_instance_container)
+
+ assert machine_manager.numUserSettings == 12
+ assert machine_manager.hasUserSettings
diff --git a/tests/TestMaterialManager.py b/tests/TestMaterialManager.py
new file mode 100644
index 0000000000..2d66dfa4fd
--- /dev/null
+++ b/tests/TestMaterialManager.py
@@ -0,0 +1,43 @@
+from unittest.mock import MagicMock, patch
+
+from cura.Machines.MaterialManager import MaterialManager
+
+
+mocked_registry = MagicMock()
+material_1 = {"id": "test", "GUID":"TEST!", "base_file": "base_material", "definition": "fdmmachine", "approximate_diameter": 3, "brand": "generic"}
+material_2 = {"id": "base_material", "GUID": "TEST2!", "base_file": "test", "definition": "fdmmachine", "approximate_diameter": 3}
+mocked_registry.findContainersMetadata = MagicMock(return_value = [material_1, material_2])
+
+
+mocked_definition = MagicMock()
+mocked_definition.getId = MagicMock(return_value = "fdmmachine")
+mocked_definition.getMetaDataEntry = MagicMock(return_value = [])
+
+
+def test_initialize(application):
+ # Just test if the simple loading works
+ with patch("UM.Application.Application.getInstance", MagicMock(return_value=application)):
+ manager = MaterialManager(mocked_registry)
+ manager.initialize()
+ # Double check that we actually got some material nodes
+ assert manager.getMaterialGroup("base_material").name == "base_material"
+ assert manager.getMaterialGroup("test").name == "test"
+
+
+def test_getAvailableMaterials(application):
+ with patch("UM.Application.Application.getInstance", MagicMock(return_value=application)):
+ manager = MaterialManager(mocked_registry)
+ manager.initialize()
+
+ available_materials = manager.getAvailableMaterials(mocked_definition, None, None, 3)
+
+ assert "base_material" in available_materials
+ assert "test" in available_materials
+
+
+def test_getMaterialNode(application):
+ with patch("UM.Application.Application.getInstance", MagicMock(return_value=application)):
+ manager = MaterialManager(mocked_registry)
+ manager.initialize()
+
+ assert manager.getMaterialNode("fdmmachine", None, None, 3, "base_material").getMetaDataEntry("id") == "test"
diff --git a/tests/TestPrintInformation.py b/tests/TestPrintInformation.py
index 177643bc90..9b9362ea75 100644
--- a/tests/TestPrintInformation.py
+++ b/tests/TestPrintInformation.py
@@ -1,7 +1,7 @@
import functools
from UM.Qt.Duration import Duration
-from cura import PrintInformation
+from cura.UI import PrintInformation
from cura.Settings.MachineManager import MachineManager
from unittest.mock import MagicMock, patch
@@ -77,8 +77,6 @@ def test_duration():
# Fake a print duration message
print_information._onPrintDurationMessage(0, {"travel": 20}, [10])
- # Some debugging code, since this test sometimes fails on the CI server.
- print("Testing debug;", print_information.getFeaturePrintTimes(), print_information.currentPrintTime)
# We only set a single time, so the total time must be of the same value.
assert int(print_information.currentPrintTime) == 20
diff --git a/tests/TestQualityManager.py b/tests/TestQualityManager.py
new file mode 100644
index 0000000000..50318260b2
--- /dev/null
+++ b/tests/TestQualityManager.py
@@ -0,0 +1,60 @@
+from unittest.mock import MagicMock
+
+import pytest
+
+from cura.Machines.QualityManager import QualityManager
+
+
+
+mocked_stack = MagicMock()
+mocked_extruder = MagicMock()
+
+mocked_material = MagicMock()
+mocked_material.getMetaDataEntry = MagicMock(return_value = "base_material")
+
+mocked_extruder.material = mocked_material
+mocked_stack.extruders = {"0": mocked_extruder}
+
+@pytest.fixture()
+def material_manager():
+ result = MagicMock()
+ result.getRootMaterialIDWithoutDiameter = MagicMock(return_value = "base_material")
+ return result
+
+@pytest.fixture()
+def container_registry():
+ result = MagicMock()
+ mocked_metadata = [{"id": "test", "definition": "fdmprinter", "quality_type": "normal", "name": "test_name", "global_quality": True, "type": "quality"},
+ {"id": "test_material", "definition": "fdmprinter", "quality_type": "normal", "name": "test_name_material", "material": "base_material", "type": "quality"},
+ {"id": "quality_changes_id", "definition": "fdmprinter", "type": "quality_changes", "quality_type": "amazing!", "name": "herp"}]
+ result.findContainersMetadata = MagicMock(return_value = mocked_metadata)
+ return result
+
+
+@pytest.fixture()
+def quality_mocked_application(material_manager, container_registry):
+ result = MagicMock()
+ result.getMaterialManager = MagicMock(return_value=material_manager)
+ result.getContainerRegistry = MagicMock(return_value=container_registry)
+ return result
+
+
+def test_getQualityGroups(quality_mocked_application):
+ manager = QualityManager(quality_mocked_application)
+ manager.initialize()
+
+ assert "normal" in manager.getQualityGroups(mocked_stack)
+
+
+def test_getQualityGroupsForMachineDefinition(quality_mocked_application):
+ manager = QualityManager(quality_mocked_application)
+ manager.initialize()
+
+ assert "normal" in manager.getQualityGroupsForMachineDefinition(mocked_stack)
+
+
+def test_getQualityChangesGroup(quality_mocked_application):
+ manager = QualityManager(quality_mocked_application)
+ manager.initialize()
+
+ assert "herp" in manager.getQualityChangesGroups(mocked_stack)
diff --git a/tests/conftest.py b/tests/conftest.py
index b21b32b028..7f46c202b3 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -6,12 +6,14 @@
import unittest.mock
import pytest
-import Arcus #Prevents error: "PyCapsule_GetPointer called with incorrect name" with conflicting SIP configurations between Arcus and PyQt: Import Arcus and Savitar first!
-import Savitar
-from UM.Qt.QtApplication import QtApplication #QtApplication import is required, even though it isn't used.
-from cura.CuraApplication import CuraApplication
-from cura.MachineActionManager import MachineActionManager
+# Prevents error: "PyCapsule_GetPointer called with incorrect name" with conflicting SIP configurations between Arcus and PyQt: Import Arcus and Savitar first!
+import Savitar # Dont remove this line
+import Arcus # No really. Don't. It needs to be there!
+from UM.Qt.QtApplication import QtApplication # QtApplication import is required, even though it isn't used.
+# Even though your IDE says these files are not used, don't believe it. It's lying. They need to be there.
+from cura.CuraApplication import CuraApplication
+from cura.UI.MachineActionManager import MachineActionManager
# Create a CuraApplication object that will be shared among all tests. It needs to be initialized.
# Since we need to use it more that once, we create the application the first time and use its instance afterwards.